// package safe_bool -- потокобезопасный булевый признак. package safe_bool import ( "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" ) // MSafeBool -- потокобезопасный булевый признак. type MSafeBool struct { *safe_mutex.MSafeMutex val *def_bool.MBool } // MutSafeBool -- возвращает новый потокобезопасный булевый признак. func MutSafeBool[T def_spec_base.BoolConstraint](owner *owner.LOwner, val T) *MSafeBool { sf := &MSafeBool{ MSafeMutex: safe_mutex.MutSafeMutex(), val: def_bool.MutBool(owner, val), } return sf } // MutSafeBoolFromTxt -- возвращает новое потокобезопасное булево из текста. func MutSafeBoolFromTxt[T def_spec_base.TxtConstraint](owner *owner.LOwner, strVal T) *result.Result[*MSafeBool] { sf := MutSafeBool(owner, false) val := def_txt.LetTxt(owner, strVal) res := sf.FromTxt(val) if res.IsSome() { err := def_err.LetErr(owner, "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(owner *owner.LOwner, env *def_txt.LTxt) *result.Result[*MSafeBool] { sf := MutSafeBool(owner, false) res := sf.FromEnv(env) if res.IsErr() { err := def_err.LetErr(owner, "NewSafeBoolGetenv(): in parse env(%v), err=\n\t%w", env, res.Err()) return result.ResErr[*MSafeBool](err) } return result.ResOk(sf) } // IsOk -- возвращает хранимый булевый признак. func (sf *MSafeBool) IsOk() def_spec_base.Bool { sf.RLock() defer sf.RUnlock() return sf.val.IsOk() } // IsNot -- возвращает хранимый булевый признак. func (sf *MSafeBool) IsNot() def_spec_base.Bool { sf.RLock() defer sf.RUnlock() return sf.val.IsNot() } // Set -- устанавливает булевый признак. func (sf *MSafeBool) Set() { sf.Lock() defer sf.Unlock() sf.val.Set() } // Reset -- сбрасывает булевый признак. func (sf *MSafeBool) Reset() { sf.Lock() defer sf.Unlock() sf.val.Reset() } // 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.Set() case "false": sf.val.Reset() default: err := def_err.LetErr(sf.val.Owner(), "MSafeBool.FromTxt(): val(%v) bad", strVal) return option.NewSome(err) } return option.NewNone[*def_err.LErr]() } // FromEnv -- получает значение из окружения. func (sf *MSafeBool) FromEnv(env *def_txt.LTxt) *result.Result[*def_bool.LBool] { res := sf.val.FromEnv(env.Get()) if res.IsErr() { err := def_err.LetErr(sf.val.Owner(), "MSafeBool.FromEnv(): from env %v, err=\n\t%w", env, res.Err()) return result.ResErr[*def_bool.LBool](err) } return res } // Let -- возвращает собственное неизменяемое значение func (sf *MSafeBool) Let() *def_bool.LBool { return sf.val.Let() }