diff options
Diffstat (limited to 'modules/codec/c++/interface.hpp')
-rw-r--r-- | modules/codec/c++/interface.hpp | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/modules/codec/c++/interface.hpp b/modules/codec/c++/interface.hpp index 0f41f55..e1c9a12 100644 --- a/modules/codec/c++/interface.hpp +++ b/modules/codec/c++/interface.hpp @@ -12,28 +12,40 @@ template<typename SchemaFunc, typename Encode, typename Storage, typename Contex class function; namespace impl { +template<typename DataSchema, typename Encode, typename Storage> +struct FuncReturnTypeHelper { + using Type = data<DataSchema,Encode,Storage>; +}; + +template<typename Encode, typename Storage> +struct FuncReturnTypeHelper<schema::Void, Encode, Storage> { + using Type = void; +}; + template<typename Request, typename Response, typename Encode, typename Storage, typename Ctx> struct FuncTypeHelper { - using Type = std::function<data<Response, Encode, Storage>(data<Request, Encode, Storage>&, Ctx)>; + using Type = std::function<error_or<typename FuncReturnTypeHelper<Response,Encode,Storage>::Type>(data<Request, Encode, Storage>&, Ctx)>; }; template<typename Request, typename Response, typename Encode, typename Storage> struct FuncTypeHelper<Request, Response, Encode, Storage, void_t> { - using Type = std::function<data<Response, Encode, Storage>(data<Request, Encode, Storage>&)>; + using Type = std::function<error_or<typename FuncReturnTypeHelper<Response, Encode, Storage>::Type>(data<Request, Encode, Storage>&)>; }; + } template<typename Request, typename Response, typename Encode, typename Storage, typename Context> class function<schema::Function<Request, Response>, Encode, Storage, Context> { private: typename impl::FuncTypeHelper<Request, Response, Encode, Storage, Context>::Type func_; + using ResponseDataType = typename impl::FuncReturnTypeHelper<Response, Encode, Storage>::Type; public: template<typename Func> function(Func func): func_{std::move(func)} {} - error_or<data<Response, Encode, Storage>> call(data<Request, Encode, Storage>& req, Context ctx = {}){ + error_or<ResponseDataType> call(data<Request, Encode, Storage>& req, Context ctx = {}){ if constexpr (std::is_same_v<Context, void_t>){ (void) ctx; return func_(req); @@ -84,13 +96,13 @@ public: template<string_literal Lit> error_or< - data< + typename impl::FuncReturnTypeHelper< typename parameter_pack_type< parameter_key_pack_index< Lit, Names... >::value , Responses...>::type - , Encode, Storage>> call( + , Encode, Storage>::Type > call( data< typename parameter_pack_type< parameter_key_pack_index< |