summaryrefslogtreecommitdiff
path: root/modules/codec
diff options
context:
space:
mode:
Diffstat (limited to 'modules/codec')
-rw-r--r--modules/codec/c++/interface.hpp25
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);
+ }
}
};