parsesec.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package parsesec
  2. import (
  3. "fmt"
  4. "strconv"
  5. "sync"
  6. )
  7. /*
  8. Парсер секунд
  9. */
  10. // ParseSec -- парсер секунд
  11. type ParseSec struct {
  12. val int
  13. block sync.RWMutex
  14. }
  15. // NewParseSec -- возвращает новый *ParseSec
  16. func NewParseSec() *ParseSec {
  17. return &ParseSec{}
  18. }
  19. // Get -- возвращает хранимое значение
  20. func (sf *ParseSec) Get() int {
  21. sf.block.RLock()
  22. defer sf.block.RUnlock()
  23. return sf.val
  24. }
  25. // String -- возвращает строковое значение секунд
  26. func (sf *ParseSec) 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 *ParseSec) Reset() {
  34. sf.block.Lock()
  35. defer sf.block.Unlock()
  36. sf.val = 0
  37. }
  38. // Parse -- устанавливает значение секунд
  39. func (sf *ParseSec) Parse(strSec string) error {
  40. sf.block.Lock()
  41. defer sf.block.Unlock()
  42. iSec, err := strconv.Atoi(strSec)
  43. if err != nil {
  44. return fmt.Errorf("ParseSec.Parse(): секунды(%v) не число, err=%w", strSec, err)
  45. }
  46. if err := sf.set(iSec); err != nil {
  47. return fmt.Errorf("ParseSec.Parse(): in internal setting, err=\n\t%w", err)
  48. }
  49. return nil
  50. }
  51. // Set -- устанавливает целочисленное значение
  52. func (sf *ParseSec) Set(iSec int) error {
  53. sf.block.Lock()
  54. defer sf.block.Unlock()
  55. if err := sf.set(iSec); err != nil {
  56. return fmt.Errorf("ParseSec.Set(): in internal setting int, err=\n\t%w", err)
  57. }
  58. return nil
  59. }
  60. // Внутренняя установка значения секунд
  61. func (sf *ParseSec) set(iSec int) error {
  62. if !(0 <= iSec && iSec < 60) {
  63. return fmt.Errorf("ParseSec.set(): секунды(%v) не в диапазоне 0..60", iSec)
  64. }
  65. sf.val = iSec
  66. return nil
  67. }