diff options
Diffstat (limited to 'modules')
-rw-r--r-- | modules/codec/c++/interface.hpp | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/modules/codec/c++/interface.hpp b/modules/codec/c++/interface.hpp index 19dc145..f77c05f 100644 --- a/modules/codec/c++/interface.hpp +++ b/modules/codec/c++/interface.hpp @@ -3,25 +3,42 @@ #include <functional> #include <forstio/error.hpp> + #include "schema.hpp" #include "data.hpp" namespace saw { -template<typename SchemaFunc, typename Encode> +template<typename SchemaFunc, typename Encode, typename Context = void_t > class function; +namespace impl { +template<typename Request, typename Response, typename Encode, typename Ctx> +struct FuncTypeHelper { + using Type = std::function<data<Response, Encode>(data<Request, Encode>, Ctx)>; +}; + template<typename Request, typename Response, typename Encode> -class function<schema::Function<Request, Response>, Encode> { +struct FuncTypeHelper<Request, Response, Encode, void_t> { + using Type = std::function<data<Response, Encode>(data<Request, Encode>)>; +}; +} + +template<typename Request, typename Response, typename Encode, typename Context> +class function<schema::Function<Request, Response>, Encode, Context> { private: - std::function<data<Response, Encode>(data<Request, Encode>)> func_; + typename impl::FuncTypeHelper<Request, Response, Encode, Context>::Type func_; public: template<typename Func> function(Func func): func_{std::move(func)} {} - error_or<data<Response, Encode>> call(data<Request, Encode> req){ + error_or<data<Response, Encode>> call(data<Request, Encode> req, Context ctx = {}){ + if constexpr (std::is_same_v<Context, void_t>){ return func_(std::move(req)); + } else { + return func_(std::move(req), ctx); + } } }; |