#include "Repl.h" #include #include #include #include #include #include #include "ExternalEditor.h" #include "StringUtil.h" #include "Terminal.h" #include "Tokenizer.h" namespace { const std::size_t kUnlimited = std::numeric_limits::max(); bool parseVisibility(const std::string& word) { const std::string value = StringUtil::lower(word); if (value == "show") { return true; } if (value == "hide") { return false; } throw std::runtime_error("Expected 'show' or 'hide', got '" + word + "'."); } } // namespace Repl::Repl(Database& db, Display& display, Config& config) : db_(db), display_(display), config_(config), tracker_(db), completer_(db, specs_), quit_(false) { registerCommands(); } void Repl::add(const std::string& key, const std::string& usage, const std::string& help, std::size_t minArgs, std::size_t maxArgs, const std::vector& argKinds, Handler handler) { CommandSpec spec; spec.key = key; spec.usage = usage; spec.help = help; spec.minArgs = minArgs; spec.maxArgs = maxArgs; spec.argKinds = argKinds; Command command; command.spec = spec; command.handler = handler; commands_.push_back(command); specs_.push_back(spec); } void Repl::registerCommands() { add("acc add", "acc add ", "create an account", 1, 1, {ArgKind::None}, &Repl::cmdAccAdd); add("acc del", "acc del ", "delete an account (its tasks become unassigned)", 1, 1, {ArgKind::Account}, &Repl::cmdAccDel); add("acc rename", "acc rename ", "rename an account", 2, 2, {ArgKind::Account, ArgKind::None}, &Repl::cmdAccRename); add("acc wait", "acc wait