#pragma once #include #include "schema.hpp" #include "data.hpp" namespace saw { template class function; template class function, Encode, Func> { private: Func func_; public: function(Func func): func_{std::move(func)} {} error_or> call(data req){ return func_(std::move(req)); } }; template class interface; template class interface, Names>...>, Encode, Funcs...> { private: std::tuple, Encode, Funcs>...> funcs_; public: interface(function, Encode, Funcs>... funcs): funcs_{std::move(funcs)...} {} /** * Get the function based on the string literal matching the position in the tuple */ template 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::value>(funcs_); } template error_or::value , Responses...>::type , Encode>> call( data< typename parameter_pack_type< parameter_key_pack_index< Lit, Names... >::value , Requests...>::type , Encode> req ){ return get().call(std::move(req)); } }; template struct function_factory { template static function create(Func func){ return function{std::move(func)}; } }; template struct interface_factory { template static interface create(Func... func){ return interface{std::move(func)...}; } }; }