#include "logger.hpp" #include "parser.hpp" #include "parser_interface.hpp" #include "types.hpp" #include "worker.hpp" #include #include #include #include #include /** * @brief This file implements a generic parser APP. * * It recieves path of the VPD file(mandatory) and path to a config * file(optional) as arguments. It will parse the data and return parsed data in * a required format. * * Steps to get parsed VPD. * - Pass VPD file path and config file (if applicable). * - Read VPD file to vector. * - Pass that to parser_factory to get the parser and call parse API on that * parser object to get the Parsed VPD map. * - If VPD format is other than the existing formats. Follow the steps * - a) Add logic in parser_factory.cpp, vpdTypeCheck API to detect the format. * - b) Implement a custom parser class. * - c) Override parse API in the newly added parser class. * - d) Add type of parsed data returned by parse API into types.hpp, * "VPDMapVariant". * */ int main(int argc, char** argv) { try { std::string vpdFilePath{}; CLI::App app{"VPD-parser-app - APP to parse VPD. "}; app.add_option("-f, --file", vpdFilePath, "VPD file path")->required(); std::string configFilePath{}; app.add_option("-c,--config", configFilePath, "Path to JSON config"); CLI11_PARSE(app, argc, argv); vpd::logging::logMessage("VPD file path recieved" + vpdFilePath); // VPD file path is a mandatory parameter to execute any parser. if (vpdFilePath.empty()) { throw std::runtime_error("Empty VPD file path"); } nlohmann::json json; vpd::types::VPDMapVariant parsedVpdDataMap; // Below are two different ways of parsing the VPD. if (!configFilePath.empty()) { vpd::logging::logMessage( "Processing with config file - " + configFilePath); std::shared_ptr objWorker = std::make_shared(configFilePath); parsedVpdDataMap = objWorker->parseVpdFile(vpdFilePath); // Based on requirement, call appropriate public API of worker class /*If required to publish the FRU data on Dbus*/ // objWorker->publishFruDataOnDbus(parsedVpdDataMap); } else { // Will work with empty JSON std::shared_ptr vpdParser = std::make_shared(vpdFilePath, json); parsedVpdDataMap = vpdParser->parse(); } // If custom handling is required then custom logic to be implemented // based on the type of variant, // eg: for IPZ VPD format if (auto ipzVpdMap = std::get_if(&parsedVpdDataMap)) { // get rid of unused variable warning/error (void)ipzVpdMap; // implement code that needs to handle parsed IPZ VPD. } } catch (const std::exception& ex) { vpd::logging::logMessage(ex.what()); return -1; } return 0; }