(args []string)
| 140 | } |
| 141 | |
| 142 | func addTask(args []string) int { |
| 143 | if len(args) == 0 || args[0] == "" { |
| 144 | fmt.Fprintln(os.Stderr, "error: add task requires a name") |
| 145 | return 2 |
| 146 | } |
| 147 | name := args[0] |
| 148 | fs := flagSet("add task") |
| 149 | slugFlag := fs.String("slug", "", "short user-chosen slug (default: auto-generated from name)") |
| 150 | project := fs.String("project", "", "parent project slug (optional)") |
| 151 | workDir := fs.String("work-dir", "", "work directory (overrides project default)") |
| 152 | priority := fs.String("priority", "medium", "high|medium|low") |
| 153 | dueFlag := fs.String("due", "", "due date (YYYY-MM-DD, today, tomorrow, monday, 3d)") |
| 154 | assigneeFlag := fs.String("assignee", "", "optional assignee (default: self)") |
| 155 | var tags stringSliceFlag |
| 156 | fs.Var(&tags, "tag", "attach a tag (repeatable: --tag foo --tag bar)") |
| 157 | mkdir := fs.Bool("mkdir", false, "create --work-dir if it does not exist") |
| 158 | if err := fs.Parse(args[1:]); err != nil { |
| 159 | return 2 |
| 160 | } |
| 161 | |
| 162 | if !isValidPriority(*priority) { |
| 163 | fmt.Fprintf(os.Stderr, "error: priority must be high|medium|low, got %q\n", *priority) |
| 164 | return 2 |
| 165 | } |
| 166 | |
| 167 | dbPath, err := flowDBPath() |
| 168 | if err != nil { |
| 169 | fmt.Fprintf(os.Stderr, "error: %v\n", err) |
| 170 | return 1 |
| 171 | } |
| 172 | db, err := flowdb.OpenDB(dbPath) |
| 173 | if err != nil { |
| 174 | fmt.Fprintf(os.Stderr, "error: %v\n", err) |
| 175 | return 1 |
| 176 | } |
| 177 | defer db.Close() |
| 178 | |
| 179 | var slug string |
| 180 | if *slugFlag != "" { |
| 181 | slug = *slugFlag |
| 182 | } else { |
| 183 | baseSlug, err := Slugify(name) |
| 184 | if err != nil { |
| 185 | fmt.Fprintf(os.Stderr, "error: %v\n", err) |
| 186 | return 2 |
| 187 | } |
| 188 | slug, err = uniqueSlug(db, "tasks", baseSlug) |
| 189 | if err != nil { |
| 190 | fmt.Fprintf(os.Stderr, "error: %v\n", err) |
| 191 | return 1 |
| 192 | } |
| 193 | } |
| 194 | |
| 195 | // Resolve project first, since it may supply the default work_dir. |
| 196 | var projectSlug any = nil |
| 197 | var projectWorkDir string |
| 198 | if *project != "" { |
| 199 | p, err := flowdb.GetProject(db, *project) |
no test coverage detected