safe_bool.go 3.0 KB

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