package command import ( "errors" "fmt" "io" "strings" "text/tabwriter" ) var ErrHelp = errors.New("help requested") type helpBuilder struct { n *node prefix []string } func (h *helpBuilder) writeHelp(w io.Writer) error { if _, err := fmt.Fprintf(w, "\nUsage:\t%s%s COMMAND [OPTIONS]\n\nCommands:\n", strings.Join(h.prefix, " "), &h.n.su); err != nil { return err } tw := tabwriter.NewWriter(w, 0, 1, 4, ' ', 0) if err := h.writeCommands(h.n.child, tw); err != nil { return err } if err := tw.Flush(); err != nil { return err } _, err := w.Write([]byte{'\n'}) if err == nil { err = ErrHelp } return err } func (h *helpBuilder) writeCommands(n *node, 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 h.writeCommands(n.next, w) }