summaryrefslogtreecommitdiff
path: root/pkg/server/cmds.go
diff options
context:
space:
mode:
authorMikhail Osipov <mike.osipov@gmail.com>2020-01-23 01:35:53 +0300
committerMikhail Osipov <mike.osipov@gmail.com>2020-01-23 01:35:53 +0300
commitace11449468ebd41b84d5a41811db240c5d35eda (patch)
treeca5fafd1b42a2de3568e5c693552f428db0011a0 /pkg/server/cmds.go
parentbd9866835bc61d7eb5e98fbd6f85252298974506 (diff)
add help
Diffstat (limited to 'pkg/server/cmds.go')
-rw-r--r--pkg/server/cmds.go54
1 files changed, 54 insertions, 0 deletions
diff --git a/pkg/server/cmds.go b/pkg/server/cmds.go
index f148991..e383dac 100644
--- a/pkg/server/cmds.go
+++ b/pkg/server/cmds.go
@@ -2,6 +2,7 @@ package server
import (
"strings"
+ "sort"
"log"
)
@@ -17,6 +18,10 @@ type node struct {
var cmds = newNode()
+func init() {
+ newCmd(help, "help")
+}
+
func newNode() *node {
return &node{m: map[string]*node{}}
}
@@ -61,3 +66,52 @@ func getCmd(path []string) (*cmd, []string) {
return nil, nil
}
+
+func help(r *request) {
+ var ss []string
+
+ var walker func ([]string, *node)
+
+ walker = func (path []string, node *node) {
+ if node.c != nil {
+ ss = append(ss, strings.Join(path, " "))
+ return
+ }
+
+ n := len(path)
+ path = append(path, "")
+
+ for k, v := range node.m {
+ path[n] = k
+ walker(path, v)
+ }
+ }
+
+ root := cmds
+
+ for _, s := range r.args {
+ root = root.m[s]
+
+ if root == nil {
+ break
+ }
+ }
+
+ if root == nil {
+ r.Print("nothing to help")
+ return
+ }
+
+ if root.c != nil {
+ r.Print("usage: ", root.c.name, " [...]")
+ return
+ }
+
+ walker(nil, root)
+
+ sort.Strings(ss)
+
+ for _, s := range ss {
+ r.Println(s)
+ }
+}