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