parser_time.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package parser_time
  2. import (
  3. "fmt"
  4. "strings"
  5. "sync"
  6. "wartank/pkg/components/parser_time/parse_hour"
  7. "wartank/pkg/components/parser_time/parsemin"
  8. "wartank/pkg/components/parser_time/parsesec"
  9. "wartank/pkg/types"
  10. )
  11. /*
  12. Выковыривает из строки время и потокобезопасно хранит его
  13. */
  14. // ПарсерВремя -- потокобезопасный ковырятор строки времени
  15. type ПарсерВремя struct {
  16. всегоСек int // Числовое значение хранимого времени
  17. час types.ИПарсерЧас // Часы метки времени
  18. мин *parsemin.ParseMin // Минуты метки времени
  19. сек *parsesec.ParseSec // Секунды метки времени
  20. block sync.RWMutex
  21. }
  22. // НовПарсерВремя -- возвращает новый *ParseTime
  23. func НовПарсерВремя() *ПарсерВремя {
  24. сам := &ПарсерВремя{
  25. час: parse_hour.НовПарсерЧас(),
  26. мин: parsemin.NewParseMin(),
  27. сек: parsesec.NewParseSec(),
  28. }
  29. _ = types.ИПарсерВремя(сам)
  30. return сам
  31. }
  32. // ВсегоСек -- возвращает общее число секунд
  33. func (sf *ПарсерВремя) ВсегоСек() int {
  34. sf.block.RLock()
  35. defer sf.block.RUnlock()
  36. return sf.всегоСек
  37. }
  38. // Уст -- разбирает строковое представление на части
  39. func (sf *ПарсерВремя) Уст(strTime string) error {
  40. sf.block.Lock()
  41. defer sf.block.Unlock()
  42. if strTime == "" {
  43. return fmt.Errorf("CountTime.Set(): val is empty")
  44. }
  45. // Разбить время, перевести в секунды
  46. lstTime := strings.Split(strTime, ":")
  47. switch len(lstTime) {
  48. case 1: // Только секунды
  49. sf.час.Сброс()
  50. sf.мин.Reset()
  51. if err := sf.сек.Parse(lstTime[0]); err != nil {
  52. return fmt.Errorf("ParseTime(): in parse second only, err=\n\t%w", err)
  53. }
  54. case 2: // Минуты, секунды
  55. sf.час.Сброс()
  56. if err := sf.мин.Parse(lstTime[0]); err != nil {
  57. return fmt.Errorf("ParseTime(): in parse [min]/sec, err=\n\t%w", err)
  58. }
  59. if err := sf.сек.Parse(lstTime[1]); err != nil {
  60. return fmt.Errorf("ParseTime(): in parse min/[sec], err=\n\t%w", err)
  61. }
  62. case 3:
  63. strHour := lstTime[0]
  64. strMin := lstTime[1]
  65. strSec := lstTime[2]
  66. if err := sf.сек.Parse(strSec); err != nil {
  67. return fmt.Errorf("ParseTime(): in parse hour/min/[sec], err=\n\t%w", err)
  68. }
  69. if err := sf.мин.Parse(strMin); err != nil {
  70. return fmt.Errorf("ParseTime(): in parse hour/[min]/sec, err=\n\t%w", err)
  71. }
  72. if err := sf.час.Уст(strHour); err != nil {
  73. return fmt.Errorf("ParseTime(): in parse [hour]/min/sec, err=\n\t%w", err)
  74. }
  75. default:
  76. return fmt.Errorf("ParseTime(): bad time val(%q)", strTime)
  77. }
  78. sf.всегоСек = int(sf.час.Получ()*3600) + sf.мин.Get()*60 + sf.сек.Get()
  79. return nil
  80. }
  81. // Hour -- возвращает хранимые часы
  82. func (sf *ПарсерВремя) Час() types.ИПарсерЧас {
  83. return sf.час
  84. }
  85. // Min -- возвращает хранимые минуты
  86. func (sf *ПарсерВремя) Min() *parsemin.ParseMin {
  87. return sf.мин
  88. }
  89. // Sec -- возвращает хранимые секунды
  90. func (sf *ПарсерВремя) Sec() *parsesec.ParseSec {
  91. return sf.сек
  92. }
  93. // String -- возвращает хранимое время
  94. func (sf *ПарсерВремя) String() string {
  95. res := sf.час.String() + ":" + sf.мин.String() + ":" + sf.сек.String()
  96. return res
  97. }