safe_bool.go 2.5 KB

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