xref: /openbmc/bmcweb/features/redfish/src/registries.cpp (revision 40e9b92ec19acffb46f83a6e55b18974da5d708e)
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