diff --git a/kong_test.go b/kong_test.go index 34e89c9..b6abfd7 100644 --- a/kong_test.go +++ b/kong_test.go @@ -718,6 +718,22 @@ func TestMapFlagWithSliceValue(t *testing.T) { assert.Equal(t, map[string][]int{"a": {1, 2}, "b": {3}}, cli.Set) } +func TestMapFlagWithUnmappableValueType(t *testing.T) { + var cli struct { + Set map[string]any + } + _, err := mustNew(t, &cli).Parse([]string{"--set", "a=b"}) + assert.EqualError(t, err, "--set: no mapper for value type of map[string]interface {}") +} + +func TestMapFlagWithUnmappableKeyType(t *testing.T) { + var cli struct { + Set map[complex128]string + } + _, err := mustNew(t, &cli).Parse([]string{"--set", "a=b"}) + assert.EqualError(t, err, "--set: no mapper for key type of map[complex128]string") +} + type embeddedFlags struct { Embedded string } diff --git a/mapper.go b/mapper.go index 390b627..e973a5b 100644 --- a/mapper.go +++ b/mapper.go @@ -515,6 +515,9 @@ func mapDecoder(r *Registry) MapperFunc { keyScanner := ScanAsType(FlagValueToken, key) keyDecoder := r.ForNamedType(keyTypeName, el.Key()) + if keyDecoder == nil { + return fmt.Errorf("no mapper for key type of %s", target.Type()) + } keyValue := reflect.New(el.Key()).Elem() if err := keyDecoder.Decode(ctx.WithScanner(keyScanner), keyValue); err != nil { return fmt.Errorf("invalid map key %q", key) @@ -522,6 +525,9 @@ func mapDecoder(r *Registry) MapperFunc { valueScanner := ScanAsType(FlagValueToken, value) valueDecoder := r.ForNamedType(valueTypeName, el.Elem()) + if valueDecoder == nil { + return fmt.Errorf("no mapper for value type of %s", target.Type()) + } valueValue := reflect.New(el.Elem()).Elem() if err := valueDecoder.Decode(ctx.WithScanner(valueScanner), valueValue); err != nil { return fmt.Errorf("invalid map value %q", value)