From f0483c5d9e462bc1c25cae4daf2ce28fa6d3ce0c Mon Sep 17 00:00:00 2001 From: Justin Toman Date: Wed, 26 Jun 2024 17:49:09 -0500 Subject: [PATCH] fix: apply envPrefix to all BindEnv vars --- viper.go | 6 +++++- viper_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/viper.go b/viper.go index d2f85d8..b1df3ff 100644 --- a/viper.go +++ b/viper.go @@ -1106,7 +1106,11 @@ func (v *Viper) BindEnv(input ...string) error { if len(input) == 1 { v.env[key] = append(v.env[key], v.mergeWithEnvPrefix(key)) } else { - v.env[key] = append(v.env[key], input[1:]...) + envKeys := make([]string, len(input[:1])) + for i, envKey := range input[1:] { + envKeys[i] = v.mergeWithEnvPrefix(envKey) + } + v.env[key] = append(v.env[key], envKeys...) } return nil diff --git a/viper_test.go b/viper_test.go index 1419113..93670c6 100644 --- a/viper_test.go +++ b/viper_test.go @@ -2590,6 +2590,30 @@ func TestFlagShadow(t *testing.T) { assert.Equal(t, "", v.GetString("foo.bar1.bar2")) } +func TestBindUsesEnvPrefix(t *testing.T) { + v := New() + + os.Setenv("APP_FOO", "foo") + os.Setenv("APP_BAR", "bar") + + v.SetEnvPrefix("APP") + v.AutomaticEnv() + v.BindEnv("foo1", "FOO") + v.BindEnv("bar1", "BAR") + + assert.Equal(t, "foo", v.Get("foo1")) + assert.Equal(t, "bar", v.Get("bar1")) + + type TestStruct struct { + Foo1 string `mapstructure:"foo1"` + Bar1 string `mapstructure:"bar1"` + } + var ts TestStruct + assert.NoError(t, v.Unmarshal(&ts)) + assert.Equal(t, "foo", ts.Foo1) + assert.Equal(t, "bar", ts.Bar1) +} + func BenchmarkGetBool(b *testing.B) { key := "BenchmarkGetBool" v = New()