Added 'provide-module' and 'require-module' commands
This commit is contained in:
parent
670f8192c8
commit
6092852640
|
@ -40,6 +40,33 @@ void CommandManager::register_command(String command_name,
|
||||||
std::move(completer) };
|
std::move(completer) };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CommandManager::module_defined(StringView module_name) const
|
||||||
|
{
|
||||||
|
return m_modules.find(module_name) != m_modules.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommandManager::register_module(String module_name, String commands)
|
||||||
|
{
|
||||||
|
auto module = m_modules.find(module_name);
|
||||||
|
if (module != m_modules.end() and module->value.loaded)
|
||||||
|
throw runtime_error{format("module already loaded: '{}'", module_name)};
|
||||||
|
|
||||||
|
m_modules[module_name] = { false, std::move(commands) };
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommandManager::load_module(StringView module_name, Context& context)
|
||||||
|
{
|
||||||
|
auto module = m_modules.find(module_name);
|
||||||
|
if (module == m_modules.end())
|
||||||
|
throw runtime_error{format("no such module: '{}'", module_name)};
|
||||||
|
if (module->value.loaded)
|
||||||
|
return;
|
||||||
|
|
||||||
|
module->value.loaded = true;
|
||||||
|
execute(module->value.commands, context);
|
||||||
|
module->value.commands.clear();
|
||||||
|
}
|
||||||
|
|
||||||
struct parse_error : runtime_error
|
struct parse_error : runtime_error
|
||||||
{
|
{
|
||||||
parse_error(StringView error)
|
parse_error(StringView error)
|
||||||
|
|
|
@ -123,6 +123,12 @@ public:
|
||||||
|
|
||||||
void clear_last_complete_command() { m_last_complete_command = String{}; }
|
void clear_last_complete_command() { m_last_complete_command = String{}; }
|
||||||
|
|
||||||
|
bool module_defined(StringView module_name) const;
|
||||||
|
|
||||||
|
void register_module(String module_name, String commands);
|
||||||
|
|
||||||
|
void load_module(StringView module_name, Context& context);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void execute_single_command(CommandParameters params,
|
void execute_single_command(CommandParameters params,
|
||||||
Context& context,
|
Context& context,
|
||||||
|
@ -143,6 +149,14 @@ private:
|
||||||
String m_last_complete_command;
|
String m_last_complete_command;
|
||||||
int m_command_depth = 0;
|
int m_command_depth = 0;
|
||||||
|
|
||||||
|
struct Module
|
||||||
|
{
|
||||||
|
bool loaded;
|
||||||
|
String commands;
|
||||||
|
};
|
||||||
|
using ModuleMap = HashMap<String, Module, MemoryDomain::Commands>;
|
||||||
|
ModuleMap m_modules;
|
||||||
|
|
||||||
CommandMap::const_iterator find_command(const Context& context,
|
CommandMap::const_iterator find_command(const Context& context,
|
||||||
StringView name) const;
|
StringView name) const;
|
||||||
};
|
};
|
||||||
|
|
|
@ -2417,8 +2417,17 @@ const CommandDesc provide_module_cmd = {
|
||||||
CommandFlags::None,
|
CommandFlags::None,
|
||||||
CommandHelper{},
|
CommandHelper{},
|
||||||
CommandCompleter{},
|
CommandCompleter{},
|
||||||
[](const ParametersParser& parse, Context& context, const ShellContext&)
|
[](const ParametersParser& parser, Context& context, const ShellContext&)
|
||||||
{
|
{
|
||||||
|
const String& module_name = parser[0];
|
||||||
|
auto& cm = CommandManager::instance();
|
||||||
|
|
||||||
|
if (not all_of(module_name, is_identifier))
|
||||||
|
throw runtime_error(format("invalid module name: '{}'", module_name));
|
||||||
|
|
||||||
|
if (cm.module_defined(module_name) and not parser.get_switch("override"))
|
||||||
|
throw runtime_error(format("module '{}' already defined", module_name));
|
||||||
|
cm.register_module(module_name, parser[1]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2432,6 +2441,7 @@ const CommandDesc require_module_cmd = {
|
||||||
CommandCompleter{},
|
CommandCompleter{},
|
||||||
[](const ParametersParser& parser, Context& context, const ShellContext&)
|
[](const ParametersParser& parser, Context& context, const ShellContext&)
|
||||||
{
|
{
|
||||||
|
CommandManager::instance().load_module(parser[0], context);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user