package main import ( "strings" "time" timertxt "git.bullercodeworks.com/brian/go-timertxt" ) func (a *AppState) getMostRecentTimer() (*timertxt.Timer, error) { wrk, err := a.TimerList.GetMostRecentTimer() if err != nil { // Couldn't find a timer in the 'timer.txt'... Check the 'done' file if err = a.LoadDoneList(); err != nil { return nil, err } wrk, err = a.DoneList.GetMostRecentTimer() if err != nil { return nil, err } } return wrk, nil } func (a *AppState) SetTimerFinished(id int, end time.Time) error { var t *timertxt.Timer var err error if t, err = a.TimerList.GetTimer(id); err != nil { return err } t.FinishDate = end t.Finished = true return nil } func (a *AppState) addTimer(timerString string) error { t, err := timertxt.ParseTimer(timerString) if err != nil { return err } if t.StartDate.IsZero() { t.StartDate = time.Now() } a.TimerList.AddTimer(t) return a.WriteList() } func (a *AppState) archiveTimer(id int) error { var err error var timer *timertxt.Timer if timer, err = a.TimerList.GetTimer(id); err != nil { return err } if err := a.TimerList.ArchiveTimerToFile(*timer, app.getDoneFile()); err != nil { return err } a.TimerList.RemoveTimer(*timer) return a.WriteList() } func (a *AppState) unarchiveTimer(id int) error { var err error var timer *timertxt.Timer if timer, err = a.DoneList.GetTimer(id); err != nil { return err } a.TimerList.AddTimer(timer) if err = a.WriteList(); err != nil { return err } a.DoneList.RemoveTimer(*timer) return a.WriteDoneList() } func (a *AppState) LoadTimerList() error { var err error var tl timertxt.TimerList tl, err = timertxt.LoadFromFilename(a.getTimerFile()) tl.Sort(timertxt.SORT_UNFINISHED_START) a.TimerList = &tl return err } func (a *AppState) WriteList() error { return a.TimerList.WriteToFilename(a.getTimerFile()) } func (a *AppState) LoadDoneList() error { var err error var tl timertxt.TimerList tl, err = timertxt.LoadFromFilename(a.getDoneFile()) a.DoneList = &tl return err } func (a *AppState) WriteDoneList() error { return a.DoneList.WriteToFilename(a.getDoneFile()) } func (a *AppState) getFilterPredicate(filter string) func(timertxt.Timer) bool { var predicates []func(timertxt.Timer) bool // If none of the 'filter' is in upper-case, do a case-insensitive filter checkCase := true if strings.ToLower(filter) == filter { checkCase = false } filterParts := strings.Split(filter, " ") for _, part := range filterParts { if strings.HasPrefix(part, "@") { predicates = append(predicates, func(t timertxt.Timer) bool { for _, v := range t.Contexts { if "@"+v == part { return true } } return false }) } else if strings.HasPrefix(part, "+") { predicates = append(predicates, func(t timertxt.Timer) bool { for _, v := range t.Projects { if "+"+v == part { return true } } return false }) } else { predicates = append(predicates, func(t timertxt.Timer) bool { val := t.Original if !checkCase { val = strings.ToLower(t.Original) } return strings.Contains(val, part) }) } } return func(t timertxt.Timer) bool { for _, v := range predicates { if v(t) { return true } } return false } }