// package safe_string -- потокобезопасная строка. package safe_string import ( "os" "sync" mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0" mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs" ) // safeString -- потокобезопасная строка. type safeString struct { sync.RWMutex val defs.ITxtMut } // NewSafeString -- возвращает новую потокобезопасную строку. func NewSafeString() mKs.ISafeString { sf := &safeString{} return sf } // NewSafeStringGetenv -- возвращает новую потокобезопасную строку из окружения. func NewSafeStringGetenv(env defs.ITxtFix) mL0.IResult[mKs.ISafeString] { sf := NewSafeString() res := sf.Getenv(env) if res.IsErr() { err := defs.Err("NewSafeStringGetenv(): in get from env(%v), err=\n\t%w", env, res.Err()) return mL0.NewErr[mKs.ISafeString](err) } return mL0.NewOk(sf) } // Byte -- возвращает байтовое представление строки. func (sf *safeString) Byte() []byte { sf.RLock() defer sf.RUnlock() return sf.val.Byte() } // Get -- возвращает хранимую строку. func (sf *safeString) Get() defs.ITxtMut { sf.RLock() defer sf.RUnlock() return sf.val } // Set -- устанавливает строку. func (sf *safeString) Set(val defs.ITxtMut) { sf.Lock() defer sf.Unlock() sf.val = val } // Reset -- сбрасывает строку. func (sf *safeString) Reset() { sf.Lock() defer sf.Unlock() sf.val.Set("") } // Getenv -- получает значение из окружения. func (sf *safeString) Getenv(env defs.ITxtFix) mL0.IResult[defs.ITxtFix] { txtVal := defs.ATxt(os.Getenv(env.String())) if txtVal == "" { err := defs.Err("safeString.Getenv(): from env(%v), val is empty", env) return mL0.NewErr[defs.ITxtFix](err) } sf.val = defs.Txt(txtVal) return mL0.NewOk(defs.ITxtFix(sf.val)) }