package cmd import ( "fmt" "os" "git.jnss.me/joakim/opal/internal/engine" "github.com/spf13/cobra" ) var modifyCmd = &cobra.Command{ Use: "modify [filter...] [modifiers...]", Short: "Modify task attributes", Run: func(cmd *cobra.Command, args []string) { if err := modifyTasks(args); err != nil { fmt.Fprintf(os.Stderr, "Error: %v\n", err) os.Exit(1) } }, } func modifyTasks(args []string) error { // Split into filter and modifier // Simple heuristic: modifiers contain ':', filters might not filterArgs := []string{} modifierArgs := []string{} for _, arg := range args { // If it starts with + or -, it could be either // If it contains : and a value, it's likely a modifier // Numeric args are filters // For now, put everything in modifiers (will be improved) modifierArgs = append(modifierArgs, arg) } if len(modifierArgs) == 0 { return fmt.Errorf("no modifiers specified") } // Try to parse as filter first to get the ID filter, _ := engine.ParseFilter(filterArgs) ws, _ := engine.LoadWorkingSet() var tasks []*engine.Task if ws != nil && len(filter.IDs) > 0 { for _, id := range filter.IDs { task, err := ws.GetTaskByDisplayID(id) if err == nil { tasks = append(tasks, task) } } } if len(tasks) == 0 { return fmt.Errorf("no tasks to modify") } mod, err := engine.ParseModifier(modifierArgs) if err != nil { return fmt.Errorf("failed to parse modifiers: %w", err) } for _, task := range tasks { if err := mod.Apply(task); err != nil { return fmt.Errorf("failed to modify task: %w", err) } } fmt.Printf("Modified %d task(s).\n", len(tasks)) return nil }