summaryrefslogtreecommitdiff
path: root/pkg/server/cmds.go
diff options
context:
space:
mode:
authorMikhail Osipov <mikhail.osipov@kaspersky.com>2020-01-22 19:07:42 +0300
committerMikhail Osipov <mikhail.osipov@kaspersky.com>2020-01-22 19:07:42 +0300
commitbd9866835bc61d7eb5e98fbd6f85252298974506 (patch)
tree7f7b5e4b9aef94a060af67795e9a3ba6b7ae7e7c /pkg/server/cmds.go
parentac7616442fc6767ba282db867901d50dbe8d50be (diff)
separate cmds interface
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
+}