parse_hour.go 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package parse_hour
  2. import (
  3. "fmt"
  4. "strconv"
  5. "sync"
  6. "wartank/pkg/alias"
  7. "wartank/pkg/types"
  8. )
  9. /*
  10. Потокобезопасно парсит из строки значение часа
  11. */
  12. // ПарсерЧас -- потокобезопасный парсер часа из строки
  13. type ПарсерЧас struct {
  14. знач alias.Час // Значение часа
  15. блок sync.RWMutex
  16. }
  17. // НовПарсерЧас -- возвращает новый *ПарсерЧас
  18. func НовПарсерЧас() *ПарсерЧас {
  19. сам := &ПарсерЧас{}
  20. _ = types.ИПарсерЧас(сам)
  21. return сам
  22. }
  23. // Получ -- возвращает хранимое значение
  24. func (сам *ПарсерЧас) Получ() alias.Час {
  25. сам.блок.RLock()
  26. defer сам.блок.RUnlock()
  27. return сам.знач
  28. }
  29. // String -- возвращает строковое значение часов
  30. func (сам *ПарсерЧас) String() string {
  31. сам.блок.RLock()
  32. defer сам.блок.RUnlock()
  33. res := fmt.Sprintf("%02d", сам.знач)
  34. return res
  35. }
  36. // Сброс -- сбрасывает значение часов
  37. func (сам *ПарсерЧас) Сброс() {
  38. сам.блок.Lock()
  39. defer сам.блок.Unlock()
  40. сам.знач = 0
  41. }
  42. // Уст -- устанавливает значение часов
  43. //
  44. // Значение часов может быть больше 24
  45. func (sf *ПарсерЧас) Уст(часы string) error {
  46. sf.блок.Lock()
  47. defer sf.блок.Unlock()
  48. цЧасы, err := strconv.Atoi(часы)
  49. if err != nil {
  50. return fmt.Errorf("ПарсерЧас.Уст(): часы(%q) не число, err=\n\t%w", часы, err)
  51. }
  52. if цЧасы<0{
  53. return fmt.Errorf("ПарсерЧас.Уст(): часы(%q) меньше нуля, err=\n\t%w", часы, err)
  54. }
  55. if err := sf.уст(alias.Час(цЧасы)); err != nil {
  56. return fmt.Errorf("ПарсерЧас.Уст(): in internal set hour(%q), err=\n\t%w", часы, err)
  57. }
  58. return nil
  59. }
  60. // УстЦел -- устанавливает числовое значение часов
  61. func (sf *ПарсерЧас) УстЦел(часы alias.Час) error {
  62. sf.блок.Lock()
  63. defer sf.блок.Unlock()
  64. if err := sf.уст(часы); err != nil {
  65. return fmt.Errorf("ПарсерЧас.УстЦел(): in internal set hour(%v), err=\n\t%w", часы, err)
  66. }
  67. return nil
  68. }
  69. // Внутренняя процедура для числовой установки часов без блокировки
  70. func (sf *ПарсерЧас) уст(часы alias.Час) error {
  71. sf.знач = часы
  72. return nil
  73. }