safe_string.go 1.9 KB

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