| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- // 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()
- }
|