safe_string.go 1.9 KB

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