summaryrefslogtreecommitdiffstats
path: root/extensions/openpower-pels/additional_data.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/openpower-pels/additional_data.hpp')
-rw-r--r--extensions/openpower-pels/additional_data.hpp132
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
OpenPOWER on IntegriCloud