diff options
Diffstat (limited to 'extensions/openpower-pels/additional_data.hpp')
-rw-r--r-- | extensions/openpower-pels/additional_data.hpp | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/extensions/openpower-pels/additional_data.hpp b/extensions/openpower-pels/additional_data.hpp new file mode 100644 index 0000000..ca4a47d --- /dev/null +++ b/extensions/openpower-pels/additional_data.hpp @@ -0,0 +1,132 @@ +#pragma once +#include <map> +#include <nlohmann/json.hpp> +#include <optional> +#include <string> +#include <vector> + +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<std::string>& 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<string> - the value, if found + */ + std::optional<std::string> 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<std::string, std::string>& - The data + */ + const std::map<std::string, std::string>& 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<std::string, std::string> _data; +}; +} // namespace pels +} // namespace openpower |