From ae68248d25ca942eeb7f600dbbd6bf3624c085de Mon Sep 17 00:00:00 2001 From: NiseVoid Date: Sun, 19 Aug 2018 17:04:29 +0200 Subject: [PATCH] Add Renderer --- context.go | 14 ++++++++++++-- router.go | 16 ++++++++-------- type.go | 9 +++++++++ 3 files changed, 29 insertions(+), 10 deletions(-) create mode 100644 type.go diff --git a/context.go b/context.go index 4ca32f7..26efcda 100644 --- a/context.go +++ b/context.go @@ -9,14 +9,15 @@ import ( // Context is passed to handlers and middlewares type Context struct { + router *Router Request *http.Request Response http.ResponseWriter Param func(string) string store map[string]interface{} } -func newContext(res http.ResponseWriter, req *http.Request, param httprouter.Params) *Context { - return &Context{req, res, param.ByName, make(map[string]interface{})} +func newContext(router *Router, res http.ResponseWriter, req *http.Request, param httprouter.Params) *Context { + return &Context{router, req, res, param.ByName, make(map[string]interface{})} } // String returns the given status code and writes the bytes to the body @@ -45,6 +46,15 @@ func (c *Context) JSON(code int, data interface{}) error { return json.NewEncoder(c.Response).Encode(data) // TODO: Encode to buffer first to prevent partial responses on error } +func (c *Context) Render(code int, template string, data interface{}) error { + if c.router.Renderer == nil { + panic(`Cannot call render without a renderer set`) + } + + c.Response.WriteHeader(code) + return c.router.Renderer.Render(c.Response, template, data, c) +} + // Set sets a value in the context. Set is not safe to be used concurrently func (c *Context) Set(key string, value interface{}) { c.store[key] = value diff --git a/router.go b/router.go index 31d4b7a..4c1c616 100644 --- a/router.go +++ b/router.go @@ -20,8 +20,8 @@ type GetHandle func(*Context) error // Router is the router itself type Router struct { - routes []route - Port int + routes []route + Renderer Renderer } // New returns a new Router @@ -83,11 +83,11 @@ func (r *Router) getHttpr() *httprouter.Router { for _, v := range r.routes { if handle, ok := v.Handle.(GetHandle); ok { - httpr.Handle(v.Method, v.Path, handleGET(handle)) + httpr.Handle(v.Method, v.Path, handleGET(r, handle)) continue } - httpr.Handle(v.Method, v.Path, handlePOST(v.Handle)) + httpr.Handle(v.Method, v.Path, handlePOST(r, v.Handle)) } return httpr @@ -119,11 +119,11 @@ func checkInterfaceHandle(f interface{}) { return } -func handlePOST(f interface{}) httprouter.Handle { +func handlePOST(r *Router, f interface{}) httprouter.Handle { funcRv, inputRt := reflect.ValueOf(f), reflect.TypeOf(f).In(1) return func(res http.ResponseWriter, req *http.Request, param httprouter.Params) { - c := newContext(res, req, param) + c := newContext(r, res, req, param) data := reflect.New(inputRt) { @@ -141,9 +141,9 @@ func handlePOST(f interface{}) httprouter.Handle { } } -func handleGET(f GetHandle) httprouter.Handle { +func handleGET(r *Router, f GetHandle) httprouter.Handle { return func(res http.ResponseWriter, req *http.Request, param httprouter.Params) { - c := newContext(res, req, param) + c := newContext(r, res, req, param) err := f(c) diff --git a/type.go b/type.go new file mode 100644 index 0000000..2d5c6a5 --- /dev/null +++ b/type.go @@ -0,0 +1,9 @@ +package router + +import ( + "io" +) + +type Renderer interface { + Render(w io.Writer, template string, data interface{}, c *Context) error +}