Skip to main content

cortexkit_bus_trait/
register.rs

1use async_trait::async_trait;
2
3use crate::BusResult;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
6pub struct Revision(pub u64);
7
8#[derive(Debug, Clone, PartialEq, Eq)]
9pub struct RegisterValue {
10    pub value: Vec<u8>,
11    pub revision: Revision,
12}
13
14#[derive(Debug, Clone, PartialEq, Eq)]
15pub struct RegisterEntry {
16    pub key: String,
17    pub value: Vec<u8>,
18    pub revision: Revision,
19}
20
21#[derive(Debug, Clone, PartialEq, Eq)]
22pub struct Tombstone {
23    pub key: String,
24    pub revision: Revision,
25}
26
27#[derive(Debug, Clone, PartialEq, Eq)]
28pub enum RegisterUpdate {
29    Put(RegisterEntry),
30    Delete(Tombstone),
31}
32
33#[derive(Debug, Clone, PartialEq, Eq)]
34pub enum WatchEvent {
35    /// One event contains the complete, possibly empty, connection snapshot.
36    Snapshot {
37        entries: Vec<RegisterEntry>,
38        revision: Revision,
39    },
40    Update(RegisterUpdate),
41}
42
43#[async_trait]
44pub trait RegisterWatch: Send {
45    async fn next(&mut self) -> BusResult<WatchEvent>;
46
47    /// True only after this watch delivered its snapshot on this connection.
48    fn has_snapshot(&self) -> bool;
49}
50
51#[async_trait]
52pub trait Register: Send + Sync {
53    type Watch: RegisterWatch;
54
55    async fn put(&self, key: &str, value: Vec<u8>) -> BusResult<Revision>;
56    async fn get(&self, key: &str) -> BusResult<RegisterValue>;
57    async fn delete(&self, key: &str) -> BusResult<Tombstone>;
58    async fn watch(&self, prefix: &str) -> BusResult<Self::Watch>;
59}