CliParser.Init() accepts optional flags. Currently una flag is available: ResetOnEqualSign
This commit is contained in:
parent
9e28ee6545
commit
00b84278d8
14
cli.go
14
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, "-") {
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
16
opt_test.go
16
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)
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user