use thiserror::Error;
pub type PersistenceResult<T> = std::result::Result<T, PersistenceError>;
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum PersistenceError {
#[error("lock held: {key}")]
LockHeld {
key: String,
},
#[error("lock acquire timed out for key '{key}' after {attempts} attempts")]
LockAcquireTimeout {
key: String,
attempts: u32,
},
#[error(
"schema version mismatch: payload version {payload}, build version range \
[{min}, {current}]"
)]
SchemaVersionMismatch {
payload: u32,
min: u32,
current: u32,
},
#[error("configuration error: {0}")]
Config(String),
#[error("backend failure: {0}")]
Backend(String),
#[error(transparent)]
Serde(#[from] serde_json::Error),
}
impl From<PersistenceError> for entelix_core::Error {
fn from(err: PersistenceError) -> Self {
match err {
PersistenceError::LockHeld { .. } | PersistenceError::LockAcquireTimeout { .. } => {
Self::invalid_request(err.to_string())
}
PersistenceError::SchemaVersionMismatch { .. } => Self::config(err.to_string()),
PersistenceError::Config(msg) => Self::config(msg),
PersistenceError::Backend(msg) => Self::provider_network(msg),
PersistenceError::Serde(e) => Self::Serde(e),
}
}
}