safe_txt.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // package safe_txt -- потокобезопасный внутренний текст.
  2. package safe_txt
  3. import (
  4. "os"
  5. "sync"
  6. "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
  7. )
  8. // MSafeTxt -- потокобезопасный внутренний текст.
  9. type MSafeTxt struct {
  10. sync.RWMutex
  11. val *lev0.MTxt
  12. }
  13. // MutSafeTxt -- возвращает новую потокобезопасный внутренний текст.
  14. func MutSafeTxt[T lev0.TxtConstraint](txt T, arg ...any) *MSafeTxt {
  15. sf := &MSafeTxt{
  16. val: lev0.MutTxt(txt, arg...),
  17. }
  18. return sf
  19. }
  20. // MutSafeTxtFromEnv -- возвращает новую потокобезопасный внутрений текст из окружения.
  21. func MutSafeTxtFromEnv(env *lev0.LTxt) *lev0.Result[*MSafeTxt] {
  22. sf := MutSafeTxt("")
  23. res := sf.FromEnv(env)
  24. if res.IsErr() {
  25. err := lev0.LetErr("NewSafeStringGetenv(): in get from env(%v), err=\n\t%w", env, res.Err())
  26. return lev0.ResErr[*MSafeTxt](err)
  27. }
  28. return lev0.ResOk(sf)
  29. }
  30. // Byte -- возвращает байтовое представление текста.
  31. func (sf *MSafeTxt) Byte() []byte {
  32. sf.RLock()
  33. defer sf.RUnlock()
  34. return sf.val.Byte()
  35. }
  36. // Get -- возвращает хранимый текст.
  37. func (sf *MSafeTxt) Get() *lev0.LTxt {
  38. sf.RLock()
  39. defer sf.RUnlock()
  40. return sf.val.Let()
  41. }
  42. // Set -- устанавливает текст.
  43. func (sf *MSafeTxt) Set(val *lev0.LTxt) {
  44. sf.Lock()
  45. defer sf.Unlock()
  46. sf.val.Set(val.Get())
  47. }
  48. // Reset -- сбрасывает ьекст.
  49. func (sf *MSafeTxt) Reset() {
  50. sf.Lock()
  51. defer sf.Unlock()
  52. sf.val.Set("")
  53. }
  54. // FromEnv -- получает значение из окружения.
  55. func (sf *MSafeTxt) FromEnv(env *lev0.LTxt) *lev0.Result[*lev0.LTxt] {
  56. txtVal := lev0.ATxt(os.Getenv(env.String()))
  57. if txtVal == "" {
  58. err := lev0.LetErr("safeString.Getenv(): from env(%v), val is empty", env)
  59. return lev0.ResErr[*lev0.LTxt](err)
  60. }
  61. sf.val = lev0.MutTxt(txtVal)
  62. return lev0.ResOk(sf.val.Let())
  63. }
  64. // TrimSuffix -- обрезает суффикс хранимаого текста
  65. func (sf *MSafeTxt) TrimSuffix(txt lev0.ATxt) lev0.ATxt {
  66. return sf.val.TrimSuffix(txt)
  67. }