diff options
Diffstat (limited to 'pkg/server/cmds.go')
| -rw-r--r-- | pkg/server/cmds.go | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/pkg/server/cmds.go b/pkg/server/cmds.go new file mode 100644 index 0000000..f148991 --- /dev/null +++ b/pkg/server/cmds.go @@ -0,0 +1,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 +} |
