Skip to content

Commit

Permalink
Merge pull request #71 from DIMO-Network/config-inline-support
Browse files Browse the repository at this point in the history
Adds inline support for loading config from ENV.
  • Loading branch information
KevinJoiner committed Jul 1, 2024
2 parents bf3e070 + ed18320 commit 6ce137e
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 6 deletions.
11 changes: 9 additions & 2 deletions config_loader.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"os"
"reflect"
"strconv"
"strings"

"github.com/pkg/errors"
"gopkg.in/yaml.v3"
Expand Down Expand Up @@ -51,12 +52,18 @@ func loadFromEnvVars[S any](settings S) error {
for i := 0; i < valueOfConfig.NumField(); i++ {
field := valueOfConfig.Field(i)
fieldYamlName := typeOfT.Field(i).Tag.Get("yaml")

if fieldYamlName == "-" {
continue
}
if field.Kind() == reflect.Struct {
// 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 !strings.HasSuffix(fieldYamlName, ",inline") {
subFieldYamlName = fieldYamlName + "_" + subFieldYamlName
}

err = matchEnvVarToField(subFieldYamlName, subField)
}
} else {
Expand Down
22 changes: 18 additions & 4 deletions config_loader_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ DB_CONNECT_STRING: mydb.aws.net
ENV: dev
REDIS:
URL: redis.bobby
INLINE_URL: inline.bobby
IGNORE: ignoreme
`
settings, err := loadFromYaml[TestSettings]([]byte(data))
assert.NoError(t, err, "no error expected")
Expand All @@ -22,6 +24,8 @@ 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)
assert.Equal(t, "", settings.IGNORE)
}

func Test_loadFromEnvVars(t *testing.T) {
Expand All @@ -34,6 +38,8 @@ 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")
t.Setenv("IGNORE", "ignoreme")

err := loadFromEnvVars(&settings) // b/c of type inference we don't need to specify the type
assert.NoError(t, err)
Expand All @@ -42,6 +48,8 @@ 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)
assert.Equal(t, "", settings.IGNORE)
}

func Test_loadFromEnvVars_errIfNotPointer(t *testing.T) {
Expand All @@ -65,12 +73,18 @@ 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"`
IGNORE string `yaml:"-"`
}

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

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

0 comments on commit 6ce137e

Please sign in to comment.