From e4d50cac8ea880129a0a675bc90e077c962c8883 Mon Sep 17 00:00:00 2001 From: Justin Toman Date: Wed, 26 Jun 2024 17:41:43 -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 d2f85d8bf..b1df3ff6f 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 14191130a..93670c674 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()