Skip to content

Commit

Permalink
helpful error message when flag is missing values
Browse files Browse the repository at this point in the history
  • Loading branch information
pyqlsa committed Jun 11, 2022
1 parent 9d72e94 commit 63df81c
Show file tree
Hide file tree
Showing 2 changed files with 104 additions and 4 deletions.
100 changes: 100 additions & 0 deletions kong_test.go
Expand Up @@ -1561,3 +1561,103 @@ func TestHelpShouldStillWork(t *testing.T) {
// program; errors will not propagate in the real world).
require.Error(t, err)
}

func TestSliceDecoderHelpfulErrorMsg(t *testing.T) {
tests := []struct {
name string
cli interface{}
args []string
err string
}{
{
"DefaultRune",
&struct {
Stuff []string
}{},
[]string{"--stuff"},
`--stuff: missing argument: expecting "<arg>,..."`,
},
{
"SpecifiedRune",
&struct {
Stuff []string `sep:","`
}{},
[]string{"--stuff"},
`--stuff: missing argument: expecting "<arg>,..."`,
},
{
"SpaceRune",
&struct {
Stuff []string `sep:" "`
}{},
[]string{"--stuff"},
`--stuff: missing argument: expecting "<arg> ..."`,
},
{
"OtherRune",
&struct {
Stuff []string `sep:"_"`
}{},
[]string{"--stuff"},
`--stuff: missing argument: expecting "<arg>_..."`,
},
}
for _, test := range tests {
test := test
t.Run(test.name, func(t *testing.T) {
p := mustNew(t, test.cli)
_, err := p.Parse(test.args)
require.EqualError(t, err, test.err)
})
}
}

func TestMapDecoderHelpfulErrorMsg(t *testing.T) {
tests := []struct {
name string
cli interface{}
args []string
expected string
}{
{
"DefaultRune",
&struct {
Stuff map[string]int
}{},
[]string{"--stuff"},
`--stuff: missing argument: expecting "<key>=<value>;..."`,
},
{
"SpecifiedRune",
&struct {
Stuff map[string]int `mapsep:";"`
}{},
[]string{"--stuff"},
`--stuff: missing argument: expecting "<key>=<value>;..."`,
},
{
"SpaceRune",
&struct {
Stuff map[string]int `mapsep:" "`
}{},
[]string{"--stuff"},
`--stuff: missing argument: expecting "<key>=<value> ..."`,
},
{
"OtherRune",
&struct {
Stuff map[string]int `mapsep:","`
}{},
[]string{"--stuff"},
`--stuff: missing argument: expecting "<key>=<value>,..."`,
},
}
for _, test := range tests {
test := test
t.Run(test.name, func(t *testing.T) {
p := mustNew(t, test.cli)
_, err := p.Parse(test.args)
require.EqualError(t, err, test.expected)
})
}
}
8 changes: 4 additions & 4 deletions mapper.go
Expand Up @@ -439,17 +439,17 @@ func mapDecoder(r *Registry) MapperFunc {
target.Set(reflect.MakeMap(target.Type()))
}
el := target.Type()
sep := ctx.Value.Tag.MapSep
mapsep := ctx.Value.Tag.MapSep
var childScanner *Scanner
if ctx.Value.Flag != nil {
t := ctx.Scan.Pop()
// If decoding a flag, we need an argument.
if t.IsEOL() {
return errors.New("unexpected EOL")
return fmt.Errorf("missing argument: expecting \"<key>=<value>%c...\"", mapsep)
}
switch v := t.Value.(type) {
case string:
childScanner = ScanAsType(t.Type, SplitEscaped(v, sep)...)
childScanner = ScanAsType(t.Type, SplitEscaped(v, mapsep)...)

case []map[string]interface{}:
for _, m := range v {
Expand Down Expand Up @@ -520,7 +520,7 @@ func sliceDecoder(r *Registry) MapperFunc {
t := ctx.Scan.Pop()
// If decoding a flag, we need an argument.
if t.IsEOL() {
return errors.New("unexpected EOL")
return fmt.Errorf("missing argument: expecting \"<arg>%c...\"", sep)
}
switch v := t.Value.(type) {
case string:
Expand Down

0 comments on commit 63df81c

Please sign in to comment.