| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- package parser_time
- import (
- "fmt"
- "strings"
- "sync"
- "wartank/pkg/components/parser_time/parse_hour"
- "wartank/pkg/components/parser_time/parsemin"
- "wartank/pkg/components/parser_time/parsesec"
- "wartank/pkg/types"
- )
- /*
- Выковыривает из строки время и потокобезопасно хранит его
- */
- // ПарсерВремя -- потокобезопасный ковырятор строки времени
- type ПарсерВремя struct {
- всегоСек int // Числовое значение хранимого времени
- час types.ИПарсерЧас // Часы метки времени
- мин *parsemin.ParseMin // Минуты метки времени
- сек *parsesec.ParseSec // Секунды метки времени
- block sync.RWMutex
- }
- // НовПарсерВремя -- возвращает новый *ParseTime
- func НовПарсерВремя() *ПарсерВремя {
- сам := &ПарсерВремя{
- час: parse_hour.НовПарсерЧас(),
- мин: parsemin.NewParseMin(),
- сек: parsesec.NewParseSec(),
- }
- _ = types.ИПарсерВремя(сам)
- return сам
- }
- // ВсегоСек -- возвращает общее число секунд
- func (sf *ПарсерВремя) ВсегоСек() int {
- sf.block.RLock()
- defer sf.block.RUnlock()
- return sf.всегоСек
- }
- // Уст -- разбирает строковое представление на части
- func (sf *ПарсерВремя) Уст(strTime string) error {
- sf.block.Lock()
- defer sf.block.Unlock()
- if strTime == "" {
- return fmt.Errorf("CountTime.Set(): val is empty")
- }
- // Разбить время, перевести в секунды
- lstTime := strings.Split(strTime, ":")
- switch len(lstTime) {
- case 1: // Только секунды
- sf.час.Сброс()
- sf.мин.Reset()
- if err := sf.сек.Parse(lstTime[0]); err != nil {
- return fmt.Errorf("ParseTime(): in parse second only, err=\n\t%w", err)
- }
- case 2: // Минуты, секунды
- sf.час.Сброс()
- if err := sf.мин.Parse(lstTime[0]); err != nil {
- return fmt.Errorf("ParseTime(): in parse [min]/sec, err=\n\t%w", err)
- }
- if err := sf.сек.Parse(lstTime[1]); err != nil {
- return fmt.Errorf("ParseTime(): in parse min/[sec], err=\n\t%w", err)
- }
- case 3:
- strHour := lstTime[0]
- strMin := lstTime[1]
- strSec := lstTime[2]
- if err := sf.сек.Parse(strSec); err != nil {
- return fmt.Errorf("ParseTime(): in parse hour/min/[sec], err=\n\t%w", err)
- }
- if err := sf.мин.Parse(strMin); err != nil {
- return fmt.Errorf("ParseTime(): in parse hour/[min]/sec, err=\n\t%w", err)
- }
- if err := sf.час.Уст(strHour); err != nil {
- return fmt.Errorf("ParseTime(): in parse [hour]/min/sec, err=\n\t%w", err)
- }
- default:
- return fmt.Errorf("ParseTime(): bad time val(%q)", strTime)
- }
- sf.всегоСек = int(sf.час.Получ()*3600) + sf.мин.Get()*60 + sf.сек.Get()
- return nil
- }
- // Hour -- возвращает хранимые часы
- func (sf *ПарсерВремя) Час() types.ИПарсерЧас {
- return sf.час
- }
- // Min -- возвращает хранимые минуты
- func (sf *ПарсерВремя) Min() *parsemin.ParseMin {
- return sf.мин
- }
- // Sec -- возвращает хранимые секунды
- func (sf *ПарсерВремя) Sec() *parsesec.ParseSec {
- return sf.сек
- }
- // String -- возвращает хранимое время
- func (sf *ПарсерВремя) String() string {
- res := sf.час.String() + ":" + sf.мин.String() + ":" + sf.сек.String()
- return res
- }
|