parse_hour.go 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. return alias.МилСек(сам.знач * 3_600 * 1_000)
  26. }
  27. // Получ -- возвращает хранимое значение
  28. func (сам *ПарсерЧас) Получ() alias.Час {
  29. сам.блок.RLock()
  30. defer сам.блок.RUnlock()
  31. return сам.знач
  32. }
  33. // String -- возвращает строковое значение часов
  34. func (сам *ПарсерЧас) String() string {
  35. сам.блок.RLock()
  36. defer сам.блок.RUnlock()
  37. res := fmt.Sprintf("%02d", сам.знач)
  38. return res
  39. }
  40. // Сброс -- сбрасывает значение часов
  41. func (сам *ПарсерЧас) Сброс() {
  42. сам.блок.Lock()
  43. defer сам.блок.Unlock()
  44. сам.знач = 0
  45. }
  46. // Уст -- устанавливает значение часов
  47. //
  48. // Значение часов может быть больше 24
  49. func (сам *ПарсерЧас) Уст(часы alias.Время) error {
  50. сам.блок.Lock()
  51. defer сам.блок.Unlock()
  52. цЧасы, err := strconv.Atoi(string(часы))
  53. if err != nil {
  54. return fmt.Errorf("ПарсерЧас.Уст(): часы(%q) не число, err=\n\t%w", часы, err)
  55. }
  56. if цЧасы < 0 {
  57. return fmt.Errorf("ПарсерЧас.Уст(): часы(%q) меньше нуля, err=\n\t%w", часы, err)
  58. }
  59. if err := сам.уст(alias.Час(цЧасы)); err != nil {
  60. return fmt.Errorf("ПарсерЧас.Уст(): in internal set hour(%q), err=\n\t%w", часы, err)
  61. }
  62. return nil
  63. }
  64. // УстЧас -- устанавливает числовое значение часов
  65. func (сам *ПарсерЧас) УстЧас(часы alias.Час) error {
  66. сам.блок.Lock()
  67. defer сам.блок.Unlock()
  68. if err := сам.уст(часы); err != nil {
  69. return fmt.Errorf("ПарсерЧас.УстЧас(): in internal set hour(%v), err=\n\t%w", часы, err)
  70. }
  71. return nil
  72. }
  73. // Внутренняя процедура для числовой установки часов без блокировки
  74. func (сам *ПарсерЧас) уст(часы alias.Час) error {
  75. сам.знач = часы
  76. return nil
  77. }