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 }