diff --git a/cli.go b/cli.go index 59caf51..47b54c2 100644 --- a/cli.go +++ b/cli.go @@ -14,6 +14,7 @@ type cliParser interface { getCliArgs(startIndex, endIndex int) (args []string) PrintVersion(specs []string) PrintUsage() + FlagIsSet(flag int16) bool } type cliOptionParser interface { @@ -41,20 +42,31 @@ type OptReference interface { SetHidden(hidden bool) } +const ( + ResetOnEqualSign = int16(1 << iota) // for some option types, like arrays, the equal signs reset to empty the accumulator of values +) + type CliParser struct { description string version string options []cliOptionParser argSpecs []argSpec cliArgs []string + flags int16 } -func (cli *CliParser) Init(argv []string, version string, description string) { +func (cli *CliParser) Init(argv []string, version string, description string, flags ...int16) { cli.version = version cli.description = description cli.cliArgs = argv + for _, flag := range flags { + cli.flags |= flag + } } +func (cli *CliParser) FlagIsSet(flag int16) bool { + return (cli.flags & flag) == flag +} func (cli *CliParser) GetOption(name string) (ref OptReference) { var opt cliOptionParser if strings.HasPrefix(name, "-") { diff --git a/opt-int-array.go b/opt-int-array.go index 5975627..2507611 100644 --- a/opt-int-array.go +++ b/opt-int-array.go @@ -75,7 +75,7 @@ func (opt *cliOptionIntArray) parse(parser cliParser, argIndex int, valuePtr *st err = errInvalidOptionValue(opt.name, boxedValue, "num-array") } } else { - if !opt.alreadySeen { + if !opt.alreadySeen || (valuePtr != nil && parser.FlagIsSet(ResetOnEqualSign)) { *opt.targetVar = []int{} opt.alreadySeen = true } diff --git a/opt_test.go b/opt_test.go index ce7555f..473c034 100644 --- a/opt_test.go +++ b/opt_test.go @@ -49,12 +49,12 @@ func addBoxOption(cli *CliParser, boxPtr *[]int) { }) } -func testIntArrayOptOk(t *testing.T, n int, args []string) { +func testIntArrayOptOk(t *testing.T, n int, args []string, flags ...int16) { var box []int var cli CliParser t.Logf("Arg set n. %d", n) addBoxOption(&cli, &box) - cli.Init(args, "1.0.0", "TestIntArrayOpt description") + cli.Init(args, "1.0.0", "TestIntArrayOpt description", flags...) if err := cli.Parse(); err != nil { t.Error(err) } else if len(box) != 4 { @@ -62,12 +62,12 @@ func testIntArrayOptOk(t *testing.T, n int, args []string) { } } -func testIntArrayOptKo(t *testing.T, n int, args []string, msg string) { +func testIntArrayOptKo(t *testing.T, n int, args []string, msg string, flags ...int16) { var box []int var cli CliParser t.Logf("Arg set n. %d", n) addBoxOption(&cli, &box) - cli.Init(args, "1.0.0", "TestIntArrayOpt description") + cli.Init(args, "1.0.0", "TestIntArrayOpt description", flags...) if err := cli.Parse(); err == nil { t.Errorf("Expected error, got nil") } else if err.Error() != msg { @@ -132,4 +132,12 @@ func TestIntArrayOpt(t *testing.T) { "--box", "450,12", } testIntArrayOptKo(t, n, args, "--box option requires exactly 4 items, 5 provided") + + n++ + args = []string{ + "TestIntArrayOpt", + "--box", "100,200,150", + "--box=100,200,150,450", + } + testIntArrayOptOk(t, n, args, ResetOnEqualSign) }