created Callout classes for various PEL callouts
Signed-off-by: Zane Shelley <zshelle@us.ibm.com>
Change-Id: Ia36c52281ebd425ab1c38be57ff35ea19ee01740
diff --git a/analyzer/service_data.hpp b/analyzer/service_data.hpp
new file mode 100644
index 0000000..9c5e6fd
--- /dev/null
+++ b/analyzer/service_data.hpp
@@ -0,0 +1,151 @@
+#pragma once
+
+#include <nlohmann/json.hpp>
+
+namespace analyzer
+{
+
+/** @brief An abstract class for service event, also known as a callout. */
+class Callout
+{
+ public:
+ /** Each callout will have a priority indicating when to issue the required
+ * service action. Details below. */
+ enum Priority
+ {
+ /** Serivce is mandatory. */
+ HIGH,
+
+ /** Serivce medium priority callouts one at a time, in order, until the
+ * issue is resolved. */
+ MED,
+
+ MED_A, ///< Same as PRI_MED, except replace all A's as a group.
+ MED_B, ///< Same as PRI_MED, except replace all B's as a group.
+ MED_C, ///< Same as PRI_MED, except replace all C's as a group.
+
+ /** If servicing all high and medium priority callouts did not resolve
+ * the issue, service low priority callouts one at a time, in order,
+ * until the issue is resolved. */
+ LOW,
+ };
+
+ public:
+ /** @brief Pure virtual destructor. */
+ virtual ~Callout() = 0;
+
+ protected:
+ /**
+ * @brief Constructor from components.
+ * @param p The callout priority.
+ */
+ explicit Callout(Priority p) : iv_priority(p) {}
+
+ private:
+ /** The callout priority. */
+ const Priority iv_priority;
+
+ protected:
+ /**
+ * @brief Appends the callout priority to the end of the given json object.
+ * @param j The json object for a single callout.
+ */
+ void addPriority(nlohmann::json& j) const
+ {
+ // clang-format off
+ static const std::map<Priority, std::string> m =
+ {
+ {HIGH, "H"},
+ {MED, "M"},
+ {MED_A, "A"},
+ {MED_B, "B"},
+ {MED_C, "C"},
+ {LOW, "L"},
+ };
+ // clang-format on
+
+ j.emplace("Priority", m.at(iv_priority));
+ }
+
+ public:
+ /**
+ * @brief Appends a json object representing this callout to the end of the
+ * given json object.
+ * @param j The json object containing all current callouts for a PEL.
+ */
+ virtual void getJson(nlohmann::json&) const = 0;
+};
+
+// Pure virtual destructor must be defined.
+inline Callout::~Callout() {}
+
+/** @brief A service event requiring hardware replacement. */
+class HardwareCallout : public Callout
+{
+ public:
+ /**
+ * @brief Constructor from components.
+ * @param i_locationCode The location code of the hardware callout.
+ * @param i_priority The callout priority.
+ */
+ HardwareCallout(const std::string& i_locationCode, Priority i_priority) :
+ Callout(i_priority), iv_locationCode(i_locationCode)
+ {}
+
+ private:
+ /** The hardware location code. */
+ const std::string iv_locationCode;
+
+ public:
+ void getJson(nlohmann::json& j) const override
+ {
+ nlohmann::json c = {{"LocationCode", iv_locationCode}};
+ addPriority(c);
+ j.emplace_back(c);
+ }
+};
+
+/**
+ * @brief A service event requiring a special procedure to be handled by a
+ * service engineer.
+ */
+class ProcedureCallout : public Callout
+{
+ public:
+ /** Supported service procedures. */
+ enum Procedure
+ {
+ NEXTLVL, ///< Contact next level support.
+ };
+
+ public:
+ /**
+ * @brief Constructor from components.
+ * @param i_procedure The location code of the hardware callout.
+ * @param i_priority The callout priority.
+ */
+ ProcedureCallout(Procedure i_procedure, Priority i_priority) :
+ Callout(i_priority), iv_procedure(i_procedure)
+ {}
+
+ private:
+ /** The callout priority. */
+ const Procedure iv_procedure;
+
+ public:
+ void getJson(nlohmann::json& j) const override
+ {
+ // clang-format off
+ static const std::map<Procedure, std::string> m =
+ {
+ {NEXTLVL, "NEXTLVL"},
+ };
+ // clang-format on
+
+ nlohmann::json c = {{"Procedure", m.at(iv_procedure)}};
+ addPriority(c);
+ j.emplace_back(c);
+ }
+};
+
+} // namespace analyzer