diff options
Diffstat (limited to 'modules/remote/c++/remote_loopback.hpp')
-rw-r--r-- | modules/remote/c++/remote_loopback.hpp | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/modules/remote/c++/remote_loopback.hpp b/modules/remote/c++/remote_loopback.hpp index 0e9eb2d..8037b81 100644 --- a/modules/remote/c++/remote_loopback.hpp +++ b/modules/remote/c++/remote_loopback.hpp @@ -74,13 +74,29 @@ public: {} template<string_literal Lit> - error_or< - id< - typename schema_member_type<Lit, Iface>::type::ResponseT - > - > call(id<typename schema_member_type<Lit, Iface>::type::RequestT> id_param){ + error_or<void> call(id<typename schema_member_type<Lit, Iface>::type::RequestT> id_param, id<typename schema_member_type<Lit,Iface>::type::ResponseT> id_resp){ + using Req = typename schema_member_type<Lit,Iface>::type::RequestT; + auto req_dat_ptr = std::get<ptr<data_server<Req,Encode,rmt::Loopback>>>(dat_srvs_); + auto eo_req_param = req_dat_ptr().find(id_param); + if(eo_req_param.is_error()){ + return std::move(eo_req_param.get_error()); + } + auto& req_param = eo_req_param.get_value(); + + auto eo_answer = iface_.template call<Lit>(req_param()); + if(eo_answer.is_error()){ + return std::move(eo_answer.get_error()); + } + auto& answer = eo_answer.get_value(); + + using Resp = typename schema_member_type<Lit,Iface>::type::ResponseT; + auto resp_dat_ptr = std::get<ptr<data_server<Resp,Encode,rmt::Loopback>>>(dat_srvs_); + auto eo_send = resp_dat_ptr().send(std::move(answer), id_resp); + if(eo_send.is_error()){ + return std::move(eo_send.get_error()); + } - return make_error<err::not_implemented>(); + return make_void(); } }; |