fix: fillDefault, handling of nested structs (#3072)

This commit is contained in:
MarkJoyMa 2023-04-08 19:43:13 +08:00 committed by GitHub
parent 07f03ebd0c
commit 2e6402f4b5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 33 additions and 3 deletions

View File

@ -818,6 +818,11 @@ func (u *Unmarshaler) processNamedFieldWithoutValue(fieldType reflect.Type, valu
} }
if u.opts.fillDefault { if u.opts.fillDefault {
if fieldType.Kind() != reflect.Ptr && fieldKind == reflect.Struct {
return u.processFieldNotFromString(fieldType, value, valueWithParent{
value: emptyMap,
}, opts, fullName)
}
return nil return nil
} }

View File

@ -12,6 +12,7 @@ import (
"github.com/google/uuid" "github.com/google/uuid"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/zeromicro/go-zero/core/stringx" "github.com/zeromicro/go-zero/core/stringx"
) )
@ -4453,7 +4454,7 @@ func TestFillDefaultUnmarshal(t *testing.T) {
var st St var st St
err := fillDefaultUnmarshal.Unmarshal(map[string]any{}, &st) err := fillDefaultUnmarshal.Unmarshal(map[string]any{}, &st)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, st.A, "a") assert.Equal(t, "a", st.A)
}) })
t.Run("env", func(t *testing.T) { t.Run("env", func(t *testing.T) {
@ -4467,8 +4468,8 @@ func TestFillDefaultUnmarshal(t *testing.T) {
var st St var st St
err := fillDefaultUnmarshal.Unmarshal(map[string]any{}, &st) err := fillDefaultUnmarshal.Unmarshal(map[string]any{}, &st)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, st.A, "a") assert.Equal(t, "a", st.A)
assert.Equal(t, st.C, "c") assert.Equal(t, "c", st.C)
}) })
t.Run("has value", func(t *testing.T) { t.Run("has value", func(t *testing.T) {
@ -4482,6 +4483,30 @@ func TestFillDefaultUnmarshal(t *testing.T) {
err := fillDefaultUnmarshal.Unmarshal(map[string]any{}, &st) err := fillDefaultUnmarshal.Unmarshal(map[string]any{}, &st)
assert.Error(t, err) 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) { func Test_UnmarshalMap(t *testing.T) {