use std::fmt;
pub type Result<T> = std::result::Result<T, SqliteError>;
#[derive(Debug)]
pub enum SqliteError {
Io(std::io::Error),
NotSqlite(String),
Unsupported(String),
Malformed {
page: Option<u32>,
reason: String,
},
}
impl SqliteError {
pub(crate) fn malformed(page: impl Into<Option<u32>>, reason: impl Into<String>) -> Self {
SqliteError::Malformed {
page: page.into(),
reason: reason.into(),
}
}
pub(crate) fn unsupported(reason: impl Into<String>) -> Self {
SqliteError::Unsupported(reason.into())
}
pub(crate) fn not_sqlite(reason: impl Into<String>) -> Self {
SqliteError::NotSqlite(reason.into())
}
}
impl fmt::Display for SqliteError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
SqliteError::Io(e) => write!(f, "io error: {e}"),
SqliteError::NotSqlite(reason) => write!(f, "not a sqlite database: {reason}"),
SqliteError::Unsupported(reason) => write!(f, "unsupported sqlite file: {reason}"),
SqliteError::Malformed {
page: Some(p),
reason,
} => write!(f, "malformed sqlite database (page {p}): {reason}"),
SqliteError::Malformed { page: None, reason } => {
write!(f, "malformed sqlite database: {reason}")
}
}
}
}
impl std::error::Error for SqliteError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
SqliteError::Io(e) => Some(e),
_ => None,
}
}
}
impl From<std::io::Error> for SqliteError {
fn from(e: std::io::Error) -> Self {
SqliteError::Io(e)
}
}