Skip to main content

nrc_mls_sqlite_storage/
error.rs

1//! Error types for the SQLite storage implementation.
2
3use std::fmt;
4
5/// Error type for SQLite storage operations.
6#[derive(Debug)]
7pub enum Error {
8    /// SQLite database error
9    Database(String),
10    /// Error from rusqlite
11    Rusqlite(rusqlite::Error),
12    /// Error during database migration
13    Refinery(refinery::Error),
14    /// Error from OpenMLS
15    OpenMls(String),
16}
17
18impl std::error::Error for Error {}
19
20impl fmt::Display for Error {
21    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
22        match self {
23            Self::Database(msg) => write!(f, "Database error: {}", msg),
24            Self::Rusqlite(err) => write!(f, "SQLite error: {}", err),
25            Self::Refinery(msg) => write!(f, "Migration error: {}", msg),
26            Self::OpenMls(msg) => write!(f, "OpenMLS error: {}", msg),
27        }
28    }
29}
30
31impl From<rusqlite::Error> for Error {
32    fn from(e: rusqlite::Error) -> Self {
33        Self::Rusqlite(e)
34    }
35}
36
37impl From<refinery::Error> for Error {
38    fn from(e: refinery::Error) -> Self {
39        Self::Refinery(e)
40    }
41}
42
43impl From<std::io::Error> for Error {
44    fn from(e: std::io::Error) -> Self {
45        Self::Database(format!("IO error: {}", e))
46    }
47}
48
49impl From<Error> for rusqlite::Error {
50    fn from(err: Error) -> Self {
51        rusqlite::Error::FromSqlConversionFailure(
52            0,
53            rusqlite::types::Type::Text,
54            Box::new(std::io::Error::new(
55                std::io::ErrorKind::InvalidData,
56                err.to_string(),
57            )),
58        )
59    }
60}