Skip to content

Commit

Permalink
Fix map in map (#101)
Browse files Browse the repository at this point in the history
  • Loading branch information
cristaloleg committed Aug 14, 2021
1 parent 5ae6b2e commit 32ffc95
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 1 deletion.
29 changes: 29 additions & 0 deletions aconfig_test.go
Expand Up @@ -1360,3 +1360,32 @@ func TestSliceStructs(t *testing.T) {
t.Fatalf("want %v, got %v", want, got)
}
}

func TestMapOfMap(t *testing.T) {
type TestConfig struct {
Options map[string]float64
}
var cfg TestConfig

loader := LoaderFor(&cfg, Config{
SkipDefaults: true,
SkipEnv: true,
SkipFlags: true,
Files: []string{"testdata/toy.json"},
})

if err := loader.Load(); err != nil {
t.Fatal(err)
}

var want = TestConfig{
Options: map[string]float64{
"foo": 0.4,
"bar": 0.25,
},
}

if got := cfg; !reflect.DeepEqual(want, got) {
t.Fatalf("want %v, got %v", want, got)
}
}
21 changes: 20 additions & 1 deletion reflection.go
Expand Up @@ -196,7 +196,26 @@ func (l *Loader) setFieldData(field *fieldData, value interface{}) error {
return l.setSlice(field, sliceToString(value))

case reflect.Map:
return l.setMap(field, fmt.Sprint(value))
v, ok := value.(map[string]interface{})
if !ok {
return l.setMap(field, fmt.Sprint(value))
}

mapp := reflect.MakeMapWithSize(field.field.Type, len(v))
for key, val := range v {
fdk := l.newSimpleFieldData(reflect.New(field.field.Type.Key()).Elem())
if err := l.setFieldData(fdk, key); err != nil {
return fmt.Errorf("incorrect map key %q: %w", key, err)
}

fdv := l.newSimpleFieldData(reflect.New(field.field.Type.Elem()).Elem())
if err := l.setFieldData(fdv, val); err != nil {
return fmt.Errorf("incorrect map value %q: %w", val, err)
}
mapp.SetMapIndex(fdk.value, fdv.value)
}
field.value.Set(mapp)
return nil

default:
return fmt.Errorf("type kind %q isn't supported", kind)
Expand Down
6 changes: 6 additions & 0 deletions testdata/toy.json
@@ -0,0 +1,6 @@
{
"options": {
"foo": 0.4,
"bar": 0.25
}
}

0 comments on commit 32ffc95

Please sign in to comment.