-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathmodule.go
145 lines (130 loc) · 3.69 KB
/
module.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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package xmux
import (
"net/http"
"sync"
"github.com/hyahm/xmux/helper"
)
func DefaultModuleTemplate(w http.ResponseWriter, r *http.Request) bool {
return false
}
// 在启动的时候才会执行, 所以不用加锁
type module struct {
// order []func(w http.ResponseWriter, r *http.Request) bool // 保存执行的顺序
filter map[string]struct{} // 过滤重复的,值是索引的位置
funcOrder []func(w http.ResponseWriter, r *http.Request) bool // 函数名排序
mu sync.RWMutex
}
// 获取module数组
func (m *module) cloneMudule() *module {
newModule := &module{
filter: make(map[string]struct{}),
funcOrder: make([]func(w http.ResponseWriter, r *http.Request) bool, 0, len(m.funcOrder)),
mu: sync.RWMutex{},
}
for k := range m.filter {
newModule.filter[k] = struct{}{}
}
newModule.funcOrder = append(newModule.funcOrder, m.funcOrder...)
return newModule
}
// 删除模块, 返回新的模块
func (m *module) delete(delmodules map[string]struct{}) {
m.mu.Lock()
defer m.mu.Unlock()
for name := range delmodules {
if _, ok := m.filter[name]; ok {
// 说明存在
for index, value := range m.funcOrder {
if helper.GetFuncName(value) == name {
m.funcOrder = append(m.funcOrder[:index], m.funcOrder[index+1:]...)
delete(m.filter, name)
break
}
}
}
}
}
func (m *module) GetModules() []func(w http.ResponseWriter, r *http.Request) bool {
m.mu.RLock()
defer m.mu.RUnlock()
return m.funcOrder
}
// 添加模块
func (m *module) add(mds ...func(w http.ResponseWriter, r *http.Request) bool) {
m.mu.Lock()
defer m.mu.Unlock()
// 添加, 不会重复添加 module
for _, md := range mds {
name := helper.GetFuncName(md)
if _, ok := m.filter[name]; !ok {
m.funcOrder = append(m.funcOrder, md)
m.filter[name] = struct{}{}
}
}
}
// func (m module) addModule(new module) module {
// // 添加, module
// temp := module{
// filter: make(filter),
// funcOrder: make(funcOrder, len(m.funcOrder)),
// }
// for k, v := range m.filter {
// temp.filter[k] = v
// }
// for k, v := range m.funcOrder {
// temp.funcOrder[k] = v
// }
// if temp.filter == nil {
// temp.filter = make(filter)
// }
// for _, name := range new.funcOrder {
// if _, ok := temp.filter[name]; !ok {
// temp.funcOrder = append(temp.funcOrder, name)
// temp.filter[name] = new.filter[name]
// }
// }
// return temp
// }
// func (m module) deleteKey(names ...string) module {
// // 添加, 不会重复添加 module
// temp := module{
// filter: make(filter),
// funcOrder: make(funcOrder, len(m.funcOrder)),
// }
// for k, v := range m.filter {
// temp.filter[k] = v
// }
// for k, v := range m.funcOrder {
// temp.funcOrder[k] = v
// }
// for _, delname := range names {
// if _, ok := temp.filter[delname]; ok {
// // 删除排序数组的值
// for index, name := range temp.funcOrder {
// if delname == name {
// temp.funcOrder = append(temp.funcOrder[:index], temp.funcOrder[index+1:]...)
// break
// }
// }
// // 删除map
// delete(temp.filter, delname)
// }
// }
// return temp
// }
//
// 直接删除函数名, delmodule 里面使用的
// func (dm delModule) addDeleteKey(mfs ...func(w http.ResponseWriter, r *http.Request) bool) delModule {
// temp := delModule{
// modules: make(map[string]struct{}),
// }
// for k, v := range dm.modules {
// temp.modules[k] = v
// }
// // 添加, 不会重复添加 module, 删除的时候, 是在程序运行的时候执行的,所以需要加锁
// for _, mf := range mfs {
// mn := runtime.FuncForPC(reflect.ValueOf(mf).Pointer()).Name()
// temp.modules[mn] = struct{}{}
// }
// return temp
// }