From f3ddf1f7ee602a224429717ddc431e9083d45882 Mon Sep 17 00:00:00 2001 From: akutuev Date: Mon, 12 Sep 2022 13:49:40 +0100 Subject: [PATCH] fix: non empty struct pointer value (#236) Co-authored-by: Alexander Kutuev --- env.go | 8 ++------ env_test.go | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/env.go b/env.go index 625aaa2..f0b09df 100644 --- a/env.go +++ b/env.go @@ -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)...) diff --git a/env_test.go b/env_test.go index cf25c1e..1190ea4 100644 --- a/env_test.go +++ b/env_test.go @@ -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()