use std::{
path::PathBuf,
sync::{MutexGuard, PoisonError},
};
use crate::ffi::Mdb;
#[derive(thiserror::Error, Debug)]
pub enum Error {
#[error("invalid path: {0}")]
InvalidPath(PathBuf),
#[error("invalid mdb file: {0}")]
InvalidMdbFile(PathBuf),
#[error("{0}")]
MdbSqlError(String),
#[error(transparent)]
NulError(#[from] std::ffi::NulError),
#[error(transparent)]
Utf8Error(#[from] std::str::Utf8Error),
#[error("{0}")]
MutexPoisonError(String),
#[error("invalid index to row results: {0}")]
InvalidRowIndex(usize),
#[error(transparent)]
FromSqlError(#[from] serde_plain::Error),
}
impl From<PoisonError<MutexGuard<'_, Mdb>>> for Error {
fn from(error: PoisonError<MutexGuard<Mdb>>) -> Self {
Self::MutexPoisonError(error.to_string())
}
}
#[cfg(feature = "rusqlite")]
impl From<Error> for rusqlite::Error {
fn from(e: Error) -> Self {
match e {
Error::InvalidPath(p) => Self::InvalidPath(p),
Error::NulError(e) => Self::NulError(e),
Error::Utf8Error(e) => Self::Utf8Error(e),
err => Self::SqliteFailure(
rusqlite::ffi::Error {
code: rusqlite::ffi::ErrorCode::Unknown,
extended_code: 0,
},
Some(err.to_string()),
),
}
}
}