use mnesis::{ErrorId, KernelError, Version};
use thiserror::Error;
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum StoreError<A, EncErr, DecErr> {
#[error(
"concurrency conflict on stream '{stream_id}': expected version {expected:?}, actual {actual:?}"
)]
Conflict {
stream_id: ErrorId,
expected: Option<Version>,
actual: Option<Version>,
},
#[error("stream '{stream_id}' not found")]
StreamNotFound { stream_id: ErrorId },
#[error("adapter error: {0}")]
Adapter(#[source] A),
#[error("encode error: {0}")]
Encode(#[source] EncErr),
#[error("decode error: {0}")]
Decode(#[source] DecErr),
#[error("kernel error: {0}")]
Kernel(#[from] KernelError),
#[error("version overflow: cannot advance past u64::MAX")]
VersionOverflow,
#[error("envelope synthesis error: {0}")]
EnvelopeSynthesis(#[source] crate::envelope::ForDecodeError),
#[error("envelope error: {0}")]
Envelope(#[from] crate::envelope::EnvelopeError),
}
impl<A, EncErr, DecErr> StoreError<A, EncErr, DecErr> {
#[must_use]
pub const fn is_conflict(&self) -> bool {
matches!(self, Self::Conflict { .. })
}
}
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum LoadWithError<A, EncErr, DecErr, UpErr> {
#[error(transparent)]
Store(#[from] StoreError<A, EncErr, DecErr>),
#[error("upcast error: {0}")]
Upcast(#[source] UpErr),
}
impl<A, EncErr, DecErr, UpErr> From<KernelError> for LoadWithError<A, EncErr, DecErr, UpErr> {
fn from(err: KernelError) -> Self {
Self::Store(StoreError::Kernel(err))
}
}
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum AppendError<E> {
#[error(
"concurrency conflict on '{stream_id}': expected version {expected:?}, actual {actual:?}"
)]
Conflict {
stream_id: ErrorId,
expected: Option<Version>,
actual: Option<Version>,
},
#[error("store error: {0}")]
Store(#[source] E),
}
#[derive(Debug, Error)]
pub enum AppendValidationError {
#[error("append conflict on '{stream_id}': expected {expected:?}, actual {actual:?}")]
Conflict {
stream_id: ErrorId,
expected: Option<Version>,
actual: Option<Version>,
},
#[error("stream version overflow at u64::MAX")]
VersionOverflow,
}