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 }