#[derive(Debug, thiserror::Error)]
#[non_exhaustive]
pub enum BackendError {
#[error("backend: not a valid database")]
NotADatabase,
#[error("backend: database is locked or busy")]
Locked,
#[error("backend: constraint violation: {0}")]
Constraint(String),
#[error("backend: I/O error: {0}")]
Io(String),
#[error("{0}")]
Validation(String),
#[error("backend: operation not supported: {capability}")]
Unsupported {
capability: &'static str,
},
#[error("{0}")]
OpfsUnavailable(String),
#[error("backend: {0}")]
Other(String),
}
#[cfg(any(feature = "native-sqlite", feature = "_has-encryption"))]
pub fn from_rusqlite(err: rusqlite::Error) -> BackendError {
use rusqlite::Error::SqliteFailure;
use rusqlite::ErrorCode;
match &err {
SqliteFailure(ffi_err, msg) => match ffi_err.code {
ErrorCode::NotADatabase => BackendError::NotADatabase,
ErrorCode::DatabaseBusy | ErrorCode::DatabaseLocked => BackendError::Locked,
ErrorCode::ConstraintViolation => {
BackendError::Constraint(msg.clone().unwrap_or_default())
}
ErrorCode::SystemIoFailure => BackendError::Io(msg.clone().unwrap_or_default()),
_ => BackendError::Other(err.to_string()),
},
_ => BackendError::Other(err.to_string()),
}
}