diff --git a/providers/posflag/posflag.go b/providers/posflag/posflag.go index e92d430d..5ed7ad00 100644 --- a/providers/posflag/posflag.go +++ b/providers/posflag/posflag.go @@ -86,6 +86,12 @@ func (p *Posflag) Read() (map[string]interface{}, error) { val, _ = p.flagset.GetStringSlice(key) case "intSlice": val, _ = p.flagset.GetIntSlice(key) + case "stringToString": + val, _ = p.flagset.GetStringToString(key) + case "stringToInt": + val, _ = p.flagset.GetStringToInt(key) + case "stringToInt64": + val, _ = p.flagset.GetStringToInt64(key) default: val = f.Value.String() } diff --git a/providers/posflag/posflag_test.go b/providers/posflag/posflag_test.go index 32c4dd3c..dd68b651 100644 --- a/providers/posflag/posflag_test.go +++ b/providers/posflag/posflag_test.go @@ -44,3 +44,31 @@ func TestIssue90(t *testing.T) { require.Equal(t, exampleKeys, k.All()) } + +type Maps struct { + String map[string]string + Int map[string]int + Int64 map[string]int64 +} + +func TestIssue100(t *testing.T) { + var err error + examplePosFlags := &pflag.FlagSet{} + examplePosFlags.StringToString("string", map[string]string{"k": "v"}, "") + examplePosFlags.StringToInt("int", map[string]int{"k": 1}, "") + examplePosFlags.StringToInt64("int64", map[string]int64{"k": 2}, "") + + k := koanf.New(".") + + err = k.Load(posflag.Provider(examplePosFlags, ".", k), nil) + require.Nil(t, err) + + maps := new(Maps) + + err = k.Unmarshal("", maps) + require.Nil(t, err) + + require.Equal(t, map[string]string{"k": "v"}, maps.String) + require.Equal(t, map[string]int{"k": 1}, maps.Int) + require.Equal(t, map[string]int64{"k": 2}, maps.Int64) +}