safe_txt.go 2.7 KB

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