registries: make registration dynamic

Rather than having to manually hook code for registries, add a small
registration function to the registry header and use this registration
results throughout the registry interactions.

Tested:

Confirmed registries have same behavior.

```
$ curl -s -k https://localhost:18080/redfish/v1/Registries/ | jq '.Members | map(."@odata.id")'
[
  "/redfish/v1/Registries/Base",
  "/redfish/v1/Registries/HeartbeatEvent",
  "/redfish/v1/Registries/OpenBMC",
  "/redfish/v1/Registries/ResourceEvent",
  "/redfish/v1/Registries/TaskEvent",
  "/redfish/v1/Registries/Telemetry"
]
```

```
$ curl -s -k https://localhost:18080/redfish/v1/Registries/TaskEvent/TaskEvent | jq ".Messages | keys"
[
  "TaskAborted",
  "TaskCancelled",
  "TaskCompletedOK",
  "TaskCompletedWarning",
  "TaskPaused",
  "TaskProgressChanged",
  "TaskRemoved",
  "TaskResumed",
  "TaskStarted"
]
```

Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
Change-Id: Iaa355420736a2587d9da4e995208d579443ca9b8
diff --git a/redfish-core/lib/message_registries.hpp b/redfish-core/lib/message_registries.hpp
index 6bbdb48..325fe6b 100644
--- a/redfish-core/lib/message_registries.hpp
+++ b/redfish-core/lib/message_registries.hpp
@@ -10,17 +10,15 @@
 #include "query.hpp"
 #include "registries.hpp"
 #include "registries/privilege_registry.hpp"
-#include "registries_selector.hpp"
 
 #include <boost/beast/http/verb.hpp>
 #include <boost/url/format.hpp>
 
-#include <array>
 #include <format>
 #include <functional>
 #include <memory>
 #include <optional>
-#include <span>
+#include <ranges>
 #include <utility>
 
 namespace redfish
@@ -46,11 +44,7 @@
 
     nlohmann::json& members = asyncResp->res.jsonValue["Members"];
 
-    static constexpr const auto registryFiles = std::to_array(
-        {"Base", "TaskEvent", "ResourceEvent", "OpenBMC", "Telemetry",
-         "HeartbeatEvent"});
-
-    for (const char* memberName : registryFiles)
+    for (const auto& memberName : std::views::keys(registries::allRegistries()))
     {
         nlohmann::json::object_t member;
         member["@odata.id"] =
@@ -81,10 +75,10 @@
         return;
     }
     std::string dmtf = "DMTF ";
-    std::optional<registries::HeaderAndUrl> headerAndUrl =
-        registries::getRegistryHeaderAndUrlFromPrefix(registry);
+    std::optional<registries::RegistryEntryRef> registryEntry =
+        registries::getRegistryFromPrefix(registry);
 
-    if (!headerAndUrl)
+    if (!registryEntry)
     {
         messages::resourceNotFound(asyncResp->res, "MessageRegistryFile",
                                    registry);
@@ -94,8 +88,8 @@
     {
         dmtf.clear();
     }
-    const registries::Header& header = headerAndUrl->header;
-    const char* url = headerAndUrl->url;
+    const registries::Header& header = registryEntry->get().header;
+    const char* url = registryEntry->get().url;
 
     asyncResp->res.jsonValue["@odata.id"] =
         boost::urls::format("/redfish/v1/Registries/{}", registry);
@@ -145,16 +139,16 @@
         return;
     }
 
-    std::optional<registries::HeaderAndUrl> headerAndUrl =
-        registries::getRegistryHeaderAndUrlFromPrefix(registry);
-    if (!headerAndUrl)
+    std::optional<registries::RegistryEntryRef> registryEntry =
+        registries::getRegistryFromPrefix(registry);
+    if (!registryEntry)
     {
         messages::resourceNotFound(asyncResp->res, "MessageRegistryFile",
                                    registry);
         return;
     }
 
-    const registries::Header& header = headerAndUrl->header;
+    const registries::Header& header = registryEntry->get().header;
     if (registry != registryMatch)
     {
         messages::resourceNotFound(asyncResp->res, header.type, registryMatch);
@@ -178,8 +172,8 @@
     nlohmann::json& messageObj = asyncResp->res.jsonValue["Messages"];
 
     // Go through the Message Registry and populate each Message
-    const std::span<const registries::MessageEntry> registryEntries =
-        registries::getRegistryFromPrefix(registry);
+    const registries::MessageEntries registryEntries =
+        registries::getRegistryMessagesFromPrefix(registry);
 
     for (const registries::MessageEntry& message : registryEntries)
     {