safe_int.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. // package safe_int -- потокобезопасный целое
  2. package safe_int
  3. import (
  4. "fmt"
  5. "os"
  6. "strconv"
  7. "sync"
  8. . "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
  9. )
  10. // safeInt -- потокобезопасное целое
  11. type safeInt struct {
  12. sync.RWMutex
  13. val int
  14. }
  15. // NewSafeInt -- возвращает новое потокобезопасное целое
  16. func NewSafeInt() ISafeInt {
  17. sf := &safeInt{}
  18. return sf
  19. }
  20. // NewSafeIntFromStr -- возвращает новое потокобезоппсное целое из строки
  21. func NewSafeIntFromStr(strVal string) Result[ISafeInt] {
  22. sf := NewSafeInt()
  23. res := sf.FromStr(strVal)
  24. if res.IsErr() {
  25. err := fmt.Errorf("NewSafeIntFromStr(): in parse str(%v), err=\n\t%w", strVal, res.Err())
  26. return NewErr[ISafeInt](err)
  27. }
  28. return NewOk(sf)
  29. }
  30. // NewSafeIntGetenv -- возвращает новое потокобезоппсное целое из окружения
  31. func NewSafeIntGetenv(env string) Result[ISafeInt] {
  32. sf := NewSafeInt()
  33. res := sf.Getenv(env)
  34. if res.IsErr() {
  35. err := fmt.Errorf("NewSafeIntGetenv(): in parse env(%v), err=\n\t%w", env, res.Err())
  36. return NewErr[ISafeInt](err)
  37. }
  38. return NewOk(sf)
  39. }
  40. // Get -- возвращает хранимое целое
  41. func (sf *safeInt) Get() int {
  42. sf.RLock()
  43. defer sf.RUnlock()
  44. return sf.val
  45. }
  46. // Set -- устанавливает целое
  47. func (sf *safeInt) Set(val int) {
  48. sf.Lock()
  49. defer sf.Unlock()
  50. sf.val = val
  51. }
  52. // Reset -- сбрасывает целое
  53. func (sf *safeInt) Reset() {
  54. sf.Lock()
  55. defer sf.Unlock()
  56. sf.val = 0
  57. }
  58. // FromStr -- получает число из строки
  59. func (sf *safeInt) FromStr(strVal string) Result[int] {
  60. iVal, err := strconv.Atoi(strVal)
  61. if err != nil {
  62. return NewErr[int](fmt.Errorf("safeInt.FromStr(): vak(%v) bad, err=\n\t%w", strVal, err))
  63. }
  64. sf.Lock()
  65. defer sf.Unlock()
  66. sf.val = iVal
  67. return NewOk(sf.val)
  68. }
  69. // Getenv -- получает значение из окружения
  70. func (sf *safeInt) Getenv(env string) Result[int] {
  71. strVal := os.Getenv(env)
  72. res := sf.FromStr(strVal)
  73. if res.IsErr() {
  74. err := fmt.Errorf("safeInt.Getenv(): from env %v, err=\n\t%w", env, res.Err())
  75. return NewErr[int](err)
  76. }
  77. return res
  78. }