summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pkg/server/cmds.go63
-rw-r--r--pkg/server/echo.go2
-rw-r--r--pkg/server/env.go10
-rw-r--r--pkg/server/exit.go2
-rw-r--r--pkg/server/server.go59
-rw-r--r--pkg/server/sleep.go2
-rw-r--r--pkg/server/status.go2
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) {