Merge pull request #205 from dmzkrsk/strict-subgroup-parsing
add strict subcommand parsing
This commit is contained in:
commit
c0a8e20a0a
2
go.sum
2
go.sum
|
@ -1,5 +1,3 @@
|
||||||
github.com/alexflint/go-scalar v1.1.0 h1:aaAouLLzI9TChcPXotr6gUhq+Scr8rl0P9P4PnltbhM=
|
|
||||||
github.com/alexflint/go-scalar v1.1.0/go.mod h1:LoFvNMqS1CPrMVltza4LvnGKhaSpc3oyLEBUZVhhS2o=
|
|
||||||
github.com/alexflint/go-scalar v1.2.0 h1:WR7JPKkeNpnYIOfHRa7ivM21aWAdHD0gEWHCx+WQBRw=
|
github.com/alexflint/go-scalar v1.2.0 h1:WR7JPKkeNpnYIOfHRa7ivM21aWAdHD0gEWHCx+WQBRw=
|
||||||
github.com/alexflint/go-scalar v1.2.0/go.mod h1:LoFvNMqS1CPrMVltza4LvnGKhaSpc3oyLEBUZVhhS2o=
|
github.com/alexflint/go-scalar v1.2.0/go.mod h1:LoFvNMqS1CPrMVltza4LvnGKhaSpc3oyLEBUZVhhS2o=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
|
11
parse.go
11
parse.go
|
@ -115,6 +115,10 @@ type Config struct {
|
||||||
// IgnoreDefault instructs the library not to reset the variables to the
|
// IgnoreDefault instructs the library not to reset the variables to the
|
||||||
// default values, including pointers to sub commands
|
// default values, including pointers to sub commands
|
||||||
IgnoreDefault bool
|
IgnoreDefault bool
|
||||||
|
|
||||||
|
// StrictSubcommands intructs the library not to allow global commands after
|
||||||
|
// subcommand
|
||||||
|
StrictSubcommands bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parser represents a set of command line options with destination values
|
// Parser represents a set of command line options with destination values
|
||||||
|
@ -588,7 +592,12 @@ func (p *Parser) process(args []string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// add the new options to the set of allowed options
|
// add the new options to the set of allowed options
|
||||||
specs = append(specs, subcmd.specs...)
|
if p.config.StrictSubcommands {
|
||||||
|
specs = make([]*spec, len(subcmd.specs))
|
||||||
|
copy(specs, subcmd.specs)
|
||||||
|
} else {
|
||||||
|
specs = append(specs, subcmd.specs...)
|
||||||
|
}
|
||||||
|
|
||||||
// capture environment vars for these new options
|
// capture environment vars for these new options
|
||||||
if !p.config.IgnoreEnv {
|
if !p.config.IgnoreEnv {
|
||||||
|
|
|
@ -98,9 +98,9 @@ func TestInt(t *testing.T) {
|
||||||
|
|
||||||
func TestHexOctBin(t *testing.T) {
|
func TestHexOctBin(t *testing.T) {
|
||||||
var args struct {
|
var args struct {
|
||||||
Hex int
|
Hex int
|
||||||
Oct int
|
Oct int
|
||||||
Bin int
|
Bin int
|
||||||
Underscored int
|
Underscored int
|
||||||
}
|
}
|
||||||
err := parse("--hex 0xA --oct 0o10 --bin 0b101 --underscored 123_456", &args)
|
err := parse("--hex 0xA --oct 0o10 --bin 0b101 --underscored 123_456", &args)
|
||||||
|
@ -1614,3 +1614,79 @@ func TestTextMarshalerUnmarshalerEmptyPointer(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
assert.Nil(t, args.Config)
|
assert.Nil(t, args.Config)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSubcommandGlobalFlag_Before(t *testing.T) {
|
||||||
|
var args struct {
|
||||||
|
Global bool `arg:"-g"`
|
||||||
|
Sub *struct {
|
||||||
|
} `arg:"subcommand"`
|
||||||
|
}
|
||||||
|
|
||||||
|
p, err := NewParser(Config{StrictSubcommands: false}, &args)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
err = p.Parse([]string{"-g", "sub"})
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.True(t, args.Global)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSubcommandGlobalFlag_InCommand(t *testing.T) {
|
||||||
|
var args struct {
|
||||||
|
Global bool `arg:"-g"`
|
||||||
|
Sub *struct {
|
||||||
|
} `arg:"subcommand"`
|
||||||
|
}
|
||||||
|
|
||||||
|
p, err := NewParser(Config{StrictSubcommands: false}, &args)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
err = p.Parse([]string{"sub", "-g"})
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.True(t, args.Global)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSubcommandGlobalFlag_Before_Strict(t *testing.T) {
|
||||||
|
var args struct {
|
||||||
|
Global bool `arg:"-g"`
|
||||||
|
Sub *struct {
|
||||||
|
} `arg:"subcommand"`
|
||||||
|
}
|
||||||
|
|
||||||
|
p, err := NewParser(Config{StrictSubcommands: true}, &args)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
err = p.Parse([]string{"-g", "sub"})
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.True(t, args.Global)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSubcommandGlobalFlag_InCommand_Strict(t *testing.T) {
|
||||||
|
var args struct {
|
||||||
|
Global bool `arg:"-g"`
|
||||||
|
Sub *struct {
|
||||||
|
} `arg:"subcommand"`
|
||||||
|
}
|
||||||
|
|
||||||
|
p, err := NewParser(Config{StrictSubcommands: true}, &args)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
err = p.Parse([]string{"sub", "-g"})
|
||||||
|
assert.Error(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSubcommandGlobalFlag_InCommand_Strict_Inner(t *testing.T) {
|
||||||
|
var args struct {
|
||||||
|
Global bool `arg:"-g"`
|
||||||
|
Sub *struct {
|
||||||
|
Guard bool `arg:"-g"`
|
||||||
|
} `arg:"subcommand"`
|
||||||
|
}
|
||||||
|
|
||||||
|
p, err := NewParser(Config{StrictSubcommands: true}, &args)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
err = p.Parse([]string{"sub", "-g"})
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.False(t, args.Global)
|
||||||
|
assert.True(t, args.Sub.Guard)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue