Skip to content

Commit 9c2faac

Browse files
[CAP-9048] support named-parameter (object) input for task runs (#296)
Supports named-parameter (object) input for task runs (invocation and display). This has been supported via the API and SDK for some time, but not (well) in the CLI. GitOrigin-RevId: 01e3f5d9733a379dcc592aaa34b6f305a8d4d1da
1 parent 75bc040 commit 9c2faac

File tree

4 files changed

+38
-38
lines changed

4 files changed

+38
-38
lines changed

pkg/taskrun/details.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ func TaskRunDetailsFormat(taskRun *wfclient.TaskRunDetails) []tui.KeyValue {
3030
{Key: "Completed At", Value: completedAt},
3131
}
3232

33+
inputJSON, err := json.Marshal(taskRun.Input)
34+
if err == nil {
35+
keyValues = append(keyValues, tui.KeyValue{Key: "Input", Value: string(inputJSON)})
36+
}
37+
3338
if taskRun.Error != nil {
3439
keyValues = append(keyValues, tui.KeyValue{Key: "Error", Value: *taskRun.Error})
3540
}

pkg/tasks/repo.go

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,10 @@ type Repo struct {
1616
client *client.ClientWithResponses
1717
}
1818

19-
func (r *Repo) RunTask(ctx context.Context, taskID string, input []interface{}) (*workflows.TaskRun, error) {
20-
var taskData workflows.TaskData
21-
if err := taskData.FromTaskData0(input); err != nil {
22-
return nil, fmt.Errorf("failed to convert input to TaskData: %w", err)
23-
}
24-
19+
func (r *Repo) RunTask(ctx context.Context, taskID string, input *workflows.TaskData) (*workflows.TaskRun, error) {
2520
resp, err := r.client.CreateTaskWithResponse(ctx, client.CreateTaskJSONRequestBody{
2621
Task: taskID,
27-
Input: taskData,
22+
Input: *input,
2823
})
2924

3025
if err != nil {

pkg/text/string.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package text
22

33
import (
4+
"encoding/json"
45
"fmt"
56

67
"github.com/render-oss/cli/pkg/client"
@@ -46,6 +47,12 @@ func Version(workflowID string) func(wfv *wfclient.WorkflowVersion) string {
4647
}
4748

4849
func TaskRunDetails(taskRun *wfclient.TaskRunDetails) string {
50+
inputStr := ""
51+
inputJSON, err := json.Marshal(taskRun.Input)
52+
if err == nil {
53+
inputStr = fmt.Sprintf(",\ninput: %s", string(inputJSON))
54+
}
55+
4956
errorOrResults := ""
5057
if taskRun.Results != nil {
5158
errorOrResults = fmt.Sprintf(",\nresults: %v", taskRun.Results)
@@ -54,6 +61,6 @@ func TaskRunDetails(taskRun *wfclient.TaskRunDetails) string {
5461
}
5562

5663
return FormatStringF(
57-
"Task run details for %s: status %s, started at %s, completed at %s%s",
58-
taskRun.Id, taskRun.Status, taskRun.StartedAt, taskRun.CompletedAt, errorOrResults)
64+
"Task run details for %s: status %s, started at %s, completed at %s%s%s",
65+
taskRun.Id, taskRun.Status, taskRun.StartedAt, taskRun.CompletedAt, inputStr, errorOrResults)
5966
}

pkg/tui/views/workflows/loader.go

Lines changed: 22 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@ package workflows
33
import (
44
"context"
55
"encoding/json"
6-
"errors"
76
"fmt"
8-
"io"
9-
"strings"
107
"time"
118

129
"github.com/render-oss/cli/pkg/client"
@@ -49,43 +46,39 @@ func (t *WorkflowLoader) CreateTaskRun(ctx context.Context, input TaskRunInput)
4946
return t.taskRepo.RunTask(ctx, input.TaskID, inputData)
5047
}
5148

52-
func unmarshalInputData(input string) ([]interface{}, error) {
53-
var parsedInputs []interface{}
54-
49+
func unmarshalInputData(input string) (*workflows.TaskData, error) {
5550
if len(input) == 0 {
5651
return nil, fmt.Errorf("Task input is required.")
5752
}
5853

5954
inputRaw := []byte(input)
6055

61-
if err := json.Unmarshal(inputRaw, &parsedInputs); err != nil {
62-
var syntaxErr *json.SyntaxError
63-
var unmarshaltypeErr *json.UnmarshalTypeError
64-
if errors.As(err, &syntaxErr) || errors.Is(err, io.ErrUnexpectedEOF) {
65-
return nil, fmt.Errorf("The task input has invalid JSON.")
66-
} else if errors.As(err, &unmarshaltypeErr) {
67-
actualType := friendlyTypeName(unmarshaltypeErr.Value)
68-
return nil, fmt.Errorf("Expected type array for task input, received type %s.", actualType)
69-
} else {
70-
return nil, err
71-
}
56+
// Validate that the input is valid JSON
57+
if !json.Valid(inputRaw) {
58+
return nil, fmt.Errorf("The task input has invalid JSON.")
7259
}
7360

74-
return parsedInputs, nil
75-
}
61+
var taskData workflows.TaskData
7662

77-
// friendlyTypeName converts type names from Go's json.UnmarshalTypeError to user-friendly names
78-
func friendlyTypeName(typeName string) string {
79-
typeName = strings.TrimSpace(typeName)
63+
// Try to parse as array (TaskData0 contains positional arguments)
64+
var arrayInput workflows.TaskData0
65+
if err := json.Unmarshal(inputRaw, &arrayInput); err == nil {
66+
if err := taskData.FromTaskData0(arrayInput); err != nil {
67+
return nil, fmt.Errorf("failed to convert input to TaskData: %w", err)
68+
}
69+
return &taskData, nil
70+
}
8071

81-
switch typeName {
82-
case "[]interface {}":
83-
return "array"
84-
case "bool":
85-
return "boolean"
86-
default:
87-
return typeName
72+
// Try to parse as object (TaskData1 contains named parameters)
73+
var objectInput workflows.TaskData1
74+
if err := json.Unmarshal(inputRaw, &objectInput); err == nil {
75+
if err := taskData.FromTaskData1(objectInput); err != nil {
76+
return nil, fmt.Errorf("failed to convert input to TaskData: %w", err)
77+
}
78+
return &taskData, nil
8879
}
80+
81+
return nil, fmt.Errorf("Task input must be a JSON array or object.")
8982
}
9083

9184
func (w *WorkflowLoader) LoadVersionList(ctx context.Context, input VersionListInput, cur client.Cursor) (client.Cursor, []*wfclient.WorkflowVersion, error) {

0 commit comments

Comments
 (0)