summaryrefslogtreecommitdiff
path: root/pkg/server/cmds.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/server/cmds.go')
-rw-r--r--pkg/server/cmds.go63
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
+}