Skip to content
12 changes: 11 additions & 1 deletion pkg/registry/buildctx.go
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,17 @@ func buildCtx(cmd *cobra.Command, cs *spec.CommandSpec, args []string, r *Regist
return nil, err
}
for _, f := range cs.Flags {
if f.Required && cmdctx.GetString(ctx.FlagValues, f.Name) == "" {
if !f.Required {
continue
}
var missing bool
switch {
case f.IsArray || f.IsMulti:
missing = len(cmdctx.GetStringSlice(ctx.FlagValues, f.Name)) == 0
default:
missing = cmdctx.GetString(ctx.FlagValues, f.Name) == ""
}
if missing {
if len(f.CompletionValues) > 0 {
return nil, fmt.Errorf("flag --%s is required (%s)", f.Name, strings.Join(f.CompletionValues, ", "))
}
Expand Down
31 changes: 31 additions & 0 deletions pkg/registry/buildctx_workflow_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,37 @@ func TestBuildCtx_WorkflowRequiredFlag(t *testing.T) {
}
}

func TestBuildCtx_WorkflowRequiredArrayFlag(t *testing.T) {
r := New()
registerWorkflowExecute(t, r, "reqarrayflag", &spec.CommandSpec{
Flags: []spec.Flag{
{Name: "keys", Required: true, IsArray: true, Description: "keys to remove"},
},
})
cs := r.GetSpec(VerbExecute, "reqarrayflag")

t.Run("missing", func(t *testing.T) {
cmd := buildWorkflowTestCmd(t, r, cs)
_, err := buildCtx(cmd, cs, []string{"my-id"}, r)
if err == nil {
t.Fatal("buildCtx() = nil, want error")
}
if !strings.Contains(err.Error(), "flag --keys is required") {
t.Fatalf("buildCtx() error %q missing expected substring", err)
}
})

t.Run("provided", func(t *testing.T) {
cmd := buildWorkflowTestCmd(t, r, cs)
if err := cmd.ParseFlags([]string{"--keys", "key-one,key-two"}); err != nil {
t.Fatalf("ParseFlags: %v", err)
}
if _, err := buildCtx(cmd, cs, []string{"my-id"}, r); err != nil {
t.Fatalf("buildCtx() = %v, want no error", err)
}
})
}

func TestBuildCtx_WorkflowIdPartsTooMany(t *testing.T) {
r := New()
registerWorkflowExecute(t, r, "cluster", &spec.CommandSpec{
Expand Down
Loading