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 }