-
Notifications
You must be signed in to change notification settings - Fork 0
/
router.go
105 lines (83 loc) · 2.23 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
package router
import (
zeroapi "github.com/zerogo-hub/zero-api"
)
type router struct {
// app 应用实例
app zeroapi.App
prefix string
// routes 按照 Method 存储路由
routes map[string]Route
// validators 存储验证函数
validators map[string]zeroapi.RouterValidator
}
// NewRouter 创建一个 zeroapi.Router 实例
func NewRouter(app zeroapi.App) zeroapi.Router {
return &router{
app: app,
routes: make(map[string]Route, len(zeroapi.AllMethods())),
validators: make(map[string]zeroapi.RouterValidator),
}
}
// Prefix 设置前缀,设置前就已添加的路由不会有该前缀
// 例如: prefix = "/blog",则 "/user" -> "/blog/user"
func (r *router) Prefix(prefix string) {
if len(prefix) == 0 {
return
}
if prefix[0] != '/' {
prefix = "/" + prefix
}
r.prefix = prefix
}
// Register 注册路由处理函数,以及中间件
// method: HTTP Method,见 core/const.go Methodxxxx
// path: 路径,以 "/" 开头,不可以为空
// handles: 处理函数和路由级别中间件,匹配成功后会调用该函数
func (r *router) Register(method, path string, handlers ...zeroapi.Handler) bool {
if len(path) == 0 {
return false
} else if len(handlers) == 0 {
return false
}
if r.prefix != "" {
path = r.prefix + "/" + path
}
re := r.routes[method]
if re == nil {
re = NewRoute()
r.routes[method] = re
}
re.Insert(path, handlers...)
return true
}
// Build 解析路由,包括动态参数,正则表达式,验证函数的解析,路由路径查找优化
func (r *router) Build() bool {
for _, re := range r.routes {
if !re.Build(r) {
return false
}
}
return true
}
// Lookup 查找路由
func (r *router) Lookup(method, path string) ([]zeroapi.Handler, map[string]string) {
if re := r.routes[method]; re != nil {
return re.Lookup(path)
}
return nil, nil
}
// RegisterRouterValidator 注册路由验证函数
func (r *router) RegisterRouterValidator(name string, validator zeroapi.RouterValidator) {
if _, exist := r.validators[name]; exist {
return
}
r.validators[name] = validator
}
// Validator 获取路由验证函数
func (r *router) Validator(name string) zeroapi.RouterValidator {
if f, exist := r.validators[name]; exist {
return f
}
return nil
}