Files
HarborForge.Cli/internal/help/help.go
2026-03-21 14:37:42 +00:00

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)
}