safe_bool.go 3.1 KB

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