1 #include "logger.hpp"
2 #include "parser.hpp"
3 #include "parser_interface.hpp"
4 #include "types.hpp"
5 #include "worker.hpp"
6
7 #include <CLI/CLI.hpp>
8 #include <nlohmann/json.hpp>
9 #include <parser_factory.hpp>
10
11 #include <filesystem>
12 #include <iostream>
13
14 /**
15 * @brief This file implements a generic parser APP.
16 *
17 * It recieves path of the VPD file(mandatory) and path to a config
18 * file(optional) as arguments. It will parse the data and return parsed data in
19 * a required format.
20 *
21 * Steps to get parsed VPD.
22 * - Pass VPD file path and config file (if applicable).
23 * - Read VPD file to vector.
24 * - Pass that to parser_factory to get the parser and call parse API on that
25 * parser object to get the Parsed VPD map.
26 * - If VPD format is other than the existing formats. Follow the steps
27 * - a) Add logic in parser_factory.cpp, vpdTypeCheck API to detect the format.
28 * - b) Implement a custom parser class.
29 * - c) Override parse API in the newly added parser class.
30 * - d) Add type of parsed data returned by parse API into types.hpp,
31 * "VPDMapVariant".
32 *
33 */
34
main(int argc,char ** argv)35 int main(int argc, char** argv)
36 {
37 try
38 {
39 std::string vpdFilePath{};
40 CLI::App app{"VPD-parser-app - APP to parse VPD. "};
41
42 app.add_option("-f, --file", vpdFilePath, "VPD file path")->required();
43
44 std::string configFilePath{};
45
46 app.add_option("-c,--config", configFilePath, "Path to JSON config");
47
48 CLI11_PARSE(app, argc, argv);
49
50 vpd::logging::logMessage("VPD file path recieved" + vpdFilePath);
51
52 // VPD file path is a mandatory parameter to execute any parser.
53 if (vpdFilePath.empty())
54 {
55 throw std::runtime_error("Empty VPD file path");
56 }
57
58 nlohmann::json json;
59 vpd::types::VPDMapVariant parsedVpdDataMap;
60
61 // Below are two different ways of parsing the VPD.
62 if (!configFilePath.empty())
63 {
64 vpd::logging::logMessage(
65 "Processing with config file - " + configFilePath);
66
67 std::shared_ptr<vpd::Worker> objWorker =
68 std::make_shared<vpd::Worker>(configFilePath);
69 parsedVpdDataMap = objWorker->parseVpdFile(vpdFilePath);
70
71 // Based on requirement, call appropriate public API of worker class
72 /*If required to publish the FRU data on Dbus*/
73 // objWorker->publishFruDataOnDbus(parsedVpdDataMap);
74 }
75 else
76 {
77 // Will work with empty JSON
78 std::shared_ptr<vpd::Parser> vpdParser =
79 std::make_shared<vpd::Parser>(vpdFilePath, json);
80 parsedVpdDataMap = vpdParser->parse();
81 }
82
83 // If custom handling is required then custom logic to be implemented
84 // based on the type of variant,
85 // eg: for IPZ VPD format
86 if (auto ipzVpdMap =
87 std::get_if<vpd::types::IPZVpdMap>(&parsedVpdDataMap))
88 {
89 // get rid of unused variable warning/error
90 (void)ipzVpdMap;
91 // implement code that needs to handle parsed IPZ VPD.
92 }
93 }
94 catch (const std::exception& ex)
95 {
96 vpd::logging::logMessage(ex.what());
97 return -1;
98 }
99
100 return 0;
101 }
102