// package safe_bool -- потокобезопасный булевый признак. package safe_bool import ( "os" "strings" "sync" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_err" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec_base" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_txt" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/option" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/result" ) // MSafeBool -- потокобезопасный булевый признак. type MSafeBool struct { sync.RWMutex val def_spec_base.Bool } // MutSafeBool -- возвращает новый потокобезопасный булевый признак. func MutSafeBool[T def_spec_base.BoolConstraint](val T) *MSafeBool { sf := &MSafeBool{ val: def_spec_base.Bool(val), } return sf } // MutSafeBoolFromTxt -- возвращает новое потокобезопасное булево из текста. func MutSafeBoolFromTxt(strVal *def_txt.LTxt) *result.Result[*MSafeBool] { sf := MutSafeBool(false) res := sf.FromTxt(strVal) if res.IsSome() { err := def_err.LetErr("NewSafeBoolFromStr(): in parse str(%v), err=\n\t%w", strVal, res.Some().Get()) return result.ResErr[*MSafeBool](err) } return result.ResOk(sf) } // MutSafeBoolFromEnv -- возвращает новое потокобезопасное целое из окружения. func MutSafeBoolFromEnv(env *def_txt.LTxt) *result.Result[*MSafeBool] { sf := MutSafeBool(false) res := sf.Getenv(env) if res.IsSome() { err := def_err.LetErr("NewSafeBoolGetenv(): in parse env(%v), err=\n\t%w", env, res.Some().Get()) return result.ResErr[*MSafeBool](err) } return result.ResOk(sf) } // Get -- возвращает хранимый булевый признак. func (sf *MSafeBool) Get() def_spec_base.Bool { sf.RLock() defer sf.RUnlock() return sf.val } // Set -- устанавливает булевый признак. func (sf *MSafeBool) Set() { sf.Lock() defer sf.Unlock() sf.val = true } // Reset -- сбрасывает булевый признак. func (sf *MSafeBool) Reset() { sf.Lock() defer sf.Unlock() sf.val = false } // FromTxt -- получает число из текста. func (sf *MSafeBool) FromTxt(strVal *def_txt.LTxt) *option.Option[*def_err.LErr] { _strVal := strings.ToLower(strVal.String()) sf.Lock() defer sf.Unlock() switch _strVal { case "true": sf.val = true case "false": sf.val = false default: err := def_err.LetErr("MSafeBool.FromTxt(): val(%v) bad", strVal) return option.NewSome(err) } return option.NewNone[*def_err.LErr]() } // Getenv -- получает значение из окружения. func (sf *MSafeBool) Getenv(env *def_txt.LTxt) *option.Option[*def_err.LErr] { strVal := def_spec_base.Txt(os.Getenv(env.String())) res := sf.FromTxt(def_txt.LetTxt(strVal)) if res.IsSome() { err := def_err.LetErr("safeBool.Getenv(): from env %v, err=\n\t%w", env, res.Some().Get()) return option.NewSome(err) } return option.NewNone[*def_err.LErr]() }