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