Skip to content

Commit

Permalink
Add field name in Error message when Binding type mismatch
Browse files Browse the repository at this point in the history
Old error message
`
Unmarshal type error: expected=int, got=string, offset=47
`
New error message
`
Unmarshal type error: expected=int, got=string, field=age, offset=47
`
Make it easy to fix for client.
  • Loading branch information
anuchitop authored and vishr committed May 1, 2018
1 parent f867058 commit d36ff72
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 1 deletion.
2 changes: 1 addition & 1 deletion bind.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ func (b *DefaultBinder) Bind(i interface{}, c Context) (err error) {
case strings.HasPrefix(ctype, MIMEApplicationJSON):
if err = json.NewDecoder(req.Body).Decode(i); err != nil {
if ute, ok := err.(*json.UnmarshalTypeError); ok {
return NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Unmarshal type error: expected=%v, got=%v, offset=%v", ute.Type, ute.Value, ute.Offset))
return NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Unmarshal type error: expected=%v, got=%v, field=%v, offset=%v", ute.Type, ute.Value, ute.Field, ute.Offset))
} else if se, ok := err.(*json.SyntaxError); ok {
return NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Syntax error: offset=%v, error=%v", se.Offset, se.Error()))
} else {
Expand Down
17 changes: 17 additions & 0 deletions bind_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,23 @@ func TestBindbindData(t *testing.T) {
assertBindTestStruct(t, ts)
}

func TestBindUnmarshalTypeError(t *testing.T) {
body := bytes.NewBufferString(`{ "id": "text" }`)
e := New()
req := httptest.NewRequest(POST, "/", body)
req.Header.Set(HeaderContentType, MIMEApplicationJSON)

rec := httptest.NewRecorder()
c := e.NewContext(req, rec)
u := new(user)

err := c.Bind(u)

he := &HTTPError{Code: http.StatusBadRequest, Message: "Unmarshal type error: expected=int, got=string, field=id, offset=14"}

assert.Equal(t, he, err)
}

func TestBindSetWithProperType(t *testing.T) {
ts := new(bindTestStruct)
typ := reflect.TypeOf(ts).Elem()
Expand Down

0 comments on commit d36ff72

Please sign in to comment.