diff options
| author | Mikhail Osipov <mikhail.osipov@kaspersky.com> | 2020-01-22 19:07:42 +0300 |
|---|---|---|
| committer | Mikhail Osipov <mikhail.osipov@kaspersky.com> | 2020-01-22 19:07:42 +0300 |
| commit | bd9866835bc61d7eb5e98fbd6f85252298974506 (patch) | |
| tree | 7f7b5e4b9aef94a060af67795e9a3ba6b7ae7e7c /pkg | |
| parent | ac7616442fc6767ba282db867901d50dbe8d50be (diff) | |
separate cmds interface
Diffstat (limited to 'pkg')
| -rw-r--r-- | pkg/server/cmds.go | 63 | ||||
| -rw-r--r-- | pkg/server/echo.go | 2 | ||||
| -rw-r--r-- | pkg/server/env.go | 10 | ||||
| -rw-r--r-- | pkg/server/exit.go | 2 | ||||
| -rw-r--r-- | pkg/server/server.go | 59 | ||||
| -rw-r--r-- | pkg/server/sleep.go | 2 | ||||
| -rw-r--r-- | pkg/server/status.go | 2 |
7 files changed, 73 insertions, 67 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 +} diff --git a/pkg/server/echo.go b/pkg/server/echo.go index 00f0c2d..8980ed1 100644 --- a/pkg/server/echo.go +++ b/pkg/server/echo.go @@ -5,7 +5,7 @@ import ( ) func init() { - setHandler(echo, "echo") + newCmd(echo, "echo") } func echo(r *request) { diff --git a/pkg/server/env.go b/pkg/server/env.go index 769342a..6434432 100644 --- a/pkg/server/env.go +++ b/pkg/server/env.go @@ -5,11 +5,11 @@ import ( ) func init() { - setHandler(envSet, "env", "set") - setHandler(envGet, "env", "get") - setHandler(envShow, "env", "show") - setHandler(envShow, "env", "print") - setHandler(envUnset, "env", "unset") + newCmd(envSet, "env", "set") + newCmd(envGet, "env", "get") + newCmd(envShow, "env", "show") + newCmd(envShow, "env", "print") + newCmd(envUnset, "env", "unset") } type env struct { diff --git a/pkg/server/exit.go b/pkg/server/exit.go index 159dd8d..5226ac3 100644 --- a/pkg/server/exit.go +++ b/pkg/server/exit.go @@ -1,7 +1,7 @@ package server func init() { - setHandler(exit, "exit") + newCmd(exit, "exit") } func exit(r *request) { diff --git a/pkg/server/server.go b/pkg/server/server.go index d8a014d..8b803e7 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -12,18 +12,6 @@ import ( "io" ) -type cmd struct { - name string - f func (r *request) -} - -type node struct { - c *cmd - m map[string]*node -} - -var cmds = newNode() - type Server struct { listen net.Listener since time.Time @@ -124,51 +112,6 @@ func (r *request) expect(c ...int) { } } -func newNode() *node { - return &node{m: map[string]*node{}} -} - -func setHandler(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 getHandler(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 -} - func (s *Server) isDone() bool { select { case <- s.done: @@ -283,7 +226,7 @@ func (c *client) handle() { } func (r *request) parse(query string) bool { - c, args := getHandler(strings.Split(query, " ")) + c, args := getCmd(strings.Split(query, " ")) if c == nil { r.Print("unknown command") diff --git a/pkg/server/sleep.go b/pkg/server/sleep.go index fc94079..14d22ad 100644 --- a/pkg/server/sleep.go +++ b/pkg/server/sleep.go @@ -8,7 +8,7 @@ import ( const maxSleep = 10 func init() { - setHandler(sleep, "sleep") + newCmd(sleep, "sleep") } func sleep(r *request) { diff --git a/pkg/server/status.go b/pkg/server/status.go index bc725a7..aff3844 100644 --- a/pkg/server/status.go +++ b/pkg/server/status.go @@ -5,7 +5,7 @@ import ( ) func init() { - setHandler(status, "status") + newCmd(status, "status") } func status(r *request) { |
