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