diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2011-09-16 09:18:51 +0000 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2011-09-16 09:18:51 +0000 |
| commit | 63191f1900fe805db49654605ffe4eba9fc547b9 (patch) | |
| tree | e95e732c939611c27dfd4d5ff83cfe1456d4e625 /src/command_manager.hh | |
| parent | aeea1c610c5a6e5a8062166919cc5affece8f55d (diff) | |
CommandManager: support per command configurable completion
Diffstat (limited to 'src/command_manager.hh')
| -rw-r--r-- | src/command_manager.hh | 43 |
1 files changed, 40 insertions, 3 deletions
diff --git a/src/command_manager.hh b/src/command_manager.hh index e46c5a77..037ec2c9 100644 --- a/src/command_manager.hh +++ b/src/command_manager.hh @@ -5,6 +5,7 @@ #include <vector> #include <unordered_map> #include <functional> +#include <initializer_list> #include "exception.hh" #include "completion.hh" @@ -20,17 +21,53 @@ struct wrong_argument_count : runtime_error typedef std::vector<std::string> CommandParameters; typedef std::function<void (const CommandParameters&)> Command; +typedef std::function<CandidateList (const CommandParameters&, + size_t, size_t)> CommandCompleter; + +class PerArgumentCommandCompleter +{ +public: + typedef std::function<CandidateList (const std::string&, size_t)> ArgumentCompleter; + typedef std::vector<ArgumentCompleter> ArgumentCompleterList; + + PerArgumentCommandCompleter(const ArgumentCompleterList& completers) + : m_completers(completers) {} + + PerArgumentCommandCompleter(ArgumentCompleterList&& completers) + : m_completers(completers) {} + + PerArgumentCommandCompleter(std::initializer_list<ArgumentCompleter> completers) + : m_completers(completers) {} + + CandidateList operator()(const CommandParameters& params, + size_t token_to_complete, + size_t pos_in_token) const; + +private: + ArgumentCompleterList m_completers; +}; + class CommandManager { public: void execute(const std::string& command_line); Completions complete(const std::string& command_line, size_t cursor_pos); - void register_command(const std::string& command_name, Command command); - void register_command(const std::vector<std::string>& command_names, Command command); + void register_command(const std::string& command_name, + Command command, + const CommandCompleter& completer = CommandCompleter()); + + void register_command(const std::vector<std::string>& command_names, + Command command, + const CommandCompleter& completer = CommandCompleter()); private: - std::unordered_map<std::string, Command> m_commands; + struct CommandAndCompleter + { + Command command; + CommandCompleter completer; + }; + std::unordered_map<std::string, CommandAndCompleter> m_commands; }; } |
