-
Notifications
You must be signed in to change notification settings - Fork 0
/
router.go
123 lines (99 loc) · 3.08 KB
/
router.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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package lightning
import (
"github.com/buaazp/fasthttprouter"
"github.com/headwindfly/sessions"
"github.com/valyala/fasthttp"
)
type Router struct {
*fasthttprouter.Router
middlewares []Middleware
sessionStore sessions.Store
}
func NewRouter() *Router {
return &Router{
Router: fasthttprouter.New(),
middlewares: make([]Middleware, 0),
}
}
func (r *Router) SetSessionStore(store sessions.Store) {
r.sessionStore = store
}
func (r *Router) SetMiddlewares(middlewares []Middleware) {
r.middlewares = middlewares
}
func (r *Router) AddMiddleware(middleware Middleware) {
r.middlewares = append(r.middlewares, middleware)
}
func (r *Router) GET(path string, handler Handler) {
r.Router.GET(path, r.getHandler(handler))
}
func (r *Router) HEAD(path string, handler Handler) {
r.Router.HEAD(path, r.getHandler(handler))
}
func (r *Router) OPTIONS(path string, handler Handler) {
r.Router.OPTIONS(path, r.getHandler(handler))
}
func (r *Router) POST(path string, handler Handler) {
r.Router.POST(path, r.getHandler(handler))
}
func (r *Router) PUT(path string, handler Handler) {
r.Router.PUT(path, r.getHandler(handler))
}
func (r *Router) PATCH(path string, handler Handler) {
r.Router.PATCH(path, r.getHandler(handler))
}
func (r *Router) DELETE(path string, handler Handler) {
r.Router.DELETE(path, r.getHandler(handler))
}
func (r *Router) Handle(method, path string, handler Handler) {
r.Router.Handle(method, path, r.getHandler(handler))
}
func (r *Router) getHandler(handler Handler) fasthttprouter.Handle {
for i := len(r.middlewares) - 1; i >= 0; i-- {
handler = r.middlewares[i].Handle(handler)
}
return func(_ctx *fasthttp.RequestCtx, ps fasthttprouter.Params) {
ctx := NewContext(r, _ctx, &ps)
handler.Handle(ctx)
}
}
func (r *Router) RegisterController(route string, c ControllerInterface) {
handlers := make(map[string]Handler, 0)
// Register GET request's handler.
var getHandler Handler
getHandler = c.Handle(HandlerFunc(c.GET))
handlers["GET"] = getHandler
// Register POST request's handler.
var postHandler Handler
postHandler = c.Handle(HandlerFunc(c.POST))
handlers["POST"] = postHandler
// Register DELETE request's handler.
var deleteHandler Handler
deleteHandler = c.Handle(HandlerFunc(c.DELETE))
handlers["DELETE"] = deleteHandler
// Register PUT request's handler.
var putHandler Handler
putHandler = c.Handle(HandlerFunc(c.PUT))
handlers["PUT"] = putHandler
// Register OPTIONS request's handler.
var optionsHandler Handler
optionsHandler = c.Handle(HandlerFunc(c.OPTIONS))
handlers["OPTIONS"] = optionsHandler
// Register PATCH request's handler.
var patchHandler Handler
patchHandler = c.Handle(HandlerFunc(c.PATCH))
handlers["PATCH"] = patchHandler
for method, handler := range handlers {
var _handler Handler
_handler = handler
// Register middlewares.
for i := len(r.middlewares) - 1; i >= 0; i-- {
_handler = r.middlewares[i].Handle(_handler)
}
// Add to route.
r.Router.Handle(method, route, func(_ctx *fasthttp.RequestCtx, ps fasthttprouter.Params) {
ctx := NewContext(r, _ctx, &ps)
_handler.Handle(ctx)
})
}
}