parser_time.go 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package parser_time
  2. import (
  3. "strings"
  4. "sync"
  5. . "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
  6. . "wartank/app/lev0/alias"
  7. . "wartank/app/lev0/types"
  8. "wartank/app/lev1/product/parser_time/parse_hour"
  9. "wartank/app/lev1/product/parser_time/parse_min"
  10. "wartank/app/lev1/product/parser_time/parse_sec"
  11. )
  12. /*
  13. Выковыривает из строки время и потокобезопасно хранит его
  14. */
  15. // ПарсерВремя -- потокобезопасный ковырятор строки времени
  16. type ПарсерВремя struct {
  17. всегоМилСек АМилСек // Числовое значение хранимого времени
  18. час ИПарсерЧас // Часы метки времени
  19. мин ИПарсерМин // Минуты метки времени
  20. сек ИПарсерСек // Секунды метки времени
  21. блок sync.RWMutex
  22. }
  23. // НовПарсерВремя -- возвращает новый *ParseTime
  24. func НовПарсерВремя() *ПарсерВремя {
  25. сам := &ПарсерВремя{
  26. час: parse_hour.НовПарсерЧас(),
  27. мин: parse_min.НовПарсерМинут(),
  28. сек: parse_sec.НовПарсерСекунд(),
  29. }
  30. _ = ИПарсерВремя(сам)
  31. return сам
  32. }
  33. // ПолучМилСек -- возвращает общее число секунд
  34. func (сам *ПарсерВремя) ПолучМилСек() АМилСек {
  35. сам.блок.RLock()
  36. defer сам.блок.RUnlock()
  37. return сам.всегоМилСек
  38. }
  39. // Уст -- разбирает строковое представление на части
  40. func (сам *ПарсерВремя) Уст(стрВремя АВремя) {
  41. сам.блок.Lock()
  42. defer сам.блок.Unlock()
  43. Hassert(стрВремя != "", "CountTime.Set(): val is empty")
  44. списВремя := strings.Split(string(стрВремя), ":")
  45. фнМинУст := func() {
  46. стрСек := АВремя(списВремя[1])
  47. сам.сек.Уст(стрСек)
  48. стрМин := АВремя(списВремя[0])
  49. сам.мин.Уст(стрМин)
  50. }
  51. фнЧасУст := func() {
  52. стрСек := АВремя(списВремя[2])
  53. сам.сек.Уст(стрСек)
  54. стрМин := АВремя(списВремя[1])
  55. сам.мин.Уст(стрМин)
  56. стрЧас := АВремя(списВремя[0])
  57. сам.час.Уст(стрЧас)
  58. }
  59. // Разбить время, перевести в секунды
  60. switch len(списВремя) {
  61. case 1: // Только секунды
  62. стрСек := АВремя(списВремя[0])
  63. сам.сек.Уст(стрСек)
  64. case 2: // Минуты, секунды
  65. фнМинУст()
  66. case 3:
  67. фнЧасУст()
  68. default:
  69. Hassert(false, "ПарсерВремя.Уст(): сбойная строка времени(%q)", стрВремя)
  70. }
  71. сам.всегоМилСек = сам.час.ПолучМилСек() + сам.мин.ПолучМилСек() + сам.сек.ПолучМилСек()
  72. }
  73. // Час -- возвращает хранимые часы
  74. func (сам *ПарсерВремя) Час() ИПарсерЧас {
  75. return сам.час
  76. }
  77. // Мин -- возвращает хранимые минуты
  78. func (сам *ПарсерВремя) Мин() ИПарсерМин {
  79. return сам.мин
  80. }
  81. // Сек -- возвращает хранимые секунды
  82. func (сам *ПарсерВремя) Сек() ИПарсерСек {
  83. return сам.сек
  84. }