safe_bool.go 2.6 KB

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