Struct safe_drive::service::server::ServerSend
source · pub struct ServerSend<T> { /* private fields */ }
Expand description
Sender to send a response.
Implementations§
source§impl<T: ServiceMsg> ServerSend<T>
impl<T: ServiceMsg> ServerSend<T>
sourcepub fn send(
self,
data: &<T as ServiceMsg>::Response
) -> Result<Server<T>, (Self, RCLError)>
pub fn send( self, data: &<T as ServiceMsg>::Response ) -> Result<Server<T>, (Self, RCLError)>
Send a response to the client.
§Errors
RCLError::InvalidArgument
if any arguments are invalid, orRCLError::ServiceInvalid
if the service is invalid, orRCLError::Error
if an unspecified error occurs.
§Example
use safe_drive::{
logger::Logger, msg::common_interfaces::std_srvs, pr_error, service::server::Server,
};
async fn server_task(mut server: Server<std_srvs::srv::Empty>, logger: Logger) {
loop {
// Call recv() by using timeout.
let req = server.recv().await;
match req {
Ok((sender, request, _header)) => {
let response = std_srvs::srv::EmptyResponse::new().unwrap();
match sender.send(&response) {
Ok(s) => server = s, // Get a new server to handle next request.
Err((s, _e)) => server = s.give_up(), // Failed to send.
}
}
Err(e) => {
pr_error!(logger, "error: {e}");
return;
}
}
}
}
§Notes
data
should be immutable, but rcl_send_response
provided
by ROS2 takes normal pointers instead of const
pointers.
So, currently, send
takes data
as mutable.
pub fn give_up(self) -> Server<T>
Auto Trait Implementations§
impl<T> Freeze for ServerSend<T>
impl<T> !RefUnwindSafe for ServerSend<T>
impl<T> Send for ServerSend<T>where
T: Send,
impl<T> !Sync for ServerSend<T>
impl<T> Unpin for ServerSend<T>where
T: Unpin,
impl<T> UnwindSafe for ServerSend<T>where
T: UnwindSafe,
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more