Refactor broker requests
This commit is contained in:
parent
ec49c28425
commit
cf6431fbe1
@ -33,7 +33,7 @@ impl BrokerTask {
|
|||||||
loop {
|
loop {
|
||||||
tokio::select! {
|
tokio::select! {
|
||||||
Some(request) = self.request_rx.recv() => {
|
Some(request) = self.request_rx.recv() => {
|
||||||
request.handle_request(&mut registry);
|
request.run_request(&mut registry);
|
||||||
}
|
}
|
||||||
else => {
|
else => {
|
||||||
trace!("no more handles to BrokerTask");
|
trace!("no more handles to BrokerTask");
|
||||||
|
@ -6,67 +6,88 @@ use super::{
|
|||||||
};
|
};
|
||||||
use crate::{Message, Publication, Subscription};
|
use crate::{Message, Publication, Subscription};
|
||||||
|
|
||||||
pub(crate) trait BrokerRequestInternal {
|
pub trait BrokerRequestInternal {
|
||||||
fn handle_request(self: Box<Self>, registry: &mut Registry);
|
fn run_request(self: Box<Self>, registry: &mut Registry);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) trait BrokerRequest: BrokerRequestInternal {}
|
pub trait RequestHandler {
|
||||||
impl<T: BrokerRequestInternal> BrokerRequest for T {}
|
type Response;
|
||||||
|
|
||||||
pub(crate) type BrokerRequestBox = Box<dyn BrokerRequest + Send + Sync>;
|
fn handle(self, registry: &mut Registry) -> Self::Response;
|
||||||
pub(crate) type BrokerRequestSender = mpsc::Sender<BrokerRequestBox>;
|
}
|
||||||
|
|
||||||
pub(crate) struct SubscribeRequest<T> {
|
pub struct BrokerRequest<H: RequestHandler> {
|
||||||
|
handler: H,
|
||||||
|
response_tx: oneshot::Sender<H::Response>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<H: RequestHandler> BrokerRequestInternal for BrokerRequest<H> {
|
||||||
|
fn run_request(self: Box<Self>, registry: &mut Registry) {
|
||||||
|
let response = self.handler.handle(registry);
|
||||||
|
let _ = self.response_tx.send(response);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<H: RequestHandler + Default> BrokerRequest<H> {
|
||||||
|
fn create(response_tx: oneshot::Sender<H::Response>) -> Box<Self> {
|
||||||
|
Box::new(Self {
|
||||||
|
handler: H::default(),
|
||||||
|
response_tx,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn new() -> (Box<Self>, oneshot::Receiver<H::Response>) {
|
||||||
|
let (response_tx, response_rx) = oneshot::channel();
|
||||||
|
(Self::create(response_tx), response_rx)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub type BrokerRequestBox = Box<dyn BrokerRequestInternal + Send + Sync>;
|
||||||
|
pub type BrokerRequestSender = mpsc::Sender<BrokerRequestBox>;
|
||||||
|
|
||||||
|
pub type SubscribeRequest<T> = BrokerRequest<Subscribe<T>>;
|
||||||
|
pub struct Subscribe<T: Message> {
|
||||||
msg_type: BasicMessageType<T>,
|
msg_type: BasicMessageType<T>,
|
||||||
response_tx: oneshot::Sender<BrokerResult<Subscription<T>>>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Message> BrokerRequestInternal for SubscribeRequest<T> {
|
impl<T: Message> Default for Subscribe<T> {
|
||||||
fn handle_request(self: Box<Self>, registry: &mut Registry) {
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
msg_type: BasicMessageType::<T>::default(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Message> RequestHandler for Subscribe<T> {
|
||||||
|
type Response = BrokerResult<Subscription<T>>;
|
||||||
|
|
||||||
|
fn handle(self, registry: &mut Registry) -> Self::Response {
|
||||||
let sender = registry.get_sender_for_type::<T>(&self.msg_type);
|
let sender = registry.get_sender_for_type::<T>(&self.msg_type);
|
||||||
let subscription = sender.map(|sender| {
|
sender.map(|sender| {
|
||||||
let receiver = sender.subscribe();
|
let receiver = sender.subscribe();
|
||||||
Subscription::new(receiver)
|
Subscription::new(receiver)
|
||||||
});
|
})
|
||||||
let _ = self.response_tx.send(subscription);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Message> SubscribeRequest<T> {
|
pub type AdvertiseRequest<T> = BrokerRequest<Advertise<T>>;
|
||||||
pub(crate) fn new() -> (Box<Self>, oneshot::Receiver<BrokerResult<Subscription<T>>>) {
|
pub struct Advertise<T: Message> {
|
||||||
let (response_tx, response_rx) = oneshot::channel();
|
|
||||||
(
|
|
||||||
Box::new(Self {
|
|
||||||
msg_type: Default::default(),
|
|
||||||
response_tx,
|
|
||||||
}),
|
|
||||||
response_rx,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) struct AdvertiseRequest<T> {
|
|
||||||
msg_type: BasicMessageType<T>,
|
msg_type: BasicMessageType<T>,
|
||||||
response_tx: oneshot::Sender<BrokerResult<Publication<T>>>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Message> BrokerRequestInternal for AdvertiseRequest<T> {
|
impl<T: Message> Default for Advertise<T> {
|
||||||
fn handle_request(self: Box<Self>, registry: &mut Registry) {
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
msg_type: BasicMessageType::<T>::default(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Message> RequestHandler for Advertise<T> {
|
||||||
|
type Response = BrokerResult<Publication<T>>;
|
||||||
|
|
||||||
|
fn handle(self, registry: &mut Registry) -> Self::Response {
|
||||||
let sender = registry.get_sender_for_type::<T>(&self.msg_type);
|
let sender = registry.get_sender_for_type::<T>(&self.msg_type);
|
||||||
let publication = sender.map(|sender| Publication::new(sender.clone()));
|
sender.map(|sender| Publication::new(sender.clone()))
|
||||||
let _ = self.response_tx.send(publication);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T: Message> AdvertiseRequest<T> {
|
|
||||||
pub(crate) fn new() -> (Box<Self>, oneshot::Receiver<BrokerResult<Publication<T>>>) {
|
|
||||||
let (response_tx, response_rx) = oneshot::channel();
|
|
||||||
(
|
|
||||||
Box::new(Self {
|
|
||||||
msg_type: Default::default(),
|
|
||||||
response_tx,
|
|
||||||
}),
|
|
||||||
response_rx,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user