Skip to main content

tea_session_sqlite/
error.rs

1use thiserror::Error;
2
3/// Bounded failure returned by the `SQLite` session store.
4#[derive(Debug, Clone, PartialEq, Error)]
5pub enum SqliteSessionError {
6    /// The database schema is unsupported or structurally incompatible.
7    #[error("sqlite schema failure: {0}")]
8    Schema(String),
9    /// A `SQLite` operation failed.
10    #[error("sqlite failure: {0}")]
11    Sqlite(String),
12    /// A canonical record or journal entry failed to serialize.
13    #[error("serialization failure: {0}")]
14    Serialization(String),
15}
16
17impl From<rusqlite::Error> for SqliteSessionError {
18    fn from(error: rusqlite::Error) -> Self {
19        match error {
20            rusqlite::Error::SqliteFailure(error, Some(message))
21                if error.extended_code == rusqlite::ffi::SQLITE_SCHEMA =>
22            {
23                Self::Schema(message)
24            }
25            error => Self::Sqlite(error.to_string()),
26        }
27    }
28}
29
30impl From<SqliteSessionError> for tea_session::SessionStoreError {
31    fn from(error: SqliteSessionError) -> Self {
32        use tea_session::SessionStoreErrorCode;
33        let code = match &error {
34            SqliteSessionError::Schema(_) => SessionStoreErrorCode::UnsupportedSchemaVersion,
35            SqliteSessionError::Sqlite(message) if message.contains("constraint") => {
36                SessionStoreErrorCode::SequenceConflict
37            }
38            SqliteSessionError::Sqlite(_) => SessionStoreErrorCode::StorageUnavailable,
39            SqliteSessionError::Serialization(_) => SessionStoreErrorCode::InvalidRecord,
40        };
41        tea_session::SessionStoreError::new(code, error.to_string())
42    }
43}