xref: /openbmc/bmcweb/features/redfish/include/utils/json_utils.hpp (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 #pragma once
1777dd8813SKowalski, Kamil #include <crow/http_request.h>
1877dd8813SKowalski, Kamil #include <crow/http_response.h>
1977dd8813SKowalski, Kamil 
20*1abe55efSEd Tanous #include <nlohmann/json.hpp>
2177dd8813SKowalski, Kamil 
22*1abe55efSEd Tanous namespace redfish
23*1abe55efSEd Tanous {
24*1abe55efSEd Tanous 
25*1abe55efSEd Tanous namespace json_util
26*1abe55efSEd Tanous {
2777dd8813SKowalski, Kamil 
2877dd8813SKowalski, Kamil /**
2977dd8813SKowalski, Kamil  * @brief Defines JSON utils operation status
3077dd8813SKowalski, Kamil  */
31*1abe55efSEd Tanous enum class Result
32*1abe55efSEd Tanous {
33*1abe55efSEd Tanous     SUCCESS,
34*1abe55efSEd Tanous     NOT_EXIST,
35*1abe55efSEd Tanous     WRONG_TYPE,
36*1abe55efSEd Tanous     NULL_POINTER
37*1abe55efSEd Tanous };
3877dd8813SKowalski, Kamil 
3977dd8813SKowalski, Kamil /**
4077dd8813SKowalski, Kamil  * @brief Describes JSON utils messages requirement
4177dd8813SKowalski, Kamil  */
42*1abe55efSEd Tanous enum class MessageSetting
43*1abe55efSEd Tanous {
4477dd8813SKowalski, Kamil     NONE = 0x0,      ///< No messages will be added
4577dd8813SKowalski, Kamil     MISSING = 0x1,   ///< PropertyMissing message will be added
4677dd8813SKowalski, Kamil     TYPE_ERROR = 0x2 ///< PropertyValueTypeError message will be added
4777dd8813SKowalski, Kamil };
4877dd8813SKowalski, Kamil 
4977dd8813SKowalski, Kamil /**
5077dd8813SKowalski, Kamil  * @brief Wrapper function for extracting string from JSON object without
5177dd8813SKowalski, Kamil  *        throwing exceptions
5277dd8813SKowalski, Kamil  *
5377dd8813SKowalski, Kamil  * @param[in]  fieldName   Name of requested field
5477dd8813SKowalski, Kamil  * @param[in]  json        JSON object from which field should be extracted
5577dd8813SKowalski, Kamil  * @param[out] output      Variable to which extracted will be written in case
5677dd8813SKowalski, Kamil  *                         of success
5777dd8813SKowalski, Kamil  *
5877dd8813SKowalski, Kamil  * @return Result informing about operation status, output will be
5977dd8813SKowalski, Kamil  *         written only in case of Result::SUCCESS
6077dd8813SKowalski, Kamil  */
6177dd8813SKowalski, Kamil Result getString(const char* fieldName, const nlohmann::json& json,
6277dd8813SKowalski, Kamil                  const std::string*& output);
6377dd8813SKowalski, Kamil 
6477dd8813SKowalski, Kamil /**
6577dd8813SKowalski, Kamil  * @brief Wrapper function for extracting object from JSON object without
6677dd8813SKowalski, Kamil  *        throwing exceptions
6777dd8813SKowalski, Kamil  *
6877dd8813SKowalski, Kamil  * @param[in]  fieldName   Name of requested field
6977dd8813SKowalski, Kamil  * @param[in]  json        JSON object from which field should be extracted
7077dd8813SKowalski, Kamil  * @param[out] output      Variable to which extracted will be written in case
7177dd8813SKowalski, Kamil  *                         of success
7277dd8813SKowalski, Kamil  *
7377dd8813SKowalski, Kamil  * @return Result informing about operation status, output will be
7477dd8813SKowalski, Kamil  *         written only in case of Result::SUCCESS
7577dd8813SKowalski, Kamil  */
7677dd8813SKowalski, Kamil Result getObject(const char* fieldName, const nlohmann::json& json,
7777dd8813SKowalski, Kamil                  nlohmann::json* output);
7877dd8813SKowalski, Kamil 
7977dd8813SKowalski, Kamil /**
8077dd8813SKowalski, Kamil  * @brief Wrapper function for extracting array from JSON object without
8177dd8813SKowalski, Kamil  *        throwing exceptions
8277dd8813SKowalski, Kamil  *
8377dd8813SKowalski, Kamil  * @param[in]  fieldName   Name of requested field
8477dd8813SKowalski, Kamil  * @param[in]  json        JSON object from which field should be extracted
8577dd8813SKowalski, Kamil  * @param[out] output      Variable to which extracted will be written in case
8677dd8813SKowalski, Kamil  *                         of success
8777dd8813SKowalski, Kamil  *
8877dd8813SKowalski, Kamil  * @return Result informing about operation status, output will be
8977dd8813SKowalski, Kamil  *         written only in case of Result::SUCCESS
9077dd8813SKowalski, Kamil  */
9177dd8813SKowalski, Kamil Result getArray(const char* fieldName, const nlohmann::json& json,
9277dd8813SKowalski, Kamil                 nlohmann::json* output);
9377dd8813SKowalski, Kamil 
9477dd8813SKowalski, Kamil /**
9577dd8813SKowalski, Kamil  * @brief Wrapper function for extracting int from JSON object without
9677dd8813SKowalski, Kamil  *        throwing exceptions
9777dd8813SKowalski, Kamil  *
9877dd8813SKowalski, Kamil  * @param[in]  fieldName   Name of requested field
9977dd8813SKowalski, Kamil  * @param[in]  json        JSON object from which field should be extracted
10077dd8813SKowalski, Kamil  * @param[out] output      Variable to which extracted will be written in case
10177dd8813SKowalski, Kamil  *                         of success
10277dd8813SKowalski, Kamil  *
10377dd8813SKowalski, Kamil  * @return Result informing about operation status, output will be
10477dd8813SKowalski, Kamil  *         written only in case of Result::SUCCESS
10577dd8813SKowalski, Kamil  */
10677dd8813SKowalski, Kamil Result getInt(const char* fieldName, const nlohmann::json& json,
10777dd8813SKowalski, Kamil               int64_t& output);
10877dd8813SKowalski, Kamil 
10977dd8813SKowalski, Kamil /**
11077dd8813SKowalski, Kamil  * @brief Wrapper function for extracting uint from JSON object without
11177dd8813SKowalski, Kamil  *        throwing exceptions
11277dd8813SKowalski, Kamil  *
11377dd8813SKowalski, Kamil  * @param[in]  fieldName   Name of requested field
11477dd8813SKowalski, Kamil  * @param[in]  json        JSON object from which field should be extracted
11577dd8813SKowalski, Kamil  * @param[out] output      Variable to which extracted will be written in case
11677dd8813SKowalski, Kamil  *                         of success
11777dd8813SKowalski, Kamil  *
11877dd8813SKowalski, Kamil  * @return Result informing about operation status, output will be
11977dd8813SKowalski, Kamil  *         written only in case of Result::SUCCESS
12077dd8813SKowalski, Kamil  */
12177dd8813SKowalski, Kamil Result getUnsigned(const char* fieldName, const nlohmann::json& json,
12277dd8813SKowalski, Kamil                    uint64_t& output);
12377dd8813SKowalski, Kamil 
12477dd8813SKowalski, Kamil /**
12577dd8813SKowalski, Kamil  * @brief Wrapper function for extracting bool from JSON object without
12677dd8813SKowalski, Kamil  *        throwing exceptions
12777dd8813SKowalski, Kamil  *
12877dd8813SKowalski, Kamil  * @param[in]  fieldName   Name of requested field
12977dd8813SKowalski, Kamil  * @param[in]  json        JSON object from which field should be extracted
13077dd8813SKowalski, Kamil  * @param[out] output      Variable to which extracted will be written in case
13177dd8813SKowalski, Kamil  *                         of success
13277dd8813SKowalski, Kamil  *
13377dd8813SKowalski, Kamil  * @return Result informing about operation status, output will be
13477dd8813SKowalski, Kamil  *         written only in case of Result::SUCCESS
13577dd8813SKowalski, Kamil  */
13677dd8813SKowalski, Kamil Result getBool(const char* fieldName, const nlohmann::json& json, bool& output);
13777dd8813SKowalski, Kamil 
13877dd8813SKowalski, Kamil /**
13977dd8813SKowalski, Kamil  * @brief Wrapper function for extracting float from JSON object without
14077dd8813SKowalski, Kamil  *        throwing exceptions (nlohmann stores JSON floats as C++ doubles)
14177dd8813SKowalski, Kamil  *
14277dd8813SKowalski, Kamil  * @param[in]  fieldName   Name of requested field
14377dd8813SKowalski, Kamil  * @param[in]  json        JSON object from which field should be extracted
14477dd8813SKowalski, Kamil  * @param[out] output      Variable to which extracted will be written in case
14577dd8813SKowalski, Kamil  *                         of success
14677dd8813SKowalski, Kamil  *
14777dd8813SKowalski, Kamil  * @return Result informing about operation status, output will be
14877dd8813SKowalski, Kamil  *         written only in case of Result::SUCCESS
14977dd8813SKowalski, Kamil  */
15077dd8813SKowalski, Kamil Result getDouble(const char* fieldName, const nlohmann::json& json,
15177dd8813SKowalski, Kamil                  double& output);
15277dd8813SKowalski, Kamil 
15377dd8813SKowalski, Kamil /**
15477dd8813SKowalski, Kamil  * @brief Wrapper function for extracting string from JSON object without
15577dd8813SKowalski, Kamil  *        throwing exceptions
15677dd8813SKowalski, Kamil  *
15777dd8813SKowalski, Kamil  * @param[in]  fieldName   Name of requested field
15877dd8813SKowalski, Kamil  * @param[in]  json        JSON object from which field should be extracted
15977dd8813SKowalski, Kamil  * @param[out] output      Variable to which extracted will be written in case
16077dd8813SKowalski, Kamil  *                         of success
16177dd8813SKowalski, Kamil  * @param[in]  msgCfgMap   Map for message addition settings
16277dd8813SKowalski, Kamil  * @param[out] msgJson     JSON to which error messages will be added
16377dd8813SKowalski, Kamil  * @param[in]  fieldPath   Field path in JSON
16477dd8813SKowalski, Kamil  *
16577dd8813SKowalski, Kamil  * @return Result informing about operation status, output will be
16677dd8813SKowalski, Kamil  *         written only in case of Result::SUCCESS
16777dd8813SKowalski, Kamil  */
16877dd8813SKowalski, Kamil Result getString(const char* fieldName, const nlohmann::json& json,
16977dd8813SKowalski, Kamil                  const std::string*& output, uint8_t msgCfgMap,
17077dd8813SKowalski, Kamil                  nlohmann::json& msgJson, const std::string&& fieldPath);
17177dd8813SKowalski, Kamil 
17277dd8813SKowalski, Kamil /**
17377dd8813SKowalski, Kamil  * @brief Wrapper function for extracting object from JSON object without
17477dd8813SKowalski, Kamil  *        throwing exceptions
17577dd8813SKowalski, Kamil  *
17677dd8813SKowalski, Kamil  * @param[in]  fieldName   Name of requested field
17777dd8813SKowalski, Kamil  * @param[in]  json        JSON object from which field should be extracted
17877dd8813SKowalski, Kamil  * @param[out] output      Variable to which extracted will be written in case
17977dd8813SKowalski, Kamil  *                         of success
18077dd8813SKowalski, Kamil  * @param[in]  msgCfgMap   Map for message addition settings
18177dd8813SKowalski, Kamil  * @param[out] msgJson     JSON to which error messages will be added
18277dd8813SKowalski, Kamil  * @param[in]  fieldPath   Field path in JSON
18377dd8813SKowalski, Kamil  *
18477dd8813SKowalski, Kamil  * @return Result informing about operation status, output will be
18577dd8813SKowalski, Kamil  *         written only in case of Result::SUCCESS
18677dd8813SKowalski, Kamil  */
18777dd8813SKowalski, Kamil Result getObject(const char* fieldName, const nlohmann::json& json,
18877dd8813SKowalski, Kamil                  nlohmann::json* output, uint8_t msgCfgMap,
18977dd8813SKowalski, Kamil                  nlohmann::json& msgJson, const std::string&& fieldPath);
19077dd8813SKowalski, Kamil 
19177dd8813SKowalski, Kamil /**
19277dd8813SKowalski, Kamil  * @brief Wrapper function for extracting array from JSON object without
19377dd8813SKowalski, Kamil  *        throwing exceptions
19477dd8813SKowalski, Kamil  *
19577dd8813SKowalski, Kamil  * @param[in]  fieldName   Name of requested field
19677dd8813SKowalski, Kamil  * @param[in]  json        JSON object from which field should be extracted
19777dd8813SKowalski, Kamil  * @param[out] output      Variable to which extracted will be written in case
19877dd8813SKowalski, Kamil  *                         of success
19977dd8813SKowalski, Kamil  * @param[in]  msgCfgMap   Map for message addition settings
20077dd8813SKowalski, Kamil  * @param[out] msgJson     JSON to which error messages will be added
20177dd8813SKowalski, Kamil  * @param[in]  fieldPath   Field path in JSON
20277dd8813SKowalski, Kamil  *
20377dd8813SKowalski, Kamil  * @return Result informing about operation status, output will be
20477dd8813SKowalski, Kamil  *         written only in case of Result::SUCCESS
20577dd8813SKowalski, Kamil  */
20677dd8813SKowalski, Kamil Result getArray(const char* fieldName, const nlohmann::json& json,
20777dd8813SKowalski, Kamil                 nlohmann::json* output, uint8_t msgCfgMap,
20877dd8813SKowalski, Kamil                 nlohmann::json& msgJson, const std::string&& fieldPath);
20977dd8813SKowalski, Kamil 
21077dd8813SKowalski, Kamil /**
21177dd8813SKowalski, Kamil  * @brief Wrapper function for extracting int from JSON object without
21277dd8813SKowalski, Kamil  *        throwing exceptions
21377dd8813SKowalski, Kamil  *
21477dd8813SKowalski, Kamil  * @param[in]  fieldName   Name of requested field
21577dd8813SKowalski, Kamil  * @param[in]  json        JSON object from which field should be extracted
21677dd8813SKowalski, Kamil  * @param[out] output      Variable to which extracted will be written in case
21777dd8813SKowalski, Kamil  *                         of success
21877dd8813SKowalski, Kamil  * @param[in]  msgCfgMap   Map for message addition settings
21977dd8813SKowalski, Kamil  * @param[out] msgJson     JSON to which error messages will be added
22077dd8813SKowalski, Kamil  * @param[in]  fieldPath   Field path in JSON
22177dd8813SKowalski, Kamil  *
22277dd8813SKowalski, Kamil  * @return Result informing about operation status, output will be
22377dd8813SKowalski, Kamil  *         written only in case of Result::SUCCESS
22477dd8813SKowalski, Kamil  */
22577dd8813SKowalski, Kamil Result getInt(const char* fieldName, const nlohmann::json& json,
22677dd8813SKowalski, Kamil               int64_t& output, uint8_t msgCfgMap, nlohmann::json& msgJson,
22777dd8813SKowalski, Kamil               const std::string&& fieldPath);
22877dd8813SKowalski, Kamil 
22977dd8813SKowalski, Kamil /**
23077dd8813SKowalski, Kamil  * @brief Wrapper function for extracting uint from JSON object without
23177dd8813SKowalski, Kamil  *        throwing exceptions
23277dd8813SKowalski, Kamil  *
23377dd8813SKowalski, Kamil  * @param[in]  fieldName   Name of requested field
23477dd8813SKowalski, Kamil  * @param[in]  json        JSON object from which field should be extracted
23577dd8813SKowalski, Kamil  * @param[out] output      Variable to which extracted will be written in case
23677dd8813SKowalski, Kamil  *                         of success
23777dd8813SKowalski, Kamil  * @param[in]  msgCfgMap   Map for message addition settings
23877dd8813SKowalski, Kamil  * @param[out] msgJson     JSON to which error messages will be added
23977dd8813SKowalski, Kamil  * @param[in]  fieldPath   Field path in JSON
24077dd8813SKowalski, Kamil  *
24177dd8813SKowalski, Kamil  * @return Result informing about operation status, output will be
24277dd8813SKowalski, Kamil  *         written only in case of Result::SUCCESS
24377dd8813SKowalski, Kamil  */
24477dd8813SKowalski, Kamil Result getUnsigned(const char* fieldName, const nlohmann::json& json,
24577dd8813SKowalski, Kamil                    uint64_t& output, uint8_t msgCfgMap, nlohmann::json& msgJson,
24677dd8813SKowalski, Kamil                    const std::string&& fieldPath);
24777dd8813SKowalski, Kamil 
24877dd8813SKowalski, Kamil /**
24977dd8813SKowalski, Kamil  * @brief Wrapper function for extracting bool from JSON object without
25077dd8813SKowalski, Kamil  *        throwing exceptions
25177dd8813SKowalski, Kamil  *
25277dd8813SKowalski, Kamil  * @param[in]  fieldName   Name of requested field
25377dd8813SKowalski, Kamil  * @param[in]  json        JSON object from which field should be extracted
25477dd8813SKowalski, Kamil  * @param[out] output      Variable to which extracted will be written in case
25577dd8813SKowalski, Kamil  *                         of success
25677dd8813SKowalski, Kamil  * @param[in]  msgCfgMap   Map for message addition settings
25777dd8813SKowalski, Kamil  * @param[out] msgJson     JSON to which error messages will be added
25877dd8813SKowalski, Kamil  * @param[in]  fieldPath   Field path in JSON
25977dd8813SKowalski, Kamil  *
26077dd8813SKowalski, Kamil  * @return Result informing about operation status, output will be
26177dd8813SKowalski, Kamil  *         written only in case of Result::SUCCESS
26277dd8813SKowalski, Kamil  */
26377dd8813SKowalski, Kamil Result getBool(const char* fieldName, const nlohmann::json& json, bool& output,
26477dd8813SKowalski, Kamil                uint8_t msgCfgMap, nlohmann::json& msgJson,
26577dd8813SKowalski, Kamil                const std::string&& fieldPath);
26677dd8813SKowalski, Kamil 
26777dd8813SKowalski, Kamil /**
26877dd8813SKowalski, Kamil  * @brief Wrapper function for extracting float from JSON object without
26977dd8813SKowalski, Kamil  *        throwing exceptions (nlohmann stores JSON floats as C++ doubles)
27077dd8813SKowalski, Kamil  *
27177dd8813SKowalski, Kamil  * @param[in]  fieldName   Name of requested field
27277dd8813SKowalski, Kamil  * @param[in]  json        JSON object from which field should be extracted
27377dd8813SKowalski, Kamil  * @param[out] output      Variable to which extracted will be written in case
27477dd8813SKowalski, Kamil  * of success
27577dd8813SKowalski, Kamil  * @param[in]  msgCfgMap   Map for message addition settings
27677dd8813SKowalski, Kamil  * @param[out] msgJson     JSON to which error messages will be added
27777dd8813SKowalski, Kamil  * @param[in]  fieldPath   Field path in JSON
27877dd8813SKowalski, Kamil  *
27977dd8813SKowalski, Kamil  * @return Result informing about operation status, output will be
28077dd8813SKowalski, Kamil  *         written only in case of Result::SUCCESS
28177dd8813SKowalski, Kamil  */
28277dd8813SKowalski, Kamil Result getDouble(const char* fieldName, const nlohmann::json& json,
28377dd8813SKowalski, Kamil                  double& output, uint8_t msgCfgMap, nlohmann::json& msgJson,
28477dd8813SKowalski, Kamil                  const std::string&& fieldPath);
28577dd8813SKowalski, Kamil 
28677dd8813SKowalski, Kamil /**
28777dd8813SKowalski, Kamil  * @brief Processes request to extract JSON from its body. If it fails, adds
28877dd8813SKowalski, Kamil  *       MalformedJSON message to response and ends it.
28977dd8813SKowalski, Kamil  *
29077dd8813SKowalski, Kamil  * @param[io]  res       Response object
29177dd8813SKowalski, Kamil  * @param[in]  req       Request object
29277dd8813SKowalski, Kamil  * @param[out] reqJson   JSON object extracted from request's body
29377dd8813SKowalski, Kamil  *
29477dd8813SKowalski, Kamil  * @return true if JSON is valid, false when JSON is invalid and response has
29577dd8813SKowalski, Kamil  *         been filled with message and ended.
29677dd8813SKowalski, Kamil  */
29755c7b7a2SEd Tanous bool processJsonFromRequest(crow::Response& res, const crow::Request& req,
29877dd8813SKowalski, Kamil                             nlohmann::json& reqJson);
29977dd8813SKowalski, Kamil 
30077dd8813SKowalski, Kamil } // namespace json_util
30177dd8813SKowalski, Kamil 
30277dd8813SKowalski, Kamil } // namespace redfish
303