use crate::{
AppendResult, DurableStream, EventQuery, EventStream, HandleStream, NewEvent, QueryResult,
};
use std::error::Error;
use std::fmt::{Display, Formatter};
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum EventStoreError {
EmptyAppend,
ConditionalAppendConflict {
expected: Option<u64>,
actual: Option<u64>,
},
NotImplemented {
store: &'static str,
operation: &'static str,
},
BackendFailure {
message: String,
},
}
impl Display for EventStoreError {
fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
match self {
Self::EmptyAppend => formatter.write_str("append requires at least one event"),
Self::ConditionalAppendConflict { expected, actual } => {
write!(
formatter,
"context version mismatch: expected {expected:?}, actual {actual:?}"
)
}
Self::NotImplemented { store, operation } => {
write!(formatter, "{store} does not implement {operation} yet")
}
Self::BackendFailure { message } => write!(formatter, "backend failure: {message}"),
}
}
}
impl Error for EventStoreError {}
pub trait EventStore {
fn query(&self, event_query: &EventQuery) -> Result<QueryResult, EventStoreError>;
fn append(&self, new_events: Vec<NewEvent>) -> Result<AppendResult, EventStoreError>;
fn append_if(
&self,
new_events: Vec<NewEvent>,
context_query: &EventQuery,
expected_context_version: Option<u64>,
) -> Result<AppendResult, EventStoreError>;
fn stream_all(&self, handle: HandleStream) -> Result<EventStream, EventStoreError>;
fn stream_to(
&self,
event_query: &EventQuery,
handle: HandleStream,
) -> Result<EventStream, EventStoreError>;
fn stream_all_durable(
&self,
durable_stream: &DurableStream,
handle: HandleStream,
) -> Result<EventStream, EventStoreError>;
fn stream_to_durable(
&self,
durable_stream: &DurableStream,
event_query: &EventQuery,
handle: HandleStream,
) -> Result<EventStream, EventStoreError>;
}