diff options
author | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-10-22 18:33:00 +0200 |
---|---|---|
committer | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-10-22 18:33:00 +0200 |
commit | 05a7fa9a2815b63b5b6f7eea107807e33aa62137 (patch) | |
tree | f810107a00dd88d8135be2db0fb4dafd736c9ad5 | |
parent | 98cf3372f2ed4e61ccb0acc522549aaa3d18fd59 (diff) |
Trying to get the reference working
-rw-r--r-- | modules/codec/c++/schema.hpp | 1 | ||||
-rw-r--r-- | modules/remote/c++/remote_loopback.hpp | 4 | ||||
-rw-r--r-- | modules/remote/c++/remote_loopback_base.hpp | 21 | ||||
-rw-r--r-- | modules/remote/tests/remote_loopback.cpp | 32 |
4 files changed, 44 insertions, 14 deletions
diff --git a/modules/codec/c++/schema.hpp b/modules/codec/c++/schema.hpp index c2cacd5..c0fb66f 100644 --- a/modules/codec/c++/schema.hpp +++ b/modules/codec/c++/schema.hpp @@ -195,6 +195,7 @@ template <class... T> struct Interface { template <class... Requests, class... Responses, string_literal... Names> struct Interface<Member<Function<Requests, Responses>,Names>...> { static constexpr string_literal name = "Interface"; + static constexpr uint64_t size = sizeof...(Responses); }; // NOLINTEND diff --git a/modules/remote/c++/remote_loopback.hpp b/modules/remote/c++/remote_loopback.hpp index c651589..0e9eb2d 100644 --- a/modules/remote/c++/remote_loopback.hpp +++ b/modules/remote/c++/remote_loopback.hpp @@ -76,9 +76,9 @@ public: template<string_literal Lit> error_or< id< - typename schema_member_type<Lit, Iface>::type::Response + typename schema_member_type<Lit, Iface>::type::ResponseT > - > call(id<typename schema_member_type<Lit, Iface>::type::Request> id_param){ + > call(id<typename schema_member_type<Lit, Iface>::type::RequestT> id_param){ return make_error<err::not_implemented>(); } diff --git a/modules/remote/c++/remote_loopback_base.hpp b/modules/remote/c++/remote_loopback_base.hpp index 5e5e108..7a567b2 100644 --- a/modules/remote/c++/remote_loopback_base.hpp +++ b/modules/remote/c++/remote_loopback_base.hpp @@ -54,14 +54,19 @@ private: template<typename Iface, typename Encoding, uint64_t I> error_or<void> find_data_servers_ele(typename rpc_server<Iface,Encoding,rmt::Loopback>::DataServers& ret_val){ - + if } template<typename Iface, typename Encoding> error_or<typename rpc_server<Iface, Encoding, rmt::Loopback>::DataServers> find_data_servers(){ typename rpc_server<Iface,Encoding,rmt::Loopback>::DataServers ret_val; - + { + auto eov = find_data_servers_ele<Iface,Encoding,0u>(ret_val); + if(eov.is_error()){ + return std::move(eov.get_error()); + } + } return ret_val; } @@ -77,15 +82,21 @@ public: * Connect to a remote */ template<typename Iface, typename Encode> - conveyor<rpc_client<Iface, Encode, rmt::Loopback>> connect(const remote_address<rmt::Loopback>& addr); + conveyor<rpc_client<Iface, Encode, rmt::Loopback>> rpc_connect(const remote_address<rmt::Loopback>& addr); /** * Start listening */ template<typename Iface, typename Encode> - error_or<own<rpc_server<Iface, Encode, rmt::Loopback>>> rpc_listen(const remote_address<rmt::Loopback>& addr, typename rpc_server<Iface,Encode,rmt::Loopback>::InterfaceT iface){ + error_or<own<rpc_server<Iface, Encode, rmt::Loopback>>> rpc_listen(remote_address<rmt::Loopback>& addr, typename rpc_server<Iface,Encode,rmt::Loopback>::InterfaceT iface){ + + auto eo_dat_srvs = find_data_servers<Iface,Encode>(); + if(eo_dat_srvs.is_error()){ + return std::move(eo_dat_srvs.get_error()); + } + auto& dat_srvs = eo_dat_srvs.get_value(); - return heap<rpc_server<Iface,Encode,rmt::Loopback>>({*this}, addr, std::move(iface)); + return heap<rpc_server<Iface,Encode,rmt::Loopback>>(*this, addr, std::move(iface), dat_srvs); } /** diff --git a/modules/remote/tests/remote_loopback.cpp b/modules/remote/tests/remote_loopback.cpp index d6f1e73..e1f3898 100644 --- a/modules/remote/tests/remote_loopback.cpp +++ b/modules/remote/tests/remote_loopback.cpp @@ -31,20 +31,38 @@ SAW_TEST("Remote Loopback RPC"){ auto eo_i64_srv = rmt.template data_listen<sch::Int64, encode::Native>(*addr); SAW_EXPECT(eo_i64_srv.is_value(), std::string{"Couldn't listen: "} + std::string{eo_i64_srv.get_error().get_category()}); auto& i64_srv = eo_i64_srv.get_value(); + + auto foo_func = [](data<sch::UInt32, encode::Native> input) -> error_or<data<sch::Int64, encode::Native>> { + data<sch::Int64, encode::Native> rv; + rv.set(input.get() * 2); + return rv; + }; + + auto iface = interface_factory<sch::TestInterface, encode::Native>::create(std::move(foo_func)); - auto eo_rpc_srv = rmt.template rpc_listen<sch::TestInterface, encode::Native>(*addr, { - [](data<sch::UInt32, encode::Native> input) -> error_or<data<sch::Int64, encode::Native>> { - data<sch::Int64, encode::Native> rv; - rv.set(input.get() * 2); - return rv; - } - }); + auto eo_rpc_srv = rmt.template rpc_listen<sch::TestInterface, encode::Native>(*addr, std::move(iface)); SAW_EXPECT(eo_rpc_srv.is_value(), std::string{"Couldn't listen: "} + std::string{eo_rpc_srv.get_error().get_category()}); auto& rpc_srv = eo_rpc_srv.get_value(); id<sch::UInt32> id32{0u}; id<sch::Int64> id64{0u}; + data<sch::UInt32, encode::Native> inp{21}; + + { + auto eo_send = u32_srv->send(inp, id32); + SAW_EXPECT(eo_send.is_value(), "Failed send."); + } + auto eo_called = rpc_srv->template call<"foo">(id32); + SAW_EXPECT(eo_called.is_value(), "Failed call."); + auto& called = eo_called.get_value(); + + { + auto eo_recv = i64_srv->receive(called); + SAW_EXPECT(eo_recv.is_value(), "Failed receive."); + auto& recv = eo_recv.get_value(); + SAW_EXPECT((recv.get() == 42), (std::string{"Wrong value received: "} + std::to_string(recv.get()))); + } } SAW_TEST("Remote Loopback Data"){ |