4
Copyright (c) 2021 МГТУ им. Н.Э. Баумана, кафедра ИУ-6, Михаил Фетисов,
6
https://bmstu.codes/lsx/simodo/stars
9
#include "simodo/module/HardModuleLoader.h"
10
#include "simodo/inout/format/fmt.h"
12
#include <unordered_map>
16
#include <boost/dll/import.hpp>
18
using namespace simodo;
19
using namespace simodo::module;
21
namespace dll = boost::dll;
22
namespace fs = std::filesystem;
28
static std::unordered_map<std::string,std::function<ExtModuleFactory_t>> hard_factories;
32
std::shared_ptr<variable::Module_interface> HardModuleLoader::load(const std::string & module_name,
33
interpret::Interpret_interface * interpret)
36
auto it = hard_factories.find(module_name);
38
if (it != hard_factories.end())
39
return std::make_shared<HardModule>(it->second);
41
std::function<ExtModuleFactory_t> creator = nullptr;
43
for(const std::string & dir : _module_places) {
44
fs::path path_to_folder { dir };
45
fs::path path_to_module { path_to_folder / (module_name + ".simodo-module") };
47
if (fs::exists(path_to_module)) {
51
creator = loadPluginFactory(path_to_module.string(),"create_simodo_module");
54
catch(const std::runtime_error & e) {
55
_last_error = e.what();
60
auto [it,ok] = hard_factories.insert({module_name, creator});
62
return std::make_shared<HardModule>(creator,interpret);
65
/// @note Если модуль (точнее, его фабрика) найден, но не может быть загружен - это ошибка,
66
/// а не повод продолжить поиски.
71
if (_last_error.empty())
72
_last_error = inout::fmt("Module '%1' was not found").arg(module_name);
74
return std::shared_ptr<variable::Module_interface>();
77
std::function<ExtModuleFactory_t> HardModuleLoader::loadPluginFactory(const std::string & path,
78
const std::string & alias_name)
80
return dll::import_alias<ExtModuleFactory_t>(path.c_str(), alias_name);