Add 'IgnoreDefault' option
This commit is contained in:
parent
bf32f08247
commit
a87d80089a
18
README.md
18
README.md
|
@ -180,6 +180,24 @@ var args struct {
|
||||||
arg.MustParse(&args)
|
arg.MustParse(&args)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### Ignoring environment variables and/or default values
|
||||||
|
|
||||||
|
The values in an existing structure can be kept in-tact by ignoring environment
|
||||||
|
variables and/or default values.
|
||||||
|
|
||||||
|
```go
|
||||||
|
var args struct {
|
||||||
|
Test string `arg:"-t,env:TEST" default:"something"`
|
||||||
|
}
|
||||||
|
|
||||||
|
p, err := arg.NewParser(arg.Config{
|
||||||
|
IgnoreEnv: true,
|
||||||
|
IgnoreDefault: true,
|
||||||
|
}, &args)
|
||||||
|
|
||||||
|
err = p.Parse(os.Args)
|
||||||
|
```
|
||||||
|
|
||||||
### Arguments with multiple values
|
### Arguments with multiple values
|
||||||
```go
|
```go
|
||||||
var args struct {
|
var args struct {
|
||||||
|
|
10
parse.go
10
parse.go
|
@ -121,6 +121,10 @@ type Config struct {
|
||||||
|
|
||||||
// IgnoreEnv instructs the library not to read environment variables
|
// IgnoreEnv instructs the library not to read environment variables
|
||||||
IgnoreEnv bool
|
IgnoreEnv bool
|
||||||
|
|
||||||
|
// IgnoreDefault instructs the library not to reset the variables to the
|
||||||
|
// default values, including pointers to sub commands
|
||||||
|
IgnoreDefault bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parser represents a set of command line options with destination values
|
// Parser represents a set of command line options with destination values
|
||||||
|
@ -527,7 +531,9 @@ func (p *Parser) process(args []string) error {
|
||||||
|
|
||||||
// instantiate the field to point to a new struct
|
// instantiate the field to point to a new struct
|
||||||
v := p.val(subcmd.dest)
|
v := p.val(subcmd.dest)
|
||||||
v.Set(reflect.New(v.Type().Elem())) // we already checked that all subcommands are struct pointers
|
if !p.config.IgnoreDefault || v.IsNil() {
|
||||||
|
v.Set(reflect.New(v.Type().Elem())) // we already checked that all subcommands are struct pointers
|
||||||
|
}
|
||||||
|
|
||||||
// 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...)
|
specs = append(specs, subcmd.specs...)
|
||||||
|
@ -659,7 +665,7 @@ func (p *Parser) process(args []string) error {
|
||||||
}
|
}
|
||||||
return errors.New(msg)
|
return errors.New(msg)
|
||||||
}
|
}
|
||||||
if spec.defaultVal != "" {
|
if !p.config.IgnoreDefault && spec.defaultVal != "" {
|
||||||
err := scalar.ParseValue(p.val(spec.dest), spec.defaultVal)
|
err := scalar.ParseValue(p.val(spec.dest), spec.defaultVal)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error processing default value for %s: %v", name, err)
|
return fmt.Errorf("error processing default value for %s: %v", name, err)
|
||||||
|
|
|
@ -816,6 +816,19 @@ func TestEnvironmentVariableIgnored(t *testing.T) {
|
||||||
assert.Equal(t, "", args.Foo)
|
assert.Equal(t, "", args.Foo)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDefaultValuesIgnored(t *testing.T) {
|
||||||
|
var args struct {
|
||||||
|
Foo string `default:"bad"`
|
||||||
|
}
|
||||||
|
|
||||||
|
p, err := NewParser(Config{IgnoreDefault: true}, &args)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
err = p.Parse(nil)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, "", args.Foo)
|
||||||
|
}
|
||||||
|
|
||||||
func TestEnvironmentVariableInSubcommandIgnored(t *testing.T) {
|
func TestEnvironmentVariableInSubcommandIgnored(t *testing.T) {
|
||||||
var args struct {
|
var args struct {
|
||||||
Sub *struct {
|
Sub *struct {
|
||||||
|
|
Loading…
Reference in New Issue