diff options
| author | Mikhail Osipov <mike.osipov@gmail.com> | 2020-01-23 01:35:53 +0300 |
|---|---|---|
| committer | Mikhail Osipov <mike.osipov@gmail.com> | 2020-01-23 01:35:53 +0300 |
| commit | ace11449468ebd41b84d5a41811db240c5d35eda (patch) | |
| tree | ca5fafd1b42a2de3568e5c693552f428db0011a0 /pkg/server/cmds.go | |
| parent | bd9866835bc61d7eb5e98fbd6f85252298974506 (diff) | |
add help
Diffstat (limited to 'pkg/server/cmds.go')
| -rw-r--r-- | pkg/server/cmds.go | 54 |
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) + } +} |
