parsehour.go 2.1 KB

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