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