tea_session_sqlite/
error.rs1use thiserror::Error;
2
3#[derive(Debug, Clone, PartialEq, Error)]
5pub enum SqliteSessionError {
6 #[error("sqlite schema failure: {0}")]
8 Schema(String),
9 #[error("sqlite failure: {0}")]
11 Sqlite(String),
12 #[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}