#include "mappings.hpp" #include "ansi.hpp" #include "csv.hpp" #include #include #include #include #include #include #include #include #include #include #include #include #include namespace fs = boost::filesystem; namespace mappings { Mappings Mappings::load() { std::map mappings; std::map renames; // load mappings fs::directory_iterator end_itr; try { for (fs::directory_iterator itr("mappings"); itr != end_itr; ++itr) { if (fs::is_directory(itr->status()) || !boost::algorithm::ends_with(itr->path().string(), ".csv")) continue; csv::CsvReader csv(itr->path().string()); std::vector l; while (csv >> l) { if (l.size() < 2) { BOOST_LOG_TRIVIAL(warning) << "found invalid mapping"; continue; } mappings[l[0]] = { l[0], l[1], l.size() >= 4 ? std::optional(l[3]) : std::nullopt }; } } } catch (boost::filesystem::filesystem_error& e) { if (e.code() == boost::system::errc::no_such_file_or_directory) { throw std::runtime_error( std::string("The mappings directory is missing!\n") + e.what() ); } throw; } if (fs::is_regular_file("renames.csv")) { csv::CsvReader csv("renames.csv"); std::vector l; while (csv >> l) { if (l.size() < 2) { BOOST_LOG_TRIVIAL(warning) << "found invalid rename"; continue; } renames[l[0]] = l[1]; } } else { BOOST_LOG_TRIVIAL(warning) << "no renames found, skipping"; } BOOST_LOG_TRIVIAL(info) << "loaded " << mappings.size() << " mappings and " << renames.size() << " renames"; return { mappings, renames }; } void showMapInfo(Mapping mapping, std::optional rename) { auto doc = mapping.doc.has_value() ? std::string(ansi::yellow) + "\n\n\t" + *mapping.doc + "\n" : ""; if (rename.has_value()) { BOOST_LOG_TRIVIAL(info) << "\nFound mapping:\n" << ansi::cyan << "\n\tOriginal\t" << ansi::green << mapping.orig << ansi::cyan << "\n\tRemapped\t" << ansi::green << mapping.name << ansi::cyan << "\n\tRenamed \t" << ansi::green << *rename << doc << ansi::reset; } else { BOOST_LOG_TRIVIAL(info) << "\nFound mapping:\n" << ansi::cyan << "\n\tOriginal\t" << ansi::green << mapping.orig << ansi::cyan << "\n\tRemapped\t" << ansi::green << mapping.name << doc << ansi::reset; } } std::string Mappings::map(std::string inp) { if (!this->m_mappings.count(inp)) { BOOST_LOG_TRIVIAL(warning) << "unknown mapping '" << inp << "'"; return ""; } auto mapped = this->m_mappings[inp]; if (this->m_renames.count(mapped.name)) { BOOST_LOG_TRIVIAL(info) << "found rename " << mapped.name << " -> " << m_renames[mapped.name]; showMapInfo(mapped, m_renames[mapped.name]); return m_renames[mapped.name]; } showMapInfo(mapped, std::nullopt); return mapped.name; } }