Skip to content

Commit 04686fa

Browse files
authored
Merge pull request #63 from choria-io/62
(#62) Correctly validate all flags and args
2 parents 0dec005 + 1236d03 commit 04686fa

File tree

4 files changed

+22
-35
lines changed

4 files changed

+22
-35
lines changed

app.go

Lines changed: 15 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -622,42 +622,24 @@ func (a *Application) execute(context *ParseContext, selected []string) (string,
622622
}
623623

624624
func (a *Application) validateFlagsAndArgs(context *ParseContext) error {
625-
flagElements := map[string]*ParseElement{}
626625
for _, element := range context.Elements {
627626
if flag, ok := element.Clause.(*FlagClause); ok {
628-
if flag.validator == nil {
629-
return nil
627+
if flag.validator != nil {
628+
err := flag.validator(*element.Value)
629+
if err != nil {
630+
return fmt.Errorf("%s: %w", flag.name, err)
631+
}
630632
}
631-
flagElements[flag.name] = element
632633
}
633634
}
634635

635-
argElements := map[string]*ParseElement{}
636636
for _, element := range context.Elements {
637637
if arg, ok := element.Clause.(*ArgClause); ok {
638-
if arg.validator == nil {
639-
return nil
640-
}
641-
argElements[arg.name] = element
642-
}
643-
}
644-
645-
for _, flag := range flagElements {
646-
clause := flag.Clause.(*FlagClause)
647-
if clause.validator != nil {
648-
err := clause.validator(*flag.Value)
649-
if err != nil {
650-
return fmt.Errorf("%s: %w", clause.name, err)
651-
}
652-
}
653-
}
654-
655-
for _, arg := range argElements {
656-
clause := arg.Clause.(*ArgClause)
657-
if clause.validator != nil {
658-
err := clause.validator(*arg.Value)
659-
if err != nil {
660-
return fmt.Errorf("%s: %w", clause.name, err)
638+
if arg.validator != nil {
639+
err := arg.validator(*element.Value)
640+
if err != nil {
641+
return fmt.Errorf("%s: %w", arg.name, err)
642+
}
661643
}
662644
}
663645
}
@@ -784,7 +766,6 @@ func (a *Application) setValues(context *ParseContext) (selected []string, err e
784766
}
785767

786768
func (a *Application) applyValidators(context *ParseContext) (err error) {
787-
// Call command validation functions.
788769
for _, element := range context.Elements {
789770
if cmd, ok := element.Clause.(*CmdClause); ok && cmd.validator != nil {
790771
if err = cmd.validator(cmd); err != nil {
@@ -795,8 +776,12 @@ func (a *Application) applyValidators(context *ParseContext) (err error) {
795776

796777
if a.validator != nil {
797778
err = a.validator(a)
779+
if err != nil {
780+
return err
781+
}
798782
}
799-
return err
783+
784+
return nil
800785
}
801786

802787
func (a *Application) applyPreActions(context *ParseContext, dispatch bool) error {

flags_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,9 @@ func TestValidator(t *testing.T) {
411411

412412
app := newTestApp()
413413

414+
app.Arg("first", "First arg").String()
414415
arg := app.Arg("arg", "A arg").Default("a").Validator(regexpValidator("^[abc]$")).String()
416+
app.Flag("first", "First arg").String()
415417
flag := app.Flag("flag", "A flag").Validator(regexpValidator("^[xyz]$")).String()
416418

417419
_, err := app.Parse([]string{"--flag", "x"})
@@ -421,14 +423,14 @@ func TestValidator(t *testing.T) {
421423

422424
*arg = ""
423425
*flag = ""
424-
_, err = app.Parse([]string{"b", "--flag", "x"})
426+
_, err = app.Parse([]string{"1st", "b", "--flag", "x"})
425427
assert.NoError(t, err)
426428
assert.Equal(t, *flag, "x")
427429
assert.Equal(t, *arg, "b")
428430

429431
*arg = ""
430432
*flag = ""
431-
_, err = app.Parse([]string{"z", "--flag", "x"})
433+
_, err = app.Parse([]string{"1st", "z", "--flag", "x"})
432434
assert.Error(t, err, `does not validate using "^[abc]$"`)
433435
assert.Equal(t, *flag, "")
434436
assert.Equal(t, *arg, "")

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ go 1.23.0
44

55
require (
66
github.com/stretchr/testify v1.10.0
7-
golang.org/x/text v0.24.0
7+
golang.org/x/text v0.28.0
88
)
99

1010
require (

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
44
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
55
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
66
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
7-
golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
8-
golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
7+
golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
8+
golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
99
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
1010
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
1111
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

0 commit comments

Comments
 (0)