You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

60 lines
1.5 KiB

package cli
// CommandCategories wraps a slice of *CommandCategory.
type CommandCategories struct {
slice []*CommandCategory
}
func NewCommandCategories() *CommandCategories {
return &CommandCategories{slice: []*CommandCategory{}}
}
func (c *CommandCategories) Less(i, j int) bool {
return c.slice[i].Name < c.slice[j].Name
}
func (c *CommandCategories) Len() int {
return len(c.slice)
}
func (c *CommandCategories) Swap(i, j int) {
c.slice[i], c.slice[j] = c.slice[j], c.slice[i]
}
// AddCommand adds a command to a category, creating a new category if necessary.
func (c *CommandCategories) AddCommand(category string, command *Command) {
for _, commandCategory := range c.slice {
if commandCategory.Name == category {
commandCategory.commands = append(commandCategory.commands, command)
return
}
}
c.slice = append(c.slice,
&CommandCategory{Name: category, commands: []*Command{command}})
}
// Categories returns a copy of the category slice
func (c *CommandCategories) Categories() []*CommandCategory {
ret := make([]*CommandCategory, len(c.slice))
copy(ret, c.slice)
return ret
}
// CommandCategory is a category containing commands.
type CommandCategory struct {
Name string
commands []*Command
}
// VisibleCommands returns a slice of the Commands with Hidden=false
func (c *CommandCategory) VisibleCommands() []*Command {
ret := []*Command{}
for _, command := range c.commands {
if !command.Hidden {
ret = append(ret, command)
}
}
return ret
}