1use async_trait::async_trait;
2use dyn_clone::DynClone;
3use evento_query::{CursorType, QueryResult};
4use serde_json::Value;
5
6use crate::{
7 error::Result,
8 store::{Event, WriteEvent},
9};
10
11#[cfg(feature = "memory")]
12mod memory;
13#[cfg(feature = "memory")]
14pub use memory::*;
15
16#[cfg(feature = "pg")]
17mod pg;
18#[cfg(feature = "pg")]
19pub use pg::*;
20
21#[async_trait]
22pub trait Engine: DynClone + Send + Sync {
23 async fn write(
24 &self,
25 aggregate_id: &'_ str,
26 events: Vec<WriteEvent>,
27 original_version: u16,
28 ) -> Result<Vec<Event>>;
29
30 async fn insert(&self, events: Vec<Event>) -> Result<()>;
31
32 async fn upsert(&self, event: Event) -> Result<()>;
33
34 async fn read(
35 &self,
36 first: u16,
37 after: Option<CursorType>,
38 filters: Option<Vec<Value>>,
39 aggregate_id: Option<&'_ str>,
40 ) -> Result<QueryResult<Event>>;
41
42 async fn last(&self) -> Result<Option<Event>>;
43}
44
45dyn_clone::clone_trait_object!(Engine);