Skip to content

Commit

Permalink
feat: Add option: 'required' by default (caarlos0#187)
Browse files Browse the repository at this point in the history
* feat: Add RequiredIfNoDef option to avoid redudant required paramter on fields

* test: add missing test for Option.RequiredIfNoDef
  • Loading branch information
nexoscp committed Aug 10, 2021
1 parent 0f7f807 commit b3766d5
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 1 deletion.
5 changes: 4 additions & 1 deletion env.go
Expand Up @@ -101,6 +101,8 @@ type Options struct {
Environment map[string]string
// TagName specifies another tagname to use rather than the default env.
TagName string
// RequiredIfNoDef automatically sets all env as required if they do not declare 'envDefault'
RequiredIfNoDef bool

// Sets to true if we have already configured once.
configured bool
Expand Down Expand Up @@ -130,6 +132,7 @@ func configure(opts []Options) []Options {
if item.TagName != "" {
opt.TagName = item.TagName
}
opt.RequiredIfNoDef = item.RequiredIfNoDef
}

return []Options{opt}
Expand Down Expand Up @@ -215,7 +218,7 @@ func doParse(ref reflect.Value, funcMap map[reflect.Type]ParserFunc, opts []Opti
}

func get(field reflect.StructField, opts []Options) (val string, err error) {
var required bool
var required bool = opts[0].RequiredIfNoDef
var exists bool
var loadFile bool
var unset bool
Expand Down
18 changes: 18 additions & 0 deletions env_test.go
Expand Up @@ -1321,6 +1321,24 @@ func TestCustomTimeParser(t *testing.T) {
is.Equal(6, time.Time(cfg.SomeTime).Day())
}

func TestRequiredIfNoDefOption(t *testing.T) {
is := is.New(t)

type config struct {
Name string `env:"NAME"`
Genre string `env:"GENRE" envDefault:"Unknown"`
}

var cfg config
is.NoErr(Parse(&cfg))
isErrorWithMessage(t, Parse(&cfg, Options{RequiredIfNoDef: true}), `env: required environment variable "NAME" is not set`)

os.Setenv("NAME", "John")
defer os.Clearenv()
// should not trigger an error for the missing 'GENRE' env because it has a default value.
is.NoErr(Parse(&cfg, Options{RequiredIfNoDef: true}))
}

func isErrorWithMessage(tb testing.TB, err error, msg string) {
tb.Helper()

Expand Down

0 comments on commit b3766d5

Please sign in to comment.