xref: /openbmc/bmcweb/features/redfish/src/utils/json_utils.cpp (revision 1abe55ef9844afcddcab9d862ae06118f3a2390c)
177dd8813SKowalski, Kamil /*
277dd8813SKowalski, Kamil // Copyright (c) 2018 Intel Corporation
377dd8813SKowalski, Kamil //
477dd8813SKowalski, Kamil // Licensed under the Apache License, Version 2.0 (the "License");
577dd8813SKowalski, Kamil // you may not use this file except in compliance with the License.
677dd8813SKowalski, Kamil // You may obtain a copy of the License at
777dd8813SKowalski, Kamil //
877dd8813SKowalski, Kamil //      http://www.apache.org/licenses/LICENSE-2.0
977dd8813SKowalski, Kamil //
1077dd8813SKowalski, Kamil // Unless required by applicable law or agreed to in writing, software
1177dd8813SKowalski, Kamil // distributed under the License is distributed on an "AS IS" BASIS,
1277dd8813SKowalski, Kamil // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1377dd8813SKowalski, Kamil // See the License for the specific language governing permissions and
1477dd8813SKowalski, Kamil // limitations under the License.
1577dd8813SKowalski, Kamil */
1677dd8813SKowalski, Kamil #include "utils/json_utils.hpp"
17*1abe55efSEd Tanous 
1877dd8813SKowalski, Kamil #include <error_messages.hpp>
1977dd8813SKowalski, Kamil 
20*1abe55efSEd Tanous namespace redfish
21*1abe55efSEd Tanous {
2277dd8813SKowalski, Kamil 
23*1abe55efSEd Tanous namespace json_util
24*1abe55efSEd Tanous {
2577dd8813SKowalski, Kamil 
2677dd8813SKowalski, Kamil Result getString(const char* fieldName, const nlohmann::json& json,
27*1abe55efSEd Tanous                  const std::string*& output)
28*1abe55efSEd Tanous {
2977dd8813SKowalski, Kamil     // Find field
3077dd8813SKowalski, Kamil     auto fieldIt = json.find(fieldName);
3177dd8813SKowalski, Kamil 
3277dd8813SKowalski, Kamil     // Verify existence
33*1abe55efSEd Tanous     if (fieldIt == json.end())
34*1abe55efSEd Tanous     {
3577dd8813SKowalski, Kamil         return Result::NOT_EXIST;
3677dd8813SKowalski, Kamil     }
3777dd8813SKowalski, Kamil 
3877dd8813SKowalski, Kamil     output = fieldIt->get_ptr<const std::string*>();
3977dd8813SKowalski, Kamil 
4077dd8813SKowalski, Kamil     // Verify type - we know that it exists, so nullptr means wrong type
41*1abe55efSEd Tanous     if (output == nullptr)
42*1abe55efSEd Tanous     {
4377dd8813SKowalski, Kamil         return Result::WRONG_TYPE;
4477dd8813SKowalski, Kamil     }
4577dd8813SKowalski, Kamil 
4677dd8813SKowalski, Kamil     return Result::SUCCESS;
4777dd8813SKowalski, Kamil }
4877dd8813SKowalski, Kamil 
4977dd8813SKowalski, Kamil Result getObject(const char* fieldName, const nlohmann::json& json,
50*1abe55efSEd Tanous                  nlohmann::json* output)
51*1abe55efSEd Tanous {
5277dd8813SKowalski, Kamil     // Verify input pointer
53*1abe55efSEd Tanous     if (output == nullptr)
54*1abe55efSEd Tanous     {
5577dd8813SKowalski, Kamil         return Result::NULL_POINTER;
5677dd8813SKowalski, Kamil     }
5777dd8813SKowalski, Kamil 
5877dd8813SKowalski, Kamil     // Find field
5977dd8813SKowalski, Kamil     auto fieldIt = json.find(fieldName);
6077dd8813SKowalski, Kamil 
6177dd8813SKowalski, Kamil     // Verify existence
62*1abe55efSEd Tanous     if (fieldIt == json.end())
63*1abe55efSEd Tanous     {
6477dd8813SKowalski, Kamil         return Result::NOT_EXIST;
6577dd8813SKowalski, Kamil     }
6677dd8813SKowalski, Kamil 
6777dd8813SKowalski, Kamil     // Verify type
68*1abe55efSEd Tanous     if (!fieldIt->is_object())
69*1abe55efSEd Tanous     {
7077dd8813SKowalski, Kamil         return Result::WRONG_TYPE;
7177dd8813SKowalski, Kamil     }
7277dd8813SKowalski, Kamil 
7377dd8813SKowalski, Kamil     // Extract value
7477dd8813SKowalski, Kamil     *output = *fieldIt;
7577dd8813SKowalski, Kamil 
7677dd8813SKowalski, Kamil     return Result::SUCCESS;
7777dd8813SKowalski, Kamil }
7877dd8813SKowalski, Kamil 
7977dd8813SKowalski, Kamil Result getArray(const char* fieldName, const nlohmann::json& json,
80*1abe55efSEd Tanous                 nlohmann::json* output)
81*1abe55efSEd Tanous {
8277dd8813SKowalski, Kamil     // Verify input pointer
83*1abe55efSEd Tanous     if (output == nullptr)
84*1abe55efSEd Tanous     {
8577dd8813SKowalski, Kamil         return Result::NULL_POINTER;
8677dd8813SKowalski, Kamil     }
8777dd8813SKowalski, Kamil 
8877dd8813SKowalski, Kamil     // Find field
8977dd8813SKowalski, Kamil     auto fieldIt = json.find(fieldName);
9077dd8813SKowalski, Kamil 
9177dd8813SKowalski, Kamil     // Verify existence
92*1abe55efSEd Tanous     if (fieldIt == json.end())
93*1abe55efSEd Tanous     {
9477dd8813SKowalski, Kamil         return Result::NOT_EXIST;
9577dd8813SKowalski, Kamil     }
9677dd8813SKowalski, Kamil 
9777dd8813SKowalski, Kamil     // Verify type
98*1abe55efSEd Tanous     if (!fieldIt->is_array())
99*1abe55efSEd Tanous     {
10077dd8813SKowalski, Kamil         return Result::WRONG_TYPE;
10177dd8813SKowalski, Kamil     }
10277dd8813SKowalski, Kamil 
10377dd8813SKowalski, Kamil     // Extract value
10477dd8813SKowalski, Kamil     *output = *fieldIt;
10577dd8813SKowalski, Kamil 
10677dd8813SKowalski, Kamil     return Result::SUCCESS;
10777dd8813SKowalski, Kamil }
10877dd8813SKowalski, Kamil 
10977dd8813SKowalski, Kamil Result getInt(const char* fieldName, const nlohmann::json& json,
110*1abe55efSEd Tanous               int64_t& output)
111*1abe55efSEd Tanous {
11277dd8813SKowalski, Kamil     // Find field
11377dd8813SKowalski, Kamil     auto fieldIt = json.find(fieldName);
11477dd8813SKowalski, Kamil 
11577dd8813SKowalski, Kamil     // Verify existence
116*1abe55efSEd Tanous     if (fieldIt == json.end())
117*1abe55efSEd Tanous     {
11877dd8813SKowalski, Kamil         return Result::NOT_EXIST;
11977dd8813SKowalski, Kamil     }
12077dd8813SKowalski, Kamil 
12177dd8813SKowalski, Kamil     const int64_t* retVal = fieldIt->get_ptr<const int64_t*>();
12277dd8813SKowalski, Kamil 
12377dd8813SKowalski, Kamil     // Verify type - we know that it exists, so nullptr means wrong type
124*1abe55efSEd Tanous     if (retVal == nullptr)
125*1abe55efSEd Tanous     {
12677dd8813SKowalski, Kamil         return Result::WRONG_TYPE;
12777dd8813SKowalski, Kamil     }
12877dd8813SKowalski, Kamil 
12977dd8813SKowalski, Kamil     // Extract value
13077dd8813SKowalski, Kamil     output = *retVal;
13177dd8813SKowalski, Kamil 
13277dd8813SKowalski, Kamil     return Result::SUCCESS;
13377dd8813SKowalski, Kamil }
13477dd8813SKowalski, Kamil 
13577dd8813SKowalski, Kamil Result getUnsigned(const char* fieldName, const nlohmann::json& json,
136*1abe55efSEd Tanous                    uint64_t& output)
137*1abe55efSEd Tanous {
13877dd8813SKowalski, Kamil     // Find field
13977dd8813SKowalski, Kamil     auto fieldIt = json.find(fieldName);
14077dd8813SKowalski, Kamil 
14177dd8813SKowalski, Kamil     // Verify existence
142*1abe55efSEd Tanous     if (fieldIt == json.end())
143*1abe55efSEd Tanous     {
14477dd8813SKowalski, Kamil         return Result::NOT_EXIST;
14577dd8813SKowalski, Kamil     }
14677dd8813SKowalski, Kamil 
14777dd8813SKowalski, Kamil     const uint64_t* retVal = fieldIt->get_ptr<const uint64_t*>();
14877dd8813SKowalski, Kamil 
14977dd8813SKowalski, Kamil     // Verify type - we know that it exists, so nullptr means wrong type
150*1abe55efSEd Tanous     if (retVal == nullptr)
151*1abe55efSEd Tanous     {
15277dd8813SKowalski, Kamil         return Result::WRONG_TYPE;
15377dd8813SKowalski, Kamil     }
15477dd8813SKowalski, Kamil 
15577dd8813SKowalski, Kamil     // Extract value
15677dd8813SKowalski, Kamil     output = *retVal;
15777dd8813SKowalski, Kamil 
15877dd8813SKowalski, Kamil     return Result::SUCCESS;
15977dd8813SKowalski, Kamil }
16077dd8813SKowalski, Kamil 
161*1abe55efSEd Tanous Result getBool(const char* fieldName, const nlohmann::json& json, bool& output)
162*1abe55efSEd Tanous {
16377dd8813SKowalski, Kamil     // Find field
16477dd8813SKowalski, Kamil     auto fieldIt = json.find(fieldName);
16577dd8813SKowalski, Kamil 
16677dd8813SKowalski, Kamil     // Verify existence
167*1abe55efSEd Tanous     if (fieldIt == json.end())
168*1abe55efSEd Tanous     {
16977dd8813SKowalski, Kamil         return Result::NOT_EXIST;
17077dd8813SKowalski, Kamil     }
17177dd8813SKowalski, Kamil 
17277dd8813SKowalski, Kamil     const bool* retVal = fieldIt->get_ptr<const bool*>();
17377dd8813SKowalski, Kamil 
17477dd8813SKowalski, Kamil     // Verify type - we know that it exists, so nullptr means wrong type
175*1abe55efSEd Tanous     if (retVal == nullptr)
176*1abe55efSEd Tanous     {
17777dd8813SKowalski, Kamil         return Result::WRONG_TYPE;
17877dd8813SKowalski, Kamil     }
17977dd8813SKowalski, Kamil 
18077dd8813SKowalski, Kamil     // Extract value
18177dd8813SKowalski, Kamil     output = *retVal;
18277dd8813SKowalski, Kamil 
18377dd8813SKowalski, Kamil     return Result::SUCCESS;
18477dd8813SKowalski, Kamil }
18577dd8813SKowalski, Kamil 
18677dd8813SKowalski, Kamil Result getDouble(const char* fieldName, const nlohmann::json& json,
187*1abe55efSEd Tanous                  double& output)
188*1abe55efSEd Tanous {
18977dd8813SKowalski, Kamil     // Find field
19077dd8813SKowalski, Kamil     auto fieldIt = json.find(fieldName);
19177dd8813SKowalski, Kamil 
19277dd8813SKowalski, Kamil     // Verify existence
193*1abe55efSEd Tanous     if (fieldIt == json.end())
194*1abe55efSEd Tanous     {
19577dd8813SKowalski, Kamil         return Result::NOT_EXIST;
19677dd8813SKowalski, Kamil     }
19777dd8813SKowalski, Kamil 
19877dd8813SKowalski, Kamil     const double* retVal = fieldIt->get_ptr<const double*>();
19977dd8813SKowalski, Kamil 
20077dd8813SKowalski, Kamil     // Verify type - we know that it exists, so nullptr means wrong type
201*1abe55efSEd Tanous     if (retVal == nullptr)
202*1abe55efSEd Tanous     {
20377dd8813SKowalski, Kamil         return Result::WRONG_TYPE;
20477dd8813SKowalski, Kamil     }
20577dd8813SKowalski, Kamil 
20677dd8813SKowalski, Kamil     // Extract value
20777dd8813SKowalski, Kamil     output = *retVal;
20877dd8813SKowalski, Kamil 
20977dd8813SKowalski, Kamil     return Result::SUCCESS;
21077dd8813SKowalski, Kamil }
21177dd8813SKowalski, Kamil 
21277dd8813SKowalski, Kamil Result getString(const char* fieldName, const nlohmann::json& json,
21377dd8813SKowalski, Kamil                  const std::string*& output, uint8_t msgCfgMap,
214*1abe55efSEd Tanous                  nlohmann::json& msgJson, const std::string&& fieldPath)
215*1abe55efSEd Tanous {
21677dd8813SKowalski, Kamil     // Find field
21777dd8813SKowalski, Kamil     auto fieldIt = json.find(fieldName);
21877dd8813SKowalski, Kamil 
21977dd8813SKowalski, Kamil     // Verify existence
220*1abe55efSEd Tanous     if (fieldIt == json.end())
221*1abe55efSEd Tanous     {
222*1abe55efSEd Tanous         if (msgCfgMap & static_cast<int>(MessageSetting::MISSING))
223*1abe55efSEd Tanous         {
224*1abe55efSEd Tanous             messages::addMessageToJson(
225*1abe55efSEd Tanous                 msgJson, messages::propertyMissing(fieldName), fieldPath);
22677dd8813SKowalski, Kamil         }
22777dd8813SKowalski, Kamil 
22877dd8813SKowalski, Kamil         return Result::NOT_EXIST;
22977dd8813SKowalski, Kamil     }
23077dd8813SKowalski, Kamil 
23177dd8813SKowalski, Kamil     output = fieldIt->get_ptr<const std::string*>();
23277dd8813SKowalski, Kamil 
23377dd8813SKowalski, Kamil     // Verify type - we know that it exists, so nullptr means wrong type
234*1abe55efSEd Tanous     if (output == nullptr)
235*1abe55efSEd Tanous     {
236*1abe55efSEd Tanous         if (msgCfgMap & static_cast<int>(MessageSetting::TYPE_ERROR))
237*1abe55efSEd Tanous         {
23877dd8813SKowalski, Kamil             messages::addMessageToJson(
239*1abe55efSEd Tanous                 msgJson,
240*1abe55efSEd Tanous                 messages::propertyValueTypeError(fieldIt->dump(), fieldName),
24177dd8813SKowalski, Kamil                 fieldPath);
24277dd8813SKowalski, Kamil         }
24377dd8813SKowalski, Kamil 
24477dd8813SKowalski, Kamil         return Result::WRONG_TYPE;
24577dd8813SKowalski, Kamil     }
24677dd8813SKowalski, Kamil 
24777dd8813SKowalski, Kamil     return Result::SUCCESS;
24877dd8813SKowalski, Kamil }
24977dd8813SKowalski, Kamil 
25077dd8813SKowalski, Kamil Result getObject(const char* fieldName, const nlohmann::json& json,
25177dd8813SKowalski, Kamil                  nlohmann::json* output, uint8_t msgCfgMap,
252*1abe55efSEd Tanous                  nlohmann::json& msgJson, const std::string&& fieldPath)
253*1abe55efSEd Tanous {
25477dd8813SKowalski, Kamil     // Verify input pointer
255*1abe55efSEd Tanous     if (output == nullptr)
256*1abe55efSEd Tanous     {
25777dd8813SKowalski, Kamil         return Result::NULL_POINTER;
25877dd8813SKowalski, Kamil     }
25977dd8813SKowalski, Kamil 
26077dd8813SKowalski, Kamil     // Find field
26177dd8813SKowalski, Kamil     auto fieldIt = json.find(fieldName);
26277dd8813SKowalski, Kamil 
26377dd8813SKowalski, Kamil     // Verify existence
264*1abe55efSEd Tanous     if (fieldIt == json.end())
265*1abe55efSEd Tanous     {
266*1abe55efSEd Tanous         if (msgCfgMap & static_cast<int>(MessageSetting::MISSING))
267*1abe55efSEd Tanous         {
268*1abe55efSEd Tanous             messages::addMessageToJson(
269*1abe55efSEd Tanous                 msgJson, messages::propertyMissing(fieldName), fieldPath);
27077dd8813SKowalski, Kamil         }
27177dd8813SKowalski, Kamil 
27277dd8813SKowalski, Kamil         return Result::NOT_EXIST;
27377dd8813SKowalski, Kamil     }
27477dd8813SKowalski, Kamil 
27577dd8813SKowalski, Kamil     // Verify type
276*1abe55efSEd Tanous     if (!fieldIt->is_object())
277*1abe55efSEd Tanous     {
278*1abe55efSEd Tanous         if (msgCfgMap & static_cast<int>(MessageSetting::TYPE_ERROR))
279*1abe55efSEd Tanous         {
28077dd8813SKowalski, Kamil             messages::addMessageToJson(
281*1abe55efSEd Tanous                 msgJson,
282*1abe55efSEd Tanous                 messages::propertyValueTypeError(fieldIt->dump(), fieldName),
28377dd8813SKowalski, Kamil                 fieldPath);
28477dd8813SKowalski, Kamil         }
28577dd8813SKowalski, Kamil 
28677dd8813SKowalski, Kamil         return Result::WRONG_TYPE;
28777dd8813SKowalski, Kamil     }
28877dd8813SKowalski, Kamil 
28977dd8813SKowalski, Kamil     // Extract value
29077dd8813SKowalski, Kamil     *output = *fieldIt;
29177dd8813SKowalski, Kamil 
29277dd8813SKowalski, Kamil     return Result::SUCCESS;
29377dd8813SKowalski, Kamil }
29477dd8813SKowalski, Kamil 
29577dd8813SKowalski, Kamil Result getArray(const char* fieldName, const nlohmann::json& json,
29677dd8813SKowalski, Kamil                 nlohmann::json* output, uint8_t msgCfgMap,
297*1abe55efSEd Tanous                 nlohmann::json& msgJson, const std::string&& fieldPath)
298*1abe55efSEd Tanous {
29977dd8813SKowalski, Kamil     // Verify input pointer
300*1abe55efSEd Tanous     if (output == nullptr)
301*1abe55efSEd Tanous     {
30277dd8813SKowalski, Kamil         return Result::NULL_POINTER;
30377dd8813SKowalski, Kamil     }
30477dd8813SKowalski, Kamil 
30577dd8813SKowalski, Kamil     // Find field
30677dd8813SKowalski, Kamil     auto fieldIt = json.find(fieldName);
30777dd8813SKowalski, Kamil 
30877dd8813SKowalski, Kamil     // Verify existence
309*1abe55efSEd Tanous     if (fieldIt == json.end())
310*1abe55efSEd Tanous     {
311*1abe55efSEd Tanous         if (msgCfgMap & static_cast<int>(MessageSetting::MISSING))
312*1abe55efSEd Tanous         {
313*1abe55efSEd Tanous             messages::addMessageToJson(
314*1abe55efSEd Tanous                 msgJson, messages::propertyMissing(fieldName), fieldPath);
31577dd8813SKowalski, Kamil         }
31677dd8813SKowalski, Kamil 
31777dd8813SKowalski, Kamil         return Result::NOT_EXIST;
31877dd8813SKowalski, Kamil     }
31977dd8813SKowalski, Kamil 
32077dd8813SKowalski, Kamil     // Verify type
321*1abe55efSEd Tanous     if (!fieldIt->is_array())
322*1abe55efSEd Tanous     {
323*1abe55efSEd Tanous         if (msgCfgMap & static_cast<int>(MessageSetting::TYPE_ERROR))
324*1abe55efSEd Tanous         {
32577dd8813SKowalski, Kamil             messages::addMessageToJson(
326*1abe55efSEd Tanous                 msgJson,
327*1abe55efSEd Tanous                 messages::propertyValueTypeError(fieldIt->dump(), fieldName),
32877dd8813SKowalski, Kamil                 fieldPath);
32977dd8813SKowalski, Kamil         }
33077dd8813SKowalski, Kamil 
33177dd8813SKowalski, Kamil         return Result::WRONG_TYPE;
33277dd8813SKowalski, Kamil     }
33377dd8813SKowalski, Kamil 
33477dd8813SKowalski, Kamil     // Extract value
33577dd8813SKowalski, Kamil     *output = *fieldIt;
33677dd8813SKowalski, Kamil 
33777dd8813SKowalski, Kamil     return Result::SUCCESS;
33877dd8813SKowalski, Kamil }
33977dd8813SKowalski, Kamil 
34077dd8813SKowalski, Kamil Result getInt(const char* fieldName, const nlohmann::json& json,
34177dd8813SKowalski, Kamil               int64_t& output, uint8_t msgCfgMap, nlohmann::json& msgJson,
342*1abe55efSEd Tanous               const std::string&& fieldPath)
343*1abe55efSEd Tanous {
34477dd8813SKowalski, Kamil     // Find field
34577dd8813SKowalski, Kamil     auto fieldIt = json.find(fieldName);
34677dd8813SKowalski, Kamil 
34777dd8813SKowalski, Kamil     // Verify existence
348*1abe55efSEd Tanous     if (fieldIt == json.end())
349*1abe55efSEd Tanous     {
350*1abe55efSEd Tanous         if (msgCfgMap & static_cast<int>(MessageSetting::MISSING))
351*1abe55efSEd Tanous         {
352*1abe55efSEd Tanous             messages::addMessageToJson(
353*1abe55efSEd Tanous                 msgJson, messages::propertyMissing(fieldName), fieldPath);
35477dd8813SKowalski, Kamil         }
35577dd8813SKowalski, Kamil 
35677dd8813SKowalski, Kamil         return Result::NOT_EXIST;
35777dd8813SKowalski, Kamil     }
35877dd8813SKowalski, Kamil 
35977dd8813SKowalski, Kamil     const int64_t* retVal = fieldIt->get_ptr<const int64_t*>();
36077dd8813SKowalski, Kamil 
36177dd8813SKowalski, Kamil     // Verify type - we know that it exists, so nullptr means wrong type
362*1abe55efSEd Tanous     if (retVal == nullptr)
363*1abe55efSEd Tanous     {
364*1abe55efSEd Tanous         if (msgCfgMap & static_cast<int>(MessageSetting::TYPE_ERROR))
365*1abe55efSEd Tanous         {
36677dd8813SKowalski, Kamil             messages::addMessageToJson(
367*1abe55efSEd Tanous                 msgJson,
368*1abe55efSEd Tanous                 messages::propertyValueTypeError(fieldIt->dump(), fieldName),
36977dd8813SKowalski, Kamil                 fieldPath);
37077dd8813SKowalski, Kamil         }
37177dd8813SKowalski, Kamil 
37277dd8813SKowalski, Kamil         return Result::WRONG_TYPE;
37377dd8813SKowalski, Kamil     }
37477dd8813SKowalski, Kamil 
37577dd8813SKowalski, Kamil     // Extract value
37677dd8813SKowalski, Kamil     output = *retVal;
37777dd8813SKowalski, Kamil 
37877dd8813SKowalski, Kamil     return Result::SUCCESS;
37977dd8813SKowalski, Kamil }
38077dd8813SKowalski, Kamil 
38177dd8813SKowalski, Kamil Result getUnsigned(const char* fieldName, const nlohmann::json& json,
38277dd8813SKowalski, Kamil                    uint64_t& output, uint8_t msgCfgMap, nlohmann::json& msgJson,
383*1abe55efSEd Tanous                    const std::string&& fieldPath)
384*1abe55efSEd Tanous {
38577dd8813SKowalski, Kamil     // Find field
38677dd8813SKowalski, Kamil     auto fieldIt = json.find(fieldName);
38777dd8813SKowalski, Kamil 
38877dd8813SKowalski, Kamil     // Verify existence
389*1abe55efSEd Tanous     if (fieldIt == json.end())
390*1abe55efSEd Tanous     {
391*1abe55efSEd Tanous         if (msgCfgMap & static_cast<int>(MessageSetting::MISSING))
392*1abe55efSEd Tanous         {
393*1abe55efSEd Tanous             messages::addMessageToJson(
394*1abe55efSEd Tanous                 msgJson, messages::propertyMissing(fieldName), fieldPath);
39577dd8813SKowalski, Kamil         }
39677dd8813SKowalski, Kamil 
39777dd8813SKowalski, Kamil         return Result::NOT_EXIST;
39877dd8813SKowalski, Kamil     }
39977dd8813SKowalski, Kamil 
40077dd8813SKowalski, Kamil     const uint64_t* retVal = fieldIt->get_ptr<const uint64_t*>();
40177dd8813SKowalski, Kamil 
40277dd8813SKowalski, Kamil     // Verify type - we know that it exists, so nullptr means wrong type
403*1abe55efSEd Tanous     if (retVal == nullptr)
404*1abe55efSEd Tanous     {
405*1abe55efSEd Tanous         if (msgCfgMap & static_cast<int>(MessageSetting::TYPE_ERROR))
406*1abe55efSEd Tanous         {
40777dd8813SKowalski, Kamil             messages::addMessageToJson(
408*1abe55efSEd Tanous                 msgJson,
409*1abe55efSEd Tanous                 messages::propertyValueTypeError(fieldIt->dump(), fieldName),
41077dd8813SKowalski, Kamil                 fieldPath);
41177dd8813SKowalski, Kamil         }
41277dd8813SKowalski, Kamil 
41377dd8813SKowalski, Kamil         return Result::WRONG_TYPE;
41477dd8813SKowalski, Kamil     }
41577dd8813SKowalski, Kamil 
41677dd8813SKowalski, Kamil     // Extract value
41777dd8813SKowalski, Kamil     output = *retVal;
41877dd8813SKowalski, Kamil 
41977dd8813SKowalski, Kamil     return Result::SUCCESS;
42077dd8813SKowalski, Kamil }
42177dd8813SKowalski, Kamil 
42277dd8813SKowalski, Kamil Result getBool(const char* fieldName, const nlohmann::json& json, bool& output,
42377dd8813SKowalski, Kamil                uint8_t msgCfgMap, nlohmann::json& msgJson,
424*1abe55efSEd Tanous                const std::string&& fieldPath)
425*1abe55efSEd Tanous {
42677dd8813SKowalski, Kamil     // Find field
42777dd8813SKowalski, Kamil     auto fieldIt = json.find(fieldName);
42877dd8813SKowalski, Kamil 
42977dd8813SKowalski, Kamil     // Verify existence
430*1abe55efSEd Tanous     if (fieldIt == json.end())
431*1abe55efSEd Tanous     {
432*1abe55efSEd Tanous         if (msgCfgMap & static_cast<int>(MessageSetting::MISSING))
433*1abe55efSEd Tanous         {
434*1abe55efSEd Tanous             messages::addMessageToJson(
435*1abe55efSEd Tanous                 msgJson, messages::propertyMissing(fieldName), fieldPath);
43677dd8813SKowalski, Kamil         }
43777dd8813SKowalski, Kamil 
43877dd8813SKowalski, Kamil         return Result::NOT_EXIST;
43977dd8813SKowalski, Kamil     }
44077dd8813SKowalski, Kamil 
44177dd8813SKowalski, Kamil     const bool* retVal = fieldIt->get_ptr<const bool*>();
44277dd8813SKowalski, Kamil 
44377dd8813SKowalski, Kamil     // Verify type - we know that it exists, so nullptr means wrong type
444*1abe55efSEd Tanous     if (retVal == nullptr)
445*1abe55efSEd Tanous     {
446*1abe55efSEd Tanous         if (msgCfgMap & static_cast<int>(MessageSetting::TYPE_ERROR))
447*1abe55efSEd Tanous         {
44877dd8813SKowalski, Kamil             messages::addMessageToJson(
449*1abe55efSEd Tanous                 msgJson,
450*1abe55efSEd Tanous                 messages::propertyValueTypeError(fieldIt->dump(), fieldName),
45177dd8813SKowalski, Kamil                 fieldPath);
45277dd8813SKowalski, Kamil         }
45377dd8813SKowalski, Kamil 
45477dd8813SKowalski, Kamil         return Result::WRONG_TYPE;
45577dd8813SKowalski, Kamil     }
45677dd8813SKowalski, Kamil 
45777dd8813SKowalski, Kamil     // Extract value
45877dd8813SKowalski, Kamil     output = *retVal;
45977dd8813SKowalski, Kamil 
46077dd8813SKowalski, Kamil     return Result::SUCCESS;
46177dd8813SKowalski, Kamil }
46277dd8813SKowalski, Kamil 
46377dd8813SKowalski, Kamil Result getDouble(const char* fieldName, const nlohmann::json& json,
46477dd8813SKowalski, Kamil                  double& output, uint8_t msgCfgMap, nlohmann::json& msgJson,
465*1abe55efSEd Tanous                  const std::string&& fieldPath)
466*1abe55efSEd Tanous {
46777dd8813SKowalski, Kamil     // Find field
46877dd8813SKowalski, Kamil     auto fieldIt = json.find(fieldName);
46977dd8813SKowalski, Kamil 
47077dd8813SKowalski, Kamil     // Verify existence
471*1abe55efSEd Tanous     if (fieldIt == json.end())
472*1abe55efSEd Tanous     {
473*1abe55efSEd Tanous         if (msgCfgMap & static_cast<int>(MessageSetting::MISSING))
474*1abe55efSEd Tanous         {
475*1abe55efSEd Tanous             messages::addMessageToJson(
476*1abe55efSEd Tanous                 msgJson, messages::propertyMissing(fieldName), fieldPath);
47777dd8813SKowalski, Kamil         }
47877dd8813SKowalski, Kamil 
47977dd8813SKowalski, Kamil         return Result::NOT_EXIST;
48077dd8813SKowalski, Kamil     }
48177dd8813SKowalski, Kamil 
48277dd8813SKowalski, Kamil     const double* retVal = fieldIt->get_ptr<const double*>();
48377dd8813SKowalski, Kamil 
48477dd8813SKowalski, Kamil     // Verify type - we know that it exists, so nullptr means wrong type
485*1abe55efSEd Tanous     if (retVal == nullptr)
486*1abe55efSEd Tanous     {
487*1abe55efSEd Tanous         if (msgCfgMap & static_cast<int>(MessageSetting::TYPE_ERROR))
488*1abe55efSEd Tanous         {
48977dd8813SKowalski, Kamil             messages::addMessageToJson(
490*1abe55efSEd Tanous                 msgJson,
491*1abe55efSEd Tanous                 messages::propertyValueTypeError(fieldIt->dump(), fieldName),
49277dd8813SKowalski, Kamil                 fieldPath);
49377dd8813SKowalski, Kamil         }
49477dd8813SKowalski, Kamil 
49577dd8813SKowalski, Kamil         return Result::WRONG_TYPE;
49677dd8813SKowalski, Kamil     }
49777dd8813SKowalski, Kamil 
49877dd8813SKowalski, Kamil     // Extract value
49977dd8813SKowalski, Kamil     output = *retVal;
50077dd8813SKowalski, Kamil 
50177dd8813SKowalski, Kamil     return Result::SUCCESS;
50277dd8813SKowalski, Kamil }
50377dd8813SKowalski, Kamil 
50455c7b7a2SEd Tanous bool processJsonFromRequest(crow::Response& res, const crow::Request& req,
505*1abe55efSEd Tanous                             nlohmann::json& reqJson)
506*1abe55efSEd Tanous {
50777dd8813SKowalski, Kamil     reqJson = nlohmann::json::parse(req.body, nullptr, false);
50877dd8813SKowalski, Kamil 
509*1abe55efSEd Tanous     if (reqJson.is_discarded())
510*1abe55efSEd Tanous     {
511*1abe55efSEd Tanous         messages::addMessageToErrorJson(res.jsonValue,
512*1abe55efSEd Tanous                                         messages::malformedJSON());
51377dd8813SKowalski, Kamil 
514e0d918bcSEd Tanous         res.result(boost::beast::http::status::bad_request);
51577dd8813SKowalski, Kamil         res.end();
51677dd8813SKowalski, Kamil 
51777dd8813SKowalski, Kamil         return false;
51877dd8813SKowalski, Kamil     }
51977dd8813SKowalski, Kamil 
52077dd8813SKowalski, Kamil     return true;
52177dd8813SKowalski, Kamil }
52277dd8813SKowalski, Kamil 
52377dd8813SKowalski, Kamil } // namespace json_util
52477dd8813SKowalski, Kamil 
52577dd8813SKowalski, Kamil } // namespace redfish
526