safe_string.go 1.8 KB

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