Skip to main content

actr_runtime_mailbox/
error.rs

1//! Storage layer error definitions
2
3use thiserror::Error;
4
5/// Storage layer error type
6#[derive(Error, Debug)]
7pub enum StorageError {
8    /// Database connection error
9    #[error("Database connection error: {0}")]
10    ConnectionError(String),
11
12    /// Query execution error
13    #[error("Query execution error: {0}")]
14    QueryError(String),
15
16    /// Serialization error
17    #[error("Serialization error: {0}")]
18    SerializationError(String),
19
20    /// Deserialization error
21    #[error("Deserialization error: {0}")]
22    DeserializationError(String),
23
24    /// Data integrity error
25    #[error("Data integrity error: {0}")]
26    IntegrityError(String),
27
28    /// Concurrency conflict error
29    #[error("Concurrency conflict: {0}")]
30    ConcurrencyError(String),
31
32    /// Resource not found error
33    #[error("Resource not found: {0}")]
34    NotFoundError(String),
35
36    /// Configuration error
37    #[error("Configuration error: {0}")]
38    ConfigError(String),
39
40    /// IO error
41    #[error("IO error: {0}")]
42    IoError(#[from] std::io::Error),
43
44    /// Other error
45    #[error("Other error: {0}")]
46    Other(#[from] anyhow::Error),
47}
48
49/// Storage layer result type
50pub type StorageResult<T> = Result<T, StorageError>;
51
52/// Convert actor error to storage error
53impl From<actr_protocol::ActrError> for StorageError {
54    fn from(err: actr_protocol::ActrError) -> Self {
55        StorageError::Other(anyhow::anyhow!("Actor error: {err}"))
56    }
57}
58
59#[cfg(feature = "sqlite")]
60impl From<rusqlite::Error> for StorageError {
61    fn from(err: rusqlite::Error) -> Self {
62        match err {
63            rusqlite::Error::SqliteFailure(sqlite_err, msg) => {
64                let message = format!(
65                    "SQLite error: {:?} - {}",
66                    sqlite_err.code,
67                    msg.unwrap_or_default()
68                );
69                match sqlite_err.code {
70                    rusqlite::ErrorCode::DatabaseBusy | rusqlite::ErrorCode::DatabaseLocked => {
71                        StorageError::ConcurrencyError(message)
72                    }
73                    rusqlite::ErrorCode::ConstraintViolation => {
74                        StorageError::IntegrityError(message)
75                    }
76                    rusqlite::ErrorCode::NotFound => StorageError::NotFoundError(message),
77                    _ => StorageError::QueryError(message),
78                }
79            }
80            _ => StorageError::QueryError(err.to_string()),
81        }
82    }
83}