safe_string.go 1.7 KB

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