| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- // package safe_bool_react -- потокобезопасный булевый признак с реакцией на своё изменение.
- package safe_bool_react
- import (
- "os"
- "strings"
- "gitp78su.ipnodns.ru/svi/kern/v4/d0/defs/def_bool"
- "gitp78su.ipnodns.ru/svi/kern/v4/d0/defs/def_err"
- "gitp78su.ipnodns.ru/svi/kern/v4/d0/defs/def_spec_base"
- "gitp78su.ipnodns.ru/svi/kern/v4/d0/defs/def_txt"
- "gitp78su.ipnodns.ru/svi/kern/v4/d0/defs/safe_mutex"
- "gitp78su.ipnodns.ru/svi/kern/v4/d0/defs/table/owner"
- "gitp78su.ipnodns.ru/svi/kern/v4/d0/option"
- "gitp78su.ipnodns.ru/svi/kern/v4/d0/result"
- )
- // MSafeBoolReact -- потокобезопасный булевый признак с реакцией на своё изменение.
- type MSafeBoolReact struct {
- *safe_mutex.MSafeMutex
- dict map[def_spec_base.Txt]func(def_spec_base.Bool) // Словарь обратных вызовов
- val *def_bool.MBool
- }
- // MutSafeBoolReact -- возвращает новый потокобезопасный булевый признак с реакцией на своё изменение.
- func MutSafeBoolReact[T def_spec_base.BoolConstraint](owner *owner.LOwner, val T) *MSafeBoolReact {
- sf := &MSafeBoolReact{
- MSafeMutex: safe_mutex.MutSafeMutex(),
- dict: map[def_spec_base.Txt]func(def_spec_base.Bool){},
- val: def_bool.MutBool(owner, val),
- }
- return sf
- }
- // MutSafeBoolReactFromTxt -- возвращает новое потокобезопасное булево с реакцией из строки.
- func MutSafeBoolReactFromTxt[T def_spec_base.TxtConstraint](owner *owner.LOwner, txtVal T) *result.Result[*MSafeBoolReact] {
- sf := MutSafeBoolReact(owner, false)
- val := def_txt.LetTxt(owner, txtVal)
- res := sf.FromTxt(val)
- if res.IsSome() {
- err := def_err.LetErr(owner, "NewSafeBoolReactFromStr(): in parse str(%v), err=\n\t%w",
- txtVal, res.Some().Get())
- return result.ResErr[*MSafeBoolReact](err)
- }
- return result.ResOk(sf)
- }
- // MutSafeBoolReactFromEnv -- возвращает новое потокобезопасное целое с реакцией из окружения.
- func MutSafeBoolReactFromEnv(owner *owner.LOwner, env *def_txt.LTxt) *result.Result[*MSafeBoolReact] {
- sf := MutSafeBoolReact(owner, false)
- res := sf.FromEnv(env)
- if res.IsSome() {
- err := def_err.LetErr(owner, "NewSafeBoolGetenv(): in parse env(%v), err=\n\t%w", env, res.Some().Get())
- return result.ResErr[*MSafeBoolReact](err)
- }
- return result.ResOk(sf)
- }
- // Delete -- удаляет функцию обратного вызова из наблюдения.
- func (sf *MSafeBoolReact) Delete(key *def_txt.LTxt) {
- sf.Lock()
- defer sf.Unlock()
- sf.val.CheckOwner()
- delete(sf.dict, key.Get())
- }
- // Add -- добавляет функцию обратного вызова.
- func (sf *MSafeBoolReact) Add(key *def_txt.LTxt, fn func(def_spec_base.Bool)) *result.Result[bool] {
- sf.Lock()
- defer sf.Unlock()
- sf.val.CheckOwner()
- if key.Get() == "" {
- err := def_err.LetErr(sf.val.Owner(), "safeBoolReact.Add(): key is empty")
- return result.ResErr[bool](err)
- }
- _, isOk := sf.dict[key.Get()]
- if isOk {
- err := def_err.LetErr(sf.val.Owner(), "safeBoolReact.Add(): key(%v) already exists", key)
- return result.ResErr[bool](err)
- }
- sf.dict[key.Get()] = fn
- return result.ResOk((true))
- }
- // IsOk -- возвращает хранимый булевый признак.
- func (sf *MSafeBoolReact) IsOk() def_spec_base.Bool {
- sf.RLock()
- defer sf.RUnlock()
- return sf.val.IsOk()
- }
- // IsNot -- возвращает хранимый булевый признак.
- func (sf *MSafeBoolReact) IsNot() def_spec_base.Bool {
- sf.RLock()
- defer sf.RUnlock()
- return sf.val.IsNot()
- }
- // Set -- устанавливает булевый признак.
- func (sf *MSafeBoolReact) Set() {
- sf.Lock()
- defer sf.Unlock()
- sf.val.Set()
- for _, fn := range sf.dict {
- fn(true)
- }
- }
- // Reset -- сбрасывает булевый признак.
- func (sf *MSafeBoolReact) Reset() {
- sf.Lock()
- defer sf.Unlock()
- sf.val.Reset()
- for _, fn := range sf.dict {
- fn(false)
- }
- }
- // FromTxt -- получает булево из текста.
- func (sf *MSafeBoolReact) FromTxt(txtVal *def_txt.LTxt) *option.Option[*def_err.LErr] {
- _strVal := strings.ToLower(txtVal.String())
- sf.Lock()
- defer sf.Unlock()
- switch _strVal {
- case "true":
- sf.val.Set()
- case "false":
- sf.val.Reset()
- default:
- err := def_err.LetErr(sf.val.Owner(), "safeBoolReact.FromStr(): val(%v) bad", txtVal)
- return option.NewSome(err)
- }
- return option.NewNone[*def_err.LErr]()
- }
- // FromEnv -- получает значение из окружения.
- func (sf *MSafeBoolReact) FromEnv(env *def_txt.LTxt) *option.Option[*def_err.LErr] {
- strVal := def_spec_base.Txt(os.Getenv(env.String()))
- res := sf.FromTxt(def_txt.LetTxt(sf.val.Owner(), strVal))
- if res.IsSome() {
- err := def_err.LetErr(sf.val.Owner(),
- "safeBoolReact.Getenv(): from env %v, err=\n\t%w",
- env, res.Some().Get())
- return option.NewSome(err)
- }
- return option.NewNone[*def_err.LErr]()
- }
|