package main import ( "strings" "time" todo "github.com/1set/todotxt" ) type Frequency = int const ( Day Frequency = iota Week Month Quarter Year ) var frequencyMap = map[string]Frequency{ "day": Day, "daily": Day, "week": Week, "weekly": Week, "month": Month, "monthly": Month, "quarter": Quarter, "quartery": Quarter, "year": Year, "yearly": Year, } func handleRecurringTask(task todo.Task) *todo.Task { freqValue := task.AdditionalTags["freq"] if freqValue != "" { newTask, _ := todo.ParseTask(task.Original) dueDate := getDueDate(task) frequency := frequencyMap[strings.ToLower(freqValue)] newTask.DueDate = getNextDueDate(dueDate, frequency) return newTask } return &todo.Task{} } func getNextDueDate(dueDate time.Time, frequency Frequency) time.Time { if dueDate.Before(time.Now()) { dueDate = time.Now() } switch frequency { case Day: return dueDate.AddDate(0, 0, 1) case Week: return dueDate.AddDate(0, 0, 7) case Month: return dueDate.AddDate(0, 1, 0) case Quarter: return dueDate.AddDate(0, 3, 0) case Year: return dueDate.AddDate(1, 0, 0) default: return dueDate } } func getDueDate(task todo.Task) time.Time { if task.HasDueDate() { return task.DueDate } else { return time.Now() } }