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