cmq 0.0.1

Composable Message Queue
Documentation
mod publisher;
mod registrar;
mod subscriber;

use crb::core::{Unique, watch};
use publisher::PubInner;
use std::ops::Deref;
use subscriber::SubInner;

pub trait PubSub: Sized + Sync + Send + 'static {
    type Delta: Send;
    type Query: Send;
    type Publisher: Publisher<Self>;
    type Subscriber: Subscriber<Self>;
}

pub trait Publisher<T: PubSub>
where
    Self: From<PubInner<T>>,
    Self: Deref<Target = PubInner<T>>,
{
}

pub trait Subscriber<T: PubSub>
where
    Self: From<SubInner<T>>,
    Self: Deref<Target = SubInner<T>>,
{
}

pub type PubId = Unique;

pub type SubId = Unique;

pub struct PubEvent<T: PubSub> {
    pub sub_id: SubId,
    pub value: PubValue<T>,
}

pub enum PubValue<T: PubSub> {
    Connected,
    Query(T::Query),
    Disconnected,
}

pub enum SubEvent<T: PubSub> {
    Loaded(State<T>),
    Delta(T::Delta),
    Lost,
}

pub struct State<T> {
    state_rx: watch::Receiver<T>,
}

impl<T> State<T> {
    pub fn new(state: T) -> (Self, watch::Sender<T>) {
        let (state_tx, state_rx) = watch::channel(state);
        (Self { state_rx }, state_tx)
    }

    pub fn borrow(&self) -> watch::Ref<T> {
        self.state_rx.borrow()
    }
}