kitty/tools/cli/group.go
2022-11-14 15:42:03 +05:30

117 lines
2.6 KiB
Go

// License: GPLv3 Copyright: 2022, Kovid Goyal, <kovid at kovidgoyal.net>
package cli
import (
"fmt"
"strings"
)
var _ = fmt.Print
type CommandGroup struct {
SubCommands []*Command
Title string
}
func (self *CommandGroup) HasVisibleSubCommands() bool {
for _, c := range self.SubCommands {
if !c.Hidden {
return true
}
}
return false
}
func (self *CommandGroup) Clone(parent *Command) *CommandGroup {
ans := CommandGroup{Title: self.Title, SubCommands: make([]*Command, len(self.SubCommands))}
for i, o := range self.SubCommands {
ans.SubCommands[i] = o.Clone(parent)
}
return &ans
}
func (self *CommandGroup) AddSubCommand(parent *Command, name string) *Command {
ans := NewRootCommand()
ans.Parent = parent
ans.Name = name
self.SubCommands = append(self.SubCommands, ans)
return ans
}
func (self *CommandGroup) FindSubCommand(name string) *Command {
for _, c := range self.SubCommands {
if c.Name == name {
return c
}
}
return nil
}
func (self *CommandGroup) FindSubCommands(prefix string, matches []*Command) []*Command {
for _, c := range self.SubCommands {
if strings.HasPrefix(c.Name, prefix) {
matches = append(matches, c)
}
}
return matches
}
type OptionGroup struct {
Options []*Option
Title string
}
func (self *OptionGroup) Clone(parent *Command) *OptionGroup {
ans := OptionGroup{Title: self.Title, Options: make([]*Option, len(self.Options))}
for i, o := range self.Options {
c := *o
c.init_option()
c.Parent = parent
ans.Options[i] = &c
}
return &ans
}
func (self *OptionGroup) AddOption(parent *Command, spec OptionSpec) (*Option, error) {
ans, err := option_from_spec(spec)
if err == nil {
ans.Parent = parent
self.Options = append(self.Options, ans)
}
return ans, err
}
func (self *OptionGroup) AddOptionFromString(parent *Command, items ...string) (*Option, error) {
ans, err := OptionFromString(items...)
if err == nil {
ans.Parent = parent
self.Options = append(self.Options, ans)
}
return ans, err
}
func (self *OptionGroup) FindOptions(prefix_with_hyphens string) []*Option {
is_short := !strings.HasPrefix(prefix_with_hyphens, "--")
option_name := NormalizeOptionName(prefix_with_hyphens)
ans := make([]*Option, 0, 4)
for _, q := range self.Options {
if q.MatchingAlias(option_name, is_short) != "" {
ans = append(ans, q)
}
}
return ans
}
func (self *OptionGroup) FindOption(name_with_hyphens string) *Option {
is_short := !strings.HasPrefix(name_with_hyphens, "--")
option_name := NormalizeOptionName(name_with_hyphens)
for _, q := range self.Options {
if q.HasAlias(option_name, is_short) {
return q
}
}
return nil
}