control: Create ZoneHandlers directly from JSON

Instead of creating the ZoneHandler functions from the configuration
data provided in the zones.json, create them at the time of parsing the
JSON. This simplifies the creation of the zone definitions structure
that's shared between a YAML configuration or a JSON configuration.

Tested:
    Verified ZoneHandler functions returned for zone properties

Change-Id: Ida85e78bf88e9c82e9402b7fd183485020a70631
Signed-off-by: Matthew Barth <msbarth@us.ibm.com>
diff --git a/control/json/zone.hpp b/control/json/zone.hpp
index ede56e4..4f7742c 100644
--- a/control/json/zone.hpp
+++ b/control/json/zone.hpp
@@ -16,6 +16,7 @@
 #pragma once
 
 #include "config_base.hpp"
+#include "types.hpp"
 
 #include <nlohmann/json.hpp>
 #include <sdbusplus/bus.hpp>
@@ -31,7 +32,7 @@
 using json = nlohmann::json;
 
 /* Interface property handler function */
-using propertyHandler = std::function<std::any(const json&)>;
+using propHandler = std::function<ZoneHandler(const json&, bool)>;
 
 /**
  * @class Zone - Represents a configured fan control zone
@@ -51,13 +52,10 @@
   public:
     /* JSON file name for zones */
     static constexpr auto confFileName = "zones.json";
-
-    /* Map of interfaces to properties with their values and persistency */
-    static constexpr auto propValue = 0;
-    static constexpr auto propPersist = 1;
-    using Interfaces =
-        std::map<std::string,
-                 std::map<std::string, std::tuple<std::any, bool>>>;
+    static constexpr auto thermModeIntf =
+        "xyz.openbmc_project.Control.ThermalMode";
+    static constexpr auto supportedProp = "Supported";
+    static constexpr auto currentProp = "Current";
 
     Zone() = delete;
     Zone(const Zone&) = delete;
@@ -136,17 +134,18 @@
     }
 
     /**
-     * @brief Get the configuration of interfaces
+     * @brief Get the configuration of zone interface handlers
      *
      * Interfaces hosted by a zone can optionally be configured to set their
      * property values and/or persistency. These interfaces must be supported
      * by the zone object they are configured for.
      *
-     * @return Map of interfaces to properties with their values and persistency
+     * @return List of zone interface handler functions that set an interface's
+     * property values and persistency states
      */
-    inline const auto& getInterfaces() const
+    inline const auto& getZoneHandlers() const
     {
-        return _interfaces;
+        return _zoneHandlers;
     }
 
   private:
@@ -162,11 +161,15 @@
     /* Zone's speed decrease interval(in seconds) */
     uint64_t _decInterval;
 
-    /* Map of interfaces to properties with their values and persistency */
-    Interfaces _interfaces;
+    /**
+     * Zone interface handler functions for its
+     * configured interfaces (OPTIONAL)
+     */
+    std::vector<ZoneHandler> _zoneHandlers;
 
-    /* Interface properties mapping to their associated handler function */
-    static const std::map<std::string, propertyHandler> _props;
+    /* Interface to property mapping of their associated handler function */
+    static const std::map<std::string, std::map<std::string, propHandler>>
+        _intfPropHandlers;
 
     /**
      * @brief Parse and set the zone's full speed value
@@ -198,13 +201,14 @@
     void setDecInterval(const json& jsonObj);
 
     /**
-     * @brief Parse and set properties on interfaces the zone serves(OPTIONAL)
+     * @brief Parse and set the interfaces served by the zone(OPTIONAL)
      *
      * @param[in] jsonObj - JSON object for the zone
      *
-     * Sets any properties on the interfaces that the zone to serves along
-     * with the property's persistency state (OPTIONAL). A property's "persist"
-     * state is defaulted to not be persisted when not given.
+     * Constructs any zone interface handler functions for interfaces that the
+     * zone serves which contains the interface's property's value and
+     * persistency state (OPTIONAL). A property's "persist" state is defaulted
+     * to not be persisted when not given.
      */
     void setInterfaces(const json& jsonObj);
 };
@@ -216,22 +220,26 @@
 {
 
 /**
- * @brief "Supported" property on the "ThermalMode" interface
+ * @brief "Supported" property on the "xyz.openbmc_project.Control.ThermalMode"
+ * interface
  *
  * @param[in] jsonObj - JSON object for the "Supported" property
+ * @param[in] persist - Whether to persist the value or not
  *
- * @return - A std::any object of the "Supported" property's value
+ * @return Zone interface handler function for the property
  */
-std::any supported(const json& jsonObj);
+ZoneHandler supported(const json& jsonObj, bool persist);
 
 /**
- * @brief "Current property on the "ThermalMode" interface
+ * @brief "Current" property on the "xyz.openbmc_project.Control.ThermalMode"
+ * interface
  *
  * @param[in] jsonObj - JSON object for the "Current" property
+ * @param[in] persist - Whether to persist the value or not
  *
- * @return - A std::any object of the "Current" property's value
+ * @return Zone interface handler function for the property
  */
-std::any current(const json& jsonObj);
+ZoneHandler current(const json& jsonObj, bool persist);
 
 } // namespace zone::property