diff options
| author | Ophestra <cat@gensokyo.uk> | 2025-02-22 22:06:02 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2025-02-22 22:43:37 +0900 |
| commit | 8000a2febb546b3b68eddd9330d5709281068e9f (patch) | |
| tree | 7b43ae152cc5979e4db65a3632eb542c03654a47 /command/help.go | |
| parent | 7bd48d34899e01d0dc3f0bfb042690f9ee0b1219 (diff) | |
command: implement help builder
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'command/help.go')
| -rw-r--r-- | command/help.go | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/command/help.go b/command/help.go new file mode 100644 index 00000000..0bcc15f1 --- /dev/null +++ b/command/help.go @@ -0,0 +1,49 @@ +package command + +import ( + "errors" + "fmt" + "io" + "strings" + "text/tabwriter" +) + +var ErrHelp = errors.New("help requested") + +func (n *node) writeHelp() error { + if _, err := fmt.Fprintf(n.out, + "\nUsage:\t%s [-h | --help]%s COMMAND [OPTIONS]\n", + strings.Join(append(n.prefix, n.name), " "), &n.suffix, + ); err != nil { + return err + } + if n.child != nil { + if _, err := fmt.Fprint(n.out, "\nCommands:\n"); err != nil { + return err + } + } + + tw := tabwriter.NewWriter(n.out, 0, 1, 4, ' ', 0) + if err := n.child.writeCommands(tw); err != nil { + return err + } + if err := tw.Flush(); err != nil { + return err + } + + _, err := n.out.Write([]byte{'\n'}) + if err == nil { + err = ErrHelp + } + return err +} + +func (n *node) writeCommands(w io.Writer) error { + if n == nil { + return nil + } + if _, err := fmt.Fprintf(w, "\t%s\t%s\n", n.name, n.usage); err != nil { + return err + } + return n.next.writeCommands(w) +} |
