Skip to content

Commit 5a03800

Browse files
authored
feat: support loading config values from environment (#55)
1 parent 766ff1f commit 5a03800

File tree

4 files changed

+31
-1
lines changed

4 files changed

+31
-1
lines changed

conf/loader.go

+5
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"os"
66
"reflect"
77

8+
"github.com/caarlos0/env/v8" // spell: disable-line
89
"github.com/creasty/defaults" // spell: disable-line
910
yaml "gopkg.in/yaml.v3"
1011

@@ -70,6 +71,10 @@ func (l *Loader[C]) load() (C, error) {
7071
return l.Config, err
7172
}
7273
}
74+
// Override values passed in via ENV var
75+
if err := env.Parse(l.Config); err != nil {
76+
return l.Config, err
77+
}
7378
// Validate
7479
if err := validate.Struct(l.Config); err != nil {
7580
return l.Config, err

conf/loader_test.go

+23-1
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,16 @@ func ExampleLoader() {
2727
}
2828

2929
type MyConfig struct {
30-
Name string `default:"untitled"`
30+
Name string `default:"untitled" env:"CONFIG_NAME"`
3131
Count int `default:"1" validate:"lt=100"`
3232
Enabled bool
3333
Tags []string
3434
}
3535

36+
type MyConfigWithError struct {
37+
Name string `env:"CONFIG_NAME,unknown"` // unknown tag to trigger error
38+
}
39+
3640
func FixturePath(names ...string) string {
3741
name := "config.yaml"
3842
if len(names) > 0 {
@@ -116,6 +120,24 @@ func TestLoader_LoadWhenYAMLError(t *testing.T) {
116120
assert.ErrorContains(t, err, "boom")
117121
}
118122

123+
func TestLoader_Load_WithEnv(t *testing.T) {
124+
t.Setenv("CONFIG_NAME", "name from env var")
125+
126+
loader := NewLoader(&MyConfig{}, "")
127+
config, err := loader.Load()
128+
assert.NoError(t, err)
129+
assert.Equal(t, "name from env var", config.Name)
130+
}
131+
132+
func TestLoader_Load_WhenEnvError(t *testing.T) {
133+
t.Setenv("CONFIG_NAME", "name from env var")
134+
135+
loader := NewLoader(&MyConfigWithError{}, "")
136+
config, err := loader.Load()
137+
assert.ErrorContains(t, err, `tag option "unknown" not supported`)
138+
assert.Equal(t, "", config.Name)
139+
}
140+
119141
func TestLoader_LoadWhenValidationError(t *testing.T) {
120142
_, err := NewLoader(&MyConfig{}, FixturePath("invalid.yaml")).Load()
121143
assert.ErrorContains(t, err, "Count must be less than 100")

go.mod

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ require (
66
github.com/AlecAivazis/survey/v2 v2.3.6
77
github.com/Masterminds/sprig/v3 v3.2.3
88
github.com/briandowns/spinner v1.23.0
9+
github.com/caarlos0/env/v8 v8.0.0
910
github.com/creasty/defaults v1.7.0
1011
github.com/go-playground/locales v0.14.1
1112
github.com/go-playground/universal-translator v0.18.1

go.sum

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63n
1010
github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w=
1111
github.com/briandowns/spinner v1.23.0 h1:alDF2guRWqa/FOZZYWjlMIx2L6H0wyewPxo/CH4Pt2A=
1212
github.com/briandowns/spinner v1.23.0/go.mod h1:rPG4gmXeN3wQV/TsAY4w8lPdIM6RX3yqeBQJSrbXjuE=
13+
github.com/caarlos0/env/v8 v8.0.0 h1:POhxHhSpuxrLMIdvTGARuZqR4Jjm8AYmoi/JKlcScs0=
14+
github.com/caarlos0/env/v8 v8.0.0/go.mod h1:7K4wMY9bH0esiXSSHlfHLX5xKGQMnkH5Fk4TDSSSzfo=
1315
github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI=
1416
github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
1517
github.com/creasty/defaults v1.7.0 h1:eNdqZvc5B509z18lD8yc212CAqJNvfT1Jq6L8WowdBA=

0 commit comments

Comments
 (0)