From b89354adb0c0af65cda278ddccb0ff860808e8f0 Mon Sep 17 00:00:00 2001 From: Cam Hutchison Date: Mon, 1 Jun 2020 22:27:02 +1000 Subject: [PATCH] Fix sep:"none" and mapsep:"none" According to the README.md, a value of `"none"` for the `sep` tag (for slices) and `mapsep` (for maps) is meant to disable the separator that would allow multiple entries to be added from a single argument. However, using `"none"` just set the separator to the rune `'n'`. Fix the parsing of the tag, and also update `SplitEscaped` to not split with a separator of `-1`. Add a new test for the new cases. --- mapper.go | 3 +++ mapper_test.go | 13 +++++++++++++ tag.go | 20 ++++++++++---------- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/mapper.go b/mapper.go index d038cb0..8a1944d 100644 --- a/mapper.go +++ b/mapper.go @@ -636,6 +636,9 @@ func urlMapper() MapperFunc { // // SplitEscaped(`hello\,there,bob`, ',') == []string{"hello,there", "bob"} func SplitEscaped(s string, sep rune) (out []string) { + if sep == -1 { + return []string{s} + } escaped := false token := "" for _, ch := range s { diff --git a/mapper_test.go b/mapper_test.go index 14f06d5..b6d7737 100644 --- a/mapper_test.go +++ b/mapper_test.go @@ -130,6 +130,7 @@ func TestDurationMapper(t *testing.T) { func TestSplitEscaped(t *testing.T) { require.Equal(t, []string{"a", "b"}, kong.SplitEscaped("a,b", ',')) require.Equal(t, []string{"a,b", "c"}, kong.SplitEscaped(`a\,b,c`, ',')) + require.Equal(t, []string{"a,b,c"}, kong.SplitEscaped(`a,b,c`, -1)) } func TestJoinEscaped(t *testing.T) { @@ -172,6 +173,18 @@ func TestMapWithDifferentSeparator(t *testing.T) { require.Equal(t, map[string]string{"a": "b", "c": "d"}, cli.Value) } +func TestMapWithNoSeparator(t *testing.T) { + var cli struct { + Slice []string `sep:"none"` + Value map[string]string `mapsep:"none"` + } + k := mustNew(t, &cli) + _, err := k.Parse([]string{"--slice=a,n,c", "--value=a=b;n=d"}) + require.NoError(t, err) + require.Equal(t, []string{"a,n,c"}, cli.Slice) + require.Equal(t, map[string]string{"a": "b;n=d"}, cli.Value) +} + func TestURLMapper(t *testing.T) { var cli struct { URL *url.URL `arg:""` diff --git a/tag.go b/tag.go index 88380fe..b0d2fe5 100644 --- a/tag.go +++ b/tag.go @@ -151,23 +151,23 @@ func parseTag(fv reflect.Value, ft reflect.StructField) *Tag { t.Short, _ = t.GetRune("short") t.Hidden = t.Has("hidden") t.Format = t.Get("format") - t.Sep, _ = t.GetRune("sep") - t.MapSep, _ = t.GetRune("mapsep") t.Group = t.Get("group") t.Xor = t.Get("xor") t.Prefix = t.Get("prefix") t.Embed = t.Has("embed") - if t.Sep == 0 { - if t.Get("sep") == "none" { - t.Sep = -1 - } else { + if t.Get("sep") == "none" { + t.Sep = -1 + } else { + t.Sep, _ = t.GetRune("sep") + if t.Sep == 0 { t.Sep = ',' } } - if t.MapSep == 0 { - if t.Get("mapsep") == "none" { - t.MapSep = -1 - } else { + if t.Get("mapsep") == "none" { + t.MapSep = -1 + } else { + t.MapSep, _ = t.GetRune("mapsep") + if t.MapSep == 0 { t.MapSep = ';' } }