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}