blob: f1489910df37f600a1cb69f6bb086bae80a2c2c1 (
plain)
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
|
package server
import (
"strings"
"log"
)
type cmd struct {
name string
f func (r *request)
}
type node struct {
c *cmd
m map[string]*node
}
var cmds = newNode()
func newNode() *node {
return &node{m: map[string]*node{}}
}
func newCmd(f func (r *request), path ...string) {
node := cmds
for _, name := range path {
v := node.m[name]
if v == nil {
v = newNode()
node.m[name] = v
}
node = v
}
if node.c != nil {
s := strings.Join(path, " ")
log.Panicf("handler already registered at '%s'", s)
}
node.c = &cmd{
name: strings.Join(path, " "),
f: f,
}
}
func getCmd(path []string) (*cmd, []string) {
node := cmds
for n, name := range path {
node = node.m[name]
if node == nil {
return nil, nil
}
if node.c != nil {
return node.c, path[n + 1:]
}
}
return nil, nil
}
|