safe_bool.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // package safe_bool -- потокобезопасный булевый признак
  2. package safe_bool
  3. import (
  4. "fmt"
  5. "os"
  6. "strings"
  7. "sync"
  8. . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
  9. )
  10. // safeBool -- потокобезопасный булевый признак
  11. type safeBool struct {
  12. sync.RWMutex
  13. val bool
  14. }
  15. // NewSafeBool -- возвращает новый потокобезопасный булевый признак
  16. func NewSafeBool() ISafeBool {
  17. sf := &safeBool{}
  18. return sf
  19. }
  20. // NewSafeBoolFromStr -- возвращает новое потокобезоппсное булево из строки
  21. func NewSafeBoolFromStr(strVal string) Result[ISafeBool] {
  22. sf := NewSafeBool()
  23. res := sf.FromStr(strVal)
  24. if res.IsErr() {
  25. err := fmt.Errorf("NewSafeBoolFromStr(): in parse str(%v), err=\n\t%w", strVal, res.Err())
  26. return NewErr[ISafeBool](err)
  27. }
  28. return NewOk(sf)
  29. }
  30. // NewSafeBoolGetenv -- возвращает новое потокобезоппсное целое из окружения
  31. func NewSafeBoolGetenv(env string) Result[ISafeBool] {
  32. sf := NewSafeBool()
  33. res := sf.Getenv(env)
  34. if res.IsErr() {
  35. err := fmt.Errorf("NewSafeBoolGetenv(): in parse env(%v), err=\n\t%w", env, res.Err())
  36. return NewErr[ISafeBool](err)
  37. }
  38. return NewOk(sf)
  39. }
  40. // Get -- возвращает хранимый булевый признак
  41. func (sf *safeBool) Get() bool {
  42. sf.RLock()
  43. defer sf.RUnlock()
  44. return sf.val
  45. }
  46. // Set -- устанавливает булевый признак
  47. func (sf *safeBool) Set() {
  48. sf.Lock()
  49. defer sf.Unlock()
  50. sf.val = true
  51. }
  52. // Reset -- сбрасывает булевый признак
  53. func (sf *safeBool) Reset() {
  54. sf.Lock()
  55. defer sf.Unlock()
  56. sf.val = false
  57. }
  58. // FromStr -- получает число из строки
  59. func (sf *safeBool) FromStr(strVal string) Result[bool] {
  60. strVal = strings.ToLower(strVal)
  61. sf.Lock()
  62. defer sf.Unlock()
  63. switch strVal {
  64. case "true":
  65. sf.val = true
  66. case "false":
  67. sf.val = false
  68. default:
  69. return NewErr[bool](fmt.Errorf("safeBool.FromStr(): val(%v) bad", strVal))
  70. }
  71. return NewOk(sf.val)
  72. }
  73. // Getenv -- получает значение из окружения
  74. func (sf *safeBool) Getenv(env string) Result[bool] {
  75. strVal := os.Getenv(env)
  76. res := sf.FromStr(strVal)
  77. if res.IsErr() {
  78. err := fmt.Errorf("safeBool.Getenv(): from env %v, err=\n\t%w", env, res.Err())
  79. return NewErr[bool](err)
  80. }
  81. return res
  82. }