safe_txt.go 2.4 KB

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