1*40e9b92eSEd Tanous // SPDX-License-Identifier: Apache-2.0 2*40e9b92eSEd Tanous // SPDX-FileCopyrightText: Copyright OpenBMC Authors 3d1d411f9SSui Chen #include "registries.hpp" 4d1d411f9SSui Chen 5d109e2b6SAlexander Hansen #include "registries_selector.hpp" 6d1d411f9SSui Chen #include "str_utility.hpp" 7d1d411f9SSui Chen 8f0b59af4SEd Tanous #include <algorithm> 9f0b59af4SEd Tanous #include <cstring> 103544d2a7SEd Tanous #include <ranges> 11f0b59af4SEd Tanous #include <span> 12d1d411f9SSui Chen #include <string> 13f0b59af4SEd Tanous #include <string_view> 14d1d411f9SSui Chen #include <vector> 15d1d411f9SSui Chen 16d1d411f9SSui Chen namespace redfish::registries 17d1d411f9SSui Chen { 18d1d411f9SSui Chen 19d1d411f9SSui Chen const Message* getMessageFromRegistry(const std::string& messageKey, 20d1d411f9SSui Chen std::span<const MessageEntry> registry) 21d1d411f9SSui Chen { 223544d2a7SEd Tanous std::span<const MessageEntry>::iterator messageIt = std::ranges::find_if( 233544d2a7SEd Tanous registry, [&messageKey](const MessageEntry& messageEntry) { 24d1d411f9SSui Chen return std::strcmp(messageEntry.first, messageKey.c_str()) == 0; 25d1d411f9SSui Chen }); 26d1d411f9SSui Chen if (messageIt != registry.end()) 27d1d411f9SSui Chen { 28d1d411f9SSui Chen return &messageIt->second; 29d1d411f9SSui Chen } 30d1d411f9SSui Chen 31d1d411f9SSui Chen return nullptr; 32d1d411f9SSui Chen } 33d1d411f9SSui Chen 34d1d411f9SSui Chen const Message* getMessage(std::string_view messageID) 35d1d411f9SSui Chen { 36d1d411f9SSui Chen // Redfish MessageIds are in the form 37d1d411f9SSui Chen // RegistryName.MajorVersion.MinorVersion.MessageKey, so parse it to find 38d1d411f9SSui Chen // the right Message 39d1d411f9SSui Chen std::vector<std::string> fields; 40d1d411f9SSui Chen fields.reserve(4); 41d1d411f9SSui Chen bmcweb::split(fields, messageID, '.'); 42d109e2b6SAlexander Hansen if (fields.size() != 4) 43d109e2b6SAlexander Hansen { 44d109e2b6SAlexander Hansen return nullptr; 45d109e2b6SAlexander Hansen } 46d109e2b6SAlexander Hansen 47d1d411f9SSui Chen const std::string& registryName = fields[0]; 48d1d411f9SSui Chen const std::string& messageKey = fields[3]; 49d1d411f9SSui Chen 50d1d411f9SSui Chen // Find the right registry and check it for the MessageKey 51d109e2b6SAlexander Hansen // Find the right registry and check it for the MessageKey 52d109e2b6SAlexander Hansen return getMessageFromRegistry(messageKey, 53d109e2b6SAlexander Hansen getRegistryFromPrefix(registryName)); 54d1d411f9SSui Chen } 55d1d411f9SSui Chen 56d1d411f9SSui Chen } // namespace redfish::registries 57