safe_bool.go 2.7 KB

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