diff --git a/requires.go b/requires.go index c0b10edb..010a9964 100644 --- a/requires.go +++ b/requires.go @@ -13,20 +13,10 @@ func (e *Executor) areTaskRequiredVarsSet(t *ast.Task) error { } var missingVars []string - var notAllowedValuesVars []errors.NotAllowedVar for _, requiredVar := range t.Requires.Vars { - value, ok := t.Vars.Get(requiredVar.Name) + _, ok := t.Vars.Get(requiredVar.Name) if !ok { missingVars = append(missingVars, requiredVar.Name) - } else { - value, isString := value.Value.(string) - if isString && requiredVar.Enum != nil && !slices.Contains(requiredVar.Enum, value) { - notAllowedValuesVars = append(notAllowedValuesVars, errors.NotAllowedVar{ - Value: value, - Enum: requiredVar.Enum, - Name: requiredVar.Name, - }) - } } } @@ -37,6 +27,29 @@ func (e *Executor) areTaskRequiredVarsSet(t *ast.Task) error { } } + return nil +} + +func (e *Executor) areTaskRequiredVarsAllowedValuesSet(t *ast.Task) error { + if t.Requires == nil || len(t.Requires.Vars) == 0 { + return nil + } + + var notAllowedValuesVars []errors.NotAllowedVar + for _, requiredVar := range t.Requires.Vars { + varValue, _ := t.Vars.Get(requiredVar.Name) + + value, isString := varValue.Value.(string) + if isString && requiredVar.Enum != nil && !slices.Contains(requiredVar.Enum, value) { + notAllowedValuesVars = append(notAllowedValuesVars, errors.NotAllowedVar{ + Value: value, + Enum: requiredVar.Enum, + Name: requiredVar.Name, + }) + } + + } + if len(notAllowedValuesVars) > 0 { return &errors.TaskNotAllowedVars{ TaskName: t.Name(), diff --git a/task.go b/task.go index 60c25537..c8639197 100644 --- a/task.go +++ b/task.go @@ -185,6 +185,11 @@ func (e *Executor) RunTask(ctx context.Context, call *ast.Call) error { if err != nil { return err } + + if err := e.areTaskRequiredVarsAllowedValuesSet(t); err != nil { + return err + } + if !e.Watch && atomic.AddInt32(e.taskCallCount[t.Task], 1) >= MaximumTaskCall { return &errors.TaskCalledTooManyTimesError{ TaskName: t.Task, diff --git a/task_test.go b/task_test.go index 7acfe383..93c74ede 100644 --- a/task_test.go +++ b/task_test.go @@ -180,12 +180,12 @@ func TestRequires(t *testing.T) { } require.NoError(t, e.Setup()) - require.ErrorContains(t, e.Run(context.Background(), &ast.Call{Task: "missing-var"}), "task: Task \"missing-var\" cancelled because it is missing required variables: foo") + require.ErrorContains(t, e.Run(context.Background(), &ast.Call{Task: "missing-var"}), "task: Task \"missing-var\" cancelled because it is missing required variables: FOO") buff.Reset() require.NoError(t, e.Setup()) vars := ast.NewVars() - vars.Set("foo", ast.Var{Value: "bar"}) + vars.Set("FOO", ast.Var{Value: "bar"}) require.NoError(t, e.Run(context.Background(), &ast.Call{ Task: "missing-var", Vars: vars, @@ -193,11 +193,15 @@ func TestRequires(t *testing.T) { buff.Reset() require.NoError(t, e.Setup()) - require.ErrorContains(t, e.Run(context.Background(), &ast.Call{Task: "validation-var", Vars: vars}), "task: Task \"validation-var\" cancelled because it is missing required variables:\n - foo has an invalid value : 'bar' (allowed values : [one two])") + require.ErrorContains(t, e.Run(context.Background(), &ast.Call{Task: "validation-var", Vars: vars}), "task: Task \"validation-var\" cancelled because it is missing required variables:\n - FOO has an invalid value : 'bar' (allowed values : [one two])") buff.Reset() require.NoError(t, e.Setup()) - vars.Set("foo", ast.Var{Value: "one"}) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "validation-var-dynamic", Vars: vars})) + buff.Reset() + + require.NoError(t, e.Setup()) + vars.Set("FOO", ast.Var{Value: "one"}) require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "validation-var", Vars: vars})) buff.Reset() diff --git a/testdata/requires/Taskfile.yml b/testdata/requires/Taskfile.yml index 21983878..1bc638e4 100644 --- a/testdata/requires/Taskfile.yml +++ b/testdata/requires/Taskfile.yml @@ -7,7 +7,7 @@ tasks: missing-var: requires: vars: - - foo + - FOO cmd: echo "{{.foo}}" var-defined-in-task: @@ -19,10 +19,21 @@ tasks: cmd: echo "{{.FOO}}" + validation-var-dynamic: + vars: + FOO: + sh: echo "one" + + requires: + vars: + - name: FOO + enum: ['one', 'two'] + + validation-var: requires: vars: - - name: foo + - name: FOO enum: ['one', 'two']