6#include "Stroika/Foundation/IO/Network/HTTP/ClientErrorException.h"
8#include "Stroika/Frameworks/WebService/Server/Basic.h"
10namespace Stroika::Frameworks::WebService::Server::VariantValue {
17 namespace STROIKA_PRIVATE_ {
19 template <
typename IGNORED_F_RETURN_TYPE>
20 inline auto mkArgsTuple_ (
const Iterable<VariantValue>& variantValueArgs,
const DataExchange::ObjectVariantMapper& objVarMapper,
21 [[maybe_unused]]
const function<IGNORED_F_RETURN_TYPE (
void)>& f)
23 Require (variantValueArgs.size () == 0);
26 template <
typename IGNORED_F_RETURN_TYPE,
typename SINGLE_ARG>
27 inline auto mkArgsTuple_ (
const Iterable<VariantValue>& variantValueArgs,
const DataExchange::ObjectVariantMapper& objVarMapper,
28 [[maybe_unused]]
const function<IGNORED_F_RETURN_TYPE (SINGLE_ARG)>& f)
30 Require (variantValueArgs.size () == 1);
31 return make_tuple (objVarMapper.ToObject<SINGLE_ARG> (variantValueArgs.Nth (0)));
33 template <
typename IGNORED_F_RETURN_TYPE,
typename ARG_FIRST,
typename... REST_ARG_TYPES>
34 inline auto mkArgsTuple_ (
const Iterable<VariantValue>& variantValueArgs,
const DataExchange::ObjectVariantMapper& objVarMapper,
35 [[maybe_unused]]
const function<IGNORED_F_RETURN_TYPE (ARG_FIRST, REST_ARG_TYPES...)>& f)
37 Require (variantValueArgs.size () ==
sizeof...(REST_ARG_TYPES) + 1);
38 return tuple_cat (mkArgsTuple_ (variantValueArgs.Take (1), objVarMapper, function<IGNORED_F_RETURN_TYPE (ARG_FIRST)>{}),
39 mkArgsTuple_ (variantValueArgs.Skip (1), objVarMapper, function<IGNORED_F_RETURN_TYPE (REST_ARG_TYPES...)>{}));
42 template <
typename RETURN_TYPE,
typename... ARG_TYPES>
43 VariantValue ApplyArgs (
const Sequence<VariantValue>& variantValueArgs,
const DataExchange::ObjectVariantMapper& objVarMapper,
44 const function<RETURN_TYPE (ARG_TYPES...)>& f)
46 using IO::Network::HTTP::ClientErrorException;
47 Require (variantValueArgs.size () ==
sizeof...(ARG_TYPES));
49 auto&& args = ClientErrorException::TreatExceptionsAsClientError (
50 [&] () {
return STROIKA_PRIVATE_::mkArgsTuple_ (variantValueArgs, objVarMapper, f); });
51 if constexpr (same_as<RETURN_TYPE, void>) {
53 return VariantValue{};
56 return objVarMapper.FromObject (apply (f, args));
59 template <
typename RETURN_TYPE,
typename... ARG_TYPES>
60 VariantValue ApplyArgs (
const Mapping<String, VariantValue>& variantValueArgs,
const DataExchange::ObjectVariantMapper& objVarMapper,
61 const Traversal::Iterable<String>& paramNames,
const function<RETURN_TYPE (ARG_TYPES...)>& f)
63 Sequence<VariantValue> vvs;
64 for (
const auto& i : paramNames) {
65 vvs += variantValueArgs.LookupValue (i);
67 return ApplyArgs (vvs, objVarMapper, f);
75 inline Mapping<String, VariantValue> PickoutParamValuesFromBody (Request& request)
77 return PickoutParamValuesFromBody (request.GetBody (), request.contentType ());
85 inline Mapping<String, VariantValue> PickoutParamValuesFromURL (
const Request& request)
87 return PickoutParamValuesFromURL (request.url ());
95 inline Sequence<VariantValue> OrderParamValues (
const Iterable<String>& paramNames, Request& request)
97 return OrderParamValues (paramNames, PickoutParamValues (request));
105 inline void WriteResponse ([[maybe_unused]] Response& response, [[maybe_unused]]
const WebServiceMethodDescription& webServiceDescription)
117 template <
typename RETURN_TYPE>
118 inline void CallFAndWriteConvertedResponse_ (Response* response,
const WebServiceMethodDescription& webServiceDescription,
120 const function<RETURN_TYPE ()>& f, enable_if_t<!same_as<RETURN_TYPE, void>>* = 0)
122 WriteResponse (*response, webServiceDescription, objVarMapper.
FromObject (forward<RETURN_TYPE> (f ())));
124 template <
typename RETURN_TYPE>
125 inline void CallFAndWriteConvertedResponse_ (Response* response,
const WebServiceMethodDescription& webServiceDescription,
127 const function<RETURN_TYPE ()>& f, enable_if_t<same_as<RETURN_TYPE, void>>* = 0)
130 WriteResponse (*response, webServiceDescription);
133 template <
typename RETURN_TYPE,
typename... IN_ARGS>
134 [[deprecated (
"Since Stroika v3.0d12 ")]]
inline void
135 CallFAndWriteConvertedResponse (Response* response,
const WebServiceMethodDescription& webServiceDescription,
138 PRIVATE_::CallFAndWriteConvertedResponse_ (response, webServiceDescription, objVarMapper,
139 function<RETURN_TYPE ()>{bind<RETURN_TYPE> (f, forward<IN_ARGS> (inArgs)...)});
142 [[deprecated (
"Since Stroika v3.0d12 - use Request&")]]
inline Mapping<String, VariantValue> PickoutParamValuesFromBody (Request* request)
145 return PickoutParamValuesFromBody (request->GetBody (), request->contentType ());
147 [[deprecated (
"Since Stroika v3.0d12 - use Request&")]]
inline Mapping<String, VariantValue> PickoutParamValuesFromURL (
const Request* request)
150 return PickoutParamValuesFromURL (request->url ());
152 [[deprecated (
"Since Stroika v3.0d12 - use Request&")]]
inline Sequence<VariantValue> OrderParamValues (
const Iterable<String>& paramNames,
155 return OrderParamValues (paramNames, *request);
157 [[deprecated (
"Since Stroika v3.0d12 - use Response&")]]
inline void WriteResponse (Response* response,
const WebServiceMethodDescription& webServiceDescription)
159 WriteResponse (*response, webServiceDescription);
161 [[deprecated (
"Since Stroika v3.0d12 - use Response&")]]
inline void
162 WriteResponse (Response* response,
const WebServiceMethodDescription& webServiceDescription,
const Memory::BLOB& responseValue)
164 WriteResponse (*response, webServiceDescription, responseValue);
166 [[deprecated (
"Since Stroika v3.0d12 - use Response&")]]
inline void
167 WriteResponse (Response* response,
const WebServiceMethodDescription& webServiceDescription,
const VariantValue& responseValue)
169 WriteResponse (*response, webServiceDescription, responseValue);
172 [[deprecated (
"Since Stroika v3.0d12 - use Request&")]]
inline Mapping<String, DataExchange::VariantValue> PickoutParamValues (Request* request)
174 return PickoutParamValues (*request);
177 template <
typename RETURN_TYPE,
typename ARG_TYPE_COMBINED>
178 [[deprecated (
"Since v3.0d12 - use ObjectRequestHandler::Factory")]] WebServer::RequestHandler
179 mkRequestHandler (
const WebServiceMethodDescription& webServiceDescription,
const DataExchange::ObjectVariantMapper& objVarMapper,
180 const function<RETURN_TYPE (ARG_TYPE_COMBINED)>& f)
182 return [=] (WebServer::Message& m) {
183 ExpectedMethod (m.request (), webServiceDescription);
184 if constexpr (same_as<RETURN_TYPE, void>) {
185 f (objVarMapper.ToObject<ARG_TYPE_COMBINED> (CombineWebServiceArgsAsVariantValue (m.rwRequest ())));
186 WriteResponse (m.rwResponse (), webServiceDescription);
189 WriteResponse (m.rwResponse (), webServiceDescription,
190 f (objVarMapper.ToObject<ARG_TYPE_COMBINED> (CombineWebServiceArgsAsVariantValue (m.rwRequest ()))));
194 template <
typename RETURN_TYPE,
typename... IN_ARGS>
195 [[deprecated (
"Since v3.0d12 - use ObjectRequestHandler::Factory")]] WebServer::RequestHandler
196 mkRequestHandler (
const WebServiceMethodDescription& webServiceDescription,
const DataExchange::ObjectVariantMapper& objVarMapper,
197 const Traversal::Iterable<String>& paramNames,
const function<RETURN_TYPE (IN_ARGS...)>& f)
199 Require (paramNames.size () ==
sizeof...(IN_ARGS));
200 return [=] (WebServer::Message& m) {
201 ExpectedMethod (m.request (), webServiceDescription);
202 Sequence<VariantValue> args = OrderParamValues (paramNames, m.rwRequest ());
203 Assert (args.size () == paramNames.size ());
204 if constexpr (same_as<RETURN_TYPE, void>) {
205 (void)ApplyArgs (args, objVarMapper, f);
206 WriteResponse (m.rwResponse (), webServiceDescription);
209 WriteResponse (m.rwResponse (), webServiceDescription, ApplyArgs (args, objVarMapper, f));
213 template <
typename RETURN_TYPE>
214 [[deprecated (
"Since v3.0d12 - use ObjectRequestHandler::Factory")]] WebServer::RequestHandler
215 mkRequestHandler (
const WebServiceMethodDescription& webServiceDescription,
const DataExchange::ObjectVariantMapper& objVarMapper,
216 const function<RETURN_TYPE (
void)>& f)
218 return [=] (WebServer::Message& m) {
219 ExpectedMethod (m.request (), webServiceDescription);
220 if constexpr (same_as<RETURN_TYPE, void>) {
222 WriteResponse (m.rwResponse (), webServiceDescription);
225 WriteResponse (m.rwResponse (), webServiceDescription, objVarMapper.FromObject (f ()));
229 [[deprecated (
"Since v3.0d12 - use ObjectRequestHandler::Factory")]]
inline WebServer::RequestHandler
230 mkRequestHandler (
const WebServiceMethodDescription& webServiceDescription,
const function<Memory::BLOB (WebServer::Message* m)>& f)
232 return [=] (WebServer::Message& m) {
233 ExpectedMethod (m.request (), webServiceDescription);
234 if (webServiceDescription.fResponseType) {
235 m.rwResponse ().contentType = *webServiceDescription.fResponseType;
237 m.rwResponse ().write (f (&m));
#define RequireNotNull(p)
ObjectVariantMapper can be used to map C++ types to and from variant-union types, which can be transp...
nonvirtual VariantValue FromObject(const T &from) const