aboutsummaryrefslogtreecommitdiffhomepage
path: root/command/help.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2025-02-22 22:06:02 +0900
committerOphestra <cat@gensokyo.uk>2025-02-22 22:43:37 +0900
commit8000a2febb546b3b68eddd9330d5709281068e9f (patch)
tree7b43ae152cc5979e4db65a3632eb542c03654a47 /command/help.go
parent7bd48d34899e01d0dc3f0bfb042690f9ee0b1219 (diff)
command: implement help builder
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'command/help.go')
-rw-r--r--command/help.go49
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)
+}