Skip to content

Commit

Permalink
fix: non empty struct pointer value (#236)
Browse files Browse the repository at this point in the history
Co-authored-by: Alexander Kutuev <AKutuev@slb.com>
  • Loading branch information
akutuev and Alexander Kutuev committed Sep 12, 2022
1 parent 69c7b5a commit f3ddf1f
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 6 deletions.
8 changes: 2 additions & 6 deletions env.go
Expand Up @@ -226,12 +226,8 @@ func doParseField(refField reflect.Value, refTypeField reflect.StructField, func
if !refField.CanSet() {
return nil
}
if reflect.Ptr == refField.Kind() && !refField.IsNil() {
if refField.Elem().Kind() == reflect.Struct {
return ParseWithFuncs(refField.Interface(), funcMap, optsWithPrefix(refTypeField, opts)...)
}

return ParseWithFuncs(refField.Interface(), funcMap, opts...)
if reflect.Ptr == refField.Kind() && refField.Elem().Kind() == reflect.Struct {
return ParseWithFuncs(refField.Interface(), funcMap, optsWithPrefix(refTypeField, opts)...)
}
if reflect.Struct == refField.Kind() && refField.CanAddr() && refField.Type().Name() == "" {
return ParseWithFuncs(refField.Addr().Interface(), funcMap, optsWithPrefix(refTypeField, opts)...)
Expand Down
46 changes: 46 additions & 0 deletions env_test.go
Expand Up @@ -1475,6 +1475,52 @@ func TestComplePrefix(t *testing.T) {
isEqual(t, "blahhh", cfg.Blah)
}

func TestNonStructPtrValues(t *testing.T) {
type Foo struct {
FltPtr *float64 `env:"FLT_PRT"`
}

type ComplexConfig struct {
StrPtr *string `env:"STR_PTR"`
Foo Foo `env:"FOO_"`
}

cfg1 := ComplexConfig{}

isNoErr(t, Parse(&cfg1))
isEqual(t, nil, cfg1.StrPtr)
isEqual(t, nil, cfg1.Foo.FltPtr)

strPtr := "str_ptr"
fltPtr := 3.16
cfg2 := ComplexConfig{
StrPtr: &strPtr,
Foo: Foo{
FltPtr: &fltPtr,
},
}

setEnv(t, "STR_PTR", "env_str_ptr")
setEnv(t, "FLT_PRT", "5.16")

isNoErr(t, Parse(&cfg2))
isEqual(t, "env_str_ptr", *cfg2.StrPtr)
isEqual(t, 5.16, *cfg2.Foo.FltPtr)

var strPtrNill *string
var fltPtrNill *float64
cfg3 := ComplexConfig{
StrPtr: strPtrNill,
Foo: Foo{
FltPtr: fltPtrNill,
},
}

isNoErr(t, Parse(&cfg3))
isEqual(t, "env_str_ptr", *cfg3.StrPtr)
isEqual(t, 5.16, *cfg3.Foo.FltPtr)
}

func isTrue(tb testing.TB, b bool) {
tb.Helper()

Expand Down

0 comments on commit f3ddf1f

Please sign in to comment.