Revamped code for VPD parser

The commit removes all the pre-existing code from the branch
and pushes the revamped code.

Major modification includes:
- Movement from multi exe to single daemon model.
- Multithreaded approach to parse FRU VPD.
- Better error handling.
- Refactored code for performance optimization.

Note: This code supports all the existing functionalities as it is.

Change-Id: I1ddce1f0725ac59020b72709689a1013643bda8b
Signed-off-by: Sunny Srivastava <sunnsr25@in.ibm.com>
diff --git a/vpd-manager/src/vpd_parser_main.cpp b/vpd-manager/src/vpd_parser_main.cpp
new file mode 100644
index 0000000..0c434d8
--- /dev/null
+++ b/vpd-manager/src/vpd_parser_main.cpp
@@ -0,0 +1,101 @@
+#include "logger.hpp"
+#include "parser.hpp"
+#include "parser_interface.hpp"
+#include "types.hpp"
+#include "worker.hpp"
+
+#include <CLI/CLI.hpp>
+#include <nlohmann/json.hpp>
+#include <parser_factory.hpp>
+
+#include <filesystem>
+#include <iostream>
+
+/**
+ * @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<vpd::Worker> objWorker =
+                std::make_shared<vpd::Worker>(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<vpd::Parser> vpdParser =
+                std::make_shared<vpd::Parser>(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<vpd::types::IPZVpdMap>(&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;
+}