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}