mirror of
https://github.com/spf13/viper
synced 2025-05-11 22:57:21 +00:00
mostly copy pflags implementation of the conversion to a stringtostring
This commit is contained in:
parent
018de44cf7
commit
c633cc5570
2 changed files with 20 additions and 14 deletions
32
viper.go
32
viper.go
|
@ -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.
|
||||||
|
|
|
@ -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="},
|
||||||
|
|
Loading…
Add table
Reference in a new issue