14 namespace gate_library_parser_manager
18 std::unordered_map<std::string, std::vector<std::string>> m_parser_to_extensions;
19 std::unordered_map<std::string, std::pair<std::string, ParserFactory>> m_extension_to_parser;
21 ParserFactory get_parser_factory_for_file(
const std::filesystem::path& file_name)
24 if (!extension.empty() && extension[0] !=
'.')
26 extension =
"." + extension;
29 if (
auto it = m_extension_to_parser.find(extension); it != m_extension_to_parser.end())
31 log_info(
"gate_library_parser",
"selected gate library parser '{}'.", it->second.first);
32 return it->second.second;
35 log_error(
"gate_library_parser",
"no gate library parser registered for file extension '{}'.", extension);
42 for (
auto ext : supported_file_extensions)
45 if (!ext.empty() && ext[0] !=
'.')
49 if (
auto it = m_extension_to_parser.find(ext); it != m_extension_to_parser.end())
51 log_warning(
"gate_library_parser",
"file extension '{}' is already associated with parser '{}'.", ext, it->second.first);
54 m_extension_to_parser.emplace(ext, std::make_pair(
name, parser_factory));
55 m_parser_to_extensions[
name].push_back(ext);
57 log_info(
"gate_library_parser",
"registered gate library parser '{}' for file extension '{}'.",
name, ext);
63 if (
auto it = m_parser_to_extensions.find(
name); it != m_parser_to_extensions.end())
65 for (
const auto& ext : it->second)
67 if (
auto rm_it = m_extension_to_parser.find(ext); rm_it != m_extension_to_parser.end())
69 m_extension_to_parser.erase(rm_it);
70 log_info(
"gate_library_parser",
"unregistered gate library parser '{}' for file extension '{}'.",
name, ext);
73 m_parser_to_extensions.erase(it);
77 std::unique_ptr<GateLibrary>
parse(std::filesystem::path file_path)
79 auto factory = get_parser_factory_for_file(file_path);
87 auto begin_time = std::chrono::high_resolution_clock::now();
89 if (
auto res =
parser->parse(file_path); res.is_error())
91 log_error(
"gate_library_parser",
"error encountered while parsing gate library from file '{}':\n{}", file_path.string(), res.get_error().get());
96 std::unique_ptr<GateLibrary> gate_lib = res.get();
98 "parsed gate library '{}' from file '{}' in {:2.2f} seconds.",
101 (
double)std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now() - begin_time).count() / 1000);
#define log_error(channel,...)
#define log_info(channel,...)
#define log_warning(channel,...)
std::unique_ptr< GateLibrary > parse(std::filesystem::path file_path)
void unregister_parser(const std::string &name)
void register_parser(const std::string &name, const ParserFactory &parser_factory, const std::vector< std::string > &supported_file_extensions)
std::function< std::unique_ptr< GateLibraryParser >()> ParserFactory
CORE_API T trim(const T &s, const char *to_remove=" \t\r\n")
CORE_API T to_lower(const T &s)