#pragma once 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); /** * Determine type based on Name */ template error_or< id< typename schema_member_type::type > > call(data_or_id inp); }; /** * Implementation of a remote server on the backend */ template class rpc_server { private: interface iface_; public: rpc_server(interface iface): iface_{std::move(iface)} {} }; /** * Representation of a remote. * Partially similar to a network address */ template class remote_address { static_assert(always_false, "Type of remote not supported"); }; /** * Reference Backend structure */ template class remote_api { static_assert(always_false, "Type of backend not supported"); /** * Resolves an address for the remote */ conveyor> resolve_address(); /** * Connect to a remote */ template conveyor> connect(const remote_address& addr); /** * Start listening */ template rpc_server listen(); }; }