1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
//!
//! NComm Update Server and Client.
//!
//! An Update Client and Server is pretty much the same as an action client in
//! ROS in which a server is given some long running task that they routinely
//! update the client on.
//!
/// A common abstraction for all NComm update clients
pub trait UpdateClient {
/// The type of data used as a request by the client
type Request;
/// The type of data used as an update from the server
type Update;
/// The type of data used as a response from the server
type Response;
/// The type of error from sending or receiving data from the update
/// server
type Error;
/// Send a request to the server this client is associated with
#[allow(clippy::type_complexity)]
fn send_request(&mut self, request: Self::Request) -> Result<(), Self::Error>;
/// Poll for updates from the server
#[allow(clippy::type_complexity)]
fn poll_for_updates(&mut self) -> Vec<Result<(Self::Request, Self::Update), Self::Error>>;
/// Poll for responses from the server
#[allow(clippy::type_complexity)]
fn poll_for_responses(&mut self) -> Vec<Result<(Self::Request, Self::Response), Self::Error>>;
}
/// A common abstraction for all NComm update servers
pub trait UpdateServer {
/// The type of data received as a request from the client
type Request: Clone;
/// The type of data sent as an update to the client
type Update;
/// The type of data sent as a response to the client
type Response;
/// The unique identifier type for the various clients
type Key;
/// The type of error from sending or receiving data from and
/// to the update client
type Error;
/// Check for incoming requests from the client
#[allow(clippy::type_complexity)]
fn poll_for_requests(&mut self) -> Vec<Result<(Self::Key, Self::Request), Self::Error>>;
/// Send an update to a specific client
fn send_update(
&mut self,
client_key: Self::Key,
request: &Self::Request,
update: Self::Update,
) -> Result<(), Self::Error>;
/// Send a collection of updates to specified client
#[allow(clippy::type_complexity)]
fn send_updates(
&mut self,
mut updates: Vec<(Self::Key, &Self::Request, Self::Update)>,
) -> Vec<Result<(), Self::Error>> {
updates
.drain(..)
.map(|update| self.send_update(update.0, update.1, update.2))
.collect()
}
/// Send a response to a specific client
fn send_response(
&mut self,
client_key: Self::Key,
request: Self::Request,
response: Self::Response,
) -> Result<(), Self::Error>;
/// Send a collection of responses to specific clients
#[allow(clippy::type_complexity)]
fn send_responses(
&mut self,
mut responses: Vec<(Self::Key, Self::Request, Self::Response)>,
) -> Vec<Result<(), Self::Error>> {
responses
.drain(..)
.map(|response| self.send_response(response.0, response.1, response.2))
.collect()
}
}