use crate::protocol::dds::api::error::DdsApiError;
use crate::protocol::dds::api::participant::Participant;
use crate::protocol::dds::api::publisher::Publisher;
use crate::protocol::dds::api::subscription::Subscription;
use super::wrappers::{ReplyWrapper, RequestWrapper, Service};
pub struct ServiceServer<S: Service> {
request_sub: Subscription<RequestWrapper<S>>,
reply_pub: Publisher<ReplyWrapper<S>>,
}
impl<S: Service> ServiceServer<S> {
pub(super) fn new(
request_sub: Subscription<RequestWrapper<S>>,
reply_pub: Publisher<ReplyWrapper<S>>,
) -> Self {
Self {
request_sub,
reply_pub,
}
}
pub fn process<F>(
&mut self,
participant: &mut Participant,
mut handler: F,
) -> Result<usize, DdsApiError>
where
F: FnMut(&S::Request) -> S::Response,
{
let samples = participant.take(&self.request_sub);
let count = samples.len();
for sample in samples {
let RequestWrapper { header, body } = sample.data;
let response = handler(&body);
let reply = ReplyWrapper::<S> {
header,
body: response,
};
participant.publish(&self.reply_pub, &reply)?;
}
Ok(count)
}
}