mirror of
https://github.com/gin-gonic/gin.git
synced 2025-10-15 04:57:07 +08:00
support form bind with **Struct (#3526)
This commit is contained in:
parent
a889c58de7
commit
7b6e87b44e
@ -74,11 +74,11 @@ func (form formSource) TrySet(value reflect.Value, field reflect.StructField, ta
|
||||
}
|
||||
|
||||
func mappingByPtr(ptr any, setter setter, tag string) error {
|
||||
_, err := mapping(reflect.ValueOf(ptr), emptyField, setter, tag)
|
||||
_, err := mapping(reflect.ValueOf(ptr), &emptyField, setter, tag)
|
||||
return err
|
||||
}
|
||||
|
||||
func mapping(value reflect.Value, field reflect.StructField, setter setter, tag string) (bool, error) {
|
||||
func mapping(value reflect.Value, field *reflect.StructField, setter setter, tag string) (bool, error) {
|
||||
if field.Tag.Get(tag) == "-" { // just ignoring this field
|
||||
return false, nil
|
||||
}
|
||||
@ -96,14 +96,14 @@ func mapping(value reflect.Value, field reflect.StructField, setter setter, tag
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
if isNew && isSet {
|
||||
if isNew && (isSet || field == &emptyField) {
|
||||
value.Set(vPtr)
|
||||
}
|
||||
return isSet, nil
|
||||
}
|
||||
|
||||
if vKind != reflect.Struct || !field.Anonymous {
|
||||
ok, err := tryToSetValue(value, field, setter, tag)
|
||||
ok, err := tryToSetValue(value, *field, setter, tag)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
@ -121,7 +121,7 @@ func mapping(value reflect.Value, field reflect.StructField, setter setter, tag
|
||||
if sf.PkgPath != "" && !sf.Anonymous { // unexported
|
||||
continue
|
||||
}
|
||||
ok, err := mapping(value.Field(i), sf, setter, tag)
|
||||
ok, err := mapping(value.Field(i), &sf, setter, tag)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
@ -52,7 +52,7 @@ func TestMappingBaseTypes(t *testing.T) {
|
||||
|
||||
field := val.Elem().Type().Field(0)
|
||||
|
||||
_, err := mapping(val, emptyField, formSource{field.Name: {tt.form}}, "form")
|
||||
_, err := mapping(val, &emptyField, formSource{field.Name: {tt.form}}, "form")
|
||||
assert.NoError(t, err, testName)
|
||||
|
||||
actual := val.Elem().Field(0).Interface()
|
||||
|
Loading…
x
Reference in New Issue
Block a user