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