mirror of
https://github.com/oatpp/oatpp.git
synced 2025-01-18 16:43:57 +08:00
ApiController. Integrate oatpp::Enum with ApiController.
This commit is contained in:
parent
48c1fcce05
commit
a124a5c510
@ -74,7 +74,7 @@ if(!__param_str_val_##NAME){ \
|
|||||||
return ApiController::handleError(Status::CODE_400, "Missing HEADER parameter '" #NAME "'"); \
|
return ApiController::handleError(Status::CODE_400, "Missing HEADER parameter '" #NAME "'"); \
|
||||||
} \
|
} \
|
||||||
bool __param_validation_check_##NAME; \
|
bool __param_validation_check_##NAME; \
|
||||||
const auto& NAME = parseParameterFromString<TYPE>(#TYPE, __param_str_val_##NAME, __param_validation_check_##NAME); \
|
const auto& NAME = ApiController::TypeInterpretation<TYPE>::fromString(#TYPE, __param_str_val_##NAME, __param_validation_check_##NAME); \
|
||||||
if(!__param_validation_check_##NAME){ \
|
if(!__param_validation_check_##NAME){ \
|
||||||
return ApiController::handleError(Status::CODE_400, "Invalid HEADER parameter '" #NAME "'. Expected type is '" #TYPE "'"); \
|
return ApiController::handleError(Status::CODE_400, "Invalid HEADER parameter '" #NAME "'. Expected type is '" #TYPE "'"); \
|
||||||
}
|
}
|
||||||
@ -86,7 +86,7 @@ if(!__param_str_val_##NAME){ \
|
|||||||
oatpp::String("Missing HEADER parameter '") + QUALIFIER + "'"); \
|
oatpp::String("Missing HEADER parameter '") + QUALIFIER + "'"); \
|
||||||
} \
|
} \
|
||||||
bool __param_validation_check_##NAME; \
|
bool __param_validation_check_##NAME; \
|
||||||
const auto& NAME = parseParameterFromString<TYPE>(#TYPE, __param_str_val_##NAME, __param_validation_check_##NAME); \
|
const auto& NAME = ApiController::TypeInterpretation<TYPE>::fromString(#TYPE, __param_str_val_##NAME, __param_validation_check_##NAME); \
|
||||||
if(!__param_validation_check_##NAME){ \
|
if(!__param_validation_check_##NAME){ \
|
||||||
return ApiController::handleError(Status::CODE_400, \
|
return ApiController::handleError(Status::CODE_400, \
|
||||||
oatpp::String("Invalid HEADER parameter '") + \
|
oatpp::String("Invalid HEADER parameter '") + \
|
||||||
@ -117,7 +117,7 @@ if(!__param_str_val_##NAME){ \
|
|||||||
return ApiController::handleError(Status::CODE_400, "Missing PATH parameter '" #NAME "'"); \
|
return ApiController::handleError(Status::CODE_400, "Missing PATH parameter '" #NAME "'"); \
|
||||||
} \
|
} \
|
||||||
bool __param_validation_check_##NAME; \
|
bool __param_validation_check_##NAME; \
|
||||||
const auto& NAME = parseParameterFromString<TYPE>(#TYPE, __param_str_val_##NAME, __param_validation_check_##NAME); \
|
const auto& NAME = ApiController::TypeInterpretation<TYPE>::fromString(#TYPE, __param_str_val_##NAME, __param_validation_check_##NAME); \
|
||||||
if(!__param_validation_check_##NAME){ \
|
if(!__param_validation_check_##NAME){ \
|
||||||
return ApiController::handleError(Status::CODE_400, "Invalid PATH parameter '" #NAME "'. Expected type is '" #TYPE "'"); \
|
return ApiController::handleError(Status::CODE_400, "Invalid PATH parameter '" #NAME "'. Expected type is '" #TYPE "'"); \
|
||||||
}
|
}
|
||||||
@ -129,7 +129,7 @@ if(!__param_str_val_##NAME){ \
|
|||||||
oatpp::String("Missing PATH parameter '") + QUALIFIER + "'"); \
|
oatpp::String("Missing PATH parameter '") + QUALIFIER + "'"); \
|
||||||
} \
|
} \
|
||||||
bool __param_validation_check_##NAME; \
|
bool __param_validation_check_##NAME; \
|
||||||
const auto NAME = parseParameterFromString<TYPE>(#TYPE, __param_str_val_##NAME, __param_validation_check_##NAME); \
|
const auto NAME = ApiController::TypeInterpretation<TYPE>::fromString(#TYPE, __param_str_val_##NAME, __param_validation_check_##NAME); \
|
||||||
if(!__param_validation_check_##NAME){ \
|
if(!__param_validation_check_##NAME){ \
|
||||||
return ApiController::handleError(Status::CODE_400, \
|
return ApiController::handleError(Status::CODE_400, \
|
||||||
oatpp::String("Invalid PATH parameter '") + \
|
oatpp::String("Invalid PATH parameter '") + \
|
||||||
@ -166,7 +166,7 @@ if(!__param_str_val_##NAME){ \
|
|||||||
return ApiController::handleError(Status::CODE_400, "Missing QUERY parameter '" #NAME "'"); \
|
return ApiController::handleError(Status::CODE_400, "Missing QUERY parameter '" #NAME "'"); \
|
||||||
} \
|
} \
|
||||||
bool __param_validation_check_##NAME; \
|
bool __param_validation_check_##NAME; \
|
||||||
const auto& NAME = parseParameterFromString<TYPE>(#TYPE, __param_str_val_##NAME, __param_validation_check_##NAME); \
|
const auto& NAME = ApiController::TypeInterpretation<TYPE>::fromString(#TYPE, __param_str_val_##NAME, __param_validation_check_##NAME); \
|
||||||
if(!__param_validation_check_##NAME){ \
|
if(!__param_validation_check_##NAME){ \
|
||||||
return ApiController::handleError(Status::CODE_400, "Invalid QUERY parameter '" #NAME "'. Expected type is '" #TYPE "'"); \
|
return ApiController::handleError(Status::CODE_400, "Invalid QUERY parameter '" #NAME "'. Expected type is '" #TYPE "'"); \
|
||||||
}
|
}
|
||||||
@ -178,7 +178,7 @@ if(!__param_str_val_##NAME){ \
|
|||||||
oatpp::String("Missing QUERY parameter '") + QUALIFIER + "'"); \
|
oatpp::String("Missing QUERY parameter '") + QUALIFIER + "'"); \
|
||||||
} \
|
} \
|
||||||
bool __param_validation_check_##NAME; \
|
bool __param_validation_check_##NAME; \
|
||||||
const auto& NAME = parseParameterFromString<TYPE>(#TYPE, __param_str_val_##NAME, __param_validation_check_##NAME); \
|
const auto& NAME = ApiController::TypeInterpretation<TYPE>::fromString(#TYPE, __param_str_val_##NAME, __param_validation_check_##NAME); \
|
||||||
if(!__param_validation_check_##NAME){ \
|
if(!__param_validation_check_##NAME){ \
|
||||||
return ApiController::handleError(Status::CODE_400, \
|
return ApiController::handleError(Status::CODE_400, \
|
||||||
oatpp::String("Invalid QUERY parameter '") + \
|
oatpp::String("Invalid QUERY parameter '") + \
|
||||||
|
@ -133,6 +133,8 @@ protected:
|
|||||||
|
|
||||||
template<class T, bool notnull>
|
template<class T, bool notnull>
|
||||||
class EnumInterpreterAsString {
|
class EnumInterpreterAsString {
|
||||||
|
public:
|
||||||
|
typedef String UnderlyingTypeObjectWrapper;
|
||||||
public:
|
public:
|
||||||
template <bool N>
|
template <bool N>
|
||||||
using InterpreterType = EnumInterpreterAsString<T, N>;
|
using InterpreterType = EnumInterpreterAsString<T, N>;
|
||||||
@ -146,6 +148,10 @@ public:
|
|||||||
|
|
||||||
template<class T, bool notnull>
|
template<class T, bool notnull>
|
||||||
class EnumInterpreterAsInteger {
|
class EnumInterpreterAsInteger {
|
||||||
|
private:
|
||||||
|
typedef typename std::underlying_type<T>::type EnumUnderlyingType;
|
||||||
|
public:
|
||||||
|
typedef typename ObjectWrapperByUnderlyingType<EnumUnderlyingType>::ObjectWrapper UnderlyingTypeObjectWrapper;
|
||||||
public:
|
public:
|
||||||
template <bool N>
|
template <bool N>
|
||||||
using InterpreterType = EnumInterpreterAsInteger<T, N>;
|
using InterpreterType = EnumInterpreterAsInteger<T, N>;
|
||||||
|
@ -450,91 +450,140 @@ public:
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
T parseParameterFromString(const oatpp::String& typeName, const oatpp::String& text, bool& success) {
|
struct TypeInterpretation {
|
||||||
(void) text;
|
|
||||||
success = false;
|
static T fromString(const oatpp::String& typeName, const oatpp::String& text, bool& success) {
|
||||||
OATPP_LOGE("[oatpp::web::server::api::ApiController::parseParameterFromString()]",
|
(void) text;
|
||||||
"Error. No conversion from '%s' to '%s' is defined.", "oatpp::String", typeName->getData());
|
success = false;
|
||||||
throw std::runtime_error("[oatpp::web::server::api::ApiController::parseParameterFromString()]: Error. "
|
OATPP_LOGE("[oatpp::web::server::api::ApiController::TypeInterpretation::fromString()]",
|
||||||
"No conversion from 'oatpp::String' to '" + typeName->std_str() + "' is defined. "
|
"Error. No conversion from '%s' to '%s' is defined.", "oatpp::String", typeName->getData());
|
||||||
"Please define type conversion.");
|
throw std::runtime_error("[oatpp::web::server::api::ApiController::TypeInterpretation::fromString()]: Error. "
|
||||||
}
|
"No conversion from 'oatpp::String' to '" + typeName->std_str() + "' is defined. "
|
||||||
|
"Please define type conversion.");
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct TypeInterpretation <oatpp::String> {
|
||||||
|
static oatpp::String fromString(const oatpp::String& typeName, const oatpp::String& text, bool& success) {
|
||||||
|
(void) typeName;
|
||||||
|
success = true;
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct TypeInterpretation <oatpp::Int8> {
|
||||||
|
static oatpp::Int8 fromString(const oatpp::String& typeName, const oatpp::String& text, bool& success) {
|
||||||
|
(void) typeName;
|
||||||
|
return utils::conversion::strToInt32(text, success);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct TypeInterpretation <oatpp::UInt8> {
|
||||||
|
static oatpp::UInt8 fromString(const oatpp::String& typeName, const oatpp::String& text, bool& success) {
|
||||||
|
(void) typeName;
|
||||||
|
return utils::conversion::strToUInt32(text, success);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct TypeInterpretation <oatpp::Int16> {
|
||||||
|
static oatpp::Int16 fromString(const oatpp::String& typeName, const oatpp::String& text, bool& success) {
|
||||||
|
(void) typeName;
|
||||||
|
return utils::conversion::strToInt32(text, success);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct TypeInterpretation <oatpp::UInt16> {
|
||||||
|
static oatpp::UInt16 fromString(const oatpp::String& typeName, const oatpp::String& text, bool& success) {
|
||||||
|
(void) typeName;
|
||||||
|
return utils::conversion::strToUInt32(text, success);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct TypeInterpretation <oatpp::Int32> {
|
||||||
|
static oatpp::Int32 fromString(const oatpp::String& typeName, const oatpp::String& text, bool& success) {
|
||||||
|
(void) typeName;
|
||||||
|
return utils::conversion::strToInt32(text, success);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct TypeInterpretation <oatpp::UInt32> {
|
||||||
|
static oatpp::UInt32 fromString(const oatpp::String& typeName, const oatpp::String& text, bool& success) {
|
||||||
|
(void) typeName;
|
||||||
|
return utils::conversion::strToUInt32(text, success);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct TypeInterpretation <oatpp::Int64> {
|
||||||
|
static oatpp::Int64 fromString(const oatpp::String& typeName, const oatpp::String& text, bool& success) {
|
||||||
|
(void) typeName;
|
||||||
|
return utils::conversion::strToInt64(text, success);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct TypeInterpretation <oatpp::UInt64> {
|
||||||
|
static oatpp::UInt64 fromString(const oatpp::String& typeName, const oatpp::String& text, bool& success) {
|
||||||
|
(void) typeName;
|
||||||
|
return utils::conversion::strToUInt64(text, success);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct TypeInterpretation <oatpp::Float32> {
|
||||||
|
static oatpp::Float32 fromString(const oatpp::String& typeName, const oatpp::String& text, bool& success) {
|
||||||
|
(void) typeName;
|
||||||
|
return utils::conversion::strToFloat32(text, success);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct TypeInterpretation <oatpp::Float64> {
|
||||||
|
static oatpp::Float64 fromString(const oatpp::String& typeName, const oatpp::String& text, bool& success) {
|
||||||
|
(void) typeName;
|
||||||
|
return utils::conversion::strToFloat64(text, success);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct TypeInterpretation <oatpp::Boolean> {
|
||||||
|
static oatpp::Boolean fromString(const oatpp::String& typeName, const oatpp::String& text, bool& success) {
|
||||||
|
(void) typeName;
|
||||||
|
return utils::conversion::strToBool(text, success);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<class T, class I>
|
||||||
|
struct TypeInterpretation <data::mapping::type::EnumObjectWrapper<T, I>> {
|
||||||
|
|
||||||
|
typedef data::mapping::type::EnumObjectWrapper<T, I> EnumOW;
|
||||||
|
typedef typename I::UnderlyingTypeObjectWrapper UTOW;
|
||||||
|
|
||||||
|
static EnumOW fromString(const oatpp::String& typeName, const oatpp::String& text, bool& success) {
|
||||||
|
const auto& parsedValue = ApiController::TypeInterpretation<UTOW>::fromString(typeName, text, success);
|
||||||
|
if(success) {
|
||||||
|
data::mapping::type::EnumInterpreterError error = data::mapping::type::EnumInterpreterError::OK;
|
||||||
|
const auto& result = I::fromInterpretation(parsedValue, error);
|
||||||
|
if(error == data::mapping::type::EnumInterpreterError::OK) {
|
||||||
|
return result.template staticCast<EnumOW>();
|
||||||
|
}
|
||||||
|
success = false;
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template<>
|
|
||||||
inline oatpp::String ApiController::parseParameterFromString(const oatpp::String& typeName, const oatpp::String& text, bool& success) {
|
|
||||||
(void) typeName;
|
|
||||||
success = true;
|
|
||||||
return text;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<>
|
|
||||||
inline oatpp::Int8 ApiController::parseParameterFromString(const oatpp::String& typeName, const oatpp::String& text, bool& success) {
|
|
||||||
(void) typeName;
|
|
||||||
return utils::conversion::strToInt32(text, success);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<>
|
|
||||||
inline oatpp::UInt8 ApiController::parseParameterFromString(const oatpp::String& typeName, const oatpp::String& text, bool& success) {
|
|
||||||
(void) typeName;
|
|
||||||
return utils::conversion::strToUInt32(text, success);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<>
|
|
||||||
inline oatpp::Int16 ApiController::parseParameterFromString(const oatpp::String& typeName, const oatpp::String& text, bool& success) {
|
|
||||||
(void) typeName;
|
|
||||||
return utils::conversion::strToInt32(text, success);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<>
|
|
||||||
inline oatpp::UInt16 ApiController::parseParameterFromString(const oatpp::String& typeName, const oatpp::String& text, bool& success) {
|
|
||||||
(void) typeName;
|
|
||||||
return utils::conversion::strToUInt32(text, success);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<>
|
|
||||||
inline oatpp::Int32 ApiController::parseParameterFromString(const oatpp::String& typeName, const oatpp::String& text, bool& success) {
|
|
||||||
(void) typeName;
|
|
||||||
return utils::conversion::strToInt32(text, success);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<>
|
|
||||||
inline oatpp::UInt32 ApiController::parseParameterFromString(const oatpp::String& typeName, const oatpp::String& text, bool& success) {
|
|
||||||
(void) typeName;
|
|
||||||
return utils::conversion::strToUInt32(text, success);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<>
|
|
||||||
inline oatpp::Int64 ApiController::parseParameterFromString(const oatpp::String& typeName, const oatpp::String& text, bool& success) {
|
|
||||||
(void) typeName;
|
|
||||||
return utils::conversion::strToInt64(text, success);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<>
|
|
||||||
inline oatpp::UInt64 ApiController::parseParameterFromString(const oatpp::String& typeName, const oatpp::String& text, bool& success) {
|
|
||||||
(void) typeName;
|
|
||||||
return utils::conversion::strToUInt64(text, success);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<>
|
|
||||||
inline oatpp::Float32 ApiController::parseParameterFromString(const oatpp::String& typeName, const oatpp::String& text, bool& success) {
|
|
||||||
(void) typeName;
|
|
||||||
return utils::conversion::strToFloat32(text, success);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<>
|
|
||||||
inline oatpp::Float64 ApiController::parseParameterFromString(const oatpp::String& typeName, const oatpp::String& text, bool& success) {
|
|
||||||
(void) typeName;
|
|
||||||
return utils::conversion::strToFloat64(text, success);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<>
|
|
||||||
inline oatpp::Boolean ApiController::parseParameterFromString(const oatpp::String& typeName, const oatpp::String& text, bool& success) {
|
|
||||||
(void) typeName;
|
|
||||||
return utils::conversion::strToBool(text, success);
|
|
||||||
}
|
|
||||||
|
|
||||||
}}}}
|
}}}}
|
||||||
|
|
||||||
#endif /* oatpp_web_server_rest_Controller_hpp */
|
#endif /* oatpp_web_server_rest_Controller_hpp */
|
||||||
|
@ -282,6 +282,12 @@ public:
|
|||||||
return createResponse(Status::CODE_200, "OK");
|
return createResponse(Status::CODE_200, "OK");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ENDPOINT("GET", "enum/{enum}", testEnum,
|
||||||
|
PATH(oatpp::Enum<AllowedPathParams>::AsInteger, enumValue, "enum"))
|
||||||
|
{
|
||||||
|
return createResponse(Status::CODE_200, "OK");
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -42,6 +42,11 @@ class TestDto : public oatpp::data::mapping::type::Object {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ENUM(AllowedPathParams, v_int32,
|
||||||
|
VALUE(HELLO, 100, "hello"),
|
||||||
|
VALUE(WORLD, 200, "world")
|
||||||
|
)
|
||||||
|
|
||||||
#include OATPP_CODEGEN_END(DTO)
|
#include OATPP_CODEGEN_END(DTO)
|
||||||
|
|
||||||
}}}}
|
}}}}
|
||||||
|
Loading…
Reference in New Issue
Block a user