From 63cb372cce16411e154f856aa8af0d0f8d6571f7 Mon Sep 17 00:00:00 2001 From: GuangyuFan <97507466+FGYFFFF@users.noreply.github.com> Date: Thu, 27 Oct 2022 17:32:00 +0800 Subject: [PATCH] Feature: (issue_1451) customized slice flag separator (#1546) * feat: customized slice flag separator * feat: modify go doc * feat: update unit test --- app.go | 6 ++++++ flag.go | 4 +++- flag_test.go | 18 ++++++++++++++++++ godoc-current.txt | 2 ++ testdata/godoc-v2.x.txt | 2 ++ 5 files changed, 31 insertions(+), 1 deletion(-) diff --git a/app.go b/app.go index 24704e8..9bea11e 100644 --- a/app.go +++ b/app.go @@ -103,6 +103,8 @@ type App struct { // cli.go uses text/template to render templates. You can // render custom help text by setting this variable. CustomAppHelpTemplate string + // SliceFlagSeparator is used to customize the separator for SliceFlag, the default is "," + SliceFlagSeparator string // Boolean to enable short-option handling so user can combine several // single-character bool arguments into one // i.e. foobar -o -v -> foobar -ov @@ -241,6 +243,10 @@ func (a *App) Setup() { if a.Metadata == nil { a.Metadata = make(map[string]interface{}) } + + if len(a.SliceFlagSeparator) != 0 { + defaultSliceFlagSeparator = a.SliceFlagSeparator + } } func (a *App) newRootCommand() *Command { diff --git a/flag.go b/flag.go index 7535424..b66a75d 100644 --- a/flag.go +++ b/flag.go @@ -15,6 +15,8 @@ import ( const defaultPlaceholder = "value" +var defaultSliceFlagSeparator = "," + var ( slPfx = fmt.Sprintf("sl:::%d:::", time.Now().UTC().UnixNano()) @@ -378,5 +380,5 @@ func flagFromEnvOrFile(envVars []string, filePath string) (value string, fromWhe } func flagSplitMultiValues(val string) []string { - return strings.Split(val, ",") + return strings.Split(val, defaultSliceFlagSeparator) } diff --git a/flag_test.go b/flag_test.go index d46c1a7..3a2bc2b 100644 --- a/flag_test.go +++ b/flag_test.go @@ -3384,3 +3384,21 @@ func TestSliceShortOptionHandle(t *testing.T) { t.Fatal("Action callback was never called") } } + +// Test issue #1541 +func TestCustomizedSliceFlagSeparator(t *testing.T) { + defaultSliceFlagSeparator = ";" + defer func() { + defaultSliceFlagSeparator = "," + }() + opts := []string{"opt1", "opt2", "opt3,op", "opt4"} + ret := flagSplitMultiValues(strings.Join(opts, ";")) + if len(ret) != 4 { + t.Fatalf("split slice flag failed, want: 4, but get: %d", len(ret)) + } + for idx, r := range ret { + if r != opts[idx] { + t.Fatalf("get %dth failed, wanted: %s, but get: %s", idx, opts[idx], r) + } + } +} diff --git a/godoc-current.txt b/godoc-current.txt index e16d6ab..fadb7f8 100644 --- a/godoc-current.txt +++ b/godoc-current.txt @@ -316,6 +316,8 @@ type App struct { // cli.go uses text/template to render templates. You can // render custom help text by setting this variable. CustomAppHelpTemplate string + // SliceFlagSeparator is used to customize the separator for SliceFlag, the default is "," + SliceFlagSeparator string // Boolean to enable short-option handling so user can combine several // single-character bool arguments into one // i.e. foobar -o -v -> foobar -ov diff --git a/testdata/godoc-v2.x.txt b/testdata/godoc-v2.x.txt index e16d6ab..fadb7f8 100644 --- a/testdata/godoc-v2.x.txt +++ b/testdata/godoc-v2.x.txt @@ -316,6 +316,8 @@ type App struct { // cli.go uses text/template to render templates. You can // render custom help text by setting this variable. CustomAppHelpTemplate string + // SliceFlagSeparator is used to customize the separator for SliceFlag, the default is "," + SliceFlagSeparator string // Boolean to enable short-option handling so user can combine several // single-character bool arguments into one // i.e. foobar -o -v -> foobar -ov