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 сам.сек }