Skip to content

respect env values over non-zero fields under SetDefaultsForZeroValuesOnly#420

Open
c-tonneslan wants to merge 1 commit into
caarlos0:mainfrom
c-tonneslan:fix/setdefaultsforzerovaluesonly-env-applies
Open

respect env values over non-zero fields under SetDefaultsForZeroValuesOnly#420
c-tonneslan wants to merge 1 commit into
caarlos0:mainfrom
c-tonneslan:fix/setdefaultsforzerovaluesonly-env-applies

Conversation

@c-tonneslan
Copy link
Copy Markdown

Fixes #364.

`SetDefaultsForZeroValuesOnly` is about defaults: an env var that's actually set in the environment should still take precedence over an already-populated field. The previous check treated any non-empty value the same way, so:

```go
type Config struct {
Username string `env:"USERNAME" envDefault:"admin"`
}
cfg := Config{Username: "root"}
env.ParseWithOptions(&cfg, env.Options{
Environment: map[string]string{"USERNAME": "user1"},
SetDefaultsForZeroValuesOnly: true,
})
// got: "root"
// want: "user1"
```

Plumb the `isDefault` flag (which `getOr` already computes) out of `get()` and only skip setting when the value came from a default. Real env values keep flowing through. Existing `TestSetDefaultsForZeroValuesOnly` cases still pass.

Added `TestSetDefaultsForZeroValuesOnly_EnvOverridesNonZero` for the regression.

…sOnly

SetDefaultsForZeroValuesOnly is about defaults: an env var that's
actually set should still take precedence over an already-populated
struct field. The previous check treated any non-empty value the same
way, so an explicit override via the environment was silently dropped
the moment the destination field was non-zero.

Plumb the isDefault flag (which getOr already computes) out of get()
and only skip setting when the value came from a default. Real env
values keep flowing through.

Fixes caarlos0#364.

Signed-off-by: Charlie Tonneslan <cst0520@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Values are not loaded from environment with SetDefaultsForZeroValuesOnly

1 participant