blob: 3d572c209ce7fdf885120624b18c6a0781a5cdd2 [file] [log] [blame]
Jason M. Bills70304cb2019-03-27 12:03:59 -07001/*
2// Copyright (c) 2019 Intel Corporation
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15*/
16#pragma once
Ed Tanousc5ba4c22022-02-07 09:59:55 -080017
Ed Tanous65e4f1f2022-02-08 00:23:54 -080018#include <nlohmann/json.hpp>
19
Nan Zhoud5c80ad2022-07-11 01:16:31 +000020#include <array>
Ed Tanous80f595e2022-02-14 09:32:05 -080021#include <charconv>
Nan Zhoud5c80ad2022-07-11 01:16:31 +000022#include <cstddef>
Ed Tanous80f595e2022-02-14 09:32:05 -080023#include <numeric>
Ed Tanousc5ba4c22022-02-07 09:59:55 -080024#include <span>
25#include <string>
26#include <string_view>
Nan Zhoud5c80ad2022-07-11 01:16:31 +000027#include <utility>
28
29// IWYU pragma: no_include <stddef.h>
Ed Tanousc5ba4c22022-02-07 09:59:55 -080030
Ed Tanousfffb8c12022-02-07 23:53:03 -080031namespace redfish::registries
Jason M. Bills70304cb2019-03-27 12:03:59 -070032{
Jason M. Bills351d3062019-03-27 12:58:21 -070033struct Header
34{
35 const char* copyright;
36 const char* type;
37 const char* id;
38 const char* name;
39 const char* language;
40 const char* description;
41 const char* registryPrefix;
42 const char* registryVersion;
43 const char* owningEntity;
44};
Jason M. Bills70304cb2019-03-27 12:03:59 -070045
46struct Message
47{
48 const char* description;
49 const char* message;
Gunnar Millse7808c92020-07-08 21:17:44 -050050 const char* messageSeverity;
Ed Tanous271584a2019-07-09 16:24:22 -070051 const size_t numberOfArgs;
Jason M. Bills70304cb2019-03-27 12:03:59 -070052 std::array<const char*, 5> paramTypes;
53 const char* resolution;
54};
55using MessageEntry = std::pair<const char*, const Message>;
Ed Tanousc5ba4c22022-02-07 09:59:55 -080056
Patrick Williamsbd79bce2024-08-16 15:22:20 -040057inline std::string fillMessageArgs(
58 const std::span<const std::string_view> messageArgs, std::string_view msg)
Ed Tanousc5ba4c22022-02-07 09:59:55 -080059{
Ed Tanous80f595e2022-02-14 09:32:05 -080060 std::string ret;
61 size_t reserve = msg.size();
Ed Tanous26ccae32023-02-16 10:28:44 -080062 for (std::string_view arg : messageArgs)
Ed Tanousc5ba4c22022-02-07 09:59:55 -080063 {
Ed Tanous80f595e2022-02-14 09:32:05 -080064 reserve += arg.size();
Ed Tanousc5ba4c22022-02-07 09:59:55 -080065 }
Ed Tanous80f595e2022-02-14 09:32:05 -080066 ret.reserve(reserve);
67
68 for (size_t stringIndex = msg.find('%'); stringIndex != std::string::npos;
69 stringIndex = msg.find('%'))
70 {
71 ret += msg.substr(0, stringIndex);
72 msg.remove_prefix(stringIndex + 1);
73 size_t number = 0;
74 auto it = std::from_chars(msg.data(), &*msg.end(), number);
75 if (it.ec != std::errc())
76 {
77 return "";
78 }
79 msg.remove_prefix(1);
80 // Redfish message args are 1 indexed.
81 number--;
82 if (number >= messageArgs.size())
83 {
84 return "";
85 }
86 ret += messageArgs[number];
87 }
88 ret += msg;
89 return ret;
Ed Tanousc5ba4c22022-02-07 09:59:55 -080090}
91
Patrick Williamsbd79bce2024-08-16 15:22:20 -040092inline nlohmann::json::object_t getLogFromRegistry(
93 const Header& header, std::span<const MessageEntry> registry, size_t index,
94 std::span<const std::string_view> args)
Ed Tanous65e4f1f2022-02-08 00:23:54 -080095{
96 const redfish::registries::MessageEntry& entry = registry[index];
97 // Intentionally make a copy of the string, so we can append in the
98 // parameters.
Krzysztof Grobelny2e30bc22022-09-09 10:13:41 +020099 std::string msg =
100 redfish::registries::fillMessageArgs(args, entry.second.message);
Ed Tanous65e4f1f2022-02-08 00:23:54 -0800101 nlohmann::json jArgs = nlohmann::json::array();
Ed Tanous26ccae32023-02-16 10:28:44 -0800102 for (std::string_view arg : args)
Ed Tanous65e4f1f2022-02-08 00:23:54 -0800103 {
104 jArgs.push_back(arg);
105 }
106 std::string msgId = header.id;
107 msgId += ".";
108 msgId += entry.first;
109
110 nlohmann::json::object_t response;
111 response["@odata.type"] = "#Message.v1_1_1.Message";
112 response["MessageId"] = std::move(msgId);
113 response["Message"] = std::move(msg);
114 response["MessageArgs"] = std::move(jArgs);
115 response["MessageSeverity"] = entry.second.messageSeverity;
116 response["Resolution"] = entry.second.resolution;
117 return response;
118}
119
Sui Chend1d411f2022-04-10 23:09:36 -0700120const Message* getMessage(std::string_view messageID);
121
122const Message* getMessageFromRegistry(const std::string& messageKey,
123 std::span<const MessageEntry> registry);
124
Ed Tanousfffb8c12022-02-07 23:53:03 -0800125} // namespace redfish::registries