| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- // package safe_bool -- потокобезопасный булевый признак.
- package safe_bool
- import (
- "os"
- "strings"
- "sync"
- mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
- )
- // safeBool -- потокобезопасный булевый признак.
- type safeBool struct {
- sync.RWMutex
- val defs.Bool
- }
- // NewSafeBool -- возвращает новый потокобезопасный булевый признак.
- func NewSafeBool(val defs.Bool) core_spec.ISafeBool {
- sf := &safeBool{
- val: val,
- }
- return sf
- }
- // NewSafeBoolFromStr -- возвращает новое потокобезопасное булево из строки.
- func NewSafeBoolFromStr(strVal defs.ITxtFix) mL0.IResult[core_spec.ISafeBool] {
- sf := NewSafeBool(false)
- res := sf.FromStr(strVal)
- if res.IsSome() {
- err := defs.Err("NewSafeBoolFromStr(): in parse str(%v), err=\n\t%w", strVal, res.Some().Get())
- return mL0.NewErr[core_spec.ISafeBool](err)
- }
- return mL0.NewOk(sf)
- }
- // NewSafeBoolGetenv -- возвращает новое потокобезопасное целое из окружения.
- func NewSafeBoolGetenv(env defs.ITxtFix) core_spec.IResult[core_spec.ISafeBool] {
- sf := NewSafeBool(false)
- res := sf.Getenv(env)
- if res.IsSome() {
- err := defs.Err("NewSafeBoolGetenv(): in parse env(%v), err=\n\t%w", env, res.Some().Get())
- return mL0.NewErr[core_spec.ISafeBool](err)
- }
- return mL0.NewOk(sf)
- }
- // Get -- возвращает хранимый булевый признак.
- func (sf *safeBool) Get() defs.Bool {
- sf.RLock()
- defer sf.RUnlock()
- return sf.val
- }
- // Set -- устанавливает булевый признак.
- func (sf *safeBool) Set() {
- sf.Lock()
- defer sf.Unlock()
- sf.val = true
- }
- // Reset -- сбрасывает булевый признак.
- func (sf *safeBool) Reset() {
- sf.Lock()
- defer sf.Unlock()
- sf.val = false
- }
- // FromStr -- получает число из строки.
- func (sf *safeBool) FromStr(strVal defs.ITxtFix) core_spec.IOption[defs.IErr] {
- _strVal := strings.ToLower(strVal.String())
- sf.Lock()
- defer sf.Unlock()
- switch _strVal {
- case "true":
- sf.val = true
- case "false":
- sf.val = false
- default:
- err := defs.Err("safeBool.FromStr(): val(%v) bad", strVal)
- return mL0.NewSome(err)
- }
- return mL0.NewNone[defs.IErr]()
- }
- // Getenv -- получает значение из окружения.
- func (sf *safeBool) Getenv(env defs.ITxtFix) mL0.IOption[defs.IErr] {
- strVal := defs.ATxt(os.Getenv(env.String()))
- res := sf.FromStr(defs.TxtFix(strVal))
- if res.IsSome() {
- err := defs.Err("safeBool.Getenv(): from env %v, err=\n\t%w", env, res.Some().Get())
- return mL0.NewSome(err)
- }
- return mL0.NewNone[defs.IErr]()
- }
|