use async_trait::async_trait;
use crate::event::{EventVersion, StreamEvent};
use crate::namespace::Namespace;
#[async_trait]
pub trait EventStore: Send + Sync {
async fn ensure_namespace<N: Namespace>(&self, namespace: &N) -> crate::Result<()>;
async fn persist_next<N: Namespace>(
&self,
namespace: &N,
payload: &[u8],
filter_value: Option<&str>,
) -> crate::Result<StreamEvent>;
async fn load_history<N: Namespace>(
&self,
namespace: &N,
limit: u64,
) -> crate::Result<Vec<StreamEvent>>;
async fn load_after_version<N: Namespace>(
&self,
namespace: &N,
after_version: EventVersion,
limit: u64,
) -> crate::Result<Vec<StreamEvent>>;
async fn latest_version<N: Namespace>(
&self,
namespace: &N,
) -> crate::Result<Option<EventVersion>>;
}