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
49 if dueDate.Before(time.Now()) {
50 dueDate = time.Now()
51 }
52
53 switch frequency {
54 case Day:
55 return dueDate.AddDate(0, 0, 1)
56 case Week:
57 return dueDate.AddDate(0, 0, 7)
58 case Month:
59 return dueDate.AddDate(0, 1, 0)
60 case Quarter:
61 return dueDate.AddDate(0, 3, 0)
62 case Year:
63 return dueDate.AddDate(1, 0, 0)
64 default:
65 return dueDate
66 }
67}
68
69func getDueDate(task todo.Task) time.Time {
70 if task.HasDueDate() {
71 return task.DueDate
72 } else {
73 return time.Now()
74 }
75}