diff --git a/string_to_string.go b/string_to_string.go index 890a01af..26b3578a 100644 --- a/string_to_string.go +++ b/string_to_string.go @@ -77,7 +77,10 @@ func (s *stringToStringValue) String() string { } func stringToStringConv(val string) (interface{}, error) { - val = strings.Trim(val, "[]") + if strings.HasPrefix(val, "[") && strings.HasSuffix(val, "]") { + val = strings.TrimPrefix(val, "[") + val = strings.TrimSuffix(val, "]") + } // An empty string would cause an empty map if len(val) == 0 { return map[string]string{}, nil diff --git a/string_to_string_test.go b/string_to_string_test.go index 0777f03f..8dbe8ce0 100644 --- a/string_to_string_test.go +++ b/string_to_string_test.go @@ -160,3 +160,34 @@ func TestS2SCalledTwice(t *testing.T) { } } } + +// Regression test for a parsing bug triggered when [] +// was the last item processed in (random order) map iteration +// Using [] as the only value makes he bug reproducible +func TestS2SBracketValue(t *testing.T) { + var s2s map[string]string + f := setUpS2SFlagSet(&s2s) + + vals := map[string]string{"a": "[]"} + arg := fmt.Sprintf("--s2s=%s", createS2SFlag(vals)) + err := f.Parse([]string{arg}) + if err != nil { + t.Fatal("expected no error; got", err) + } + + for k, v := range s2s { + if vals[k] != v { + t.Fatalf("expected s2s[%s] to be %s but got: %s", k, vals[k], v) + } + } + + getS2S, err := f.GetStringToString("s2s") + if err != nil { + t.Fatal("got an error from GetStringToString():", err) + } + for k, v := range getS2S { + if vals[k] != v { + t.Fatalf("expected s2s[%s] to be %s from GetStringToString but got: %s", k, vals[k], v) + } + } +}