Skip to content

Commit

Permalink
Adds inline support for loading config from ENV.
Browse files Browse the repository at this point in the history
  • Loading branch information
KevinJoiner committed Jun 27, 2024
1 parent ca20a1c commit 87cbf63
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 5 deletions.
5 changes: 4 additions & 1 deletion config_loader.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,10 @@ func loadFromEnvVars[S any](settings S) error {
// iterate through the fields - like above, prepend fieldYamlName
for i := 0; i < field.NumField(); i++ {
subField := field.Field(i)
subFieldYamlName := fieldYamlName + "_" + field.Type().Field(i).Tag.Get("yaml")
subFieldYamlName := field.Type().Field(i).Tag.Get("yaml")
if fieldYamlName != ",inline" {
subFieldYamlName = fieldYamlName + "_" + subFieldYamlName
}
err = matchEnvVarToField(subFieldYamlName, subField)
}
} else {
Expand Down
17 changes: 13 additions & 4 deletions config_loader_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ DB_CONNECT_STRING: mydb.aws.net
ENV: dev
REDIS:
URL: redis.bobby
INLINE_URL: inline.bobby
`
settings, err := loadFromYaml[TestSettings]([]byte(data))
assert.NoError(t, err, "no error expected")
Expand All @@ -22,6 +23,7 @@ REDIS:
assert.Equal(t, "mydb.aws.net", settings.DbConnectString)
assert.Equal(t, "dev", settings.Env)
assert.Equal(t, "redis.bobby", settings.Redis.URL)
assert.Equal(t, "inline.bobby", settings.Inline.URL)
}

func Test_loadFromEnvVars(t *testing.T) {
Expand All @@ -34,6 +36,7 @@ func Test_loadFromEnvVars(t *testing.T) {
t.Setenv("ENV", "test")
t.Setenv("PORT", "5000")
t.Setenv("REDIS_URL", "redis.bobby")
t.Setenv("INLINE_URL", "inline.bobby")

err := loadFromEnvVars(&settings) // b/c of type inference we don't need to specify the type
assert.NoError(t, err)
Expand All @@ -42,6 +45,7 @@ func Test_loadFromEnvVars(t *testing.T) {
assert.Equal(t, 5000, settings.Port)
assert.Equal(t, "mydb.aws.net", settings.DbConnectString)
assert.Equal(t, "redis.bobby", settings.Redis.URL)
assert.Equal(t, "inline.bobby", settings.Inline.URL)
}

func Test_loadFromEnvVars_errIfNotPointer(t *testing.T) {
Expand All @@ -65,12 +69,17 @@ func Test_matchEnvVarToField(t *testing.T) {
}

type TestSettings struct {
Port int `yaml:"PORT"`
DbConnectString string `yaml:"DB_CONNECT_STRING"`
Env string `yaml:"ENV"`
Redis RedisSubProp `yaml:"REDIS"`
Port int `yaml:"PORT"`
DbConnectString string `yaml:"DB_CONNECT_STRING"`
Env string `yaml:"ENV"`
Redis RedisSubProp `yaml:"REDIS"`
Inline InlineSubProp `yaml:",inline"`
}

type RedisSubProp struct {
URL string `yaml:"URL"`
}

type InlineSubProp struct {
URL string `yaml:"INLINE_URL"`
}

0 comments on commit 87cbf63

Please sign in to comment.