#pragma once #include #include #include #include #include namespace openpower { namespace pels { /** * @class AdditionalData * * This class takes in the contents of the AdditionalData OpenBMC * event log property, and provides access to its values based on * their keys. * * The property is a vector of strings of the form: "KEY=VALUE", * and this class provides a getValue("KEY") API that would return * "VALUE". */ class AdditionalData { public: AdditionalData() = default; ~AdditionalData() = default; AdditionalData(const AdditionalData&) = default; AdditionalData& operator=(const AdditionalData&) = default; AdditionalData(AdditionalData&&) = default; AdditionalData& operator=(AdditionalData&&) = default; /** * @brief constructor * * @param[in] ad - the AdditionalData property vector with * entries of "KEY=VALUE" */ explicit AdditionalData(const std::vector& ad) { for (auto& item : ad) { auto pos = item.find_first_of('='); if (pos == std::string::npos || pos == 0) { continue; } _data[item.substr(0, pos)] = std::move(item.substr(pos + 1)); } } /** * @brief Returns the value of the AdditionalData item for the * key passed in. * @param[in] key - the key to search for * * @return optional - the value, if found */ std::optional getValue(const std::string& key) const { auto entry = _data.find(key); if (entry != _data.end()) { return entry->second; } return std::nullopt; } /** * @brief Remove a key/value pair from the contained data * * @param[in] key - The key of the entry to remove */ void remove(const std::string& key) { _data.erase(key); } /** * @brief Says if the object has no data * * @return bool true if the object is empty */ inline bool empty() const { return _data.empty(); } /** * @brief Returns the contained data as a JSON object * * Looks like: {"key1":"value1","key2":"value2"} * * @return json - The JSON object */ nlohmann::json toJSON() const { nlohmann::json j = _data; return j; } /** * @brief Returns the underlying map of data * * @return const std::map& - The data */ const std::map& getData() const { return _data; } /** * @brief Adds a key/value pair to the object * * @param[in] key - The key * @param[in] value - The value */ void add(const std::string& key, const std::string& value) { _data.emplace(key, value); } private: /** * @brief a map of keys to values */ std::map _data; }; } // namespace pels } // namespace openpower