parsetime.go 3.2 KB

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