/
render.go
46 lines (38 loc) · 1.36 KB
/
render.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package middlewares
import (
"errors"
"net/http"
"github.com/fzerorubigd/kitchen"
"github.com/unrolled/render"
)
// RenderContextKey is the key used to store render inside the context
const RenderContextKey key = 1
type rndr struct {
next http.Handler
rndr *render.Render
}
func (rn *rndr) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// Do not call panic, here. I think its ok to just ignore this requests
if ctx, ok := w.(kitchen.ResponseWriter); ok {
ctx.SetWithValue(RenderContextKey, rn.rndr)
}
rn.next.ServeHTTP(w, r)
}
// RenderMiddlewareGenerator generate a new render middleware for use in kitchen using render package
// Personally I hate when the framework automatically render a template base on its name. so its
// not an option here.
func RenderMiddlewareGenerator(rn *render.Render) kitchen.Middleware {
return func(next http.Handler) http.Handler {
return &rndr{next, rn}
}
}
// GetRender is a helper function and returns the render object.
// Reterns error in case of wrong interface or when the middleware is not used on the request.
func GetRender(w http.ResponseWriter) (*render.Render, error) {
if ctx, ok := w.(kitchen.ResponseWriter); ok {
if r, ok := ctx.Context().Value(RenderContextKey).(*render.Render); ok {
return r, nil
}
}
return nil, errors.New("you are not inside the kitchen or render middleware is not active")
}