From bd9866835bc61d7eb5e98fbd6f85252298974506 Mon Sep 17 00:00:00 2001 From: Mikhail Osipov Date: Wed, 22 Jan 2020 19:07:42 +0300 Subject: separate cmds interface --- pkg/server/cmds.go | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 pkg/server/cmds.go (limited to 'pkg/server/cmds.go') 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 +} -- cgit v1.2.3-70-g09d2