diff options
Diffstat (limited to 'commands/patch')
-rw-r--r-- | commands/patch/patch.go | 71 |
1 files changed, 71 insertions, 0 deletions
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()) +} |