diff options
Diffstat (limited to 'commands')
-rw-r--r-- | commands/commands.go | 7 | ||||
-rw-r--r-- | commands/patch/patch.go | 71 |
2 files changed, 77 insertions, 1 deletions
diff --git a/commands/commands.go b/commands/commands.go index 2893aa82..3270bee6 100644 --- a/commands/commands.go +++ b/commands/commands.go @@ -185,7 +185,12 @@ func GetCompletions( ) (options []string, prefix string) { // copy zeroed struct tmp := reflect.New(reflect.TypeOf(cmd)).Interface().(Command) - spec := opt.NewCmdSpec(args.Arg(0), tmp) + s, err := args.ArgSafe(0) + if err != nil { + log.Errorf("completions error: %v", err) + return options, prefix + } + spec := opt.NewCmdSpec(s, tmp) return spec.GetCompletions(args) } diff --git a/commands/patch/patch.go b/commands/patch/patch.go new file mode 100644 index 00000000..0807c1fa --- /dev/null +++ b/commands/patch/patch.go @@ -0,0 +1,71 @@ +package patch + +import ( + "errors" + "fmt" + + "git.sr.ht/~rjarry/aerc/commands" + "git.sr.ht/~rjarry/go-opt" +) + +var ( + PatchCommands *commands.Commands + subCommands *commands.Commands +) + +func register(cmd commands.Command) { + if subCommands == nil { + subCommands = commands.NewCommands() + } + subCommands.Register(cmd) +} + +func registerPatch(cmd commands.Command) { + if PatchCommands == nil { + PatchCommands = commands.NewCommands() + } + PatchCommands.Register(cmd) +} + +func init() { + registerPatch(Patch{}) +} + +type Patch struct { + SubCmd commands.Command `opt:"command" action:"ParseSub" complete:"CompleteSubNames"` + Args string `opt:"..." required:"false" complete:"CompleteSubArgs"` +} + +func (Patch) Aliases() []string { + return []string{"patch"} +} + +func (p *Patch) ParseSub(arg string) error { + p.SubCmd = subCommands.ByName(arg) + if p.SubCmd == nil { + return fmt.Errorf("%s unknown sub-command", arg) + } + return nil +} + +func (*Patch) CompleteSubNames(arg string) []string { + options := subCommands.Names() + return commands.FilterList(options, arg, nil) +} + +func (p *Patch) CompleteSubArgs(arg string) []string { + if p.SubCmd == nil { + return nil + } + // prepend arbitrary string to arg to work with sub-commands + options, _ := commands.GetCompletions(p.SubCmd, opt.LexArgs("a "+arg)) + return options +} + +func (p Patch) Execute(args []string) error { + if p.SubCmd == nil { + return errors.New("no subcommand found") + } + a := opt.QuoteArgs(args[1:]...) + return commands.ExecuteCommand(p.SubCmd, a.String()) +} |