safe_txt.go 2.5 KB

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