From 7b6e87b44e096ba2f46e3e60737573b73f38acc0 Mon Sep 17 00:00:00 2001 From: Ather Shu Date: Mon, 6 Mar 2023 19:09:23 +0800 Subject: [PATCH] support form bind with **Struct (#3526) --- binding/form_mapping.go | 10 +++++----- binding/form_mapping_test.go | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/binding/form_mapping.go b/binding/form_mapping.go index 540bbbb8..57597313 100644 --- a/binding/form_mapping.go +++ b/binding/form_mapping.go @@ -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 } diff --git a/binding/form_mapping_test.go b/binding/form_mapping_test.go index 93d6a92f..65723b72 100644 --- a/binding/form_mapping_test.go +++ b/binding/form_mapping_test.go @@ -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()