fix(flag): honor full separator length when splitting map key=value pairs

splitKeyVal sliced the value from index+1, skipping only one byte of the
key/value separator. With a multi-character sep tag (e.g. sep:"=>") the
remaining separator bytes leaked into the value. Slice from index+len(sep)
so the whole separator is consumed.
This commit is contained in:
dualfroz committed 2026-09-04 09:31:42 +02:00
1 parent 78a016e843
commit d03cd5d09c
3 files changed
+86 -1

No files matched your search

+22
View File
@@ -727,3 +727,25 @@ func TestDecoder(t *testing.T) {
assert.Nil(t, flagSet.err)
assert.Equal(t, v.D, customT{K1: "string", K2: 2})
}
func TestMapMultiCharSep(t *testing.T) {
// White-box: split on a multi-character separator must not leak the
// separator tail into the value.
if k, v, _ := splitKeyVal("key=>val", "=>"); k != "key" || v != "val" {
t.Errorf(`splitKeyVal("key=>val", "=>") = (%q, %q), want ("key", "val")`, k, v)
}
// Public API: a map flag configured with a multi-char sep.
type T struct {
Map map[string]string `cli:"m" sep:"=>"`
}
clr := color.Color{}
v := new(T)
flagSet := parseArgv([]string{"-mkey=>val"}, v, clr)
if flagSet.err != nil {
t.Fatalf("unexpected error: %v", flagSet.err)
}
if got := v.Map["key"]; got != "val" {
t.Errorf(`map value = %q, want "val"`, got)
}
}