diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 30e5cfa..943a727 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -39,7 +39,7 @@ jobs: run: make setup ci - name: Upload coverage - uses: codecov/codecov-action@v1 + uses: codecov/codecov-action@v2 if: matrix.os == 'ubuntu-latest' with: token: ${{ secrets.CODECOV_TOKEN }} diff --git a/env.go b/env.go index 3c39130..029cc10 100644 --- a/env.go +++ b/env.go @@ -103,6 +103,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 OnSet OnSetFn @@ -137,6 +139,7 @@ func configure(opts []Options) []Options { if item.OnSet != nil { opt.OnSet = item.OnSet } + opt.RequiredIfNoDef = item.RequiredIfNoDef } return []Options{opt} @@ -226,7 +229,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 isDefault bool var loadFile bool diff --git a/env_test.go b/env_test.go index ab0362e..1b2eaf9 100644 --- a/env_test.go +++ b/env_test.go @@ -1376,6 +1376,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()