mdbsql/
error.rs

1use std::{
2    path::PathBuf,
3    sync::{MutexGuard, PoisonError},
4};
5
6use crate::ffi::Mdb;
7
8/// Enum listing for errors from mdbsql.
9#[derive(thiserror::Error, Debug)]
10pub enum Error {
11    /// Error when given path is not a file.
12    #[error("invalid path: {0}")]
13    InvalidPath(PathBuf),
14
15    /// Error when given path is not a valid mdb file.
16    #[error("invalid mdb file: {0}")]
17    InvalidMdbFile(PathBuf),
18
19    /// Error from libmdbsql
20    #[error("{0}")]
21    MdbSqlError(String),
22
23    /// Error converting a string to c-string.
24    #[error(transparent)]
25    NulError(#[from] std::ffi::NulError),
26
27    /// Error converting a string to utf8.
28    #[error(transparent)]
29    Utf8Error(#[from] std::str::Utf8Error),
30
31    /// Poison Error for `MutexGuard<Mdb>`
32    #[error("{0}")]
33    MutexPoisonError(String),
34
35    /// Error when access to row value with invalid index
36    #[error("invalid index to row results: {0}")]
37    InvalidRowIndex(usize),
38
39    /// Error converting SQL value to `T`
40    #[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}