manager: led priority is optional

The default priority was "Blink" but now the priority is optional.

This helps to implement group priority.
So if someone wants to use group priority they can do so, without the
default led priority getting in the way.

The led priority can still be assigned as "Blink" explicitly if needed.

Change-Id: I9336487bcc2edc0b3308ee76eb5330b8222b7f25
Signed-off-by: Alexander Hansen <alexander.hansen@9elements.com>
diff --git a/manager/json-parser.hpp b/manager/json-parser.hpp
index e92dfbc..e17568b 100644
--- a/manager/json-parser.hpp
+++ b/manager/json-parser.hpp
@@ -20,7 +20,8 @@
 // Priority for a particular LED needs to stay SAME across all groups
 // phosphor::led::Layout::Action can only be one of `Blink` and `On`
 using PriorityMap =
-    std::unordered_map<std::string, phosphor::led::Layout::Action>;
+    std::unordered_map<std::string,
+                       std::optional<phosphor::led::Layout::Action>>;
 
 /** @brief Parse LED JSON file and output Json object
  *
@@ -65,6 +66,25 @@
                              : phosphor::led::Layout::Action::On;
 }
 
+static std::string priorityToString(
+    const std::optional<phosphor::led::Layout::Action>& priority)
+{
+    if (!priority.has_value())
+    {
+        return "none";
+    }
+    switch (priority.value())
+    {
+        case phosphor::led::Layout::Action::Off:
+            return "Off";
+        case phosphor::led::Layout::Action::On:
+            return "On";
+        case phosphor::led::Layout::Action::Blink:
+            return "Blink";
+    }
+    return "?";
+}
+
 /** @brief Validate the Priority of an LED is same across ALL groups
  *
  *  @param[in] name - led name member of each group
@@ -73,9 +93,10 @@
  *
  *  @return
  */
-void validatePriority(const std::string& name,
-                      const phosphor::led::Layout::Action& priority,
-                      PriorityMap& priorityMap)
+void validatePriority(
+    const std::string& name,
+    const std::optional<phosphor::led::Layout::Action>& priority,
+    PriorityMap& priorityMap)
 {
     auto iter = priorityMap.find(name);
     if (iter == priorityMap.end())
@@ -88,8 +109,8 @@
     {
         lg2::error(
             "Priority of LED is not same across all, Name = {NAME}, Old Priority = {OLD_PRIO}, New Priority = {NEW_PRIO}",
-            "NAME", name, "OLD_PRIO", int(iter->second), "NEW_PRIO",
-            int(priority));
+            "NAME", name, "OLD_PRIO", priorityToString(iter->second),
+            "NEW_PRIO", priorityToString(priority));
 
         throw std::runtime_error(
             "Priority of at least one LED is not same across groups");
@@ -105,8 +126,13 @@
     uint8_t dutyOn = member.value("DutyOn", 50);
     uint16_t period = member.value("Period", 0);
 
-    // Since only have Blink/On and default priority is Blink
-    auto priority = getAction(member.value("Priority", "Blink"));
+    const std::string priorityStr = member.value("Priority", "");
+    std::optional<phosphor::led::Layout::Action> priority = std::nullopt;
+
+    if (!priorityStr.empty())
+    {
+        priority = getAction(priorityStr);
+    }
 
     // Same LEDs can be part of multiple groups. However, their
     // priorities across groups need to match.