#[cfg(feature = "persistence")]
use durability as durability_crate;
use thiserror::Error;
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum PersistenceError {
#[error("I/O error: {0}")]
Io(#[from] std::io::Error),
#[error("format error: {0}")]
Format(String),
#[error("serialization error: {0}")]
Serialization(String),
#[error("deserialization error: {0}")]
Deserialization(String),
#[error("checksum mismatch: expected {expected}, got {actual}")]
ChecksumMismatch {
expected: u32,
actual: u32,
},
#[error("failed to acquire lock on {resource}: {reason}")]
LockFailed {
resource: String,
reason: String,
},
#[error("invalid state: {0}")]
InvalidState(String),
#[error("resource not found: {0}")]
NotFound(String),
#[error("invalid configuration: {0}")]
InvalidConfig(String),
#[error("operation not supported: {0}")]
NotSupported(String),
}
#[cfg(feature = "persistence")]
impl From<postcard::Error> for PersistenceError {
fn from(e: postcard::Error) -> Self {
Self::Serialization(format!("postcard error: {}", e))
}
}
impl From<crate::RetrieveError> for PersistenceError {
fn from(e: crate::RetrieveError) -> Self {
Self::Format(e.to_string())
}
}
impl From<PersistenceError> for crate::RetrieveError {
fn from(e: PersistenceError) -> Self {
match e {
PersistenceError::Io(e) => Self::Other(format!("persistence I/O: {e}")),
PersistenceError::Format(s) => Self::FormatError(s),
PersistenceError::Serialization(s) => Self::Serialization(s),
PersistenceError::Deserialization(s) => Self::FormatError(s),
_ => Self::Other(e.to_string()),
}
}
}
pub type PersistenceResult<T> = Result<T, PersistenceError>;
#[cfg(feature = "persistence")]
impl From<durability_crate::PersistenceError> for PersistenceError {
fn from(e: durability_crate::PersistenceError) -> Self {
match e {
durability_crate::PersistenceError::Io(e) => Self::Io(e),
durability_crate::PersistenceError::Format(s) => Self::Format(s),
durability_crate::PersistenceError::CrcMismatch { expected, actual } => {
Self::ChecksumMismatch { expected, actual }
}
durability_crate::PersistenceError::Encode(s) => Self::Serialization(s),
durability_crate::PersistenceError::Decode(s) => Self::Deserialization(s),
durability_crate::PersistenceError::InvalidState(s) => Self::InvalidState(s),
durability_crate::PersistenceError::InvalidConfig(s) => Self::InvalidConfig(s),
durability_crate::PersistenceError::NotSupported(s) => Self::NotSupported(s),
durability_crate::PersistenceError::LockFailed { resource, reason } => {
Self::LockFailed { resource, reason }
}
durability_crate::PersistenceError::NotFound(s) => Self::NotFound(s),
_ => Self::Format(format!("unknown durability error: {e}")),
}
}
}