use lps::*; use std::sync::Arc; #[derive(Debug, Clone)] struct TestMsg0(i32); #[derive(Debug, Clone)] struct TestMsg1(i32); impl Message for TestMsg0 {} impl Message for TestMsg1 {} struct TestPublisher { msg_broker: Arc, } impl TestPublisher { fn new(msg_broker: Arc) -> Self { Self { msg_broker } } } impl Publisher for TestPublisher { fn message_broker(&self) -> Arc { Arc::clone(&self.msg_broker) } fn set_message_broker(&mut self, msg_broker: Arc) { self.msg_broker = msg_broker; } } struct TestSubsciber0 { sub: Subscription, } impl TestSubsciber0 { fn new() -> Self { Self { sub: Subscription::unregistered(), } } } impl Subscriber for TestSubsciber0 { fn subscribe(&mut self, msg_broker: Arc) { let _ = self.sub.register(msg_broker); } fn unsubscribe(&mut self) { let _ = self.sub.unregister(); } fn activate(&self) { let _ = self.sub.activate(); } fn deactivate(&self) { let _ = self.sub.deactivate(); } fn process_messages(&mut self) { self.sub .message_iter() .handle(|msg: Arc| { println!("test_sub0.sub: {:?}", msg); }) .run(); } } struct TestSubsciber1 { sub: MultiSubscription, } impl TestSubsciber1 { fn new() -> Self { let mut multi_sub = MultiSubscription::unregistered(); multi_sub.add::().add::(); Self { sub: multi_sub } } } impl Subscriber for TestSubsciber1 { fn subscribe(&mut self, msg_broker: Arc) { let _ = self.sub.register(Arc::clone(&msg_broker)); } fn unsubscribe(&mut self) { let _ = self.sub.unregister(); } fn activate(&self) { let _ = self.sub.activate(); } fn deactivate(&self) { let _ = self.sub.deactivate(); } fn process_messages(&mut self) { self.sub .message_iter() .handle(|msg: Arc| { println!("test_sub1.sub0: {:?}", msg); }) .handle(|msg: Arc| { println!("test_sub1.sub1: {:?}", msg); }) .run(); } } fn main() { let tb: Arc = Arc::new(DefaultMessageBroker::new()); let mut s0 = TestSubsciber0::new(); s0.subscribe(Arc::clone(&tb)); let mut s1 = TestSubsciber1::new(); s1.subscribe(Arc::clone(&tb)); let p0 = TestPublisher::new(Arc::clone(&tb)); let p1 = TestPublisher::new(Arc::clone(&tb)); p0.publish(Arc::new(TestMsg0(2))); s1.deactivate(); p1.publish(Arc::new(TestMsg0(5))); s1.activate(); p1.publish(Arc::new(TestMsg1(3))); p1.publish(Arc::new(TestMsg1(6))); s0.process_messages(); s1.process_messages(); }