diff --git a/env.go b/env.go index 72719309da177bbef851ba3a6bb24bf4ae949db4..050a92092307a970a1cfe688843514824c261918 100644 --- a/env.go +++ b/env.go @@ -7,6 +7,7 @@ import ( "os" "reflect" "strconv" + "strings" ) func (s *Settings[C]) InitFromEnv(prefix string) *Settings[C] { @@ -21,12 +22,18 @@ func (s *Settings[C]) InitFromEnv(prefix string) *Settings[C] { } }() + if prefix != "" { + prefix = strings.ToUpper(prefix) + "_" + } + err := runOnTags(&s.config, []string{envTagKey}, func(k string, field reflect.Value) { if !field.CanSet() { return } + k = prefix + strings.ToUpper(k) + v, found := os.LookupEnv(k) if !found { return // env not found diff --git a/env_test.go b/env_test.go index 99ef4b4f0f23846ded5139cc5e318686d604b065..d85d37288f03b3e9e0d59250845b79e25501fc8c 100644 --- a/env_test.go +++ b/env_test.go @@ -20,6 +20,7 @@ func TestReadmeExample2(t *testing.T) { // Set value os.Setenv("HOST", "www.example.com") + defer os.Unsetenv("HOST") s := New(config) //fmt.Println(s.Config().Host) // localhost @@ -31,6 +32,27 @@ func TestReadmeExample2(t *testing.T) { } +func TestWithPrefix(t *testing.T) { + config := struct { + Host string `env:"HOST"` + }{ + Host: "localhost", + } + + // Set value + os.Setenv("XYZ_HOST", "www.example.com") + defer os.Unsetenv("XYZ_HOST") + + s := New(config) + //fmt.Println(s.Config().Host) // localhost + assert.Equal(t, s.Config().Host, "localhost") + + s.InitFromEnv("XYZ") // no prefix + //fmt.Println(s.Config().Host) // www.example.com + assert.Equal(t, s.Config().Host, "www.example.com") + +} + func TestFromEnvNotSet(t *testing.T) { config := ConfigStruct6{ IA: 1234, @@ -43,6 +65,7 @@ func TestFromEnvNotSet(t *testing.T) { // Value not set s.InitFromEnv("VALUE_IB") + defer os.Unsetenv("VALUE_IB") if s.Config().IA != 1234 { t.Errorf("Expected 1234, got %d", s.Config().IA) @@ -61,7 +84,7 @@ func TestFromEnv(t *testing.T) { s := New(config) // Value not set - s.InitFromEnv("VALUE_IB") + s.InitFromEnv("NIX") if s.Config().IA != 1234 { t.Errorf("Expected 1234, got %d", s.Config().IA) @@ -69,7 +92,8 @@ func TestFromEnv(t *testing.T) { // Set value os.Setenv("VALUE_IB", "i-am-b") - s.InitFromEnv("VALUE_IB") + defer os.Unsetenv("VALUE_IB") + s.InitFromEnv("") if s.Config().IB != "i-am-b" { t.Errorf("Expected i-am-b, got %s", s.Config().IB)