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