114 lines
3.0 KiB
Go
114 lines
3.0 KiB
Go
// Package help renders help and help-brief output for the hf CLI.
|
|
package help
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
// Command describes a CLI command or group.
|
|
type Command struct {
|
|
Name string
|
|
Description string
|
|
Permitted bool // whether the current user can execute this
|
|
SubCommands []Command
|
|
}
|
|
|
|
// Group describes a top-level command group.
|
|
type Group struct {
|
|
Name string
|
|
Description string
|
|
Permitted bool
|
|
SubCommands []Command
|
|
}
|
|
|
|
// RenderTopHelp renders `hf --help` output showing all groups.
|
|
func RenderTopHelp(version string, groups []Group) string {
|
|
var b strings.Builder
|
|
b.WriteString("hf - HarborForge CLI")
|
|
if version != "" {
|
|
b.WriteString(" (" + version + ")")
|
|
}
|
|
b.WriteString("\n\nUsage: hf <command> [flags]\n\n")
|
|
b.WriteString("Commands:\n")
|
|
maxLen := 0
|
|
for _, g := range groups {
|
|
if len(g.Name) > maxLen {
|
|
maxLen = len(g.Name)
|
|
}
|
|
}
|
|
for _, g := range groups {
|
|
b.WriteString(fmt.Sprintf(" %-*s %s\n", maxLen, g.Name, g.Description))
|
|
}
|
|
b.WriteString("\nGlobal flags:\n")
|
|
b.WriteString(" --help Show help\n")
|
|
b.WriteString(" --help-brief Show only permitted commands\n")
|
|
b.WriteString(" --json Output in JSON format\n")
|
|
return b.String()
|
|
}
|
|
|
|
// RenderTopHelpBrief renders `hf --help-brief` showing only permitted groups.
|
|
func RenderTopHelpBrief(version string, groups []Group) string {
|
|
var b strings.Builder
|
|
b.WriteString("hf - HarborForge CLI")
|
|
if version != "" {
|
|
b.WriteString(" (" + version + ")")
|
|
}
|
|
b.WriteString("\n\nPermitted commands:\n")
|
|
maxLen := 0
|
|
for _, g := range groups {
|
|
if g.Permitted && len(g.Name) > maxLen {
|
|
maxLen = len(g.Name)
|
|
}
|
|
}
|
|
for _, g := range groups {
|
|
if g.Permitted {
|
|
b.WriteString(fmt.Sprintf(" %-*s %s\n", maxLen, g.Name, g.Description))
|
|
}
|
|
}
|
|
return b.String()
|
|
}
|
|
|
|
// RenderGroupHelp renders `hf <group> --help` showing all subcommands.
|
|
func RenderGroupHelp(groupName string, cmds []Command) string {
|
|
var b strings.Builder
|
|
b.WriteString(fmt.Sprintf("hf %s - subcommands:\n\n", groupName))
|
|
maxLen := 0
|
|
for _, c := range cmds {
|
|
if len(c.Name) > maxLen {
|
|
maxLen = len(c.Name)
|
|
}
|
|
}
|
|
for _, c := range cmds {
|
|
desc := c.Description
|
|
if !c.Permitted {
|
|
desc = "(not permitted)"
|
|
}
|
|
b.WriteString(fmt.Sprintf(" %-*s %s\n", maxLen, c.Name, desc))
|
|
}
|
|
return b.String()
|
|
}
|
|
|
|
// RenderGroupHelpBrief renders `hf <group> --help-brief` showing only permitted subcommands.
|
|
func RenderGroupHelpBrief(groupName string, cmds []Command) string {
|
|
var b strings.Builder
|
|
b.WriteString(fmt.Sprintf("hf %s - permitted subcommands:\n\n", groupName))
|
|
maxLen := 0
|
|
for _, c := range cmds {
|
|
if c.Permitted && len(c.Name) > maxLen {
|
|
maxLen = len(c.Name)
|
|
}
|
|
}
|
|
for _, c := range cmds {
|
|
if c.Permitted {
|
|
b.WriteString(fmt.Sprintf(" %-*s %s\n", maxLen, c.Name, c.Description))
|
|
}
|
|
}
|
|
return b.String()
|
|
}
|
|
|
|
// RenderNotPermitted renders the short message for an unpermitted leaf command.
|
|
func RenderNotPermitted(group, cmd string) string {
|
|
return fmt.Sprintf("hf %s %s: not permitted", group, cmd)
|
|
}
|