Skip to content

Commit 0f77fef

Browse files
authoredApr 30, 2024··
fix: add logic to handle nil pointer structs (#306)
1 parent 3c53a9e commit 0f77fef

File tree

2 files changed

+22
-0
lines changed

2 files changed

+22
-0
lines changed
 

‎env.go

+13
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,15 @@ func doParseField(refField reflect.Value, refTypeField reflect.StructField, proc
300300
return err
301301
}
302302

303+
if isStructPtr(refField) && refField.IsNil() {
304+
refField.Set(reflect.New(refField.Type().Elem()))
305+
refField = refField.Elem()
306+
}
307+
308+
if _, ok := opts.FuncMap[refField.Type()]; ok {
309+
return nil
310+
}
311+
303312
if reflect.Struct == refField.Kind() {
304313
return doParse(refField, processField, optionsWithEnvPrefix(refTypeField, opts))
305314
}
@@ -644,3 +653,7 @@ func parseTextUnmarshalers(field reflect.Value, data []string, sf reflect.Struct
644653
func ToMap(env []string) map[string]string {
645654
return toMap(env)
646655
}
656+
657+
func isStructPtr(v reflect.Value) bool {
658+
return reflect.Ptr == v.Kind() && v.Type().Elem().Kind() == reflect.Struct
659+
}

‎env_test.go

+9
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,15 @@ func TestParsesEnvInner(t *testing.T) {
595595
isEqual(t, uint(8), cfg.InnerStruct.Number)
596596
}
597597

598+
func TestParsesEnvInner_WhenInnerStructPointerIsNil(t *testing.T) {
599+
t.Setenv("innervar", "someinnervalue")
600+
t.Setenv("innernum", "8")
601+
cfg := ParentStruct{}
602+
isNoErr(t, Parse(&cfg))
603+
isEqual(t, "someinnervalue", cfg.InnerStruct.Inner)
604+
isEqual(t, uint(8), cfg.InnerStruct.Number)
605+
}
606+
598607
func TestParsesEnvInnerFails(t *testing.T) {
599608
type config struct {
600609
Foo struct {

0 commit comments

Comments
 (0)
Please sign in to comment.