diff options
Diffstat (limited to 'internal/task/task.go')
| -rw-r--r-- | internal/task/task.go | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/internal/task/task.go b/internal/task/task.go new file mode 100644 index 0000000..dcb3e9a --- /dev/null +++ b/internal/task/task.go @@ -0,0 +1,61 @@ +package task + +import ( + "bufio" + "bytes" + "encoding/json" + "os/exec" +) + +// Task represents a taskwarrior task as returned by `task export`. +type Task struct { + ID int `json:"id"` + UUID string `json:"uuid"` + Description string `json:"description"` + Tags []string `json:"tags"` + Status string `json:"status"` +} + +// Add creates a new task with the given description and tags. +func Add(description string, tags []string) error { + args := []string{"add"} + for _, t := range tags { + if len(t) > 0 && t[0] != '+' { + t = "+" + t + } + args = append(args, t) + } + args = append(args, description) + + cmd := exec.Command("task", args...) + return cmd.Run() +} + +// Export retrieves all tasks using `task export rc.json.array=off` and parses +// the JSON output into a slice of Task structs. +func Export() ([]Task, error) { + cmd := exec.Command("task", "export", "rc.json.array=off") + out, err := cmd.Output() + if err != nil { + return nil, err + } + + var tasks []Task + scanner := bufio.NewScanner(bytes.NewReader(out)) + for scanner.Scan() { + line := scanner.Bytes() + line = bytes.TrimSpace(line) + if len(line) == 0 { + continue + } + var t Task + if err := json.Unmarshal(line, &t); err != nil { + return nil, err + } + tasks = append(tasks, t) + } + if err := scanner.Err(); err != nil { + return nil, err + } + return tasks, nil +} |
