use thiserror::Error;
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum StorageError {
#[error("schema migration failed at version {version}: {message}")]
Migration { version: u32, message: String },
#[error("invalid input: {0}")]
InvalidInput(String),
#[error("not found: {0}")]
NotFound(String),
#[error("conflict: {0}")]
Conflict(String),
#[error("io: {0}")]
Io(#[from] std::io::Error),
#[error("serde: {0}")]
Serde(#[from] serde_json::Error),
#[error("backend: {0}")]
Backend(String),
#[error(transparent)]
Paths(#[from] super::paths::PathsError),
}
impl StorageError {
#[must_use]
pub fn is_transient_conflict(&self) -> bool {
let msg = self.to_string().to_lowercase();
msg.contains("conflict")
|| msg.contains("database is locked")
|| msg.contains("sqlite_busy")
|| msg.contains("deadlock detected")
|| msg.contains("could not serialize access")
|| msg.contains("write conflict")
|| msg.contains("transaction was aborted")
|| msg.contains("pool timed out")
|| msg.contains("timed out while waiting")
}
}
pub type Result<T> = std::result::Result<T, StorageError>;