| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- package parser_time
- import (
- "fmt"
- "strings"
- "sync"
- "wartank/pkg/alias"
- "wartank/pkg/components/parser_time/parse_hour"
- "wartank/pkg/components/parser_time/parse_min"
- "wartank/pkg/components/parser_time/parse_sec"
- "wartank/pkg/types"
- )
- /*
- Выковыривает из строки время и потокобезопасно хранит его
- */
- // ПарсерВремя -- потокобезопасный ковырятор строки времени
- type ПарсерВремя struct {
- всегоМилСек alias.МилСек // Числовое значение хранимого времени
- час types.ИПарсерЧас // Часы метки времени
- мин types.ИПарсерМин // Минуты метки времени
- сек types.ИПарсерСек // Секунды метки времени
- блок sync.RWMutex
- }
- // НовПарсерВремя -- возвращает новый *ParseTime
- func НовПарсерВремя() *ПарсерВремя {
- сам := &ПарсерВремя{
- час: parse_hour.НовПарсерЧас(),
- мин: parse_min.НовПарсерМинут(),
- сек: parse_sec.НовПарсерСекунд(),
- }
- _ = types.ИПарсерВремя(сам)
- return сам
- }
- // Сброс -- сбрасывает значение интервала времени по требованию
- func (сам *ПарсерВремя) Сброс() {
- сам.час.Сброс()
- сам.мин.Сброс()
- сам.сек.Сброс()
- }
- // ПолучМилСек -- возвращает общее число секунд
- func (сам *ПарсерВремя) ПолучМилСек() alias.МилСек {
- сам.блок.RLock()
- defer сам.блок.RUnlock()
- return сам.всегоМилСек
- }
- // Уст -- разбирает строковое представление на части
- func (сам *ПарсерВремя) Уст(стрВремя alias.Время) error {
- сам.блок.Lock()
- defer сам.блок.Unlock()
- if стрВремя == "" {
- return fmt.Errorf("CountTime.Set(): val is empty")
- }
- сам.Сброс()
- списВремя := strings.Split(string(стрВремя), ":")
- фнСекУст := func(стрВремя alias.Время) error {
- if ош := сам.сек.Уст(стрВремя); ош != nil {
- return fmt.Errorf("ПарсерВремя.Уст().фнСекУст(): при установке секунд, ош=\n\t%w", ош)
- }
- return nil
- }
- фнМинУст := func() error {
- стрСек := alias.Время(списВремя[1])
- if ош := фнСекУст(стрСек); ош != nil {
- return fmt.Errorf("ПарсерВремя.Уст().фнМинУст(): при установке секунд, ош=\n\t%w", ош)
- }
- стрМин := alias.Время(списВремя[0])
- if ош := сам.мин.Уст(стрМин); ош != nil {
- return fmt.Errorf("ПарсерВремя.Уст().фнМинУст(): при установке минут, ош=\n\t%w", ош)
- }
- return nil
- }
- фнЧасУст := func() error {
- стрСек := alias.Время(списВремя[2])
- if ош := фнСекУст(стрСек); ош != nil {
- return fmt.Errorf("ПарсерВремя.Уст().фнЧасУст(): при установке секунд, ош=\n\t%w", ош)
- }
- стрМин := alias.Время(списВремя[1])
- if ош := сам.мин.Уст(стрМин); ош != nil {
- return fmt.Errorf("ПарсерВремя.Уст().фнЧасУст(): при установке минут, ош=\n\t%w", ош)
- }
- стрЧас := alias.Время(списВремя[0])
- if ош := сам.час.Уст(стрЧас); ош != nil {
- return fmt.Errorf("ПарсерВремя.Уст().фнЧасУст(): при установке часов, ош=\n\t%w", ош)
- }
- return nil
- }
- // Разбить время, перевести в секунды
- switch len(списВремя) {
- case 1: // Только секунды
- стрСек := alias.Время(списВремя[0])
- if ош := фнСекУст(стрСек); ош != nil {
- return ош
- }
- case 2: // Минуты, секунды
- if ош := фнМинУст(); ош != nil {
- return ош
- }
- case 3:
- if ош := фнЧасУст(); ош != nil {
- return ош
- }
- default:
- return fmt.Errorf("ПарсерВремя.Уст(): сбойная строка времени(%q)", стрВремя)
- }
- сам.всегоМилСек = сам.час.ПолучМилСек() + сам.мин.ПолучМилСек() + сам.сек.ПолучМилСек()
- return nil
- }
- // Час -- возвращает хранимые часы
- func (сам *ПарсерВремя) Час() types.ИПарсерЧас {
- return сам.час
- }
- // Мин -- возвращает хранимые минуты
- func (сам *ПарсерВремя) Мин() types.ИПарсерМин {
- return сам.мин
- }
- // Сек -- возвращает хранимые секунды
- func (сам *ПарсерВремя) Сек() types.ИПарсерСек {
- return сам.сек
- }
- // String -- возвращает хранимое время
- func (сам *ПарсерВремя) String() string {
- res := сам.час.String() + ":" + сам.мин.String() + ":" + сам.сек.String()
- return res
- }
|