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