use thiserror::Error;
pub type LockResult<T> = Result<T, LockError>;
#[derive(Debug, Error)]
pub enum LockError {
#[error("invalid distributed lock config: {0}")]
InvalidConfig(String),
#[error("distributed lock timed out: {0}")]
Timeout(String),
#[error("distributed lock connection error: {0}")]
Connection(String),
#[error("distributed lock circuit breaker rejected operation: {0}")]
BreakerOpen(String),
#[error("distributed lock is already held")]
Busy,
#[error("distributed lock owner token did not match")]
OwnerMismatch,
#[error("distributed lock backend error: {0}")]
Backend(String),
}
impl From<crate::cache_redis::RedisCacheError> for LockError {
fn from(error: crate::cache_redis::RedisCacheError) -> Self {
match error {
crate::cache_redis::RedisCacheError::InvalidConfig(message) => {
Self::InvalidConfig(message)
}
crate::cache_redis::RedisCacheError::InvalidUrl { url } => {
Self::InvalidConfig(format!("invalid redis url `{url}`"))
}
crate::cache_redis::RedisCacheError::Connection(message) => Self::Connection(message),
crate::cache_redis::RedisCacheError::Timeout(operation) => Self::Timeout(operation),
crate::cache_redis::RedisCacheError::BreakerOpen(message) => Self::BreakerOpen(message),
other => Self::Backend(other.to_string()),
}
}
}