diff --git a/env.go b/env.go index ba4cf60..6e060b6 100644 --- a/env.go +++ b/env.go @@ -270,7 +270,7 @@ func get(field reflect.StructField, opts []Options) (val string, err error) { defer os.Unsetenv(key) } - if required && !exists { + if required && !exists && len(key) > 0 { return "", fmt.Errorf(`env: required environment variable %q is not set`, key) } diff --git a/env_test.go b/env_test.go index b2402ba..6239be4 100644 --- a/env_test.go +++ b/env_test.go @@ -1377,18 +1377,26 @@ func TestCustomTimeParser(t *testing.T) { } func TestRequiredIfNoDefOption(t *testing.T) { + type Tree struct { + Fruit string `env:"FRUIT"` + } type config struct { Name string `env:"NAME"` Genre string `env:"GENRE" envDefault:"Unknown"` + Tree } var cfg config t.Run("missing", func(t *testing.T) { isErrorWithMessage(t, Parse(&cfg, Options{RequiredIfNoDef: true}), `env: required environment variable "NAME" is not set`) + os.Setenv("NAME", "John") + t.Cleanup(os.Clearenv) + isErrorWithMessage(t, Parse(&cfg, Options{RequiredIfNoDef: true}), `env: required environment variable "FRUIT" is not set`) }) t.Run("all set", func(t *testing.T) { os.Setenv("NAME", "John") + os.Setenv("FRUIT", "Apple") t.Cleanup(os.Clearenv) // should not trigger an error for the missing 'GENRE' env because it has a default value.