1use async_trait::async_trait;
2
3use crate::event::{EventVersion, StreamEvent};
4use crate::namespace::Namespace;
5
6#[async_trait]
8pub trait EventStore: Send + Sync {
9 async fn ensure_namespace<N: Namespace>(&self, namespace: &N) -> crate::Result<()>;
11
12 async fn persist_next<N: Namespace>(
14 &self,
15 namespace: &N,
16 payload: &[u8],
17 ) -> crate::Result<StreamEvent>;
18
19 async fn load_history<N: Namespace>(
21 &self,
22 namespace: &N,
23 limit: u64,
24 ) -> crate::Result<Vec<StreamEvent>>;
25
26 async fn load_after_version<N: Namespace>(
28 &self,
29 namespace: &N,
30 after_version: EventVersion,
31 limit: u64,
32 ) -> crate::Result<Vec<StreamEvent>>;
33
34 async fn latest_version<N: Namespace>(
36 &self,
37 namespace: &N,
38 ) -> crate::Result<Option<EventVersion>>;
39}