From 87cbf637b21c11d40b9137b643d4190d0d831ea2 Mon Sep 17 00:00:00 2001 From: Kevin Joiner <10265309+KevinJoiner@users.noreply.github.com> Date: Thu, 27 Jun 2024 14:51:23 -0400 Subject: [PATCH 1/3] Adds inline support for loading config from ENV. --- config_loader.go | 5 ++++- config_loader_test.go | 17 +++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/config_loader.go b/config_loader.go index 2cd5a41..98facbb 100644 --- a/config_loader.go +++ b/config_loader.go @@ -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 { diff --git a/config_loader_test.go b/config_loader_test.go index 7377df7..8fed4ed 100644 --- a/config_loader_test.go +++ b/config_loader_test.go @@ -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") @@ -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) { @@ -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) @@ -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) { @@ -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"` +} From dcb96674237c205833ce6cc69fd77ecbbf4a767a Mon Sep 17 00:00:00 2001 From: Kevin Joiner <10265309+KevinJoiner@users.noreply.github.com> Date: Thu, 27 Jun 2024 15:02:24 -0400 Subject: [PATCH 2/3] Add '-' ignore --- config_loader.go | 8 ++++++-- config_loader_test.go | 5 +++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/config_loader.go b/config_loader.go index 98facbb..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,15 +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 := field.Type().Field(i).Tag.Get("yaml") - if fieldYamlName != ",inline" { + 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 8fed4ed..4ec74e7 100644 --- a/config_loader_test.go +++ b/config_loader_test.go @@ -15,6 +15,7 @@ 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") @@ -24,6 +25,7 @@ INLINE_URL: inline.bobby 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) { @@ -37,6 +39,7 @@ func Test_loadFromEnvVars(t *testing.T) { 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) @@ -46,6 +49,7 @@ func Test_loadFromEnvVars(t *testing.T) { 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) { @@ -74,6 +78,7 @@ type TestSettings struct { Env string `yaml:"ENV"` Redis RedisSubProp `yaml:"REDIS"` Inline InlineSubProp `yaml:",inline"` + Ignore string `yaml:"-"` } type RedisSubProp struct { From ed1832058beb6de62f049ca472c8b34e9a2bbc10 Mon Sep 17 00:00:00 2001 From: Kevin Joiner <10265309+KevinJoiner@users.noreply.github.com> Date: Thu, 27 Jun 2024 15:37:13 -0400 Subject: [PATCH 3/3] Update IGNORE test --- config_loader_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config_loader_test.go b/config_loader_test.go index 4ec74e7..94be2f3 100644 --- a/config_loader_test.go +++ b/config_loader_test.go @@ -25,7 +25,7 @@ IGNORE: ignoreme 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) + assert.Equal(t, "", settings.IGNORE) } func Test_loadFromEnvVars(t *testing.T) { @@ -49,7 +49,7 @@ func Test_loadFromEnvVars(t *testing.T) { 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) + assert.Equal(t, "", settings.IGNORE) } func Test_loadFromEnvVars_errIfNotPointer(t *testing.T) { @@ -78,7 +78,7 @@ type TestSettings struct { Env string `yaml:"ENV"` Redis RedisSubProp `yaml:"REDIS"` Inline InlineSubProp `yaml:",inline"` - Ignore string `yaml:"-"` + IGNORE string `yaml:"-"` } type RedisSubProp struct {