mirror of
https://github.com/gin-gonic/gin.git
synced 2026-07-12 14:04:43 +08:00
Merge 513a86e17fa3ffed325c7f4f41fa3a919ce32afd into e88fc8927a52b74f55bec0351604a56ac0aa1c51
This commit is contained in:
commit
ced7894282
@ -186,7 +186,10 @@ type BindUnmarshaler interface {
|
|||||||
func trySetCustom(val string, value reflect.Value) (isSet bool, err error) {
|
func trySetCustom(val string, value reflect.Value) (isSet bool, err error) {
|
||||||
switch v := value.Addr().Interface().(type) {
|
switch v := value.Addr().Interface().(type) {
|
||||||
case BindUnmarshaler:
|
case BindUnmarshaler:
|
||||||
return true, v.UnmarshalParam(val)
|
if err := v.UnmarshalParam(val); err != nil {
|
||||||
|
return true, fmt.Errorf("invalid value %q: %w", val, err)
|
||||||
|
}
|
||||||
|
return true, nil
|
||||||
}
|
}
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
@ -245,7 +248,10 @@ func setByForm(value reflect.Value, field reflect.StructField, form map[string][
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ok, err = trySetCustom(vs[0], value); ok {
|
if ok, err = trySetCustom(vs[0], value); ok {
|
||||||
return ok, err
|
if err != nil {
|
||||||
|
return true, fmt.Errorf("field %q: %w", field.Name, err)
|
||||||
|
}
|
||||||
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if vs, err = trySplit(vs, field); err != nil {
|
if vs, err = trySplit(vs, field); err != nil {
|
||||||
@ -268,7 +274,10 @@ func setByForm(value reflect.Value, field reflect.StructField, form map[string][
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ok, err = trySetCustom(vs[0], value); ok {
|
if ok, err = trySetCustom(vs[0], value); ok {
|
||||||
return ok, err
|
if err != nil {
|
||||||
|
return true, fmt.Errorf("field %q: %w", field.Name, err)
|
||||||
|
}
|
||||||
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if vs, err = trySplit(vs, field); err != nil {
|
if vs, err = trySplit(vs, field); err != nil {
|
||||||
@ -293,7 +302,10 @@ func setByForm(value reflect.Value, field reflect.StructField, form map[string][
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ok, err := trySetCustom(val, value); ok {
|
if ok, err := trySetCustom(val, value); ok {
|
||||||
return ok, err
|
if err != nil {
|
||||||
|
return true, fmt.Errorf("field %q: %w", field.Name, err)
|
||||||
|
}
|
||||||
|
return true, nil
|
||||||
}
|
}
|
||||||
return true, setWithProperType(val, value, field)
|
return true, setWithProperType(val, value, field)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -715,3 +715,22 @@ func TestMappingEmptyValues(t *testing.T) {
|
|||||||
assert.Equal(t, []int{1, 2, 3}, s.SliceCsv)
|
assert.Equal(t, []int{1, 2, 3}, s.SliceCsv)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type testCustom struct {
|
||||||
|
Value string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *testCustom) UnmarshalParam(param string) error {
|
||||||
|
t.Value = "prefix_" + param
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestTrySetCustomIntegration(t *testing.T) {
|
||||||
|
var s struct {
|
||||||
|
F testCustom `form:"f"`
|
||||||
|
}
|
||||||
|
|
||||||
|
err := mappingByPtr(&s, formSource{"f": {"hello"}}, "form")
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Equal(t, "prefix_hello", s.F.Value)
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user