| #include "managed_store_serialization.h" | 
 |  | 
 | #include <cerrno> | 
 | #include <cstddef> | 
 | #include <cstdint> | 
 | #include <cstring> | 
 | #include <filesystem> | 
 | #include <fstream> | 
 | #include <ios> | 
 | #include <iterator> | 
 | #include <optional> | 
 | #include <string> | 
 | #include <tuple> | 
 | #include <utility> | 
 | #include <variant> | 
 | #include <vector> | 
 |  | 
 | #include "nlohmann/json.hpp" | 
 | #include "dbus_utility.hpp" // NOLINT | 
 | #include "async_resp.hpp" // NOLINT | 
 | #include "http_request.hpp" // NOLINT | 
 | #include "sdbusplus/message/native_types.hpp" | 
 |  | 
 | namespace serialize { | 
 |  | 
 | using dbus::utility::DbusVariantType; | 
 | using dbus::utility::MapperGetObject; | 
 | using dbus::utility::MapperGetSubTreePathsResponse; | 
 | using dbus::utility::MapperGetSubTreeResponse; | 
 | using dbus::utility::MapperServiceMap; | 
 | using dbus::utility::SystemdListUnits; | 
 | using dbus::utility::SystemdUnitStruct; | 
 |  | 
 | enum class Serialize : uint8_t { | 
 |   string_type, | 
 |   int64_t_type, | 
 |   uint64_t_type, | 
 |   double_type, | 
 |   int32_t_type, | 
 |   uint32_t_type, | 
 |   uint16_t_type, | 
 |   int16_t_type, | 
 |   uint8_t_type, | 
 |   bool_type, | 
 |   size_t_type, | 
 |   iter_type, | 
 |   tup_type | 
 | }; | 
 |  | 
 | static std::string SerializeToString(enum Serialize in) { | 
 |   switch (in) { | 
 |     case Serialize::string_type: | 
 |       return "string"; | 
 |     case Serialize::int64_t_type: | 
 |       return "int64_t"; | 
 |     case Serialize::uint64_t_type: | 
 |       return "uint64_t"; | 
 |     case Serialize::double_type: | 
 |       return "double"; | 
 |     case Serialize::int32_t_type: | 
 |       return "int32_t"; | 
 |     case Serialize::uint32_t_type: | 
 |       return "uint32_t"; | 
 |     case Serialize::uint16_t_type: | 
 |       return "uint16_t"; | 
 |     case Serialize::int16_t_type: | 
 |       return "int16_t"; | 
 |     case Serialize::uint8_t_type: | 
 |       return "uint8_t"; | 
 |     case Serialize::bool_type: | 
 |       return "bool"; | 
 |     case Serialize::size_t_type: | 
 |       return "size_t"; | 
 |     case Serialize::iter_type: | 
 |       return "iter_type"; | 
 |     case Serialize::tup_type: | 
 |       return "tup"; | 
 |     default: | 
 |       BMCWEB_LOG_STATEFUL_DEBUG << "unable to serialize enum value "; | 
 |       return "unknown"; | 
 |   } | 
 | } | 
 |  | 
 | template <typename T> | 
 | nlohmann::json iterate_serialize(const std::vector<T>& in) { | 
 |   nlohmann::json arr = nlohmann::json::array(); | 
 |   for (auto& itor : in) { | 
 |     DbusVariantType temp = itor; | 
 |     arr.push_back(Serialize(temp)); | 
 |   } | 
 |   return arr; | 
 | } | 
 |  | 
 | nlohmann::json Serialize(const DbusVariantType& v) { | 
 |   nlohmann::json j; | 
 |  | 
 |   if (const std::string* pval = std::get_if<std::string>(&v)) { | 
 |     j["type"] = "string"; | 
 |     j["val"] = *pval; | 
 |     return j; | 
 |   } | 
 |   if (const int64_t* pval = std::get_if<int64_t>(&v)) { | 
 |     j["type"] = SerializeToString(Serialize::int64_t_type); | 
 |     j["val"] = *pval; | 
 |     return j; | 
 |   } | 
 |   if (const uint64_t* pval = std::get_if<uint64_t>(&v)) { | 
 |     j["type"] = SerializeToString(Serialize::uint64_t_type); | 
 |     j["val"] = *pval; | 
 |     return j; | 
 |   } | 
 |   if (const double* pval = std::get_if<double>(&v)) { | 
 |     j["type"] = SerializeToString(Serialize::double_type); | 
 |     j["val"] = *pval; | 
 |     return j; | 
 |   } | 
 |   if (const int32_t* pval = std::get_if<int32_t>(&v)) { | 
 |     j["type"] = SerializeToString(Serialize::int32_t_type); | 
 |     j["val"] = *pval; | 
 |     return j; | 
 |   } | 
 |   if (const uint32_t* pval = std::get_if<uint32_t>(&v)) { | 
 |     j["type"] = SerializeToString(Serialize::uint32_t_type); | 
 |     j["val"] = *pval; | 
 |     return j; | 
 |   } | 
 |   if (const uint16_t* pval = std::get_if<uint16_t>(&v)) { | 
 |     j["type"] = SerializeToString(Serialize::uint16_t_type); | 
 |     j["val"] = *pval; | 
 |     return j; | 
 |   } | 
 |   if (const int16_t* pval = std::get_if<int16_t>(&v)) { | 
 |     j["type"] = SerializeToString(Serialize::int16_t_type); | 
 |     j["val"] = *pval; | 
 |     return j; | 
 |   } | 
 |   if (const uint8_t* pval = std::get_if<uint8_t>(&v)) { | 
 |     j["type"] = SerializeToString(Serialize::uint8_t_type); | 
 |     j["val"] = *pval; | 
 |     return j; | 
 |   } | 
 |   if (const bool* pval = std::get_if<bool>(&v)) { | 
 |     j["type"] = SerializeToString(Serialize::bool_type); | 
 |     j["val"] = *pval; | 
 |     return j; | 
 |   } | 
 |   if (const size_t* pval = std::get_if<size_t>(&v)) { | 
 |     j["type"] = SerializeToString(Serialize::size_t_type); | 
 |     j["val"] = *pval; | 
 |     return j; | 
 |   } | 
 |   if (const std::vector<std::tuple<std::string, std::string, std::string>>* t = | 
 |           std::get_if< | 
 |               std::vector<std::tuple<std::string, std::string, std::string>>>( | 
 |               &v)) { | 
 |     j["type"] = SerializeToString(Serialize::iter_type); | 
 |     j["iterType"] = "v_t_s_s_s"; | 
 |     j["val"] = iterate_serialize(*t); | 
 |     return j; | 
 |   } | 
 |   if (const std::vector<std::string>* t = | 
 |           std::get_if<std::vector<std::string>>(&v)) { | 
 |     j["type"] = SerializeToString(Serialize::iter_type); | 
 |     j["iterType"] = "v_s"; | 
 |     j["val"] = iterate_serialize(*t); | 
 |     return j; | 
 |   } | 
 |   if (const std::vector<double>* t = std::get_if<std::vector<double>>(&v)) { | 
 |     j["type"] = SerializeToString(Serialize::iter_type); | 
 |     j["iterType"] = "v_d"; | 
 |     j["val"] = iterate_serialize(*t); | 
 |     return j; | 
 |   } | 
 |   if (const std::vector<uint32_t>* t = std::get_if<std::vector<uint32_t>>(&v)) { | 
 |     j["type"] = SerializeToString(Serialize::iter_type); | 
 |     j["iterType"] = "v_u32"; | 
 |     j["val"] = iterate_serialize(*t); | 
 |     return j; | 
 |   } | 
 |   if (const std::vector<uint16_t>* t = std::get_if<std::vector<uint16_t>>(&v)) { | 
 |     j["type"] = SerializeToString(Serialize::iter_type); | 
 |     j["iterType"] = "v_u16"; | 
 |     j["val"] = iterate_serialize(*t); | 
 |     return j; | 
 |   } | 
 |   if (const std::vector<std::tuple<std::string, std::string>>* t = | 
 |           std::get_if<std::vector<std::tuple<std::string, std::string>>>(&v)) { | 
 |     j["type"] = SerializeToString(Serialize::iter_type); | 
 |     j["iterType"] = "v_t_s_s"; | 
 |     j["val"] = iterate_serialize(*t); | 
 |     return j; | 
 |   } | 
 |   if (const std::vector<std::tuple<uint32_t, std::vector<uint32_t>>>* t = | 
 |           std::get_if<std::vector<std::tuple<uint32_t, std::vector<uint32_t>>>>( | 
 |               &v)) { | 
 |     j["type"] = SerializeToString(Serialize::iter_type); | 
 |     ; | 
 |     j["iterType"] = "v_t_u32_v_u32"; | 
 |     j["val"] = iterate_serialize(*t); | 
 |     return j; | 
 |   } | 
 |   if (const std::vector<std::tuple<uint32_t, size_t>>* t = | 
 |           std::get_if<std::vector<std::tuple<uint32_t, size_t>>>(&v)) { | 
 |     j["type"] = SerializeToString(Serialize::iter_type); | 
 |     ; | 
 |     j["iterType"] = "v_t_u32_size"; | 
 |     j["val"] = iterate_serialize(*t); | 
 |     return j; | 
 |   } | 
 |  | 
 |   if (const std::tuple<std::string, std::string, std::string>* t = | 
 |           std::get_if<std::tuple<std::string, std::string, std::string>>(&v)) { | 
 |     j["type"] = SerializeToString(Serialize::tup_type); | 
 |     j["iterType"] = "t_s_s_s"; | 
 |     nlohmann::json arr = nlohmann::json::array(); | 
 |     DbusVariantType tmp_var = std::get<0>(*t); | 
 |     arr.push_back(Serialize(tmp_var)); | 
 |     tmp_var = std::get<1>(*t); | 
 |     arr.push_back(Serialize(tmp_var)); | 
 |     tmp_var = std::get<2>(*t); | 
 |     arr.push_back(Serialize(tmp_var)); | 
 |     j["val"] = arr; | 
 |     return j; | 
 |   } | 
 |  | 
 |   if (const std::tuple<std::string, std::string>* t = | 
 |           std::get_if<std::tuple<std::string, std::string>>(&v)) { | 
 |     j["type"] = SerializeToString(Serialize::tup_type); | 
 |     j["iterType"] = "t_s_s"; | 
 |     nlohmann::json arr = nlohmann::json::array(); | 
 |     DbusVariantType tmp_var = std::get<0>(*t); | 
 |     arr.push_back(Serialize(tmp_var)); | 
 |     tmp_var = std::get<1>(*t); | 
 |     arr.push_back(Serialize(tmp_var)); | 
 |     j["val"] = arr; | 
 |     return j; | 
 |   } | 
 |   if (const std::tuple<uint32_t, std::vector<uint32_t>>* t = | 
 |           std::get_if<std::tuple<uint32_t, std::vector<uint32_t>>>(&v)) { | 
 |     j["type"] = SerializeToString(Serialize::tup_type); | 
 |     ; | 
 |     j["iterType"] = "t_u32_v_u32"; | 
 |     nlohmann::json arr = nlohmann::json::array(); | 
 |     DbusVariantType tmp_var = std::get<0>(*t); | 
 |     arr.push_back(Serialize(tmp_var)); | 
 |     tmp_var = std::get<1>(*t); | 
 |     arr.push_back(Serialize(tmp_var)); | 
 |     j["val"] = arr; | 
 |     return j; | 
 |   } | 
 |   /* | 
 |    *    TODO deal with sdbusplus::message::object_path,and  size_t | 
 |    */ | 
 |   BMCWEB_LOG_STATEFUL_DEBUG << "unable to serialize DbusVariantType, index " | 
 |                             << v.index(); | 
 |   return j; | 
 | } | 
 |  | 
 | inline DbusVariantType DeserializeIter(nlohmann::json::reference j, | 
 |                                        const std::string& type) { | 
 |   if (type == "v_t_s_s_s") { | 
 |     std::vector<std::tuple<std::string, std::string, std::string>> vec; | 
 |     for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) { | 
 |       DbusVariantType tmp = Deserialize(*itor); | 
 |       if (const std::tuple<std::string, std::string, std::string>* pval = | 
 |               std::get_if<std::tuple<std::string, std::string, std::string>>( | 
 |                   &tmp)) { | 
 |         vec.push_back(*pval); | 
 |       } else { | 
 |         BMCWEB_LOG_STATEFUL_DEBUG | 
 |             << "unable to deserialize vector tuple string string string"; | 
 |       } | 
 |     } | 
 |     return vec; | 
 |   } | 
 |  | 
 |   if (type == "v_s") { | 
 |     std::vector<std::string> vec; | 
 |     for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) { | 
 |       DbusVariantType tmp = Deserialize(*itor); | 
 |       if (const std::string* pval = std::get_if<std::string>(&tmp)) { | 
 |         vec.push_back(*pval); | 
 |       } else { | 
 |         BMCWEB_LOG_STATEFUL_DEBUG << "unable to deserialize vector of string"; | 
 |       } | 
 |     } | 
 |     return vec; | 
 |   } | 
 |   if (type == "v_d") { | 
 |     std::vector<double> vec; | 
 |     for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) { | 
 |       DbusVariantType tmp = Deserialize(*itor); | 
 |       if (const double* pval = std::get_if<double>(&tmp)) { | 
 |         vec.push_back(*pval); | 
 |       } else { | 
 |         BMCWEB_LOG_STATEFUL_DEBUG << "unable to deserialize vector double"; | 
 |       } | 
 |     } | 
 |     return vec; | 
 |   } | 
 |   if (type == "v_u32") { | 
 |     std::vector<uint32_t> vec; | 
 |     for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) { | 
 |       DbusVariantType tmp = Deserialize(*itor); | 
 |       if (const std::uint32_t* pval = std::get_if<uint32_t>(&tmp)) { | 
 |         vec.push_back(*pval); | 
 |       } else { | 
 |         BMCWEB_LOG_STATEFUL_DEBUG << "unable to deserialize vector u32"; | 
 |       } | 
 |     } | 
 |     return vec; | 
 |   } | 
 |   if (type == "v_u16") { | 
 |     std::vector<uint16_t> vec; | 
 |     for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) { | 
 |       DbusVariantType tmp = Deserialize(*itor); | 
 |       if (const std::uint16_t* pval = std::get_if<uint16_t>(&tmp)) { | 
 |         vec.push_back(*pval); | 
 |       } else { | 
 |         BMCWEB_LOG_STATEFUL_DEBUG << "unable to deserialize vector u16"; | 
 |       } | 
 |     } | 
 |     return vec; | 
 |   } | 
 |   if (type == "v_t_s_s") { | 
 |     std::vector<std::tuple<std::string, std::string>> vec; | 
 |     for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) { | 
 |       DbusVariantType tmp = Deserialize(*itor); | 
 |       if (const std::tuple<std::string, std::string>* pval = | 
 |               std::get_if<std::tuple<std::string, std::string>>(&tmp)) { | 
 |         vec.push_back(*pval); | 
 |       } else { | 
 |         BMCWEB_LOG_STATEFUL_DEBUG | 
 |             << "unable to deserialize vector tuple string string"; | 
 |       } | 
 |     } | 
 |     return vec; | 
 |   } | 
 |  | 
 |   if (type == "v_t_u32_v_u32") { | 
 |     std::vector<std::tuple<uint32_t, std::vector<uint32_t>>> vec; | 
 |     for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) { | 
 |       DbusVariantType tmp = Deserialize(*itor); | 
 |       if (const std::tuple<uint32_t, std::vector<uint32_t>>* pval = | 
 |               std::get_if<std::tuple<uint32_t, std::vector<uint32_t>>>(&tmp)) { | 
 |         vec.push_back(*pval); | 
 |       } else { | 
 |         BMCWEB_LOG_STATEFUL_DEBUG | 
 |             << "unable to deserialize vector tuple uint32 vector uint32"; | 
 |       } | 
 |     } | 
 |     return vec; | 
 |   } | 
 |  | 
 |   if (type == "v_t_u32_size") { | 
 |     std::vector<std::tuple<uint32_t, size_t>> vec; | 
 |     for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) { | 
 |       DbusVariantType tmp = Deserialize(*itor); | 
 |       if (const std::tuple<uint32_t, size_t>* pval = | 
 |               std::get_if<std::tuple<uint32_t, size_t>>(&tmp)) { | 
 |         vec.push_back(*pval); | 
 |       } else { | 
 |         BMCWEB_LOG_STATEFUL_DEBUG << "unable to deserialize vector uint32 size"; | 
 |       } | 
 |     } | 
 |     return vec; | 
 |   } | 
 |  | 
 |   BMCWEB_LOG_STATEFUL_DEBUG << "deserialize: unknown iter type, iterType: " | 
 |                             << type; | 
 |   return {}; | 
 | } | 
 |  | 
 | inline DbusVariantType DeserializeTup(nlohmann::json::reference j, | 
 |                                       const std::string& type) { | 
 |   if (type == "t_s_s") { | 
 |     std::tuple<std::string, std::string> tup; | 
 |     DbusVariantType tmp = Deserialize(j[0]); | 
 |     if (const std::string* pval = std::get_if<std::string>(&tmp)) { | 
 |       std::get<0>(tup) = *pval; | 
 |     } else { | 
 |       BMCWEB_LOG_ERROR << "Unable to derizlize tup t_s_s 0"; | 
 |     } | 
 |     tmp = Deserialize(j[1]); | 
 |     if (const std::string* pval = std::get_if<std::string>(&tmp)) { | 
 |       std::get<1>(tup) = *pval; | 
 |     } else { | 
 |       BMCWEB_LOG_ERROR << "Unable to derizlize tup t_s_s 1"; | 
 |     } | 
 |     return tup; | 
 |   } | 
 |   if (type == "t_s_s_s") { | 
 |     std::tuple<std::string, std::string, std::string> tup; | 
 |     DbusVariantType tmp = Deserialize(j[0]); | 
 |     if (const std::string* pval = std::get_if<std::string>(&tmp)) { | 
 |       std::get<0>(tup) = *pval; | 
 |     } else { | 
 |       BMCWEB_LOG_ERROR << "Unable to derizlize up t_s_s_s 0"; | 
 |     } | 
 |     tmp = Deserialize(j[1]); | 
 |     if (const std::string* pval = std::get_if<std::string>(&tmp)) { | 
 |       std::get<1>(tup) = *pval; | 
 |     } else { | 
 |       BMCWEB_LOG_ERROR << "Unable to derizlize up t_s_s_s 1"; | 
 |     } | 
 |     tmp = Deserialize(j[2]); | 
 |     if (const std::string* pval = std::get_if<std::string>(&tmp)) { | 
 |       std::get<2>(tup) = *pval; | 
 |     } else { | 
 |       BMCWEB_LOG_ERROR << "Unable to derizlize up t_s_s_s 2"; | 
 |     } | 
 |     return tup; | 
 |   } | 
 |  | 
 |   if (type == "t_u32_v_u32") { | 
 |     std::tuple<uint32_t, std::vector<uint32_t>> tup; | 
 |     DbusVariantType tmp = Deserialize(j[0]); | 
 |     if (const uint32_t* pval = std::get_if<uint32_t>(&tmp)) { | 
 |       std::get<0>(tup) = *pval; | 
 |     } else { | 
 |       BMCWEB_LOG_ERROR << "Unable to derizlize tup t_u32_v_u32 0"; | 
 |     } | 
 |     tmp = Deserialize(j[1]); | 
 |     if (const std::vector<uint32_t>* pval = | 
 |             std::get_if<std::vector<uint32_t>>(&tmp)) { | 
 |       std::get<1>(tup) = *pval; | 
 |     } else { | 
 |       BMCWEB_LOG_ERROR << "Unable to derizlize tup t_u32_v_u32 2"; | 
 |     } | 
 |     return tup; | 
 |   } | 
 |  | 
 |   BMCWEB_LOG_STATEFUL_DEBUG << "deserialize: unknown tuple type, iterType: " | 
 |                             << type; | 
 |   return {}; | 
 | } | 
 |  | 
 | DbusVariantType Deserialize(nlohmann::json::reference j) { | 
 |   try { | 
 |     std::string vtype = j["type"]; | 
 |     BMCWEB_LOG_STATEFUL_DEBUG << "deserialize: vtype: "; | 
 |     BMCWEB_LOG_STATEFUL_DEBUG << vtype; | 
 |     if (vtype == SerializeToString(Serialize::string_type)) { | 
 |       std::string r = j["val"]; | 
 |       return {r}; | 
 |     } | 
 |     if (vtype == SerializeToString(Serialize::int64_t_type)) { | 
 |       int64_t r = j["val"]; | 
 |       return {r}; | 
 |     } | 
 |     if (vtype == SerializeToString(Serialize::uint64_t_type)) { | 
 |       uint64_t r = j["val"]; | 
 |       return {r}; | 
 |     } | 
 |     if (vtype == SerializeToString(Serialize::double_type)) { | 
 |       if (j["val"].is_null()) { | 
 |         return {0.0}; | 
 |       } | 
 |       double r = j["val"]; | 
 |       return {r}; | 
 |     } | 
 |     if (vtype == SerializeToString(Serialize::int32_t_type)) { | 
 |       int32_t r = j["val"]; | 
 |       return {r}; | 
 |     } | 
 |     if (vtype == SerializeToString(Serialize::uint32_t_type)) { | 
 |       uint32_t r = j["val"]; | 
 |       return {r}; | 
 |     } | 
 |     if (vtype == SerializeToString(Serialize::int16_t_type)) { | 
 |       int16_t r = j["val"]; | 
 |       return {r}; | 
 |     } | 
 |     if (vtype == SerializeToString(Serialize::uint16_t_type)) { | 
 |       uint16_t r = j["val"]; | 
 |       return {r}; | 
 |     } | 
 |     if (vtype == SerializeToString(Serialize::uint8_t_type)) { | 
 |       uint8_t r = j["val"]; | 
 |       return {r}; | 
 |     } | 
 |     if (vtype == SerializeToString(Serialize::bool_type)) { | 
 |       bool r = j["val"]; | 
 |       return {r}; | 
 |     } | 
 |     if (vtype == SerializeToString(Serialize::size_t_type)) { | 
 |       size_t r = j["val"]; | 
 |       return {r}; | 
 |     } | 
 |     if (vtype == SerializeToString(Serialize::iter_type)) { | 
 |       nlohmann::json::reference ref = j["val"]; | 
 |       std::string iter_type = j["iterType"]; | 
 |       DbusVariantType r = DeserializeIter(ref, iter_type); | 
 |       return r; | 
 |     } | 
 |     if (vtype == SerializeToString(Serialize::tup_type)) { | 
 |       nlohmann::json::reference ref = j["val"]; | 
 |       std::string iter_type = j["iterType"]; | 
 |       DbusVariantType r = DeserializeTup(ref, iter_type); | 
 |       return r; | 
 |     } | 
 |     BMCWEB_LOG_STATEFUL_DEBUG << "deserialize: unknown Type: " << vtype; | 
 |     return {}; | 
 |   } catch (...) { | 
 |     BMCWEB_LOG_STATEFUL_DEBUG << "deserialize: catch "; | 
 |     return {}; | 
 |   } | 
 | } | 
 |  | 
 | using DBusPropertiesMap = std::vector<std::pair<std::string, DbusVariantType>>; | 
 | using DBusInteracesMap = std::vector<std::pair<std::string, DBusPropertiesMap>>; | 
 | using ManagedObjectType = | 
 |     std::vector<std::pair<sdbusplus::message::object_path, DBusInteracesMap>>; | 
 |  | 
 | nlohmann::json SerializePropMap(DBusPropertiesMap& in) { | 
 |   nlohmann::json j; | 
 |   j["type"] = "PropMap"; | 
 |   nlohmann::json arr = nlohmann::json::array(); | 
 |   for (DBusPropertiesMap::iterator itor = in.begin(); itor != in.end(); | 
 |        itor++) { | 
 |     nlohmann::json tmp; | 
 |     tmp["string"] = itor->first; | 
 |     DbusVariantType var = itor->second; | 
 |     tmp["val"] = Serialize(var); | 
 |     arr.push_back(tmp); | 
 |   } | 
 |   j["val"] = arr; | 
 |   return j; | 
 | } | 
 |  | 
 | DBusPropertiesMap DeserializePropMap(nlohmann::json::reference j) { | 
 |   BMCWEB_LOG_STATEFUL_DEBUG << "deserialize propMap" << j.dump(); | 
 |   DBusPropertiesMap ret; | 
 |   nlohmann::json::reference val = j["val"]; | 
 |   for (nlohmann::json::iterator itor = val.begin(); itor != val.end(); itor++) { | 
 |     nlohmann::json::reference innerval = (*itor)["val"]; | 
 |     DbusVariantType tmp_variant = Deserialize(innerval); | 
 |     std::pair<std::string, DbusVariantType> tmp = {(*itor)["string"], | 
 |                                                    tmp_variant}; | 
 |     ret.push_back(tmp); | 
 |   } | 
 |   return ret; | 
 | } | 
 |  | 
 | nlohmann::json SerializeInterfaceMap(DBusInteracesMap& in) { | 
 |   nlohmann::json j; | 
 |   j["type"] = "interaceMap"; | 
 |   nlohmann::json arr = nlohmann::json::array(); | 
 |   for (DBusInteracesMap::iterator itor = in.begin(); itor != in.end(); itor++) { | 
 |     nlohmann::json tmp; | 
 |     tmp["string"] = itor->first; | 
 |     tmp["val"] = SerializePropMap(itor->second); | 
 |     arr.push_back(tmp); | 
 |   } | 
 |   j["val"] = arr; | 
 |   return j; | 
 | } | 
 |  | 
 | DBusInteracesMap DeserializeInterfaceMap(nlohmann::json::reference& j) { | 
 |   DBusInteracesMap ret; | 
 |   nlohmann::json::reference val = j["val"]; | 
 |   for (nlohmann::json::iterator itor = val.begin(); itor != val.end(); itor++) { | 
 |     nlohmann::json::reference innerval = (*itor)["val"]; | 
 |     std::pair<std::string, DBusPropertiesMap> tmp = { | 
 |         (*itor)["string"], DeserializePropMap(innerval)}; | 
 |     ret.push_back(tmp); | 
 |   } | 
 |   return ret; | 
 | } | 
 |  | 
 | nlohmann::json SerializeObject(ManagedObjectType& in) { | 
 |   nlohmann::json j; | 
 |   j["type"] = "object"; | 
 |   nlohmann::json arr = nlohmann::json::array(); | 
 |   for (ManagedObjectType::iterator itor = in.begin(); itor != in.end(); | 
 |        itor++) { | 
 |     nlohmann::json tmp; | 
 |     tmp["string"] = itor->first; | 
 |     tmp["val"] = SerializeInterfaceMap(itor->second); | 
 |     arr.push_back(tmp); | 
 |   } | 
 |   j["val"] = arr; | 
 |   return j; | 
 | } | 
 |  | 
 | ManagedObjectType DeserializeObject(nlohmann::json::reference j) { | 
 |   ManagedObjectType ret; | 
 |   nlohmann::json::reference val = j["val"]; | 
 |   for (nlohmann::json::iterator itor = val.begin(); itor != val.end(); itor++) { | 
 |     nlohmann::json::reference innerval = (*itor)["val"]; | 
 |     std::pair<std::string, DBusInteracesMap> tmp = { | 
 |         (*itor)["string"], DeserializeInterfaceMap(innerval)}; | 
 |     ret.push_back(tmp); | 
 |   } | 
 |   return ret; | 
 | } | 
 |  | 
 | nlohmann::json SerializeMapperServiceMap( | 
 |     const dbus::utility::MapperServiceMap& in) { | 
 |   nlohmann::json j; | 
 |   j["type"] = "mapperServiceMap"; | 
 |   nlohmann::json arr = nlohmann::json::array(); | 
 |   for (MapperServiceMap::const_iterator itor = in.begin(); itor != in.end(); | 
 |        itor++) { | 
 |     nlohmann::json elem; | 
 |     elem["string"] = itor->first; | 
 |     nlohmann::json inner_arr = nlohmann::json::array(); | 
 |     for (std::vector<std::string>::const_iterator inner_itor = | 
 |              itor->second.begin(); | 
 |          inner_itor != itor->second.end(); inner_itor++) { | 
 |       nlohmann::json inner_elem; | 
 |       inner_elem["type"] = "string"; | 
 |       inner_elem["val"] = *inner_itor; | 
 |       inner_arr.push_back(inner_elem); | 
 |     } | 
 |     elem["val"] = inner_arr; | 
 |     arr.push_back(elem); | 
 |   } | 
 |   j["val"] = arr; | 
 |   return j; | 
 | } | 
 |  | 
 | MapperServiceMap DeserializeMapperServiceMap(nlohmann::json::reference j) { | 
 |   MapperServiceMap ret; | 
 |   nlohmann::json::reference val = j["val"]; | 
 |   for (nlohmann::json::iterator itor = val.begin(); itor != val.end(); itor++) { | 
 |     std::vector<std::string> inner_tmp = {}; | 
 |  | 
 |     for (nlohmann::json::iterator inner_itor = (*itor)["val"].begin(); | 
 |          inner_itor != (*itor)["val"].end(); inner_itor++) { | 
 |       inner_tmp.push_back((*inner_itor)["val"]); | 
 |     } | 
 |     const std::pair<std::string, std::vector<std::string>> tmp = { | 
 |         (*itor)["string"], inner_tmp}; | 
 |     ret.push_back(tmp); | 
 |   } | 
 |   return ret; | 
 | } | 
 |  | 
 | nlohmann::json SerializeSubtree(dbus::utility::MapperGetSubTreeResponse& in) { | 
 |   nlohmann::json j; | 
 |   j["type"] = "subTreeResponse"; | 
 |   nlohmann::json arr = nlohmann::json::array(); | 
 |   for (MapperGetSubTreeResponse::iterator itor = in.begin(); itor != in.end(); | 
 |        itor++) { | 
 |     nlohmann::json tmp; | 
 |     tmp["string"] = itor->first; | 
 |     tmp["val"] = SerializeMapperServiceMap(itor->second); | 
 |     arr.push_back(tmp); | 
 |   } | 
 |   j["val"] = arr; | 
 |   return j; | 
 | } | 
 |  | 
 | MapperGetSubTreeResponse DeserializeSubtree( | 
 |     nlohmann::json::reference j) { | 
 |   MapperGetSubTreeResponse ret; | 
 |   nlohmann::json::reference val = j["val"]; | 
 |   for (nlohmann::json::iterator itor = val.begin(); itor != val.end(); itor++) { | 
 |     nlohmann::json::reference innerval = (*itor)["val"]; | 
 |     std::pair<std::string, MapperServiceMap> tmp = { | 
 |         (*itor)["string"], DeserializeMapperServiceMap(innerval)}; | 
 |     ret.push_back(tmp); | 
 |   } | 
 |   return ret; | 
 | } | 
 |  | 
 | nlohmann::json SerializeSubtreePaths(MapperGetSubTreePathsResponse& in) { | 
 |   nlohmann::json j; | 
 |   j["type"] = "subTreePathsResponse"; | 
 |   nlohmann::json arr = nlohmann::json::array(); | 
 |   for (MapperGetSubTreePathsResponse::iterator itor = in.begin(); | 
 |        itor != in.end(); itor++) { | 
 |     arr.push_back(*itor); | 
 |   } | 
 |   j["val"] = arr; | 
 |   return j; | 
 | } | 
 |  | 
 | MapperGetSubTreePathsResponse DeserializeSubtreePaths( | 
 |     nlohmann::json::reference j) { | 
 |   MapperGetSubTreePathsResponse ret; | 
 |   nlohmann::json::reference val = j["val"]; | 
 |   for (nlohmann::json::iterator itor = val.begin(); itor != val.end(); itor++) { | 
 |     ret.push_back(*itor); | 
 |   } | 
 |   return ret; | 
 | } | 
 |  | 
 | // MapperObject is equivalent to MapperServiceMap | 
 | nlohmann::json SerializeMapperObject(MapperGetObject& in) { | 
 |   return SerializeMapperServiceMap(in); | 
 | } | 
 |  | 
 | MapperGetObject DeserializeMapperObject(nlohmann::json::reference j) { | 
 |   return DeserializeMapperServiceMap(j); | 
 | } | 
 |  | 
 | nlohmann::json SerializeSystemdUnitStruct(SystemdUnitStruct& in) { | 
 |   nlohmann::json j; | 
 |   j["type"] = "systemdUnitStruct"; | 
 |   nlohmann::json::reference val = j["val"]; | 
 |  | 
 |   // Serialize all parts of the systemd unit struct a(ssssssouso) | 
 |   val["name"] = std::get<0>(in); | 
 |   val["description"] = std::get<1>(in); | 
 |   val["load_state"] = std::get<2>(in); | 
 |   val["active_state"] = std::get<3>(in); | 
 |   val["substate"] = std::get<4>(in); | 
 |   val["followed_unit"] = std::get<5>(in); | 
 |   val["unit_path"] = std::get<6>(in).str; | 
 |   val["job_id"] = std::get<7>(in); | 
 |   val["job_type"] = std::get<8>(in); | 
 |   val["job_path"] = std::get<9>(in).str; | 
 |  | 
 |   return j; | 
 | } | 
 |  | 
 | nlohmann::json SerializeSystemdListUnits(SystemdListUnits& in) { | 
 |   nlohmann::json j; | 
 |   j["type"] = "systemdListUnits"; | 
 |   nlohmann::json arr = nlohmann::json::array(); | 
 |   for (SystemdListUnits::iterator itor = in.begin(); itor != in.end(); itor++) { | 
 |     arr.push_back(SerializeSystemdUnitStruct(*itor)); | 
 |   } | 
 |   j["val"] = arr; | 
 |   return j; | 
 | } | 
 |  | 
 | SystemdUnitStruct DeserializeSystemdUnitStruct( | 
 |     nlohmann::json::reference j) { | 
 |   SystemdUnitStruct ret; | 
 |   nlohmann::json::reference val = j["val"]; | 
 |  | 
 |   return std::make_tuple( | 
 |       val["name"], val["description"], val["load_state"], val["active_state"], | 
 |       val["substate"], val["followed_unit"], | 
 |       sdbusplus::message::object_path(val["unit_path"]), val["job_id"], | 
 |       val["job_type"], sdbusplus::message::object_path(val["job_path"])); | 
 | } | 
 |  | 
 | SystemdListUnits DeserializeSystemdListUnits( | 
 |     nlohmann::json::reference j) { | 
 |   SystemdListUnits ret; | 
 |   nlohmann::json::reference val = j["val"]; | 
 |   for (nlohmann::json::iterator itor = val.begin(); itor != val.end(); itor++) { | 
 |     ret.push_back(DeserializeSystemdUnitStruct(*itor)); | 
 |   } | 
 |   return ret; | 
 | } | 
 |  | 
 | std::optional<std::string> ReadBinaryFileToString( | 
 |     const std::filesystem::path& file) { | 
 |   std::ifstream f(file, std::ios_base::in | std::ios::binary); | 
 |   if (!f.is_open()) { | 
 |     BMCWEB_LOG_STATEFUL_DEBUG << "unable to open file " << file; | 
 |     return std::nullopt; | 
 |   } | 
 |   std::string content{std::istreambuf_iterator<char>(f), | 
 |                       std::istreambuf_iterator<char>()}; | 
 |   if (!f) { | 
 |     BMCWEB_LOG_STATEFUL_DEBUG << "unable to read file " << file | 
 |                               << strerror(errno); | 
 |     return std::nullopt; | 
 |   } | 
 |   f.close(); | 
 |   if (!f) { | 
 |     BMCWEB_LOG_STATEFUL_DEBUG << "unable to close file " << file | 
 |                               << strerror(errno); | 
 |     return std::nullopt; | 
 |   } | 
 |   return content; | 
 | } | 
 |  | 
 | }  // namespace serialize |