all repos — todoxt @ c5899e9d434d528f19a7e775a4affb98efbae057

TUI for todo.txt

scheduling.go (view raw)

 1package main
 2
 3import (
 4	"strings"
 5	"time"
 6
 7	todo "github.com/1set/todotxt"
 8)
 9
10type Frequency = int
11
12const (
13	Day Frequency = iota
14	Week
15	Month
16	Quarter
17	Year
18)
19
20var frequencyMap = map[string]Frequency{
21	"day":      Day,
22	"daily":    Day,
23	"week":     Week,
24	"weekly":   Week,
25	"month":    Month,
26	"monthly":  Month,
27	"quarter":  Quarter,
28	"quartery": Quarter,
29	"year":     Year,
30	"yearly":   Year,
31}
32
33func handleRecurringTask(task todo.Task) *todo.Task {
34	freqValue := task.AdditionalTags["freq"]
35
36	if freqValue != "" {
37		newTask, _ := todo.ParseTask(task.Original)
38		dueDate := getDueDate(task)
39		frequency := frequencyMap[strings.ToLower(freqValue)]
40		newTask.DueDate = getNextDueDate(dueDate, frequency)
41		return newTask
42	}
43
44	return &todo.Task{}
45}
46
47func getNextDueDate(dueDate time.Time, frequency Frequency) time.Time {
48	switch frequency {
49	case Day:
50		return dueDate.AddDate(0, 0, 1)
51	case Week:
52		return dueDate.AddDate(0, 0, 7)
53	case Month:
54		return dueDate.AddDate(0, 1, 0)
55	case Quarter:
56		return dueDate.AddDate(0, 3, 0)
57	case Year:
58		return dueDate.AddDate(1, 0, 0)
59	default:
60		return dueDate
61	}
62}
63
64func getDueDate(task todo.Task) time.Time {
65	if task.HasDueDate() {
66		return task.DueDate
67	} else {
68		return time.Now()
69	}
70}