-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgoober.go
109 lines (101 loc) · 2.28 KB
/
goober.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
package goober
import (
"fmt"
"net/http"
)
type Route struct {
Method string
Pattern string
Handler HandlerFunc
Middleware []MiddlewareFunc
}
type Goober struct {
*Group
Logger bool
CustomLogStatus bool
CustomLog MiddlewareFunc
groups []*Group
middleware []MiddlewareFunc
}
func Init() *Goober {
web := &Goober{
Group: &Group{
Prefix: "",
},
Logger: true,
}
return web
}
func Default() *Goober {
web := &Goober{
Group: &Group{
Prefix: "",
},
Logger: true,
}
return web
}
func (ws *Goober) AddGroup(prefix string) *Group {
group := &Group{Prefix: prefix}
ws.groups = append(ws.groups, group)
return group
}
func (ws *Goober) SetCustomLogger(logger MiddlewareFunc) MiddlewareFunc {
ws.CustomLog = logger
return logger
}
func (ws *Goober) Start(port string) error {
if ws.Logger {
if ws.CustomLog != nil {
ws.Use(ws.CustomLog)
}
ws.Use(LoggingMiddleware)
}
for _, route := range ws.Group.Routes {
register(ws.Group, &route, ws)
}
for _, group := range ws.groups {
fmt.Println(group)
for _, route := range group.Routes {
register(group, &route, ws)
}
}
fmt.Println("Server started on port " + port)
return http.ListenAndServe(":"+port, nil)
}
func register(group *Group, route *Route, ws *Goober) {
fullPattern := group.Prefix + route.Pattern
// fmt.Printf("Registering route: %s %s\n", route.Method, fullPattern)
http.HandleFunc(fullPattern, func(w http.ResponseWriter, r *http.Request) {
// middle := route.Middleware
if r.Method != route.Method {
http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed)
return
}
ctx := &Context{
Request: r,
Response: ResponseWriter{
ResponseWriter: w,
},
Params: extractParams(fullPattern, r.URL.Path),
Headers: extractHeaders(r),
Query: extractQueryParams(r),
Body: extractBody(r),
}
//
allMiddleware := append(ws.middleware, group.Middleware...)
allMiddleware = append(allMiddleware, route.Middleware...)
allMiddleware = append(allMiddleware, ws.Group.Middleware...)
currentHandler := route.Handler
for i := len(allMiddleware) - 1; i >= 0; i-- {
next := currentHandler
mw := allMiddleware[i]
currentHandler = func(c *Context) {
mw(c, func() {
next(c)
})
}
}
currentHandler(ctx)
})
}