feat/conf_map_required (#4405)

Co-authored-by: aiden.ma <Aiden.ma@yijinin.com>
This commit is contained in:
MarkJoyMa 2025-01-13 01:13:41 +08:00 committed by GitHub
parent 11c47d23df
commit 12071d17b4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 41 additions and 1 deletions

View File

@ -919,12 +919,16 @@ func (u *Unmarshaler) processNamedFieldWithoutValue(fieldType reflect.Type, valu
}
switch fieldKind {
case reflect.Array, reflect.Map, reflect.Slice:
case reflect.Array, reflect.Slice:
if !opts.optional() {
return u.processFieldNotFromString(fieldType, value, valueWithParent{
value: emptyMap,
}, opts, fullName)
}
case reflect.Map:
if !opts.optional() {
return newInitError(fullName)
}
case reflect.Struct:
if !opts.optional() {
required, err := structValueRequired(u.key, derefedType)

View File

@ -2432,6 +2432,42 @@ func TestUnmarshalMapOfStruct(t *testing.T) {
}
assert.Error(t, UnmarshalKey(m, &v))
})
t.Run("map set", func(t *testing.T) {
type Inner1 struct {
M map[string]string
}
assert.Error(t, UnmarshalKey(map[string]any{}, &Inner1{}))
assert.NoError(t, UnmarshalKey(map[string]any{
"M": map[string]string{},
}, &Inner1{}))
type Inner2 struct {
Inner1
}
assert.Error(t, UnmarshalKey(map[string]any{}, &Inner2{}))
assert.NoError(t, UnmarshalKey(map[string]any{
"M": map[string]string{},
}, &Inner2{}))
type Inner3 struct {
C Inner1
}
assert.Error(t, UnmarshalKey(map[string]any{}, &Inner3{}))
assert.NoError(t, UnmarshalKey(map[string]any{
"C": map[string]any{
"M": map[string]string{},
},
}, &Inner3{}))
type Inner4 struct {
M map[string]string `json:",optional"`
}
assert.NoError(t, UnmarshalKey(map[string]any{}, &Inner4{}))
assert.NoError(t, UnmarshalKey(map[string]any{
"M": map[string]string{},
}, &Inner4{}))
})
}
func TestUnmarshalSlice(t *testing.T) {