lps 0.1.0

A local publish-subscribe pattern implementation
Documentation
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<dyn MessageBroker>,
}

impl TestPublisher {
    fn new(msg_broker: Arc<dyn MessageBroker>) -> Self {
        Self { msg_broker }
    }
}

impl Publisher for TestPublisher {
    fn message_broker(&self) -> Arc<dyn MessageBroker> {
        Arc::clone(&self.msg_broker)
    }

    fn set_message_broker(&mut self, msg_broker: Arc<dyn MessageBroker>) {
        self.msg_broker = msg_broker;
    }
}

struct TestSubsciber0 {
    sub: Subscription<TestMsg0>,
}

impl TestSubsciber0 {
    fn new() -> Self {
        Self {
            sub: Subscription::unregistered(),
        }
    }
}

impl Subscriber for TestSubsciber0 {
    fn subscribe(&mut self, msg_broker: Arc<dyn MessageBroker>) {
        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<TestMsg0>| {
                println!("test_sub0.sub: {:?}", msg);
            })
            .run();
    }
}

struct TestSubsciber1 {
    sub: MultiSubscription,
}

impl TestSubsciber1 {
    fn new() -> Self {
        let mut multi_sub = MultiSubscription::unregistered();
        multi_sub.add::<TestMsg0>().add::<TestMsg1>();

        Self { sub: multi_sub }
    }
}

impl Subscriber for TestSubsciber1 {
    fn subscribe(&mut self, msg_broker: Arc<dyn MessageBroker>) {
        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<TestMsg0>| {
                println!("test_sub1.sub0: {:?}", msg);
            })
            .handle(|msg: Arc<TestMsg1>| {
                println!("test_sub1.sub1: {:?}", msg);
            })
            .run();
    }
}

fn main() {
    let tb: Arc<dyn MessageBroker> = 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();
}