xref: /openbmc/bmcweb/features/redfish/src/registries.cpp (revision f0b59af46a6aa84890d2181b08d4e1af5ce5002f)
1d1d411f9SSui Chen #include "registries.hpp"
2d1d411f9SSui Chen 
3d1d411f9SSui Chen #include "registries/base_message_registry.hpp"
4d1d411f9SSui Chen #include "registries/openbmc_message_registry.hpp"
5d1d411f9SSui Chen #include "str_utility.hpp"
6d1d411f9SSui Chen 
7*f0b59af4SEd Tanous #include <algorithm>
8*f0b59af4SEd Tanous #include <cstring>
93544d2a7SEd Tanous #include <ranges>
10*f0b59af4SEd Tanous #include <span>
11d1d411f9SSui Chen #include <string>
12*f0b59af4SEd Tanous #include <string_view>
13d1d411f9SSui Chen #include <vector>
14d1d411f9SSui Chen 
15d1d411f9SSui Chen namespace redfish::registries
16d1d411f9SSui Chen {
17d1d411f9SSui Chen 
18d1d411f9SSui Chen const Message* getMessageFromRegistry(const std::string& messageKey,
19d1d411f9SSui Chen                                       std::span<const MessageEntry> registry)
20d1d411f9SSui Chen {
213544d2a7SEd Tanous     std::span<const MessageEntry>::iterator messageIt = std::ranges::find_if(
223544d2a7SEd Tanous         registry, [&messageKey](const MessageEntry& messageEntry) {
23d1d411f9SSui Chen         return std::strcmp(messageEntry.first, messageKey.c_str()) == 0;
24d1d411f9SSui Chen     });
25d1d411f9SSui Chen     if (messageIt != registry.end())
26d1d411f9SSui Chen     {
27d1d411f9SSui Chen         return &messageIt->second;
28d1d411f9SSui Chen     }
29d1d411f9SSui Chen 
30d1d411f9SSui Chen     return nullptr;
31d1d411f9SSui Chen }
32d1d411f9SSui Chen 
33d1d411f9SSui Chen const Message* getMessage(std::string_view messageID)
34d1d411f9SSui Chen {
35d1d411f9SSui Chen     // Redfish MessageIds are in the form
36d1d411f9SSui Chen     // RegistryName.MajorVersion.MinorVersion.MessageKey, so parse it to find
37d1d411f9SSui Chen     // the right Message
38d1d411f9SSui Chen     std::vector<std::string> fields;
39d1d411f9SSui Chen     fields.reserve(4);
40d1d411f9SSui Chen     bmcweb::split(fields, messageID, '.');
41d1d411f9SSui Chen     const std::string& registryName = fields[0];
42d1d411f9SSui Chen     const std::string& messageKey = fields[3];
43d1d411f9SSui Chen 
44d1d411f9SSui Chen     // Find the right registry and check it for the MessageKey
45d1d411f9SSui Chen     if (std::string(base::header.registryPrefix) == registryName)
46d1d411f9SSui Chen     {
47d1d411f9SSui Chen         return getMessageFromRegistry(
48d1d411f9SSui Chen             messageKey, std::span<const MessageEntry>(base::registry));
49d1d411f9SSui Chen     }
50d1d411f9SSui Chen     if (std::string(openbmc::header.registryPrefix) == registryName)
51d1d411f9SSui Chen     {
52d1d411f9SSui Chen         return getMessageFromRegistry(
53d1d411f9SSui Chen             messageKey, std::span<const MessageEntry>(openbmc::registry));
54d1d411f9SSui Chen     }
55d1d411f9SSui Chen     return nullptr;
56d1d411f9SSui Chen }
57d1d411f9SSui Chen 
58d1d411f9SSui Chen } // namespace redfish::registries
59