1use std::{
2 path::PathBuf,
3 sync::{MutexGuard, PoisonError},
4};
5
6use crate::ffi::Mdb;
7
8#[derive(thiserror::Error, Debug)]
10pub enum Error {
11 #[error("invalid path: {0}")]
13 InvalidPath(PathBuf),
14
15 #[error("invalid mdb file: {0}")]
17 InvalidMdbFile(PathBuf),
18
19 #[error("{0}")]
21 MdbSqlError(String),
22
23 #[error(transparent)]
25 NulError(#[from] std::ffi::NulError),
26
27 #[error(transparent)]
29 Utf8Error(#[from] std::str::Utf8Error),
30
31 #[error("{0}")]
33 MutexPoisonError(String),
34
35 #[error("invalid index to row results: {0}")]
37 InvalidRowIndex(usize),
38
39 #[error(transparent)]
41 FromSqlError(#[from] serde_plain::Error),
42}
43
44impl From<PoisonError<MutexGuard<'_, Mdb>>> for Error {
45 fn from(error: PoisonError<MutexGuard<Mdb>>) -> Self {
46 Self::MutexPoisonError(error.to_string())
47 }
48}
49
50#[cfg(feature = "rusqlite")]
51impl From<Error> for rusqlite::Error {
52 fn from(e: Error) -> Self {
53 match e {
54 Error::InvalidPath(p) => Self::InvalidPath(p),
55 Error::NulError(e) => Self::NulError(e),
56 Error::Utf8Error(e) => Self::Utf8Error(e),
57 err => Self::SqliteFailure(
58 rusqlite::ffi::Error {
59 code: rusqlite::ffi::ErrorCode::Unknown,
60 extended_code: 0,
61 },
62 Some(err.to_string()),
63 ),
64 }
65 }
66}