all repos — todo.txt-go @ main

CLI tool for todo.txt files written in Go

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}