#pragma once #include #include #include "remote.hpp" #include "transfer_loopback.hpp" namespace saw { template class remote_data { private: id id_; public: remote_data(const id& id): id_{id} {} /** * Wait until data arrives */ error_or> wait(wait_scope& wait); /** * Asynchronously wait for a result */ conveyor> on_receive(); }; /** * Client RPC reference structure */ template class rpc_client { /** * request the data from the remote */ template remote_data request_data(id data); /** @todo * Determine type based on Name */ /* template error_or< id< typename schema_member_type::type > > call(data_or_id inp); */ }; template<> class remote_address { private: data addr_id_; public: remote_address(data addr_id__): addr_id_{addr_id__} {} const data& get_address_id() const { return addr_id_; } }; template class rpc_server { public: using InterfaceT = interface; private: const remote_address* addr_; InterfaceT iface_; public: rpc_server(const remote_address& addr__, InterfaceT iface__): addr_{&addr__}, iface_{std::move(iface__)} {} // error_or> }; template<> class remote { private: public: /** * Resolves an address for the remote */ error_or>> parse_address(data id){ return heap>(id); } /** * Connect to a remote */ template conveyor> connect(const remote_address& addr); /** * Start listening */ template rpc_server listen(const remote_address& addr, typename rpc_server::InterfaceT iface){ return {addr, std::move(iface)}; } }; }