parser_time.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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. сам.час.Сброс()
  36. сам.мин.Сброс()
  37. сам.сек.Сброс()
  38. }
  39. // ПолучМилСек -- возвращает общее число секунд
  40. func (сам *ПарсерВремя) ПолучМилСек() АМилСек {
  41. сам.блок.RLock()
  42. defer сам.блок.RUnlock()
  43. return сам.всегоМилСек
  44. }
  45. // Уст -- разбирает строковое представление на части
  46. func (сам *ПарсерВремя) Уст(стрВремя АВремя) {
  47. сам.блок.Lock()
  48. defer сам.блок.Unlock()
  49. Hassert(стрВремя != "", "CountTime.Set(): val is empty")
  50. сам.Сброс()
  51. списВремя := strings.Split(string(стрВремя), ":")
  52. фнМинУст := func() {
  53. стрСек := АВремя(списВремя[1])
  54. сам.сек.Уст(стрСек)
  55. стрМин := АВремя(списВремя[0])
  56. сам.мин.Уст(стрМин)
  57. }
  58. фнЧасУст := func() {
  59. стрСек := АВремя(списВремя[2])
  60. сам.сек.Уст(стрСек)
  61. стрМин := АВремя(списВремя[1])
  62. сам.мин.Уст(стрМин)
  63. стрЧас := АВремя(списВремя[0])
  64. сам.час.Уст(стрЧас)
  65. }
  66. // Разбить время, перевести в секунды
  67. switch len(списВремя) {
  68. case 1: // Только секунды
  69. стрСек := АВремя(списВремя[0])
  70. сам.сек.Уст(стрСек)
  71. case 2: // Минуты, секунды
  72. фнМинУст()
  73. case 3:
  74. фнЧасУст()
  75. default:
  76. Hassert(false, "ПарсерВремя.Уст(): сбойная строка времени(%q)", стрВремя)
  77. }
  78. сам.всегоМилСек = сам.час.ПолучМилСек() + сам.мин.ПолучМилСек() + сам.сек.ПолучМилСек()
  79. }
  80. // Час -- возвращает хранимые часы
  81. func (сам *ПарсерВремя) Час() ИПарсерЧас {
  82. return сам.час
  83. }
  84. // Мин -- возвращает хранимые минуты
  85. func (сам *ПарсерВремя) Мин() ИПарсерМин {
  86. return сам.мин
  87. }
  88. // Сек -- возвращает хранимые секунды
  89. func (сам *ПарсерВремя) Сек() ИПарсерСек {
  90. return сам.сек
  91. }
  92. // String -- возвращает хранимое время
  93. func (сам *ПарсерВремя) String() string {
  94. res := сам.час.String() + ":" + сам.мин.String() + ":" + сам.сек.String()
  95. return res
  96. }