mostly copy pflags implementation of the conversion to a stringtostring

This commit is contained in:
Trevor Foster 2020-05-05 17:23:41 -04:00
parent 018de44cf7
commit c633cc5570
2 changed files with 20 additions and 14 deletions

View file

@ -1084,7 +1084,7 @@ func (v *Viper) find(lcaseKey string, flagDefault bool) interface{} {
res, _ := readAsCSV(s) res, _ := readAsCSV(s)
return cast.ToIntSlice(res) return cast.ToIntSlice(res)
case "stringToString": case "stringToString":
return parseStringToStringFlagValue(flag.ValueString()) return stringToStringConv(flag.ValueString())
default: default:
return flag.ValueString() return flag.ValueString()
} }
@ -1161,7 +1161,7 @@ func (v *Viper) find(lcaseKey string, flagDefault bool) interface{} {
res, _ := readAsCSV(s) res, _ := readAsCSV(s)
return cast.ToIntSlice(res) return cast.ToIntSlice(res)
case "stringToString": case "stringToString":
return parseStringToStringFlagValue(flag.ValueString()) return stringToStringConv(flag.ValueString())
default: default:
return flag.ValueString() return flag.ValueString()
} }
@ -1181,22 +1181,28 @@ func readAsCSV(val string) ([]string, error) {
return csvReader.Read() return csvReader.Read()
} }
func parseStringToStringFlagValue(val string) map[string]interface{} { // mostly copied from pflag's implementation of this operation here https://github.com/spf13/pflag/blob/master/string_to_string.go#L79
s := strings.TrimPrefix(val, "[") // alterations are: errors are swallowed, map[string]interface{} is returned in order to enable cast.ToStringMap
s = strings.TrimSuffix(s, "]") func stringToStringConv(val string) interface{} {
if s == "" { val = strings.Trim(val, "[]")
// An empty string would cause an empty map
if len(val) == 0 {
return map[string]interface{}{}
}
r := csv.NewReader(strings.NewReader(val))
ss, err := r.Read()
if err != nil {
return nil return nil
} }
elements := strings.Split(s, ",") out := make(map[string]interface{}, len(ss))
result := make(map[string]interface{}, len(elements)) for _, pair := range ss {
for _, element := range elements { kv := strings.SplitN(pair, "=", 2)
pair := strings.SplitN(element, "=", 2) if len(kv) != 2 {
if len(pair) != 2 {
return nil return nil
} }
result[pair[0]] = pair[1] out[kv[0]] = kv[1]
} }
return result return out
} }
// IsSet checks to see if the key has been set in any of the data locations. // IsSet checks to see if the key has been set in any of the data locations.

View file

@ -975,7 +975,7 @@ func TestBindPFlagStringToString(t *testing.T) {
Expected map[string]string Expected map[string]string
Value string Value string
}{ }{
{nil, ""}, {map[string]string{}, ""},
{map[string]string{"yo": "hi"}, "yo=hi"}, {map[string]string{"yo": "hi"}, "yo=hi"},
{map[string]string{"yo": "hi", "oh": "hi=there"}, "yo=hi,oh=hi=there"}, {map[string]string{"yo": "hi", "oh": "hi=there"}, "yo=hi,oh=hi=there"},
{map[string]string{"yo": ""}, "yo="}, {map[string]string{"yo": ""}, "yo="},