xref: /openbmc/bmcweb/features/redfish/src/utils/json_utils.cpp (revision 77dd8813e9a1f2baec63d959de15af39a8cd12d0)
1*77dd8813SKowalski, Kamil /*
2*77dd8813SKowalski, Kamil // Copyright (c) 2018 Intel Corporation
3*77dd8813SKowalski, Kamil //
4*77dd8813SKowalski, Kamil // Licensed under the Apache License, Version 2.0 (the "License");
5*77dd8813SKowalski, Kamil // you may not use this file except in compliance with the License.
6*77dd8813SKowalski, Kamil // You may obtain a copy of the License at
7*77dd8813SKowalski, Kamil //
8*77dd8813SKowalski, Kamil //      http://www.apache.org/licenses/LICENSE-2.0
9*77dd8813SKowalski, Kamil //
10*77dd8813SKowalski, Kamil // Unless required by applicable law or agreed to in writing, software
11*77dd8813SKowalski, Kamil // distributed under the License is distributed on an "AS IS" BASIS,
12*77dd8813SKowalski, Kamil // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*77dd8813SKowalski, Kamil // See the License for the specific language governing permissions and
14*77dd8813SKowalski, Kamil // limitations under the License.
15*77dd8813SKowalski, Kamil */
16*77dd8813SKowalski, Kamil #include "utils/json_utils.hpp"
17*77dd8813SKowalski, Kamil #include <error_messages.hpp>
18*77dd8813SKowalski, Kamil #include <crow/http_codes.h>
19*77dd8813SKowalski, Kamil 
20*77dd8813SKowalski, Kamil namespace redfish {
21*77dd8813SKowalski, Kamil 
22*77dd8813SKowalski, Kamil namespace json_util {
23*77dd8813SKowalski, Kamil 
24*77dd8813SKowalski, Kamil Result getString(const char* fieldName, const nlohmann::json& json,
25*77dd8813SKowalski, Kamil                  const std::string*& output) {
26*77dd8813SKowalski, Kamil   // Find field
27*77dd8813SKowalski, Kamil   auto fieldIt = json.find(fieldName);
28*77dd8813SKowalski, Kamil 
29*77dd8813SKowalski, Kamil   // Verify existence
30*77dd8813SKowalski, Kamil   if (fieldIt == json.end()) {
31*77dd8813SKowalski, Kamil     return Result::NOT_EXIST;
32*77dd8813SKowalski, Kamil   }
33*77dd8813SKowalski, Kamil 
34*77dd8813SKowalski, Kamil   output = fieldIt->get_ptr<const std::string*>();
35*77dd8813SKowalski, Kamil 
36*77dd8813SKowalski, Kamil   // Verify type - we know that it exists, so nullptr means wrong type
37*77dd8813SKowalski, Kamil   if (output == nullptr) {
38*77dd8813SKowalski, Kamil     return Result::WRONG_TYPE;
39*77dd8813SKowalski, Kamil   }
40*77dd8813SKowalski, Kamil 
41*77dd8813SKowalski, Kamil   return Result::SUCCESS;
42*77dd8813SKowalski, Kamil }
43*77dd8813SKowalski, Kamil 
44*77dd8813SKowalski, Kamil Result getObject(const char* fieldName, const nlohmann::json& json,
45*77dd8813SKowalski, Kamil                  nlohmann::json* output) {
46*77dd8813SKowalski, Kamil   // Verify input pointer
47*77dd8813SKowalski, Kamil   if (output == nullptr) {
48*77dd8813SKowalski, Kamil     return Result::NULL_POINTER;
49*77dd8813SKowalski, Kamil   }
50*77dd8813SKowalski, Kamil 
51*77dd8813SKowalski, Kamil   // Find field
52*77dd8813SKowalski, Kamil   auto fieldIt = json.find(fieldName);
53*77dd8813SKowalski, Kamil 
54*77dd8813SKowalski, Kamil   // Verify existence
55*77dd8813SKowalski, Kamil   if (fieldIt == json.end()) {
56*77dd8813SKowalski, Kamil     return Result::NOT_EXIST;
57*77dd8813SKowalski, Kamil   }
58*77dd8813SKowalski, Kamil 
59*77dd8813SKowalski, Kamil   // Verify type
60*77dd8813SKowalski, Kamil   if (!fieldIt->is_object()) {
61*77dd8813SKowalski, Kamil     return Result::WRONG_TYPE;
62*77dd8813SKowalski, Kamil   }
63*77dd8813SKowalski, Kamil 
64*77dd8813SKowalski, Kamil   // Extract value
65*77dd8813SKowalski, Kamil   *output = *fieldIt;
66*77dd8813SKowalski, Kamil 
67*77dd8813SKowalski, Kamil   return Result::SUCCESS;
68*77dd8813SKowalski, Kamil }
69*77dd8813SKowalski, Kamil 
70*77dd8813SKowalski, Kamil Result getArray(const char* fieldName, const nlohmann::json& json,
71*77dd8813SKowalski, Kamil                 nlohmann::json* output) {
72*77dd8813SKowalski, Kamil   // Verify input pointer
73*77dd8813SKowalski, Kamil   if (output == nullptr) {
74*77dd8813SKowalski, Kamil     return Result::NULL_POINTER;
75*77dd8813SKowalski, Kamil   }
76*77dd8813SKowalski, Kamil 
77*77dd8813SKowalski, Kamil   // Find field
78*77dd8813SKowalski, Kamil   auto fieldIt = json.find(fieldName);
79*77dd8813SKowalski, Kamil 
80*77dd8813SKowalski, Kamil   // Verify existence
81*77dd8813SKowalski, Kamil   if (fieldIt == json.end()) {
82*77dd8813SKowalski, Kamil     return Result::NOT_EXIST;
83*77dd8813SKowalski, Kamil   }
84*77dd8813SKowalski, Kamil 
85*77dd8813SKowalski, Kamil   // Verify type
86*77dd8813SKowalski, Kamil   if (!fieldIt->is_array()) {
87*77dd8813SKowalski, Kamil     return Result::WRONG_TYPE;
88*77dd8813SKowalski, Kamil   }
89*77dd8813SKowalski, Kamil 
90*77dd8813SKowalski, Kamil   // Extract value
91*77dd8813SKowalski, Kamil   *output = *fieldIt;
92*77dd8813SKowalski, Kamil 
93*77dd8813SKowalski, Kamil   return Result::SUCCESS;
94*77dd8813SKowalski, Kamil }
95*77dd8813SKowalski, Kamil 
96*77dd8813SKowalski, Kamil Result getInt(const char* fieldName, const nlohmann::json& json,
97*77dd8813SKowalski, Kamil               int64_t& output) {
98*77dd8813SKowalski, Kamil   // Find field
99*77dd8813SKowalski, Kamil   auto fieldIt = json.find(fieldName);
100*77dd8813SKowalski, Kamil 
101*77dd8813SKowalski, Kamil   // Verify existence
102*77dd8813SKowalski, Kamil   if (fieldIt == json.end()) {
103*77dd8813SKowalski, Kamil     return Result::NOT_EXIST;
104*77dd8813SKowalski, Kamil   }
105*77dd8813SKowalski, Kamil 
106*77dd8813SKowalski, Kamil   const int64_t* retVal = fieldIt->get_ptr<const int64_t*>();
107*77dd8813SKowalski, Kamil 
108*77dd8813SKowalski, Kamil   // Verify type - we know that it exists, so nullptr means wrong type
109*77dd8813SKowalski, Kamil   if (retVal == nullptr) {
110*77dd8813SKowalski, Kamil     return Result::WRONG_TYPE;
111*77dd8813SKowalski, Kamil   }
112*77dd8813SKowalski, Kamil 
113*77dd8813SKowalski, Kamil   // Extract value
114*77dd8813SKowalski, Kamil   output = *retVal;
115*77dd8813SKowalski, Kamil 
116*77dd8813SKowalski, Kamil   return Result::SUCCESS;
117*77dd8813SKowalski, Kamil }
118*77dd8813SKowalski, Kamil 
119*77dd8813SKowalski, Kamil Result getUnsigned(const char* fieldName, const nlohmann::json& json,
120*77dd8813SKowalski, Kamil                    uint64_t& output) {
121*77dd8813SKowalski, Kamil   // Find field
122*77dd8813SKowalski, Kamil   auto fieldIt = json.find(fieldName);
123*77dd8813SKowalski, Kamil 
124*77dd8813SKowalski, Kamil   // Verify existence
125*77dd8813SKowalski, Kamil   if (fieldIt == json.end()) {
126*77dd8813SKowalski, Kamil     return Result::NOT_EXIST;
127*77dd8813SKowalski, Kamil   }
128*77dd8813SKowalski, Kamil 
129*77dd8813SKowalski, Kamil   const uint64_t* retVal = fieldIt->get_ptr<const uint64_t*>();
130*77dd8813SKowalski, Kamil 
131*77dd8813SKowalski, Kamil   // Verify type - we know that it exists, so nullptr means wrong type
132*77dd8813SKowalski, Kamil   if (retVal == nullptr) {
133*77dd8813SKowalski, Kamil     return Result::WRONG_TYPE;
134*77dd8813SKowalski, Kamil   }
135*77dd8813SKowalski, Kamil 
136*77dd8813SKowalski, Kamil   // Extract value
137*77dd8813SKowalski, Kamil   output = *retVal;
138*77dd8813SKowalski, Kamil 
139*77dd8813SKowalski, Kamil   return Result::SUCCESS;
140*77dd8813SKowalski, Kamil }
141*77dd8813SKowalski, Kamil 
142*77dd8813SKowalski, Kamil Result getBool(const char* fieldName, const nlohmann::json& json,
143*77dd8813SKowalski, Kamil                bool& output) {
144*77dd8813SKowalski, Kamil   // Find field
145*77dd8813SKowalski, Kamil   auto fieldIt = json.find(fieldName);
146*77dd8813SKowalski, Kamil 
147*77dd8813SKowalski, Kamil   // Verify existence
148*77dd8813SKowalski, Kamil   if (fieldIt == json.end()) {
149*77dd8813SKowalski, Kamil     return Result::NOT_EXIST;
150*77dd8813SKowalski, Kamil   }
151*77dd8813SKowalski, Kamil 
152*77dd8813SKowalski, Kamil   const bool* retVal = fieldIt->get_ptr<const bool*>();
153*77dd8813SKowalski, Kamil 
154*77dd8813SKowalski, Kamil   // Verify type - we know that it exists, so nullptr means wrong type
155*77dd8813SKowalski, Kamil   if (retVal == nullptr) {
156*77dd8813SKowalski, Kamil     return Result::WRONG_TYPE;
157*77dd8813SKowalski, Kamil   }
158*77dd8813SKowalski, Kamil 
159*77dd8813SKowalski, Kamil   // Extract value
160*77dd8813SKowalski, Kamil   output = *retVal;
161*77dd8813SKowalski, Kamil 
162*77dd8813SKowalski, Kamil   return Result::SUCCESS;
163*77dd8813SKowalski, Kamil }
164*77dd8813SKowalski, Kamil 
165*77dd8813SKowalski, Kamil Result getDouble(const char* fieldName, const nlohmann::json& json,
166*77dd8813SKowalski, Kamil                  double& output) {
167*77dd8813SKowalski, Kamil   // Find field
168*77dd8813SKowalski, Kamil   auto fieldIt = json.find(fieldName);
169*77dd8813SKowalski, Kamil 
170*77dd8813SKowalski, Kamil   // Verify existence
171*77dd8813SKowalski, Kamil   if (fieldIt == json.end()) {
172*77dd8813SKowalski, Kamil     return Result::NOT_EXIST;
173*77dd8813SKowalski, Kamil   }
174*77dd8813SKowalski, Kamil 
175*77dd8813SKowalski, Kamil   const double* retVal = fieldIt->get_ptr<const double*>();
176*77dd8813SKowalski, Kamil 
177*77dd8813SKowalski, Kamil   // Verify type - we know that it exists, so nullptr means wrong type
178*77dd8813SKowalski, Kamil   if (retVal == nullptr) {
179*77dd8813SKowalski, Kamil     return Result::WRONG_TYPE;
180*77dd8813SKowalski, Kamil   }
181*77dd8813SKowalski, Kamil 
182*77dd8813SKowalski, Kamil   // Extract value
183*77dd8813SKowalski, Kamil   output = *retVal;
184*77dd8813SKowalski, Kamil 
185*77dd8813SKowalski, Kamil   return Result::SUCCESS;
186*77dd8813SKowalski, Kamil }
187*77dd8813SKowalski, Kamil 
188*77dd8813SKowalski, Kamil Result getString(const char* fieldName, const nlohmann::json& json,
189*77dd8813SKowalski, Kamil                  const std::string*& output, uint8_t msgCfgMap,
190*77dd8813SKowalski, Kamil                  nlohmann::json& msgJson, const std::string&& fieldPath) {
191*77dd8813SKowalski, Kamil   // Find field
192*77dd8813SKowalski, Kamil   auto fieldIt = json.find(fieldName);
193*77dd8813SKowalski, Kamil 
194*77dd8813SKowalski, Kamil   // Verify existence
195*77dd8813SKowalski, Kamil   if (fieldIt == json.end()) {
196*77dd8813SKowalski, Kamil     if (msgCfgMap & static_cast<int>(MessageSetting::MISSING)) {
197*77dd8813SKowalski, Kamil       messages::addMessageToJson(msgJson, messages::propertyMissing(fieldName),
198*77dd8813SKowalski, Kamil                                  fieldPath);
199*77dd8813SKowalski, Kamil     }
200*77dd8813SKowalski, Kamil 
201*77dd8813SKowalski, Kamil     return Result::NOT_EXIST;
202*77dd8813SKowalski, Kamil   }
203*77dd8813SKowalski, Kamil 
204*77dd8813SKowalski, Kamil   output = fieldIt->get_ptr<const std::string*>();
205*77dd8813SKowalski, Kamil 
206*77dd8813SKowalski, Kamil   // Verify type - we know that it exists, so nullptr means wrong type
207*77dd8813SKowalski, Kamil   if (output == nullptr) {
208*77dd8813SKowalski, Kamil     if (msgCfgMap & static_cast<int>(MessageSetting::TYPE_ERROR)) {
209*77dd8813SKowalski, Kamil       messages::addMessageToJson(
210*77dd8813SKowalski, Kamil           msgJson, messages::propertyValueTypeError(fieldIt->dump(), fieldName),
211*77dd8813SKowalski, Kamil           fieldPath);
212*77dd8813SKowalski, Kamil     }
213*77dd8813SKowalski, Kamil 
214*77dd8813SKowalski, Kamil     return Result::WRONG_TYPE;
215*77dd8813SKowalski, Kamil   }
216*77dd8813SKowalski, Kamil 
217*77dd8813SKowalski, Kamil   return Result::SUCCESS;
218*77dd8813SKowalski, Kamil }
219*77dd8813SKowalski, Kamil 
220*77dd8813SKowalski, Kamil Result getObject(const char* fieldName, const nlohmann::json& json,
221*77dd8813SKowalski, Kamil                  nlohmann::json* output, uint8_t msgCfgMap,
222*77dd8813SKowalski, Kamil                  nlohmann::json& msgJson, const std::string&& fieldPath) {
223*77dd8813SKowalski, Kamil   // Verify input pointer
224*77dd8813SKowalski, Kamil   if (output == nullptr) {
225*77dd8813SKowalski, Kamil     return Result::NULL_POINTER;
226*77dd8813SKowalski, Kamil   }
227*77dd8813SKowalski, Kamil 
228*77dd8813SKowalski, Kamil   // Find field
229*77dd8813SKowalski, Kamil   auto fieldIt = json.find(fieldName);
230*77dd8813SKowalski, Kamil 
231*77dd8813SKowalski, Kamil   // Verify existence
232*77dd8813SKowalski, Kamil   if (fieldIt == json.end()) {
233*77dd8813SKowalski, Kamil     if (msgCfgMap & static_cast<int>(MessageSetting::MISSING)) {
234*77dd8813SKowalski, Kamil       messages::addMessageToJson(msgJson, messages::propertyMissing(fieldName),
235*77dd8813SKowalski, Kamil                                  fieldPath);
236*77dd8813SKowalski, Kamil     }
237*77dd8813SKowalski, Kamil 
238*77dd8813SKowalski, Kamil     return Result::NOT_EXIST;
239*77dd8813SKowalski, Kamil   }
240*77dd8813SKowalski, Kamil 
241*77dd8813SKowalski, Kamil   // Verify type
242*77dd8813SKowalski, Kamil   if (!fieldIt->is_object()) {
243*77dd8813SKowalski, Kamil     if (msgCfgMap & static_cast<int>(MessageSetting::TYPE_ERROR)) {
244*77dd8813SKowalski, Kamil       messages::addMessageToJson(
245*77dd8813SKowalski, Kamil           msgJson, messages::propertyValueTypeError(fieldIt->dump(), fieldName),
246*77dd8813SKowalski, Kamil           fieldPath);
247*77dd8813SKowalski, Kamil     }
248*77dd8813SKowalski, Kamil 
249*77dd8813SKowalski, Kamil     return Result::WRONG_TYPE;
250*77dd8813SKowalski, Kamil   }
251*77dd8813SKowalski, Kamil 
252*77dd8813SKowalski, Kamil   // Extract value
253*77dd8813SKowalski, Kamil   *output = *fieldIt;
254*77dd8813SKowalski, Kamil 
255*77dd8813SKowalski, Kamil   return Result::SUCCESS;
256*77dd8813SKowalski, Kamil }
257*77dd8813SKowalski, Kamil 
258*77dd8813SKowalski, Kamil Result getArray(const char* fieldName, const nlohmann::json& json,
259*77dd8813SKowalski, Kamil                 nlohmann::json* output, uint8_t msgCfgMap,
260*77dd8813SKowalski, Kamil                 nlohmann::json& msgJson, const std::string&& fieldPath) {
261*77dd8813SKowalski, Kamil   // Verify input pointer
262*77dd8813SKowalski, Kamil   if (output == nullptr) {
263*77dd8813SKowalski, Kamil     return Result::NULL_POINTER;
264*77dd8813SKowalski, Kamil   }
265*77dd8813SKowalski, Kamil 
266*77dd8813SKowalski, Kamil   // Find field
267*77dd8813SKowalski, Kamil   auto fieldIt = json.find(fieldName);
268*77dd8813SKowalski, Kamil 
269*77dd8813SKowalski, Kamil   // Verify existence
270*77dd8813SKowalski, Kamil   if (fieldIt == json.end()) {
271*77dd8813SKowalski, Kamil     if (msgCfgMap & static_cast<int>(MessageSetting::MISSING)) {
272*77dd8813SKowalski, Kamil       messages::addMessageToJson(msgJson, messages::propertyMissing(fieldName),
273*77dd8813SKowalski, Kamil                                  fieldPath);
274*77dd8813SKowalski, Kamil     }
275*77dd8813SKowalski, Kamil 
276*77dd8813SKowalski, Kamil     return Result::NOT_EXIST;
277*77dd8813SKowalski, Kamil   }
278*77dd8813SKowalski, Kamil 
279*77dd8813SKowalski, Kamil   // Verify type
280*77dd8813SKowalski, Kamil   if (!fieldIt->is_array()) {
281*77dd8813SKowalski, Kamil     if (msgCfgMap & static_cast<int>(MessageSetting::TYPE_ERROR)) {
282*77dd8813SKowalski, Kamil       messages::addMessageToJson(
283*77dd8813SKowalski, Kamil           msgJson, messages::propertyValueTypeError(fieldIt->dump(), fieldName),
284*77dd8813SKowalski, Kamil           fieldPath);
285*77dd8813SKowalski, Kamil     }
286*77dd8813SKowalski, Kamil 
287*77dd8813SKowalski, Kamil     return Result::WRONG_TYPE;
288*77dd8813SKowalski, Kamil   }
289*77dd8813SKowalski, Kamil 
290*77dd8813SKowalski, Kamil   // Extract value
291*77dd8813SKowalski, Kamil   *output = *fieldIt;
292*77dd8813SKowalski, Kamil 
293*77dd8813SKowalski, Kamil   return Result::SUCCESS;
294*77dd8813SKowalski, Kamil }
295*77dd8813SKowalski, Kamil 
296*77dd8813SKowalski, Kamil Result getInt(const char* fieldName, const nlohmann::json& json,
297*77dd8813SKowalski, Kamil               int64_t& output, uint8_t msgCfgMap, nlohmann::json& msgJson,
298*77dd8813SKowalski, Kamil               const std::string&& fieldPath) {
299*77dd8813SKowalski, Kamil   // Find field
300*77dd8813SKowalski, Kamil   auto fieldIt = json.find(fieldName);
301*77dd8813SKowalski, Kamil 
302*77dd8813SKowalski, Kamil   // Verify existence
303*77dd8813SKowalski, Kamil   if (fieldIt == json.end()) {
304*77dd8813SKowalski, Kamil     if (msgCfgMap & static_cast<int>(MessageSetting::MISSING)) {
305*77dd8813SKowalski, Kamil       messages::addMessageToJson(msgJson, messages::propertyMissing(fieldName),
306*77dd8813SKowalski, Kamil                                  fieldPath);
307*77dd8813SKowalski, Kamil     }
308*77dd8813SKowalski, Kamil 
309*77dd8813SKowalski, Kamil     return Result::NOT_EXIST;
310*77dd8813SKowalski, Kamil   }
311*77dd8813SKowalski, Kamil 
312*77dd8813SKowalski, Kamil   const int64_t* retVal = fieldIt->get_ptr<const int64_t*>();
313*77dd8813SKowalski, Kamil 
314*77dd8813SKowalski, Kamil   // Verify type - we know that it exists, so nullptr means wrong type
315*77dd8813SKowalski, Kamil   if (retVal == nullptr) {
316*77dd8813SKowalski, Kamil     if (msgCfgMap & static_cast<int>(MessageSetting::TYPE_ERROR)) {
317*77dd8813SKowalski, Kamil       messages::addMessageToJson(
318*77dd8813SKowalski, Kamil           msgJson, messages::propertyValueTypeError(fieldIt->dump(), fieldName),
319*77dd8813SKowalski, Kamil           fieldPath);
320*77dd8813SKowalski, Kamil     }
321*77dd8813SKowalski, Kamil 
322*77dd8813SKowalski, Kamil     return Result::WRONG_TYPE;
323*77dd8813SKowalski, Kamil   }
324*77dd8813SKowalski, Kamil 
325*77dd8813SKowalski, Kamil   // Extract value
326*77dd8813SKowalski, Kamil   output = *retVal;
327*77dd8813SKowalski, Kamil 
328*77dd8813SKowalski, Kamil   return Result::SUCCESS;
329*77dd8813SKowalski, Kamil }
330*77dd8813SKowalski, Kamil 
331*77dd8813SKowalski, Kamil Result getUnsigned(const char* fieldName, const nlohmann::json& json,
332*77dd8813SKowalski, Kamil                    uint64_t& output, uint8_t msgCfgMap, nlohmann::json& msgJson,
333*77dd8813SKowalski, Kamil                    const std::string&& fieldPath) {
334*77dd8813SKowalski, Kamil   // Find field
335*77dd8813SKowalski, Kamil   auto fieldIt = json.find(fieldName);
336*77dd8813SKowalski, Kamil 
337*77dd8813SKowalski, Kamil   // Verify existence
338*77dd8813SKowalski, Kamil   if (fieldIt == json.end()) {
339*77dd8813SKowalski, Kamil     if (msgCfgMap & static_cast<int>(MessageSetting::MISSING)) {
340*77dd8813SKowalski, Kamil       messages::addMessageToJson(msgJson, messages::propertyMissing(fieldName),
341*77dd8813SKowalski, Kamil                                  fieldPath);
342*77dd8813SKowalski, Kamil     }
343*77dd8813SKowalski, Kamil 
344*77dd8813SKowalski, Kamil     return Result::NOT_EXIST;
345*77dd8813SKowalski, Kamil   }
346*77dd8813SKowalski, Kamil 
347*77dd8813SKowalski, Kamil   const uint64_t* retVal = fieldIt->get_ptr<const uint64_t*>();
348*77dd8813SKowalski, Kamil 
349*77dd8813SKowalski, Kamil   // Verify type - we know that it exists, so nullptr means wrong type
350*77dd8813SKowalski, Kamil   if (retVal == nullptr) {
351*77dd8813SKowalski, Kamil     if (msgCfgMap & static_cast<int>(MessageSetting::TYPE_ERROR)) {
352*77dd8813SKowalski, Kamil       messages::addMessageToJson(
353*77dd8813SKowalski, Kamil           msgJson, messages::propertyValueTypeError(fieldIt->dump(), fieldName),
354*77dd8813SKowalski, Kamil           fieldPath);
355*77dd8813SKowalski, Kamil     }
356*77dd8813SKowalski, Kamil 
357*77dd8813SKowalski, Kamil     return Result::WRONG_TYPE;
358*77dd8813SKowalski, Kamil   }
359*77dd8813SKowalski, Kamil 
360*77dd8813SKowalski, Kamil   // Extract value
361*77dd8813SKowalski, Kamil   output = *retVal;
362*77dd8813SKowalski, Kamil 
363*77dd8813SKowalski, Kamil   return Result::SUCCESS;
364*77dd8813SKowalski, Kamil }
365*77dd8813SKowalski, Kamil 
366*77dd8813SKowalski, Kamil Result getBool(const char* fieldName, const nlohmann::json& json, bool& output,
367*77dd8813SKowalski, Kamil                uint8_t msgCfgMap, nlohmann::json& msgJson,
368*77dd8813SKowalski, Kamil                const std::string&& fieldPath) {
369*77dd8813SKowalski, Kamil   // Find field
370*77dd8813SKowalski, Kamil   auto fieldIt = json.find(fieldName);
371*77dd8813SKowalski, Kamil 
372*77dd8813SKowalski, Kamil   // Verify existence
373*77dd8813SKowalski, Kamil   if (fieldIt == json.end()) {
374*77dd8813SKowalski, Kamil     if (msgCfgMap & static_cast<int>(MessageSetting::MISSING)) {
375*77dd8813SKowalski, Kamil       messages::addMessageToJson(msgJson, messages::propertyMissing(fieldName),
376*77dd8813SKowalski, Kamil                                  fieldPath);
377*77dd8813SKowalski, Kamil     }
378*77dd8813SKowalski, Kamil 
379*77dd8813SKowalski, Kamil     return Result::NOT_EXIST;
380*77dd8813SKowalski, Kamil   }
381*77dd8813SKowalski, Kamil 
382*77dd8813SKowalski, Kamil   const bool* retVal = fieldIt->get_ptr<const bool*>();
383*77dd8813SKowalski, Kamil 
384*77dd8813SKowalski, Kamil   // Verify type - we know that it exists, so nullptr means wrong type
385*77dd8813SKowalski, Kamil   if (retVal == nullptr) {
386*77dd8813SKowalski, Kamil     if (msgCfgMap & static_cast<int>(MessageSetting::TYPE_ERROR)) {
387*77dd8813SKowalski, Kamil       messages::addMessageToJson(
388*77dd8813SKowalski, Kamil           msgJson, messages::propertyValueTypeError(fieldIt->dump(), fieldName),
389*77dd8813SKowalski, Kamil           fieldPath);
390*77dd8813SKowalski, Kamil     }
391*77dd8813SKowalski, Kamil 
392*77dd8813SKowalski, Kamil     return Result::WRONG_TYPE;
393*77dd8813SKowalski, Kamil   }
394*77dd8813SKowalski, Kamil 
395*77dd8813SKowalski, Kamil   // Extract value
396*77dd8813SKowalski, Kamil   output = *retVal;
397*77dd8813SKowalski, Kamil 
398*77dd8813SKowalski, Kamil   return Result::SUCCESS;
399*77dd8813SKowalski, Kamil }
400*77dd8813SKowalski, Kamil 
401*77dd8813SKowalski, Kamil Result getDouble(const char* fieldName, const nlohmann::json& json,
402*77dd8813SKowalski, Kamil                  double& output, uint8_t msgCfgMap, nlohmann::json& msgJson,
403*77dd8813SKowalski, Kamil                  const std::string&& fieldPath) {
404*77dd8813SKowalski, Kamil   // Find field
405*77dd8813SKowalski, Kamil   auto fieldIt = json.find(fieldName);
406*77dd8813SKowalski, Kamil 
407*77dd8813SKowalski, Kamil   // Verify existence
408*77dd8813SKowalski, Kamil   if (fieldIt == json.end()) {
409*77dd8813SKowalski, Kamil     if (msgCfgMap & static_cast<int>(MessageSetting::MISSING)) {
410*77dd8813SKowalski, Kamil       messages::addMessageToJson(msgJson, messages::propertyMissing(fieldName),
411*77dd8813SKowalski, Kamil                                  fieldPath);
412*77dd8813SKowalski, Kamil     }
413*77dd8813SKowalski, Kamil 
414*77dd8813SKowalski, Kamil     return Result::NOT_EXIST;
415*77dd8813SKowalski, Kamil   }
416*77dd8813SKowalski, Kamil 
417*77dd8813SKowalski, Kamil   const double* retVal = fieldIt->get_ptr<const double*>();
418*77dd8813SKowalski, Kamil 
419*77dd8813SKowalski, Kamil   // Verify type - we know that it exists, so nullptr means wrong type
420*77dd8813SKowalski, Kamil   if (retVal == nullptr) {
421*77dd8813SKowalski, Kamil     if (msgCfgMap & static_cast<int>(MessageSetting::TYPE_ERROR)) {
422*77dd8813SKowalski, Kamil       messages::addMessageToJson(
423*77dd8813SKowalski, Kamil           msgJson, messages::propertyValueTypeError(fieldIt->dump(), fieldName),
424*77dd8813SKowalski, Kamil           fieldPath);
425*77dd8813SKowalski, Kamil     }
426*77dd8813SKowalski, Kamil 
427*77dd8813SKowalski, Kamil     return Result::WRONG_TYPE;
428*77dd8813SKowalski, Kamil   }
429*77dd8813SKowalski, Kamil 
430*77dd8813SKowalski, Kamil   // Extract value
431*77dd8813SKowalski, Kamil   output = *retVal;
432*77dd8813SKowalski, Kamil 
433*77dd8813SKowalski, Kamil   return Result::SUCCESS;
434*77dd8813SKowalski, Kamil }
435*77dd8813SKowalski, Kamil 
436*77dd8813SKowalski, Kamil bool processJsonFromRequest(crow::response& res, const crow::request& req,
437*77dd8813SKowalski, Kamil                             nlohmann::json& reqJson) {
438*77dd8813SKowalski, Kamil   reqJson = nlohmann::json::parse(req.body, nullptr, false);
439*77dd8813SKowalski, Kamil 
440*77dd8813SKowalski, Kamil   if (reqJson.is_discarded()) {
441*77dd8813SKowalski, Kamil     messages::addMessageToErrorJson(res.json_value, messages::malformedJSON());
442*77dd8813SKowalski, Kamil 
443*77dd8813SKowalski, Kamil     res.code = static_cast<int>(HttpRespCode::BAD_REQUEST);
444*77dd8813SKowalski, Kamil     res.end();
445*77dd8813SKowalski, Kamil 
446*77dd8813SKowalski, Kamil     return false;
447*77dd8813SKowalski, Kamil   }
448*77dd8813SKowalski, Kamil 
449*77dd8813SKowalski, Kamil   return true;
450*77dd8813SKowalski, Kamil }
451*77dd8813SKowalski, Kamil 
452*77dd8813SKowalski, Kamil }  // namespace json_util
453*77dd8813SKowalski, Kamil 
454*77dd8813SKowalski, Kamil }  // namespace redfish
455