Skip to content

Commit

Permalink
fix: add logic to handle nil pointer structs (#306)
Browse files Browse the repository at this point in the history
  • Loading branch information
NithinGudla committed Apr 30, 2024
1 parent 3c53a9e commit 0f77fef
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 0 deletions.
13 changes: 13 additions & 0 deletions env.go
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,15 @@ func doParseField(refField reflect.Value, refTypeField reflect.StructField, proc
return err
}

if isStructPtr(refField) && refField.IsNil() {
refField.Set(reflect.New(refField.Type().Elem()))
refField = refField.Elem()
}

if _, ok := opts.FuncMap[refField.Type()]; ok {
return nil
}

if reflect.Struct == refField.Kind() {
return doParse(refField, processField, optionsWithEnvPrefix(refTypeField, opts))
}
Expand Down Expand Up @@ -644,3 +653,7 @@ func parseTextUnmarshalers(field reflect.Value, data []string, sf reflect.Struct
func ToMap(env []string) map[string]string {
return toMap(env)
}

func isStructPtr(v reflect.Value) bool {
return reflect.Ptr == v.Kind() && v.Type().Elem().Kind() == reflect.Struct
}
9 changes: 9 additions & 0 deletions env_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -595,6 +595,15 @@ func TestParsesEnvInner(t *testing.T) {
isEqual(t, uint(8), cfg.InnerStruct.Number)
}

func TestParsesEnvInner_WhenInnerStructPointerIsNil(t *testing.T) {
t.Setenv("innervar", "someinnervalue")
t.Setenv("innernum", "8")
cfg := ParentStruct{}
isNoErr(t, Parse(&cfg))
isEqual(t, "someinnervalue", cfg.InnerStruct.Inner)
isEqual(t, uint(8), cfg.InnerStruct.Number)
}

func TestParsesEnvInnerFails(t *testing.T) {
type config struct {
Foo struct {
Expand Down

0 comments on commit 0f77fef

Please sign in to comment.