cmq/pubsub/
mod.rs

1mod publisher;
2mod registrar;
3mod subscriber;
4
5use crb::core::{Unique, watch};
6use publisher::PubInner;
7use std::ops::Deref;
8use subscriber::SubInner;
9
10pub trait PubSub: Sized + Sync + Send + 'static {
11    type Delta: Send;
12    type Query: Send;
13    type Publisher: Publisher<Self>;
14    type Subscriber: Subscriber<Self>;
15}
16
17pub trait Publisher<T: PubSub>
18where
19    Self: From<PubInner<T>>,
20    Self: Deref<Target = PubInner<T>>,
21{
22}
23
24pub trait Subscriber<T: PubSub>
25where
26    Self: From<SubInner<T>>,
27    Self: Deref<Target = SubInner<T>>,
28{
29}
30
31pub type PubId = Unique;
32
33pub type SubId = Unique;
34
35pub struct PubEvent<T: PubSub> {
36    pub sub_id: SubId,
37    pub value: PubValue<T>,
38}
39
40pub enum PubValue<T: PubSub> {
41    Connected,
42    Query(T::Query),
43    Disconnected,
44}
45
46pub enum SubEvent<T: PubSub> {
47    Loaded(State<T>),
48    Delta(T::Delta),
49    Lost,
50}
51
52pub struct State<T> {
53    state_rx: watch::Receiver<T>,
54}
55
56impl<T> State<T> {
57    pub fn new(state: T) -> (Self, watch::Sender<T>) {
58        let (state_tx, state_rx) = watch::channel(state);
59        (Self { state_rx }, state_tx)
60    }
61
62    pub fn borrow(&self) -> watch::Ref<T> {
63        self.state_rx.borrow()
64    }
65}