parser_time.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. package parser_time
  2. import (
  3. "fmt"
  4. "strings"
  5. "sync"
  6. "wartank/pkg/alias"
  7. "wartank/pkg/components/parser_time/parse_hour"
  8. "wartank/pkg/components/parser_time/parse_min"
  9. "wartank/pkg/components/parser_time/parse_sec"
  10. "wartank/pkg/types"
  11. )
  12. /*
  13. Выковыривает из строки время и потокобезопасно хранит его
  14. */
  15. // ПарсерВремя -- потокобезопасный ковырятор строки времени
  16. type ПарсерВремя struct {
  17. всегоМилСек alias.МилСек // Числовое значение хранимого времени
  18. час types.ИПарсерЧас // Часы метки времени
  19. мин types.ИПарсерМин // Минуты метки времени
  20. сек types.ИПарсерСек // Секунды метки времени
  21. блок sync.RWMutex
  22. }
  23. // НовПарсерВремя -- возвращает новый *ParseTime
  24. func НовПарсерВремя() *ПарсерВремя {
  25. сам := &ПарсерВремя{
  26. час: parse_hour.НовПарсерЧас(),
  27. мин: parse_min.НовПарсерМинут(),
  28. сек: parse_sec.НовПарсерСекунд(),
  29. }
  30. _ = types.ИПарсерВремя(сам)
  31. return сам
  32. }
  33. // Сброс -- сбрасывает значение интервала времени по требованию
  34. func (сам *ПарсерВремя) Сброс() {
  35. сам.час.Сброс()
  36. сам.мин.Сброс()
  37. сам.сек.Сброс()
  38. }
  39. // ПолучМилСек -- возвращает общее число секунд
  40. func (сам *ПарсерВремя) ПолучМилСек() alias.МилСек {
  41. сам.блок.RLock()
  42. defer сам.блок.RUnlock()
  43. return сам.всегоМилСек
  44. }
  45. // Уст -- разбирает строковое представление на части
  46. func (сам *ПарсерВремя) Уст(стрВремя alias.Время) error {
  47. сам.блок.Lock()
  48. defer сам.блок.Unlock()
  49. if стрВремя == "" {
  50. return fmt.Errorf("CountTime.Set(): val is empty")
  51. }
  52. сам.Сброс()
  53. списВремя := strings.Split(string(стрВремя), ":")
  54. фнСекУст := func(стрВремя alias.Время) error {
  55. if ош := сам.сек.Уст(стрВремя); ош != nil {
  56. return fmt.Errorf("ПарсерВремя.Уст().фнСекУст(): при установке секунд, ош=\n\t%w", ош)
  57. }
  58. return nil
  59. }
  60. фнМинУст := func() error {
  61. стрСек := alias.Время(списВремя[1])
  62. if ош := фнСекУст(стрСек); ош != nil {
  63. return fmt.Errorf("ПарсерВремя.Уст().фнМинУст(): при установке секунд, ош=\n\t%w", ош)
  64. }
  65. стрМин := alias.Время(списВремя[0])
  66. if ош := сам.мин.Уст(стрМин); ош != nil {
  67. return fmt.Errorf("ПарсерВремя.Уст().фнМинУст(): при установке минут, ош=\n\t%w", ош)
  68. }
  69. return nil
  70. }
  71. фнЧасУст := func() error {
  72. стрСек := alias.Время(списВремя[2])
  73. if ош := фнСекУст(стрСек); ош != nil {
  74. return fmt.Errorf("ПарсерВремя.Уст().фнЧасУст(): при установке секунд, ош=\n\t%w", ош)
  75. }
  76. стрМин := alias.Время(списВремя[1])
  77. if ош := сам.мин.Уст(стрМин); ош != nil {
  78. return fmt.Errorf("ПарсерВремя.Уст().фнЧасУст(): при установке минут, ош=\n\t%w", ош)
  79. }
  80. стрЧас := alias.Время(списВремя[0])
  81. if ош := сам.час.Уст(стрЧас); ош != nil {
  82. return fmt.Errorf("ПарсерВремя.Уст().фнЧасУст(): при установке часов, ош=\n\t%w", ош)
  83. }
  84. return nil
  85. }
  86. // Разбить время, перевести в секунды
  87. switch len(списВремя) {
  88. case 1: // Только секунды
  89. стрСек := alias.Время(списВремя[0])
  90. if ош := фнСекУст(стрСек); ош != nil {
  91. return ош
  92. }
  93. case 2: // Минуты, секунды
  94. if ош := фнМинУст(); ош != nil {
  95. return ош
  96. }
  97. case 3:
  98. if ош := фнЧасУст(); ош != nil {
  99. return ош
  100. }
  101. default:
  102. return fmt.Errorf("ПарсерВремя.Уст(): сбойная строка времени(%q)", стрВремя)
  103. }
  104. сам.всегоМилСек = сам.час.ПолучМилСек() + сам.мин.ПолучМилСек() + сам.сек.ПолучМилСек()
  105. return nil
  106. }
  107. // Час -- возвращает хранимые часы
  108. func (сам *ПарсерВремя) Час() types.ИПарсерЧас {
  109. return сам.час
  110. }
  111. // Мин -- возвращает хранимые минуты
  112. func (сам *ПарсерВремя) Мин() types.ИПарсерМин {
  113. return сам.мин
  114. }
  115. // Сек -- возвращает хранимые секунды
  116. func (сам *ПарсерВремя) Сек() types.ИПарсерСек {
  117. return сам.сек
  118. }
  119. // String -- возвращает хранимое время
  120. func (сам *ПарсерВремя) String() string {
  121. res := сам.час.String() + ":" + сам.мин.String() + ":" + сам.сек.String()
  122. return res
  123. }