| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- package parser_time
- import (
- "strings"
- "sync"
- . "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
- . "wartank/app/lev0/alias"
- . "wartank/app/lev0/types"
- "wartank/app/lev1/product/parser_time/parse_hour"
- "wartank/app/lev1/product/parser_time/parse_min"
- "wartank/app/lev1/product/parser_time/parse_sec"
- )
- /*
- Выковыривает из строки время и потокобезопасно хранит его
- */
- // ПарсерВремя -- потокобезопасный ковырятор строки времени
- type ПарсерВремя struct {
- всегоМилСек АМилСек // Числовое значение хранимого времени
- час ИПарсерЧас // Часы метки времени
- мин ИПарсерМин // Минуты метки времени
- сек ИПарсерСек // Секунды метки времени
- блок sync.RWMutex
- }
- // НовПарсерВремя -- возвращает новый *ParseTime
- func НовПарсерВремя() *ПарсерВремя {
- сам := &ПарсерВремя{
- час: parse_hour.НовПарсерЧас(),
- мин: parse_min.НовПарсерМинут(),
- сек: parse_sec.НовПарсерСекунд(),
- }
- _ = ИПарсерВремя(сам)
- return сам
- }
- // ПолучМилСек -- возвращает общее число секунд
- func (сам *ПарсерВремя) ПолучМилСек() АМилСек {
- сам.блок.RLock()
- defer сам.блок.RUnlock()
- return сам.всегоМилСек
- }
- // Уст -- разбирает строковое представление на части
- func (сам *ПарсерВремя) Уст(стрВремя АВремя) {
- сам.блок.Lock()
- defer сам.блок.Unlock()
- Hassert(стрВремя != "", "CountTime.Set(): val is empty")
- списВремя := strings.Split(string(стрВремя), ":")
- фнМинУст := func() {
- стрСек := АВремя(списВремя[1])
- сам.сек.Уст(стрСек)
- стрМин := АВремя(списВремя[0])
- сам.мин.Уст(стрМин)
- }
- фнЧасУст := func() {
- стрСек := АВремя(списВремя[2])
- сам.сек.Уст(стрСек)
- стрМин := АВремя(списВремя[1])
- сам.мин.Уст(стрМин)
- стрЧас := АВремя(списВремя[0])
- сам.час.Уст(стрЧас)
- }
- // Разбить время, перевести в секунды
- switch len(списВремя) {
- case 1: // Только секунды
- стрСек := АВремя(списВремя[0])
- сам.сек.Уст(стрСек)
- case 2: // Минуты, секунды
- фнМинУст()
- case 3:
- фнЧасУст()
- default:
- Hassert(false, "ПарсерВремя.Уст(): сбойная строка времени(%q)", стрВремя)
- }
- сам.всегоМилСек = сам.час.ПолучМилСек() + сам.мин.ПолучМилСек() + сам.сек.ПолучМилСек()
- }
- // Час -- возвращает хранимые часы
- func (сам *ПарсерВремя) Час() ИПарсерЧас {
- return сам.час
- }
- // Мин -- возвращает хранимые минуты
- func (сам *ПарсерВремя) Мин() ИПарсерМин {
- return сам.мин
- }
- // Сек -- возвращает хранимые секунды
- func (сам *ПарсерВремя) Сек() ИПарсерСек {
- return сам.сек
- }
|