From 2e6402f4b57895f1ef3c2e0f1f0d6a1eaf1e93ef Mon Sep 17 00:00:00 2001 From: MarkJoyMa <64180138+MarkJoyMa@users.noreply.github.com> Date: Sat, 8 Apr 2023 19:43:13 +0800 Subject: [PATCH] fix: fillDefault, handling of nested structs (#3072) --- core/mapping/unmarshaler.go | 5 +++++ core/mapping/unmarshaler_test.go | 31 ++++++++++++++++++++++++++++--- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/core/mapping/unmarshaler.go b/core/mapping/unmarshaler.go index e64a7675..e6d8a497 100644 --- a/core/mapping/unmarshaler.go +++ b/core/mapping/unmarshaler.go @@ -818,6 +818,11 @@ func (u *Unmarshaler) processNamedFieldWithoutValue(fieldType reflect.Type, valu } if u.opts.fillDefault { + if fieldType.Kind() != reflect.Ptr && fieldKind == reflect.Struct { + return u.processFieldNotFromString(fieldType, value, valueWithParent{ + value: emptyMap, + }, opts, fullName) + } return nil } diff --git a/core/mapping/unmarshaler_test.go b/core/mapping/unmarshaler_test.go index 1f723263..6d373444 100644 --- a/core/mapping/unmarshaler_test.go +++ b/core/mapping/unmarshaler_test.go @@ -12,6 +12,7 @@ import ( "github.com/google/uuid" "github.com/stretchr/testify/assert" + "github.com/zeromicro/go-zero/core/stringx" ) @@ -4453,7 +4454,7 @@ func TestFillDefaultUnmarshal(t *testing.T) { var st St err := fillDefaultUnmarshal.Unmarshal(map[string]any{}, &st) assert.NoError(t, err) - assert.Equal(t, st.A, "a") + assert.Equal(t, "a", st.A) }) t.Run("env", func(t *testing.T) { @@ -4467,8 +4468,8 @@ func TestFillDefaultUnmarshal(t *testing.T) { var st St err := fillDefaultUnmarshal.Unmarshal(map[string]any{}, &st) assert.NoError(t, err) - assert.Equal(t, st.A, "a") - assert.Equal(t, st.C, "c") + assert.Equal(t, "a", st.A) + assert.Equal(t, "c", st.C) }) t.Run("has value", func(t *testing.T) { @@ -4482,6 +4483,30 @@ func TestFillDefaultUnmarshal(t *testing.T) { err := fillDefaultUnmarshal.Unmarshal(map[string]any{}, &st) assert.Error(t, err) }) + + t.Run("handling struct", func(t *testing.T) { + type St struct { + A string `json:",default=a"` + B string + } + type St2 struct { + St + St1 St + St3 *St + C string `json:",default=c"` + D string + Child *St2 + } + var st2 St2 + err := fillDefaultUnmarshal.Unmarshal(map[string]any{}, &st2) + assert.NoError(t, err) + assert.Equal(t, "a", st2.St.A) + assert.Equal(t, "a", st2.St1.A) + assert.Nil(t, st2.St3) + assert.Equal(t, "c", st2.C) + assert.Nil(t, st2.Child) + }) + } func Test_UnmarshalMap(t *testing.T) {