From 4d46f5c770dddea15e050ebf8aed709389b4427c Mon Sep 17 00:00:00 2001 From: NiseVoid Date: Tue, 9 Oct 2018 19:18:09 +0200 Subject: [PATCH] Add Reader --- default.go | 11 +++++++++++ router.go | 14 ++++++++------ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/default.go b/default.go index 99cc394..2f0aeac 100644 --- a/default.go +++ b/default.go @@ -1,6 +1,7 @@ package router import ( + "encoding/json" "fmt" ) @@ -16,3 +17,13 @@ func defaultErrorHandler(c *Context, err interface{}) { fmt.Println(err) c.String(500, `internal server error`) } + +func defaultReader(c *Context, dst interface{}) bool { + err := json.NewDecoder(c.Request.Body).Decode(dst) + if err != nil { + c.NoContent(400) + return false + } + + return true +} diff --git a/router.go b/router.go index 720c417..45d0619 100644 --- a/router.go +++ b/router.go @@ -1,7 +1,6 @@ package router import ( - "encoding/json" "net/http" "reflect" @@ -24,9 +23,13 @@ type ErrorHandle func(*Context, interface{}) // Middleware TODO: type Middleware func(Handle) Handle +// Binder reads input to dst, returns true is successful +type Reader func(c *Context, dst interface{}) bool + // Router is the router itself type Router struct { routes []route + Reader Reader Renderer Renderer middleware []Middleware NotFoundHandler Handle @@ -36,7 +39,7 @@ type Router struct { // New returns a new Router func New() *Router { - return &Router{NotFoundHandler: defaultNotFoundHandler, MethodNotAllowedHandler: defaultMethodNotAllowedHandler, ErrorHandler: defaultErrorHandler} + return &Router{Reader: defaultReader, NotFoundHandler: defaultNotFoundHandler, MethodNotAllowedHandler: defaultMethodNotAllowedHandler, ErrorHandler: defaultErrorHandler} } // Use adds a global middleware @@ -161,12 +164,11 @@ func handlePOST(r *Router, f interface{}) Handle { return func(c *Context) error { data := reflect.New(inputRt) - err := json.NewDecoder(c.Request.Body).Decode(data.Interface()) - c.Request.Body.Close() - if err != nil { - c.NoContent(400) // TODO: send info about error (BindError) + if !r.Reader(c, data.Interface()) { + c.Request.Body.Close() return nil } + c.Request.Body.Close() out := funcRv.Call([]reflect.Value{reflect.ValueOf(c), data.Elem()})