Add 'IgnoreDefault' option

This commit is contained in:
Sebastiaan Pasterkamp 2022-01-02 15:06:37 +01:00
parent bf32f08247
commit a87d80089a
3 changed files with 41 additions and 4 deletions

View File

@ -134,10 +134,10 @@ arg.MustParse(&args)
```shell ```shell
$ ./example -h $ ./example -h
Usage: [--verbose] [--dataset DATASET] [--optimize OPTIMIZE] [--help] INPUT [OUTPUT [OUTPUT ...]] Usage: [--verbose] [--dataset DATASET] [--optimize OPTIMIZE] [--help] INPUT [OUTPUT [OUTPUT ...]]
Positional arguments: Positional arguments:
INPUT INPUT
OUTPUT OUTPUT
Options: Options:
@ -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 {

View File

@ -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)

View File

@ -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 {