From 8126d82956636a2525263e2d0d985d721fdb8074 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Thu, 21 Mar 2019 16:30:23 -0400 Subject: [PATCH] Add context-specific commands --- aerc.go | 36 ++++++++++++++++++++---- commands/account/account.go | 16 +++++++++++ commands/{ => account}/cf.go | 4 +-- commands/{ => account}/delete-message.go | 4 +-- commands/{ => account}/next-folder.go | 6 ++-- commands/{ => account}/next-message.go | 6 ++-- commands/{ => account}/select-message.go | 4 +-- commands/cd.go | 2 +- commands/commands.go | 36 ++++++++++++++++-------- commands/global.go | 12 ++++++++ commands/next-tab.go | 4 +-- commands/quit.go | 4 +-- commands/term-close.go | 2 +- commands/term.go | 2 +- 14 files changed, 103 insertions(+), 35 deletions(-) create mode 100644 commands/account/account.go rename commands/{ => account}/cf.go (93%) rename commands/{ => account}/delete-message.go (87%) rename commands/{ => account}/next-folder.go (87%) rename commands/{ => account}/next-message.go (89%) rename commands/{ => account}/select-message.go (89%) create mode 100644 commands/global.go diff --git a/aerc.go b/aerc.go index 0da80e9..d086f85 100644 --- a/aerc.go +++ b/aerc.go @@ -11,10 +11,23 @@ import ( "git.sr.ht/~sircmpwn/aerc2/config" "git.sr.ht/~sircmpwn/aerc2/commands" + "git.sr.ht/~sircmpwn/aerc2/commands/account" libui "git.sr.ht/~sircmpwn/aerc2/lib/ui" "git.sr.ht/~sircmpwn/aerc2/widgets" ) +func getCommands(selected libui.Drawable) []*commands.Commands { + switch selected.(type) { + case *widgets.AccountView: + return []*commands.Commands{ + commands.GlobalCommands, + account.AccountCommands, + } + default: + return []*commands.Commands{commands.GlobalCommands} + } +} + func main() { var ( logOut io.Writer @@ -38,12 +51,25 @@ func main() { ui *libui.UI ) aerc = widgets.NewAerc(conf, logger, func(cmd string) error { - err = commands.ExecuteCommand(aerc, cmd) - if _, ok := err.(commands.ErrorExit); ok { - ui.Exit = true - return nil + cmds := getCommands(aerc.SelectedTab()) + for i, set := range cmds { + err := set.ExecuteCommand(aerc, cmd) + if _, ok := err.(commands.NoSuchCommand); ok { + if i == len(cmds) - 1 { + return err + } else { + continue + } + } else if _, ok := err.(commands.ErrorExit); ok { + ui.Exit = true + return nil + } else if err != nil { + return err + } else { + break + } } - return err + return nil }) ui, err = libui.Initialize(conf, aerc) diff --git a/commands/account/account.go b/commands/account/account.go new file mode 100644 index 0000000..918d962 --- /dev/null +++ b/commands/account/account.go @@ -0,0 +1,16 @@ +package account + +import ( + "git.sr.ht/~sircmpwn/aerc2/commands" +) + +var ( + AccountCommands *commands.Commands +) + +func register(name string, cmd commands.AercCommand) { + if AccountCommands == nil { + AccountCommands = commands.NewCommands() + } + AccountCommands.Register(name, cmd) +} diff --git a/commands/cf.go b/commands/account/cf.go similarity index 93% rename from commands/cf.go rename to commands/account/cf.go index d8b0508..3d12b5c 100644 --- a/commands/cf.go +++ b/commands/account/cf.go @@ -1,4 +1,4 @@ -package commands +package account import ( "errors" @@ -12,7 +12,7 @@ var ( func init() { history = make(map[string]string) - Register("cf", ChangeFolder) + register("cf", ChangeFolder) } func ChangeFolder(aerc *widgets.Aerc, args []string) error { diff --git a/commands/delete-message.go b/commands/account/delete-message.go similarity index 87% rename from commands/delete-message.go rename to commands/account/delete-message.go index be56dbb..40e3bba 100644 --- a/commands/delete-message.go +++ b/commands/account/delete-message.go @@ -1,4 +1,4 @@ -package commands +package account import ( "errors" @@ -7,7 +7,7 @@ import ( ) func init() { - Register("delete-message", DeleteMessage) + register("delete-message", DeleteMessage) } func DeleteMessage(aerc *widgets.Aerc, args []string) error { diff --git a/commands/next-folder.go b/commands/account/next-folder.go similarity index 87% rename from commands/next-folder.go rename to commands/account/next-folder.go index f0332c6..1b59af1 100644 --- a/commands/next-folder.go +++ b/commands/account/next-folder.go @@ -1,4 +1,4 @@ -package commands +package account import ( "errors" @@ -9,8 +9,8 @@ import ( ) func init() { - Register("next-folder", NextPrevFolder) - Register("prev-folder", NextPrevFolder) + register("next-folder", NextPrevFolder) + register("prev-folder", NextPrevFolder) } func nextPrevFolderUsage(cmd string) error { diff --git a/commands/next-message.go b/commands/account/next-message.go similarity index 89% rename from commands/next-message.go rename to commands/account/next-message.go index d1d188c..d2c006f 100644 --- a/commands/next-message.go +++ b/commands/account/next-message.go @@ -1,4 +1,4 @@ -package commands +package account import ( "errors" @@ -10,8 +10,8 @@ import ( ) func init() { - Register("next-message", NextPrevMessage) - Register("prev-message", NextPrevMessage) + register("next-message", NextPrevMessage) + register("prev-message", NextPrevMessage) } func nextPrevMessageUsage(cmd string) error { diff --git a/commands/select-message.go b/commands/account/select-message.go similarity index 89% rename from commands/select-message.go rename to commands/account/select-message.go index 728d31b..54f48f2 100644 --- a/commands/select-message.go +++ b/commands/account/select-message.go @@ -1,4 +1,4 @@ -package commands +package account import ( "errors" @@ -8,7 +8,7 @@ import ( ) func init() { - Register("select-message", SelectMessage) + register("select-message", SelectMessage) } func SelectMessage(aerc *widgets.Aerc, args []string) error { diff --git a/commands/cd.go b/commands/cd.go index 6e3da39..bb06c23 100644 --- a/commands/cd.go +++ b/commands/cd.go @@ -13,7 +13,7 @@ var ( ) func init() { - Register("cd", ChangeDirectory) + register("cd", ChangeDirectory) } func ChangeDirectory(aerc *widgets.Aerc, args []string) error { diff --git a/commands/commands.go b/commands/commands.go index 2890cdd..a2589f8 100644 --- a/commands/commands.go +++ b/commands/commands.go @@ -10,18 +10,32 @@ import ( type AercCommand func(aerc *widgets.Aerc, args []string) error -var ( - commands map[string]AercCommand -) +type Commands map[string]AercCommand -func Register(name string, cmd AercCommand) { - if commands == nil { - commands = make(map[string]AercCommand) - } - commands[name] = cmd +func NewCommands() *Commands { + cmds := Commands(make(map[string]AercCommand)) + return &cmds } -func ExecuteCommand(aerc *widgets.Aerc, cmd string) error { +func (cmds *Commands) dict() map[string]AercCommand { + return map[string]AercCommand(*cmds) +} + +func (cmds *Commands) Register(name string, cmd AercCommand) { + cmds.dict()[name] = cmd +} + +type NoSuchCommand string + +func (err NoSuchCommand) Error() string { + return "Unknown command " + string(err) +} + +type CommandSource interface { + Commands() *Commands +} + +func (cmds *Commands) ExecuteCommand(aerc *widgets.Aerc, cmd string) error { args, err := shlex.Split(cmd) if err != nil { return err @@ -29,8 +43,8 @@ func ExecuteCommand(aerc *widgets.Aerc, cmd string) error { if len(args) == 0 { return errors.New("Expected a command.") } - if fn, ok := commands[args[0]]; ok { + if fn, ok := cmds.dict()[args[0]]; ok { return fn(aerc, args) } - return errors.New("Unknown command " + args[0]) + return NoSuchCommand(args[0]) } diff --git a/commands/global.go b/commands/global.go new file mode 100644 index 0000000..c24869a --- /dev/null +++ b/commands/global.go @@ -0,0 +1,12 @@ +package commands + +var ( + GlobalCommands *Commands +) + +func register(name string, cmd AercCommand) { + if GlobalCommands == nil { + GlobalCommands = NewCommands() + } + GlobalCommands.Register(name, cmd) +} diff --git a/commands/next-tab.go b/commands/next-tab.go index fee3fb2..a9a77c2 100644 --- a/commands/next-tab.go +++ b/commands/next-tab.go @@ -9,8 +9,8 @@ import ( ) func init() { - Register("next-tab", NextPrevTab) - Register("prev-tab", NextPrevTab) + register("next-tab", NextPrevTab) + register("prev-tab", NextPrevTab) } func nextPrevTabUsage(cmd string) error { diff --git a/commands/quit.go b/commands/quit.go index 3435859..c0c387b 100644 --- a/commands/quit.go +++ b/commands/quit.go @@ -7,7 +7,7 @@ import ( ) func init() { - Register("quit", ChangeQuit) + register("quit", CommandQuit) } type ErrorExit int @@ -16,7 +16,7 @@ func (err ErrorExit) Error() string { return "exit" } -func ChangeQuit(aerc *widgets.Aerc, args []string) error { +func CommandQuit(aerc *widgets.Aerc, args []string) error { if len(args) != 1 { return errors.New("Usage: quit") } diff --git a/commands/term-close.go b/commands/term-close.go index ae2b55b..7da4f42 100644 --- a/commands/term-close.go +++ b/commands/term-close.go @@ -8,7 +8,7 @@ import ( func init() { // TODO: Move this command into a terminal-specific command set - Register("close", TermClose) + register("close", TermClose) } func TermClose(aerc *widgets.Aerc, args []string) error { diff --git a/commands/term.go b/commands/term.go index 1981e62..d122e78 100644 --- a/commands/term.go +++ b/commands/term.go @@ -11,7 +11,7 @@ import ( ) func init() { - Register("term", Term) + register("term", Term) } func Term(aerc *widgets.Aerc, args []string) error {