gte/internal/process/list.go

131 lines
2.4 KiB
Go
Raw Normal View History

2021-07-09 09:42:44 +02:00
package process
import (
"errors"
"fmt"
2021-09-19 11:59:26 +02:00
"ewintr.nl/gte/internal/storage"
"ewintr.nl/gte/internal/task"
2021-07-09 09:42:44 +02:00
)
var (
ErrInvalidReqs = errors.New("could not make sense of requirements")
ErrListProcess = errors.New("could not fetch task list")
)
// ListReqs specifies the requirements in AND fashion for a list of tasks
type ListReqs struct {
Due task.Date
IncludeBefore bool
2021-08-09 06:46:13 +02:00
Folder string
Project string
2021-09-06 07:24:29 +02:00
ApplyUpdates bool
2021-07-09 09:42:44 +02:00
}
func (lr ListReqs) Valid() bool {
2021-08-09 06:46:13 +02:00
switch {
case lr.Folder != "":
return true
case lr.Project != "":
return true
case !lr.Due.IsZero():
return true
}
return false
2021-07-09 09:42:44 +02:00
}
// List finds all tasks that satisfy the given requirements
type List struct {
local storage.LocalRepository
reqs ListReqs
}
type ListResult struct {
2021-08-20 09:06:35 +02:00
Tasks []*task.LocalTask
2021-07-09 09:42:44 +02:00
}
func NewList(local storage.LocalRepository, reqs ListReqs) *List {
return &List{
local: local,
reqs: reqs,
}
}
func (l *List) Process() (*ListResult, error) {
if !l.reqs.Valid() {
return &ListResult{}, ErrInvalidReqs
}
2021-08-25 06:52:48 +02:00
potentialTasks, err := l.local.FindAll()
if err != nil {
return &ListResult{}, fmt.Errorf("%w: %v", ErrListProcess, err)
2021-08-09 06:46:13 +02:00
}
2021-09-06 07:24:29 +02:00
// updates
if l.reqs.ApplyUpdates {
for i := range potentialTasks {
potentialTasks[i].ApplyUpdate()
}
var undoneTasks []*task.LocalTask
for _, pt := range potentialTasks {
if !pt.Done {
undoneTasks = append(undoneTasks, pt)
}
}
potentialTasks = undoneTasks
2021-09-06 07:24:29 +02:00
}
2021-08-25 06:52:48 +02:00
// folder
if l.reqs.Folder != "" {
var folderTasks []*task.LocalTask
for _, pt := range potentialTasks {
if pt.Folder == l.reqs.Folder {
folderTasks = append(folderTasks, pt)
}
2021-08-09 06:46:13 +02:00
}
2021-08-25 06:52:48 +02:00
potentialTasks = folderTasks
2021-08-09 06:46:13 +02:00
}
if l.reqs.Due.IsZero() && l.reqs.Project == "" {
return &ListResult{
Tasks: potentialTasks,
}, nil
}
2021-08-25 06:52:48 +02:00
// project
2021-08-09 06:46:13 +02:00
if l.reqs.Project != "" {
2021-08-20 09:06:35 +02:00
var projectTasks []*task.LocalTask
2021-08-09 06:46:13 +02:00
for _, pt := range potentialTasks {
if pt.Project == l.reqs.Project {
projectTasks = append(projectTasks, pt)
}
}
potentialTasks = projectTasks
}
if l.reqs.Due.IsZero() {
return &ListResult{
Tasks: potentialTasks,
}, nil
2021-07-09 09:42:44 +02:00
}
2021-08-20 09:06:35 +02:00
dueTasks := []*task.LocalTask{}
2021-07-09 09:42:44 +02:00
for _, t := range potentialTasks {
switch {
2021-08-09 06:46:13 +02:00
case t.Due.IsZero():
// skip
2021-07-09 09:42:44 +02:00
case t.Due.Equal(l.reqs.Due):
dueTasks = append(dueTasks, t)
case l.reqs.IncludeBefore && l.reqs.Due.After(t.Due):
dueTasks = append(dueTasks, t)
}
}
return &ListResult{
Tasks: dueTasks,
}, nil
}