diff --git a/config_loader.go b/config_loader.go index 2cd5a41..eadc2df 100644 --- a/config_loader.go +++ b/config_loader.go @@ -5,6 +5,7 @@ import ( "os" "reflect" "strconv" + "strings" "github.com/pkg/errors" "gopkg.in/yaml.v3" @@ -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 { diff --git a/config_loader_test.go b/config_loader_test.go index 7377df7..94be2f3 100644 --- a/config_loader_test.go +++ b/config_loader_test.go @@ -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") @@ -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) { @@ -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) @@ -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) { @@ -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"` +}