diff options
Diffstat (limited to 'internal/askcli/command_info.go')
| -rw-r--r-- | internal/askcli/command_info.go | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/internal/askcli/command_info.go b/internal/askcli/command_info.go new file mode 100644 index 0000000..37fb49b --- /dev/null +++ b/internal/askcli/command_info.go @@ -0,0 +1,84 @@ +package askcli + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "io" + "strings" +) + +func (d *Dispatcher) handleInfo(ctx context.Context, args []string, stdout, stderr io.Writer) (int, error) { + tasks, code, err := d.infoTasks(ctx, args, stderr) + if err != nil { + writeInfoError(stderr, err) + return code, nil + } + if d.jsonOutput { + data, err := json.Marshal(tasks) + if err != nil { + fmt.Fprintf(stderr, "error: failed to marshal JSON: %v\n", err) + return 1, nil + } + stdout.Write(data) + io.WriteString(stdout, "\n") + } else { + allUUIDs := append([]string{tasks[0].UUID}, tasks[0].Depends...) + aliases, err := ensureTaskAliasesForUUIDs(allUUIDs) + if err != nil { + fmt.Fprintf(stderr, "error: failed to load task aliases: %v\n", err) + return 1, nil + } + io.WriteString(stdout, FormatTaskInfo(tasks[0], displayTaskAlias(tasks[0].UUID, aliases), aliases)) + } + return 0, nil +} + +func (d *Dispatcher) infoTasks(ctx context.Context, args []string, stderr io.Writer) ([]TaskExport, int, error) { + if len(args) >= 2 { + _, tasks, code, err := d.resolveTaskSelector(ctx, args[1], stderr) + return tasks, code, err + } + return d.startedInfoTasks(ctx, stderr) +} + +func (d *Dispatcher) startedInfoTasks(ctx context.Context, stderr io.Writer) ([]TaskExport, int, error) { + tasks, code, err := d.exportTasks(ctx, []string{"started", "export"}, stderr) + if err != nil { + return nil, code, err + } + switch len(tasks) { + case 0: + return nil, 1, fmt.Errorf("no started task found") + case 1: + return tasks, 0, nil + default: + return nil, 1, fmt.Errorf("multiple started tasks found; pass an ID or UUID explicitly") + } +} + +func (d *Dispatcher) exportTasks(ctx context.Context, args []string, stderr io.Writer) ([]TaskExport, int, error) { + var outBuf bytes.Buffer + code, err := d.runner.Run(ctx, args, nil, &outBuf, stderr) + if code != 0 { + return nil, code, err + } + tasks, err := ParseTaskExport(&outBuf) + if err != nil { + return nil, 1, err + } + if len(tasks) == 0 && len(args) > 0 && strings.HasPrefix(args[0], "uuid:") { + return nil, 1, fmt.Errorf("task not found") + } + return tasks, 0, nil +} + +func writeInfoError(stderr io.Writer, err error) { + msg := err.Error() + if strings.HasPrefix(msg, "error:") { + io.WriteString(stderr, msg+"\n") + return + } + fmt.Fprintf(stderr, "error: %v\n", err) +} |
