Add support for returning optional values

Some commands have optional return values. This allows the handlers to
be defined as returning an optional<T> value and then in the body of the
handler set the value in the optional or not.

Tested-by: unit test runs successfully

Change-Id: Ib38a4589609fb1eb192106e511c9ee3a507ac42f
Signed-off-by: Vernon Mauery <vernon.mauery@linux.intel.com>
diff --git a/include/ipmid/message/pack.hpp b/include/ipmid/message/pack.hpp
index 104354d..b458af4 100644
--- a/include/ipmid/message/pack.hpp
+++ b/include/ipmid/message/pack.hpp
@@ -18,6 +18,7 @@
 #include <array>
 #include <ipmid/message/types.hpp>
 #include <memory>
+#include <optional>
 #include <phosphor-logging/log.hpp>
 #include <tuple>
 #include <utility>
@@ -165,6 +166,21 @@
     }
 };
 
+/** @brief Specialization of PackSingle for std::optional<T> */
+template <typename T>
+struct PackSingle<std::optional<T>>
+{
+    static int op(Payload& p, const std::optional<T>& t)
+    {
+        int ret = 0;
+        if (t)
+        {
+            ret = PackSingle<T>::op(p, *t);
+        }
+        return ret;
+    }
+};
+
 /** @brief Specialization of PackSingle for std::array<T, N> */
 template <typename T, size_t N>
 struct PackSingle<std::array<T, N>>