helpful error message when flag is missing values (#310)

Fixes #277
This commit is contained in:
pyq-lsa
2022-06-11 14:29:19 -07:00
committed by GitHub
parent 9d72e94240
commit edc47ebc34
2 changed files with 106 additions and 6 deletions
+100
View File
@@ -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 value, expecting "<arg>,..."`,
},
{
"SpecifiedRune",
&struct {
Stuff []string `sep:","`
}{},
[]string{"--stuff"},
`--stuff: missing value, expecting "<arg>,..."`,
},
{
"SpaceRune",
&struct {
Stuff []string `sep:" "`
}{},
[]string{"--stuff"},
`--stuff: missing value, expecting "<arg> ..."`,
},
{
"OtherRune",
&struct {
Stuff []string `sep:"_"`
}{},
[]string{"--stuff"},
`--stuff: missing value, 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 value, expecting "<key>=<value>;..."`,
},
{
"SpecifiedRune",
&struct {
Stuff map[string]int `mapsep:";"`
}{},
[]string{"--stuff"},
`--stuff: missing value, expecting "<key>=<value>;..."`,
},
{
"SpaceRune",
&struct {
Stuff map[string]int `mapsep:" "`
}{},
[]string{"--stuff"},
`--stuff: missing value, expecting "<key>=<value> ..."`,
},
{
"OtherRune",
&struct {
Stuff map[string]int `mapsep:","`
}{},
[]string{"--stuff"},
`--stuff: missing value, 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)
})
}
}
+6 -6
View File
@@ -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 decoding a flag, we need an value.
if t.IsEOL() {
return errors.New("unexpected EOL")
return fmt.Errorf("missing value, 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 {
@@ -518,9 +518,9 @@ func sliceDecoder(r *Registry) MapperFunc {
var childScanner *Scanner
if ctx.Value.Flag != nil {
t := ctx.Scan.Pop()
// If decoding a flag, we need an argument.
// If decoding a flag, we need an value.
if t.IsEOL() {
return errors.New("unexpected EOL")
return fmt.Errorf("missing value, expecting \"<arg>%c...\"", sep)
}
switch v := t.Value.(type) {
case string: