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