summaryrefslogtreecommitdiff
path: root/modules/codec/interface.h
diff options
context:
space:
mode:
authorClaudius "keldu" Holeksa <mail@keldu.de>2023-12-04 12:18:14 +0100
committerClaudius "keldu" Holeksa <mail@keldu.de>2023-12-04 12:18:14 +0100
commita14896f9ed209dd3f9597722e5a5697bd7dbf531 (patch)
tree089ca5cbbd206d1921f8f6b53292f5bc1902ca5c /modules/codec/interface.h
parent84ecdcbca9e55b1f57fbb832e12ff4fdbb86e7c9 (diff)
meta: Renamed folder containing source
Diffstat (limited to 'modules/codec/interface.h')
-rw-r--r--modules/codec/interface.h103
1 files changed, 103 insertions, 0 deletions
diff --git a/modules/codec/interface.h b/modules/codec/interface.h
new file mode 100644
index 0000000..b1422a9
--- /dev/null
+++ b/modules/codec/interface.h
@@ -0,0 +1,103 @@
+#pragma once
+
+#include <forstio/core/error.h>
+#include "schema.h"
+#include "data.h"
+
+namespace saw {
+template<typename SchemaFunc, typename Encode, typename Func>
+class function;
+
+template<typename Request, typename Response, typename Encode, typename Func>
+class function<schema::Function<Request, Response>, Encode, Func> {
+private:
+ Func func_;
+public:
+ function(Func func):
+ func_{std::move(func)}
+ {}
+
+ error_or<data<Response, Encode>> call(data<Request, Encode> req){
+ return func_(std::move(req));
+ }
+};
+
+template<typename T, typename Encode, typename... Funcs>
+class interface;
+
+template<typename... Requests, typename... Responses, string_literal... Names, typename Encode, typename... Funcs>
+class interface<schema::Interface<schema::Member<schema::Function<Requests, Responses>, Names>...>, Encode, Funcs...> {
+private:
+ std::tuple<function<schema::Function<Requests, Responses>, Encode, Funcs>...> funcs_;
+public:
+ interface(function<schema::Function<Requests, Responses>, Encode, Funcs>... funcs):
+ funcs_{std::move(funcs)...}
+ {}
+
+ /**
+ * Get the function based on the string literal matching the position in the tuple
+ */
+ template<string_literal Lit>
+ function<
+ schema::Function<
+ typename parameter_pack_type<
+ parameter_key_pack_index<
+ Lit, Names...
+ >::value
+ , Requests...>::type
+ ,
+ typename parameter_pack_type<
+ parameter_key_pack_index<
+ Lit, Names...
+ >::value
+ , Responses...>::type
+ >
+ ,
+ Encode
+ ,
+ typename parameter_pack_type<
+ parameter_key_pack_index<
+ Lit, Names...
+ >::value
+ , Funcs...>::type
+ >& get(){
+ return std::get<parameter_key_pack_index<Lit, Names...>::value>(funcs_);
+ }
+
+ template<string_literal Lit>
+ error_or<data<
+ typename parameter_pack_type<
+ parameter_key_pack_index<
+ Lit, Names...
+ >::value
+ , Responses...>::type
+ , Encode>> call(
+ data<
+ typename parameter_pack_type<
+ parameter_key_pack_index<
+ Lit, Names...
+ >::value
+ , Requests...>::type
+ , Encode> req
+ ){
+ return get<Lit>().call(std::move(req));
+ }
+
+};
+
+template<typename T, typename Encode>
+struct function_factory {
+ template<typename Func>
+ static function<T,Encode, Func> create(Func func){
+ return function<T,Encode,Func>{std::move(func)};
+ }
+};
+
+template<typename T, typename Encode>
+struct interface_factory {
+ template<typename... Func>
+ static interface<T,Encode, Func...> create(Func... func){
+ return interface<T,Encode, Func...>{std::move(func)...};
+ }
+};
+}