Skip to content

Commit

Permalink
Add support of pointers in form binding (#1336)
Browse files Browse the repository at this point in the history
* Add support of pointers in form binding

* Add tests for pointer form binding
  • Loading branch information
lokhman authored and appleboy committed Apr 26, 2018
1 parent 8c24018 commit 2282be0
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 0 deletions.
38 changes: 38 additions & 0 deletions binding/binding_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,15 @@ type FooBarStructForFloat64Type struct {
Float64Bar float64 `form:"float64_bar" binding:"required"`
}

type FooStructForStringPtrType struct {
PtrFoo *string `form:"ptr_foo"`
PtrBar *string `form:"ptr_bar" binding:"required"`
}

type FooStructForMapPtrType struct {
PtrBar *map[string]interface{} `form:"ptr_bar"`
}

func TestBindingDefault(t *testing.T) {
assert.Equal(t, Form, Default("GET", ""))
assert.Equal(t, Form, Default("GET", MIMEJSON))
Expand Down Expand Up @@ -378,6 +387,14 @@ func TestBindingFormForType(t *testing.T) {
testFormBindingForType(t, "GET",
"/?float64_foo=&float64_bar=-12.34", "/?bar2=12.3",
"", "", "Float64")

testFormBindingForType(t, "POST",
"/", "/",
"ptr_bar=test", "bar2=test", "Ptr")

testFormBindingForType(t, "GET",
"/?ptr_bar=test", "/?bar2=test",
"", "", "Ptr")
}

func TestBindingQuery(t *testing.T) {
Expand Down Expand Up @@ -944,6 +961,27 @@ func testFormBindingForType(t *testing.T, method, path, badPath, body, badBody s
obj := FooStructForSliceMapType{}
err := b.Bind(req, &obj)
assert.Error(t, err)
case "Ptr":
obj := FooStructForStringPtrType{}
err := b.Bind(req, &obj)
assert.NoError(t, err)
assert.Nil(t, obj.PtrFoo)
assert.Equal(t, "test", *obj.PtrBar)

obj = FooStructForStringPtrType{}
obj.PtrBar = new(string)
err = b.Bind(req, &obj)
assert.NoError(t, err)
assert.Equal(t, "test", *obj.PtrBar)

objErr := FooStructForMapPtrType{}
err = b.Bind(req, &objErr)
assert.Error(t, err)

obj = FooStructForStringPtrType{}
req = requestWithBody(method, badPath, badBody)
err = b.Bind(req, &obj)
assert.Error(t, err)
}
}

Expand Down
6 changes: 6 additions & 0 deletions binding/form_mapping.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,12 @@ func setWithProperType(valueKind reflect.Kind, val string, structField reflect.V
return setFloatField(val, 64, structField)
case reflect.String:
structField.SetString(val)
case reflect.Ptr:
if !structField.Elem().IsValid() {
structField.Set(reflect.New(structField.Type().Elem()))
}
structFieldElem := structField.Elem()
return setWithProperType(structFieldElem.Kind(), val, structFieldElem)
default:
return errors.New("Unknown type")
}
Expand Down

1 comment on commit 2282be0

@ritoon
Copy link

@ritoon ritoon commented on 2282be0 Apr 27, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Please sign in to comment.