From e4280959f1977663be70a2ac539e44f42aea0cd3 Mon Sep 17 00:00:00 2001 From: Claudius 'keldu' Holeksa Date: Wed, 23 Oct 2024 15:30:16 +0200 Subject: Final stretch to have working rpc example --- modules/remote/c++/remote_loopback_base.hpp | 32 ++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) (limited to 'modules/remote/c++/remote_loopback_base.hpp') diff --git a/modules/remote/c++/remote_loopback_base.hpp b/modules/remote/c++/remote_loopback_base.hpp index 7a567b2..d91df37 100644 --- a/modules/remote/c++/remote_loopback_base.hpp +++ b/modules/remote/c++/remote_loopback_base.hpp @@ -53,16 +53,38 @@ private: std::map>> registered_rpc_servers_; template - error_or find_data_servers_ele(typename rpc_server::DataServers& ret_val){ - if + error_or find_data_servers_ele(typename rpc_server::DataServers& ret_val, ref> addr){ + if constexpr ( I < Iface::size ){ + using DataTypeGroup = typename rpc_server::TypeGroup; + using Schema = typename tmpl_group_pack_type::type; + + constexpr auto class_id = data_server::class_id; + key_t key; + key.data = std::array{addr().get_address_id().get(), class_id.first, class_id.second}; + + auto find = registered_data_servers_.find(key); + if(find == registered_data_servers_.end()){ + return make_error("Server not found"); + } + auto eo_dat_srv = find->second().template cast_to>(); + if(eo_dat_srv.is_error()){ + auto& err = eo_dat_srv.get_error(); + return std::move(err); + } + auto dat_srv = eo_dat_srv.get_value(); + std::get(ret_val) = dat_srv; + + return find_data_servers_ele(ret_val, addr); + } + return make_void(); } template - error_or::DataServers> find_data_servers(){ + error_or::DataServers> find_data_servers(ref> addr){ typename rpc_server::DataServers ret_val; { - auto eov = find_data_servers_ele(ret_val); + auto eov = find_data_servers_ele(ret_val,addr); if(eov.is_error()){ return std::move(eov.get_error()); } @@ -90,7 +112,7 @@ public: template error_or>> rpc_listen(remote_address& addr, typename rpc_server::InterfaceT iface){ - auto eo_dat_srvs = find_data_servers(); + auto eo_dat_srvs = find_data_servers(addr); if(eo_dat_srvs.is_error()){ return std::move(eo_dat_srvs.get_error()); } -- cgit v1.2.3