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