// package safe_txt -- потокобезопасный внутренний текст. package safe_txt import ( "os" "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/result" ) // MSafeTxt -- потокобезопасный внутренний текст. type MSafeTxt struct { sync.RWMutex val *def_txt.MTxt } // MutSafeTxt -- возвращает новую потокобезопасный внутренний текст. func MutSafeTxt[T def_spec_base.TxtConstraint](txt T, arg ...any) *MSafeTxt { sf := &MSafeTxt{ val: def_txt.MutTxt(txt, arg...), } return sf } // MutSafeTxtFromEnv -- возвращает новую потокобезопасный внутрений текст из окружения. func MutSafeTxtFromEnv(env *def_txt.LTxt) *result.Result[*MSafeTxt] { sf := MutSafeTxt("") res := sf.FromEnv(env) if res.IsErr() { err := def_err.LetErr("NewSafeStringGetenv(): in get from env(%v), err=\n\t%w", env, res.Err()) return result.ResErr[*MSafeTxt](err) } return result.ResOk(sf) } // Byte -- возвращает байтовое представление текста. func (sf *MSafeTxt) Byte() []byte { sf.RLock() defer sf.RUnlock() return sf.val.Byte() } // Get -- возвращает хранимый текст. func (sf *MSafeTxt) Get() *def_txt.LTxt { sf.RLock() defer sf.RUnlock() return sf.val.Let() } // Set -- устанавливает текст. func (sf *MSafeTxt) Set(val *def_txt.LTxt) { sf.Lock() defer sf.Unlock() sf.val.Set(val.Get()) } // Reset -- сбрасывает текст. func (sf *MSafeTxt) Reset() { sf.Lock() defer sf.Unlock() sf.val.Set("") } // FromEnv -- получает значение из окружения. func (sf *MSafeTxt) FromEnv(env *def_txt.LTxt) *result.Result[*def_txt.LTxt] { sf.Lock() defer sf.Unlock() txtVal := def_spec_base.Txt(os.Getenv(env.String())) if txtVal == "" { err := def_err.LetErr("safeString.Getenv(): from env(%v), val is empty", env) return result.ResErr[*def_txt.LTxt](err) } sf.val = def_txt.MutTxt(txtVal) return result.ResOk(sf.val.Let()) } // TrimSuffix -- обрезает суффикс хранимаого текста func (sf *MSafeTxt) TrimSuffix(txt def_spec_base.Txt) def_spec_base.Txt { sf.Lock() defer sf.Unlock() return sf.val.TrimSuffix(txt) }