From b89db518cbcb7cd5d905387e62b05768cc250136 Mon Sep 17 00:00:00 2001 From: Oleg Kovalov Date: Sat, 14 Aug 2021 16:38:03 +0200 Subject: [PATCH 1/2] Fix map of slices Signed-off-by: Oleg Kovalov --- aconfig_test.go | 21 +++++++++++++++++++++ reflection.go | 1 + 2 files changed, 22 insertions(+) diff --git a/aconfig_test.go b/aconfig_test.go index e9a350d..cc84558 100644 --- a/aconfig_test.go +++ b/aconfig_test.go @@ -2,6 +2,7 @@ package aconfig import ( "io/ioutil" + "net/url" "os" "reflect" "strings" @@ -1389,3 +1390,23 @@ func TestMapOfMap(t *testing.T) { t.Fatalf("want %v, got %v", want, got) } } + +func TestBad(t *testing.T) { + var cfg struct { + Params url.Values + } + os.Setenv("PARAMS", "foo:bar") + + defer func() { + if r := recover(); r != nil { + t.Fatal(r) + } + }() + if err := LoaderFor(&cfg, Config{ + SkipFlags: true, + }).Load(); err != nil { + t.Fatal(err) + } + + t.Logf("cfg %+v\n", cfg) +} diff --git a/reflection.go b/reflection.go index 653ccf8..891a207 100644 --- a/reflection.go +++ b/reflection.go @@ -320,6 +320,7 @@ func (l *Loader) setMap(field *fieldData, value string) error { } fdv := l.newSimpleFieldData(reflect.New(field.field.Type.Elem()).Elem()) + fdv.field.Type = field.field.Type.Elem() if err := l.setFieldData(fdv, val); err != nil { return fmt.Errorf("incorrect map value %q: %w", val, err) } From a3769310cdf22c2746f71b18f0b5ed926db6cf6e Mon Sep 17 00:00:00 2001 From: Oleg Kovalov Date: Sun, 15 Aug 2021 10:46:36 +0200 Subject: [PATCH 2/2] update Signed-off-by: Oleg Kovalov --- aconfig_test.go | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/aconfig_test.go b/aconfig_test.go index cc84558..e86a04f 100644 --- a/aconfig_test.go +++ b/aconfig_test.go @@ -1392,21 +1392,29 @@ func TestMapOfMap(t *testing.T) { } func TestBad(t *testing.T) { - var cfg struct { + type TestConfig struct { Params url.Values } + var cfg TestConfig os.Setenv("PARAMS", "foo:bar") + defer os.Unsetenv("PARAMS") - defer func() { - if r := recover(); r != nil { - t.Fatal(r) - } - }() - if err := LoaderFor(&cfg, Config{ + loader := LoaderFor(&cfg, Config{ SkipFlags: true, - }).Load(); err != nil { + }) + if err := loader.Load(); err != nil { t.Fatal(err) } - t.Logf("cfg %+v\n", cfg) + p, err := url.ParseQuery("foo=bar") + if err != nil { + t.Fatal(err) + } + var want = TestConfig{ + Params: p, + } + + if got := cfg; !reflect.DeepEqual(want, got) { + t.Fatalf("want %v, got %v", want, got) + } }