package main import ( "strings" "time" todotxt "github.com/br0xen/go-todotxt" ) func (a *AppState) addTask(taskString string) error { t, err := todotxt.ParseTask(taskString) if err != nil { return err } if t.CreatedDate.IsZero() { t.CreatedDate = time.Now() } a.TaskList.AddTask(t) return a.WriteList() } func (a *AppState) toggleTaskComplete(id int) error { var task *todotxt.Task var err error if task, err = a.TaskList.GetTask(id); err != nil { return err } if task.Completed { task.Reopen() } else { task.Complete() } return a.WriteList() } func (a *AppState) archiveTask(id int) error { var err error var task *todotxt.Task if task, err = a.TaskList.GetTask(id); err != nil { return err } if err := a.TaskList.ArchiveTaskToFile(*task, app.getDoneFile()); err != nil { return err } a.TaskList.RemoveTask(*task) return a.WriteList() } func (a *AppState) unarchiveTask(id int) error { var err error var task *todotxt.Task if task, err = a.DoneList.GetTask(id); err != nil { return err } a.TaskList.AddTask(task) if err = a.WriteList(); err != nil { return err } a.DoneList.RemoveTask(*task) return a.WriteDoneList() } func (a *AppState) getFilterPredicate(filter string) func(todotxt.Task) bool { var predicates []func(todotxt.Task) 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 todotxt.Task) bool { for _, v := range t.Contexts { if "@"+v == part { return true } } return false }) } else if strings.HasPrefix(part, "+") { predicates = append(predicates, func(t todotxt.Task) bool { for _, v := range t.Projects { if "+"+v == part { return true } } return false }) } else { predicates = append(predicates, func(t todotxt.Task) bool { val := t.Original if !checkCase { val = strings.ToLower(t.Original) } return strings.Contains(val, part) }) } } return func(t todotxt.Task) bool { for _, v := range predicates { if v(t) { return true } } return false } } func (a *AppState) LoadTaskList() error { var err error var tl todotxt.TaskList tl, err = todotxt.LoadFromFilename(a.getTodoFile()) a.TaskList = &tl return err } func (a *AppState) LoadDoneList() error { var err error var tl todotxt.TaskList tl, err = todotxt.LoadFromFilename(a.getDoneFile()) a.DoneList = &tl return err } func (a *AppState) WriteList() error { return a.TaskList.WriteToFilename(a.getTodoFile()) } func (a *AppState) WriteDoneList() error { return a.DoneList.WriteToFilename(a.getDoneFile()) }