xref: /openbmc/bmcweb/features/redfish/src/utils/json_utils.cpp (revision 55c7b7a2e58779580f33046d2dd8649243776700)
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"
1777dd8813SKowalski, Kamil #include <error_messages.hpp>
1877dd8813SKowalski, Kamil 
1977dd8813SKowalski, Kamil namespace redfish {
2077dd8813SKowalski, Kamil 
2177dd8813SKowalski, Kamil namespace json_util {
2277dd8813SKowalski, Kamil 
2377dd8813SKowalski, Kamil Result getString(const char* fieldName, const nlohmann::json& json,
2477dd8813SKowalski, Kamil                  const std::string*& output) {
2577dd8813SKowalski, Kamil   // Find field
2677dd8813SKowalski, Kamil   auto fieldIt = json.find(fieldName);
2777dd8813SKowalski, Kamil 
2877dd8813SKowalski, Kamil   // Verify existence
2977dd8813SKowalski, Kamil   if (fieldIt == json.end()) {
3077dd8813SKowalski, Kamil     return Result::NOT_EXIST;
3177dd8813SKowalski, Kamil   }
3277dd8813SKowalski, Kamil 
3377dd8813SKowalski, Kamil   output = fieldIt->get_ptr<const std::string*>();
3477dd8813SKowalski, Kamil 
3577dd8813SKowalski, Kamil   // Verify type - we know that it exists, so nullptr means wrong type
3677dd8813SKowalski, Kamil   if (output == nullptr) {
3777dd8813SKowalski, Kamil     return Result::WRONG_TYPE;
3877dd8813SKowalski, Kamil   }
3977dd8813SKowalski, Kamil 
4077dd8813SKowalski, Kamil   return Result::SUCCESS;
4177dd8813SKowalski, Kamil }
4277dd8813SKowalski, Kamil 
4377dd8813SKowalski, Kamil Result getObject(const char* fieldName, const nlohmann::json& json,
4477dd8813SKowalski, Kamil                  nlohmann::json* output) {
4577dd8813SKowalski, Kamil   // Verify input pointer
4677dd8813SKowalski, Kamil   if (output == nullptr) {
4777dd8813SKowalski, Kamil     return Result::NULL_POINTER;
4877dd8813SKowalski, Kamil   }
4977dd8813SKowalski, Kamil 
5077dd8813SKowalski, Kamil   // Find field
5177dd8813SKowalski, Kamil   auto fieldIt = json.find(fieldName);
5277dd8813SKowalski, Kamil 
5377dd8813SKowalski, Kamil   // Verify existence
5477dd8813SKowalski, Kamil   if (fieldIt == json.end()) {
5577dd8813SKowalski, Kamil     return Result::NOT_EXIST;
5677dd8813SKowalski, Kamil   }
5777dd8813SKowalski, Kamil 
5877dd8813SKowalski, Kamil   // Verify type
5977dd8813SKowalski, Kamil   if (!fieldIt->is_object()) {
6077dd8813SKowalski, Kamil     return Result::WRONG_TYPE;
6177dd8813SKowalski, Kamil   }
6277dd8813SKowalski, Kamil 
6377dd8813SKowalski, Kamil   // Extract value
6477dd8813SKowalski, Kamil   *output = *fieldIt;
6577dd8813SKowalski, Kamil 
6677dd8813SKowalski, Kamil   return Result::SUCCESS;
6777dd8813SKowalski, Kamil }
6877dd8813SKowalski, Kamil 
6977dd8813SKowalski, Kamil Result getArray(const char* fieldName, const nlohmann::json& json,
7077dd8813SKowalski, Kamil                 nlohmann::json* output) {
7177dd8813SKowalski, Kamil   // Verify input pointer
7277dd8813SKowalski, Kamil   if (output == nullptr) {
7377dd8813SKowalski, Kamil     return Result::NULL_POINTER;
7477dd8813SKowalski, Kamil   }
7577dd8813SKowalski, Kamil 
7677dd8813SKowalski, Kamil   // Find field
7777dd8813SKowalski, Kamil   auto fieldIt = json.find(fieldName);
7877dd8813SKowalski, Kamil 
7977dd8813SKowalski, Kamil   // Verify existence
8077dd8813SKowalski, Kamil   if (fieldIt == json.end()) {
8177dd8813SKowalski, Kamil     return Result::NOT_EXIST;
8277dd8813SKowalski, Kamil   }
8377dd8813SKowalski, Kamil 
8477dd8813SKowalski, Kamil   // Verify type
8577dd8813SKowalski, Kamil   if (!fieldIt->is_array()) {
8677dd8813SKowalski, Kamil     return Result::WRONG_TYPE;
8777dd8813SKowalski, Kamil   }
8877dd8813SKowalski, Kamil 
8977dd8813SKowalski, Kamil   // Extract value
9077dd8813SKowalski, Kamil   *output = *fieldIt;
9177dd8813SKowalski, Kamil 
9277dd8813SKowalski, Kamil   return Result::SUCCESS;
9377dd8813SKowalski, Kamil }
9477dd8813SKowalski, Kamil 
9577dd8813SKowalski, Kamil Result getInt(const char* fieldName, const nlohmann::json& json,
9677dd8813SKowalski, Kamil               int64_t& output) {
9777dd8813SKowalski, Kamil   // Find field
9877dd8813SKowalski, Kamil   auto fieldIt = json.find(fieldName);
9977dd8813SKowalski, Kamil 
10077dd8813SKowalski, Kamil   // Verify existence
10177dd8813SKowalski, Kamil   if (fieldIt == json.end()) {
10277dd8813SKowalski, Kamil     return Result::NOT_EXIST;
10377dd8813SKowalski, Kamil   }
10477dd8813SKowalski, Kamil 
10577dd8813SKowalski, Kamil   const int64_t* retVal = fieldIt->get_ptr<const int64_t*>();
10677dd8813SKowalski, Kamil 
10777dd8813SKowalski, Kamil   // Verify type - we know that it exists, so nullptr means wrong type
10877dd8813SKowalski, Kamil   if (retVal == nullptr) {
10977dd8813SKowalski, Kamil     return Result::WRONG_TYPE;
11077dd8813SKowalski, Kamil   }
11177dd8813SKowalski, Kamil 
11277dd8813SKowalski, Kamil   // Extract value
11377dd8813SKowalski, Kamil   output = *retVal;
11477dd8813SKowalski, Kamil 
11577dd8813SKowalski, Kamil   return Result::SUCCESS;
11677dd8813SKowalski, Kamil }
11777dd8813SKowalski, Kamil 
11877dd8813SKowalski, Kamil Result getUnsigned(const char* fieldName, const nlohmann::json& json,
11977dd8813SKowalski, Kamil                    uint64_t& output) {
12077dd8813SKowalski, Kamil   // Find field
12177dd8813SKowalski, Kamil   auto fieldIt = json.find(fieldName);
12277dd8813SKowalski, Kamil 
12377dd8813SKowalski, Kamil   // Verify existence
12477dd8813SKowalski, Kamil   if (fieldIt == json.end()) {
12577dd8813SKowalski, Kamil     return Result::NOT_EXIST;
12677dd8813SKowalski, Kamil   }
12777dd8813SKowalski, Kamil 
12877dd8813SKowalski, Kamil   const uint64_t* retVal = fieldIt->get_ptr<const uint64_t*>();
12977dd8813SKowalski, Kamil 
13077dd8813SKowalski, Kamil   // Verify type - we know that it exists, so nullptr means wrong type
13177dd8813SKowalski, Kamil   if (retVal == nullptr) {
13277dd8813SKowalski, Kamil     return Result::WRONG_TYPE;
13377dd8813SKowalski, Kamil   }
13477dd8813SKowalski, Kamil 
13577dd8813SKowalski, Kamil   // Extract value
13677dd8813SKowalski, Kamil   output = *retVal;
13777dd8813SKowalski, Kamil 
13877dd8813SKowalski, Kamil   return Result::SUCCESS;
13977dd8813SKowalski, Kamil }
14077dd8813SKowalski, Kamil 
14177dd8813SKowalski, Kamil Result getBool(const char* fieldName, const nlohmann::json& json,
14277dd8813SKowalski, Kamil                bool& output) {
14377dd8813SKowalski, Kamil   // Find field
14477dd8813SKowalski, Kamil   auto fieldIt = json.find(fieldName);
14577dd8813SKowalski, Kamil 
14677dd8813SKowalski, Kamil   // Verify existence
14777dd8813SKowalski, Kamil   if (fieldIt == json.end()) {
14877dd8813SKowalski, Kamil     return Result::NOT_EXIST;
14977dd8813SKowalski, Kamil   }
15077dd8813SKowalski, Kamil 
15177dd8813SKowalski, Kamil   const bool* retVal = fieldIt->get_ptr<const bool*>();
15277dd8813SKowalski, Kamil 
15377dd8813SKowalski, Kamil   // Verify type - we know that it exists, so nullptr means wrong type
15477dd8813SKowalski, Kamil   if (retVal == nullptr) {
15577dd8813SKowalski, Kamil     return Result::WRONG_TYPE;
15677dd8813SKowalski, Kamil   }
15777dd8813SKowalski, Kamil 
15877dd8813SKowalski, Kamil   // Extract value
15977dd8813SKowalski, Kamil   output = *retVal;
16077dd8813SKowalski, Kamil 
16177dd8813SKowalski, Kamil   return Result::SUCCESS;
16277dd8813SKowalski, Kamil }
16377dd8813SKowalski, Kamil 
16477dd8813SKowalski, Kamil Result getDouble(const char* fieldName, const nlohmann::json& json,
16577dd8813SKowalski, Kamil                  double& output) {
16677dd8813SKowalski, Kamil   // Find field
16777dd8813SKowalski, Kamil   auto fieldIt = json.find(fieldName);
16877dd8813SKowalski, Kamil 
16977dd8813SKowalski, Kamil   // Verify existence
17077dd8813SKowalski, Kamil   if (fieldIt == json.end()) {
17177dd8813SKowalski, Kamil     return Result::NOT_EXIST;
17277dd8813SKowalski, Kamil   }
17377dd8813SKowalski, Kamil 
17477dd8813SKowalski, Kamil   const double* retVal = fieldIt->get_ptr<const double*>();
17577dd8813SKowalski, Kamil 
17677dd8813SKowalski, Kamil   // Verify type - we know that it exists, so nullptr means wrong type
17777dd8813SKowalski, Kamil   if (retVal == nullptr) {
17877dd8813SKowalski, Kamil     return Result::WRONG_TYPE;
17977dd8813SKowalski, Kamil   }
18077dd8813SKowalski, Kamil 
18177dd8813SKowalski, Kamil   // Extract value
18277dd8813SKowalski, Kamil   output = *retVal;
18377dd8813SKowalski, Kamil 
18477dd8813SKowalski, Kamil   return Result::SUCCESS;
18577dd8813SKowalski, Kamil }
18677dd8813SKowalski, Kamil 
18777dd8813SKowalski, Kamil Result getString(const char* fieldName, const nlohmann::json& json,
18877dd8813SKowalski, Kamil                  const std::string*& output, uint8_t msgCfgMap,
18977dd8813SKowalski, Kamil                  nlohmann::json& msgJson, const std::string&& fieldPath) {
19077dd8813SKowalski, Kamil   // Find field
19177dd8813SKowalski, Kamil   auto fieldIt = json.find(fieldName);
19277dd8813SKowalski, Kamil 
19377dd8813SKowalski, Kamil   // Verify existence
19477dd8813SKowalski, Kamil   if (fieldIt == json.end()) {
19577dd8813SKowalski, Kamil     if (msgCfgMap & static_cast<int>(MessageSetting::MISSING)) {
19677dd8813SKowalski, Kamil       messages::addMessageToJson(msgJson, messages::propertyMissing(fieldName),
19777dd8813SKowalski, Kamil                                  fieldPath);
19877dd8813SKowalski, Kamil     }
19977dd8813SKowalski, Kamil 
20077dd8813SKowalski, Kamil     return Result::NOT_EXIST;
20177dd8813SKowalski, Kamil   }
20277dd8813SKowalski, Kamil 
20377dd8813SKowalski, Kamil   output = fieldIt->get_ptr<const std::string*>();
20477dd8813SKowalski, Kamil 
20577dd8813SKowalski, Kamil   // Verify type - we know that it exists, so nullptr means wrong type
20677dd8813SKowalski, Kamil   if (output == nullptr) {
20777dd8813SKowalski, Kamil     if (msgCfgMap & static_cast<int>(MessageSetting::TYPE_ERROR)) {
20877dd8813SKowalski, Kamil       messages::addMessageToJson(
20977dd8813SKowalski, Kamil           msgJson, messages::propertyValueTypeError(fieldIt->dump(), fieldName),
21077dd8813SKowalski, Kamil           fieldPath);
21177dd8813SKowalski, Kamil     }
21277dd8813SKowalski, Kamil 
21377dd8813SKowalski, Kamil     return Result::WRONG_TYPE;
21477dd8813SKowalski, Kamil   }
21577dd8813SKowalski, Kamil 
21677dd8813SKowalski, Kamil   return Result::SUCCESS;
21777dd8813SKowalski, Kamil }
21877dd8813SKowalski, Kamil 
21977dd8813SKowalski, Kamil Result getObject(const char* fieldName, const nlohmann::json& json,
22077dd8813SKowalski, Kamil                  nlohmann::json* output, uint8_t msgCfgMap,
22177dd8813SKowalski, Kamil                  nlohmann::json& msgJson, const std::string&& fieldPath) {
22277dd8813SKowalski, Kamil   // Verify input pointer
22377dd8813SKowalski, Kamil   if (output == nullptr) {
22477dd8813SKowalski, Kamil     return Result::NULL_POINTER;
22577dd8813SKowalski, Kamil   }
22677dd8813SKowalski, Kamil 
22777dd8813SKowalski, Kamil   // Find field
22877dd8813SKowalski, Kamil   auto fieldIt = json.find(fieldName);
22977dd8813SKowalski, Kamil 
23077dd8813SKowalski, Kamil   // Verify existence
23177dd8813SKowalski, Kamil   if (fieldIt == json.end()) {
23277dd8813SKowalski, Kamil     if (msgCfgMap & static_cast<int>(MessageSetting::MISSING)) {
23377dd8813SKowalski, Kamil       messages::addMessageToJson(msgJson, messages::propertyMissing(fieldName),
23477dd8813SKowalski, Kamil                                  fieldPath);
23577dd8813SKowalski, Kamil     }
23677dd8813SKowalski, Kamil 
23777dd8813SKowalski, Kamil     return Result::NOT_EXIST;
23877dd8813SKowalski, Kamil   }
23977dd8813SKowalski, Kamil 
24077dd8813SKowalski, Kamil   // Verify type
24177dd8813SKowalski, Kamil   if (!fieldIt->is_object()) {
24277dd8813SKowalski, Kamil     if (msgCfgMap & static_cast<int>(MessageSetting::TYPE_ERROR)) {
24377dd8813SKowalski, Kamil       messages::addMessageToJson(
24477dd8813SKowalski, Kamil           msgJson, messages::propertyValueTypeError(fieldIt->dump(), fieldName),
24577dd8813SKowalski, Kamil           fieldPath);
24677dd8813SKowalski, Kamil     }
24777dd8813SKowalski, Kamil 
24877dd8813SKowalski, Kamil     return Result::WRONG_TYPE;
24977dd8813SKowalski, Kamil   }
25077dd8813SKowalski, Kamil 
25177dd8813SKowalski, Kamil   // Extract value
25277dd8813SKowalski, Kamil   *output = *fieldIt;
25377dd8813SKowalski, Kamil 
25477dd8813SKowalski, Kamil   return Result::SUCCESS;
25577dd8813SKowalski, Kamil }
25677dd8813SKowalski, Kamil 
25777dd8813SKowalski, Kamil Result getArray(const char* fieldName, const nlohmann::json& json,
25877dd8813SKowalski, Kamil                 nlohmann::json* output, uint8_t msgCfgMap,
25977dd8813SKowalski, Kamil                 nlohmann::json& msgJson, const std::string&& fieldPath) {
26077dd8813SKowalski, Kamil   // Verify input pointer
26177dd8813SKowalski, Kamil   if (output == nullptr) {
26277dd8813SKowalski, Kamil     return Result::NULL_POINTER;
26377dd8813SKowalski, Kamil   }
26477dd8813SKowalski, Kamil 
26577dd8813SKowalski, Kamil   // Find field
26677dd8813SKowalski, Kamil   auto fieldIt = json.find(fieldName);
26777dd8813SKowalski, Kamil 
26877dd8813SKowalski, Kamil   // Verify existence
26977dd8813SKowalski, Kamil   if (fieldIt == json.end()) {
27077dd8813SKowalski, Kamil     if (msgCfgMap & static_cast<int>(MessageSetting::MISSING)) {
27177dd8813SKowalski, Kamil       messages::addMessageToJson(msgJson, messages::propertyMissing(fieldName),
27277dd8813SKowalski, Kamil                                  fieldPath);
27377dd8813SKowalski, Kamil     }
27477dd8813SKowalski, Kamil 
27577dd8813SKowalski, Kamil     return Result::NOT_EXIST;
27677dd8813SKowalski, Kamil   }
27777dd8813SKowalski, Kamil 
27877dd8813SKowalski, Kamil   // Verify type
27977dd8813SKowalski, Kamil   if (!fieldIt->is_array()) {
28077dd8813SKowalski, Kamil     if (msgCfgMap & static_cast<int>(MessageSetting::TYPE_ERROR)) {
28177dd8813SKowalski, Kamil       messages::addMessageToJson(
28277dd8813SKowalski, Kamil           msgJson, 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 getInt(const char* fieldName, const nlohmann::json& json,
29677dd8813SKowalski, Kamil               int64_t& output, uint8_t msgCfgMap, nlohmann::json& msgJson,
29777dd8813SKowalski, Kamil               const std::string&& fieldPath) {
29877dd8813SKowalski, Kamil   // Find field
29977dd8813SKowalski, Kamil   auto fieldIt = json.find(fieldName);
30077dd8813SKowalski, Kamil 
30177dd8813SKowalski, Kamil   // Verify existence
30277dd8813SKowalski, Kamil   if (fieldIt == json.end()) {
30377dd8813SKowalski, Kamil     if (msgCfgMap & static_cast<int>(MessageSetting::MISSING)) {
30477dd8813SKowalski, Kamil       messages::addMessageToJson(msgJson, messages::propertyMissing(fieldName),
30577dd8813SKowalski, Kamil                                  fieldPath);
30677dd8813SKowalski, Kamil     }
30777dd8813SKowalski, Kamil 
30877dd8813SKowalski, Kamil     return Result::NOT_EXIST;
30977dd8813SKowalski, Kamil   }
31077dd8813SKowalski, Kamil 
31177dd8813SKowalski, Kamil   const int64_t* retVal = fieldIt->get_ptr<const int64_t*>();
31277dd8813SKowalski, Kamil 
31377dd8813SKowalski, Kamil   // Verify type - we know that it exists, so nullptr means wrong type
31477dd8813SKowalski, Kamil   if (retVal == nullptr) {
31577dd8813SKowalski, Kamil     if (msgCfgMap & static_cast<int>(MessageSetting::TYPE_ERROR)) {
31677dd8813SKowalski, Kamil       messages::addMessageToJson(
31777dd8813SKowalski, Kamil           msgJson, messages::propertyValueTypeError(fieldIt->dump(), fieldName),
31877dd8813SKowalski, Kamil           fieldPath);
31977dd8813SKowalski, Kamil     }
32077dd8813SKowalski, Kamil 
32177dd8813SKowalski, Kamil     return Result::WRONG_TYPE;
32277dd8813SKowalski, Kamil   }
32377dd8813SKowalski, Kamil 
32477dd8813SKowalski, Kamil   // Extract value
32577dd8813SKowalski, Kamil   output = *retVal;
32677dd8813SKowalski, Kamil 
32777dd8813SKowalski, Kamil   return Result::SUCCESS;
32877dd8813SKowalski, Kamil }
32977dd8813SKowalski, Kamil 
33077dd8813SKowalski, Kamil Result getUnsigned(const char* fieldName, const nlohmann::json& json,
33177dd8813SKowalski, Kamil                    uint64_t& output, uint8_t msgCfgMap, nlohmann::json& msgJson,
33277dd8813SKowalski, Kamil                    const std::string&& fieldPath) {
33377dd8813SKowalski, Kamil   // Find field
33477dd8813SKowalski, Kamil   auto fieldIt = json.find(fieldName);
33577dd8813SKowalski, Kamil 
33677dd8813SKowalski, Kamil   // Verify existence
33777dd8813SKowalski, Kamil   if (fieldIt == json.end()) {
33877dd8813SKowalski, Kamil     if (msgCfgMap & static_cast<int>(MessageSetting::MISSING)) {
33977dd8813SKowalski, Kamil       messages::addMessageToJson(msgJson, messages::propertyMissing(fieldName),
34077dd8813SKowalski, Kamil                                  fieldPath);
34177dd8813SKowalski, Kamil     }
34277dd8813SKowalski, Kamil 
34377dd8813SKowalski, Kamil     return Result::NOT_EXIST;
34477dd8813SKowalski, Kamil   }
34577dd8813SKowalski, Kamil 
34677dd8813SKowalski, Kamil   const uint64_t* retVal = fieldIt->get_ptr<const uint64_t*>();
34777dd8813SKowalski, Kamil 
34877dd8813SKowalski, Kamil   // Verify type - we know that it exists, so nullptr means wrong type
34977dd8813SKowalski, Kamil   if (retVal == nullptr) {
35077dd8813SKowalski, Kamil     if (msgCfgMap & static_cast<int>(MessageSetting::TYPE_ERROR)) {
35177dd8813SKowalski, Kamil       messages::addMessageToJson(
35277dd8813SKowalski, Kamil           msgJson, messages::propertyValueTypeError(fieldIt->dump(), fieldName),
35377dd8813SKowalski, Kamil           fieldPath);
35477dd8813SKowalski, Kamil     }
35577dd8813SKowalski, Kamil 
35677dd8813SKowalski, Kamil     return Result::WRONG_TYPE;
35777dd8813SKowalski, Kamil   }
35877dd8813SKowalski, Kamil 
35977dd8813SKowalski, Kamil   // Extract value
36077dd8813SKowalski, Kamil   output = *retVal;
36177dd8813SKowalski, Kamil 
36277dd8813SKowalski, Kamil   return Result::SUCCESS;
36377dd8813SKowalski, Kamil }
36477dd8813SKowalski, Kamil 
36577dd8813SKowalski, Kamil Result getBool(const char* fieldName, const nlohmann::json& json, bool& output,
36677dd8813SKowalski, Kamil                uint8_t msgCfgMap, nlohmann::json& msgJson,
36777dd8813SKowalski, Kamil                const std::string&& fieldPath) {
36877dd8813SKowalski, Kamil   // Find field
36977dd8813SKowalski, Kamil   auto fieldIt = json.find(fieldName);
37077dd8813SKowalski, Kamil 
37177dd8813SKowalski, Kamil   // Verify existence
37277dd8813SKowalski, Kamil   if (fieldIt == json.end()) {
37377dd8813SKowalski, Kamil     if (msgCfgMap & static_cast<int>(MessageSetting::MISSING)) {
37477dd8813SKowalski, Kamil       messages::addMessageToJson(msgJson, messages::propertyMissing(fieldName),
37577dd8813SKowalski, Kamil                                  fieldPath);
37677dd8813SKowalski, Kamil     }
37777dd8813SKowalski, Kamil 
37877dd8813SKowalski, Kamil     return Result::NOT_EXIST;
37977dd8813SKowalski, Kamil   }
38077dd8813SKowalski, Kamil 
38177dd8813SKowalski, Kamil   const bool* retVal = fieldIt->get_ptr<const bool*>();
38277dd8813SKowalski, Kamil 
38377dd8813SKowalski, Kamil   // Verify type - we know that it exists, so nullptr means wrong type
38477dd8813SKowalski, Kamil   if (retVal == nullptr) {
38577dd8813SKowalski, Kamil     if (msgCfgMap & static_cast<int>(MessageSetting::TYPE_ERROR)) {
38677dd8813SKowalski, Kamil       messages::addMessageToJson(
38777dd8813SKowalski, Kamil           msgJson, messages::propertyValueTypeError(fieldIt->dump(), fieldName),
38877dd8813SKowalski, Kamil           fieldPath);
38977dd8813SKowalski, Kamil     }
39077dd8813SKowalski, Kamil 
39177dd8813SKowalski, Kamil     return Result::WRONG_TYPE;
39277dd8813SKowalski, Kamil   }
39377dd8813SKowalski, Kamil 
39477dd8813SKowalski, Kamil   // Extract value
39577dd8813SKowalski, Kamil   output = *retVal;
39677dd8813SKowalski, Kamil 
39777dd8813SKowalski, Kamil   return Result::SUCCESS;
39877dd8813SKowalski, Kamil }
39977dd8813SKowalski, Kamil 
40077dd8813SKowalski, Kamil Result getDouble(const char* fieldName, const nlohmann::json& json,
40177dd8813SKowalski, Kamil                  double& output, uint8_t msgCfgMap, nlohmann::json& msgJson,
40277dd8813SKowalski, Kamil                  const std::string&& fieldPath) {
40377dd8813SKowalski, Kamil   // Find field
40477dd8813SKowalski, Kamil   auto fieldIt = json.find(fieldName);
40577dd8813SKowalski, Kamil 
40677dd8813SKowalski, Kamil   // Verify existence
40777dd8813SKowalski, Kamil   if (fieldIt == json.end()) {
40877dd8813SKowalski, Kamil     if (msgCfgMap & static_cast<int>(MessageSetting::MISSING)) {
40977dd8813SKowalski, Kamil       messages::addMessageToJson(msgJson, messages::propertyMissing(fieldName),
41077dd8813SKowalski, Kamil                                  fieldPath);
41177dd8813SKowalski, Kamil     }
41277dd8813SKowalski, Kamil 
41377dd8813SKowalski, Kamil     return Result::NOT_EXIST;
41477dd8813SKowalski, Kamil   }
41577dd8813SKowalski, Kamil 
41677dd8813SKowalski, Kamil   const double* retVal = fieldIt->get_ptr<const double*>();
41777dd8813SKowalski, Kamil 
41877dd8813SKowalski, Kamil   // Verify type - we know that it exists, so nullptr means wrong type
41977dd8813SKowalski, Kamil   if (retVal == nullptr) {
42077dd8813SKowalski, Kamil     if (msgCfgMap & static_cast<int>(MessageSetting::TYPE_ERROR)) {
42177dd8813SKowalski, Kamil       messages::addMessageToJson(
42277dd8813SKowalski, Kamil           msgJson, messages::propertyValueTypeError(fieldIt->dump(), fieldName),
42377dd8813SKowalski, Kamil           fieldPath);
42477dd8813SKowalski, Kamil     }
42577dd8813SKowalski, Kamil 
42677dd8813SKowalski, Kamil     return Result::WRONG_TYPE;
42777dd8813SKowalski, Kamil   }
42877dd8813SKowalski, Kamil 
42977dd8813SKowalski, Kamil   // Extract value
43077dd8813SKowalski, Kamil   output = *retVal;
43177dd8813SKowalski, Kamil 
43277dd8813SKowalski, Kamil   return Result::SUCCESS;
43377dd8813SKowalski, Kamil }
43477dd8813SKowalski, Kamil 
435*55c7b7a2SEd Tanous bool processJsonFromRequest(crow::Response& res, const crow::Request& req,
43677dd8813SKowalski, Kamil                             nlohmann::json& reqJson) {
43777dd8813SKowalski, Kamil   reqJson = nlohmann::json::parse(req.body, nullptr, false);
43877dd8813SKowalski, Kamil 
43977dd8813SKowalski, Kamil   if (reqJson.is_discarded()) {
440*55c7b7a2SEd Tanous     messages::addMessageToErrorJson(res.jsonValue, messages::malformedJSON());
44177dd8813SKowalski, Kamil 
442e0d918bcSEd Tanous     res.result(boost::beast::http::status::bad_request);
44377dd8813SKowalski, Kamil     res.end();
44477dd8813SKowalski, Kamil 
44577dd8813SKowalski, Kamil     return false;
44677dd8813SKowalski, Kamil   }
44777dd8813SKowalski, Kamil 
44877dd8813SKowalski, Kamil   return true;
44977dd8813SKowalski, Kamil }
45077dd8813SKowalski, Kamil 
45177dd8813SKowalski, Kamil }  // namespace json_util
45277dd8813SKowalski, Kamil 
45377dd8813SKowalski, Kamil }  // namespace redfish
454