summaryrefslogtreecommitdiff
path: root/modules/remote/c++/remote_loopback.hpp
diff options
context:
space:
mode:
authorClaudius 'keldu' Holeksa <mail@keldu.de>2024-07-15 15:29:12 +0200
committerClaudius 'keldu' Holeksa <mail@keldu.de>2024-07-15 15:29:12 +0200
commit816760c8480e8e76c7f4021a845161eb697e215c (patch)
treef18ef0578dab81e1f00798e9c897210236340b90 /modules/remote/c++/remote_loopback.hpp
parent5d92d62caa68473e67022debe45bf8038c6c3b60 (diff)
Moving remote definitions from codec to remote module
Diffstat (limited to 'modules/remote/c++/remote_loopback.hpp')
-rw-r--r--modules/remote/c++/remote_loopback.hpp99
1 files changed, 99 insertions, 0 deletions
diff --git a/modules/remote/c++/remote_loopback.hpp b/modules/remote/c++/remote_loopback.hpp
new file mode 100644
index 0000000..2949243
--- /dev/null
+++ b/modules/remote/c++/remote_loopback.hpp
@@ -0,0 +1,99 @@
+#pragma once
+
+#include <variant>
+
+#include "interface.hpp"
+#include "remote.hpp"
+#include "transfer_loopback.hpp"
+
+namespace saw {
+
+template<typename T, typename Encoding, typename Storage>
+class remote_data<T, Encoding, Storage, rmt::Loopback> {
+private:
+ id<T> id_;
+public:
+ remote_data(const id<T>& id):
+ id_{id}
+ {}
+
+ /**
+ * Wait until data arrives
+ */
+ error_or<data<T, Encoding, Storage>> wait(wait_scope& wait);
+
+ /**
+ * Asynchronously wait for a result
+ */
+ conveyor<data<T, Encoding, Storage>> on_receive();
+};
+
+/**
+ * Client RPC reference structure
+ */
+template<typename Iface, typename Encoding, typename Storage>
+class rpc_client<Iface, Encoding, Storage, rmt::Loopback> {
+ /**
+ * request the data from the remote
+ */
+ template<typename IdT>
+ remote_data<IdT, Encoding, Storage, rmt::Loopback> request_data(id<IdT> data);
+
+ /** @todo
+ * Determine type based on Name
+ */
+ /*
+ template<string_literal Name>
+ error_or<
+ id<
+ typename schema_member_type<Name, Iface>::type
+ >
+ > call(data_or_id<Input> inp);
+ */
+};
+
+template<>
+class remote_address<rmt::Loopback> {
+};
+
+template<typename Iface, typename Encode, typename Storage>
+class rpc_server<Iface, Encode, Storage, rmt::Loopback> {
+public:
+ using InterfaceT = interface<Iface, Encode, Storage>;
+private:
+ const remote_address<rmt::Loopback>* addr_;
+ InterfaceT iface_;
+public:
+ rpc_server(const remote_address<rmt::Loopback>& addr__, InterfaceT iface__):
+ addr_{&addr__},
+ iface_{std::move(iface__)}
+ {}
+
+ // error_or<id<>>
+};
+
+template<>
+class remote<rmt::Loopback> {
+public:
+ /**
+ * Resolves an address for the remote
+ */
+ error_or<own<remote_address<rmt::Loopback>>> parse_address(){
+ return heap<remote_address<rmt::Loopback>>();
+ }
+
+ /**
+ * Connect to a remote
+ */
+ template<typename Iface, typename Encode, typename Storage>
+ conveyor<rpc_client<Iface, Encode, Storage, rmt::Loopback>> connect(const remote_address<rmt::Loopback>& addr);
+
+ /**
+ * Start listening
+ */
+ template<typename Iface, typename Encode, typename Storage>
+ rpc_server<Iface, Encode, Storage, rmt::Loopback> listen(const remote_address<rmt::Loopback>& addr, typename rpc_server<Iface,Encode,Storage,rmt::Loopback>::InterfaceT iface){
+ return {addr, std::move(iface)};
+ }
+};
+}