actr_mailbox/
error.rs

1//! 存储层错误定义
2
3use thiserror::Error;
4
5/// 存储层错误类型
6#[derive(Error, Debug)]
7pub enum StorageError {
8    /// 数据库连接错误
9    #[error("Database connection error: {0}")]
10    ConnectionError(String),
11
12    /// 查询执行错误
13    #[error("Query execution error: {0}")]
14    QueryError(String),
15
16    /// 序列化错误
17    #[error("Serialization error: {0}")]
18    SerializationError(String),
19
20    /// 反序列化错误
21    #[error("Deserialization error: {0}")]
22    DeserializationError(String),
23
24    /// 数据完整性错误
25    #[error("Data integrity error: {0}")]
26    IntegrityError(String),
27
28    /// 并发冲突错误
29    #[error("Concurrency conflict: {0}")]
30    ConcurrencyError(String),
31
32    /// 资源不存在错误
33    #[error("Resource not found: {0}")]
34    NotFoundError(String),
35
36    /// 配置错误
37    #[error("Configuration error: {0}")]
38    ConfigError(String),
39
40    /// IO 错误
41    #[error("IO error: {0}")]
42    IoError(#[from] std::io::Error),
43
44    /// 其他错误
45    #[error("Other error: {0}")]
46    Other(#[from] anyhow::Error),
47}
48
49/// 存储层结果类型
50pub type StorageResult<T> = Result<T, StorageError>;
51
52/// 从 actor 错误转换为存储错误
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
59impl From<rusqlite::Error> for StorageError {
60    fn from(err: rusqlite::Error) -> Self {
61        match err {
62            rusqlite::Error::SqliteFailure(sqlite_err, msg) => {
63                let message = format!(
64                    "SQLite error: {:?} - {}",
65                    sqlite_err.code,
66                    msg.unwrap_or_default()
67                );
68                match sqlite_err.code {
69                    rusqlite::ErrorCode::DatabaseBusy | rusqlite::ErrorCode::DatabaseLocked => {
70                        StorageError::ConcurrencyError(message)
71                    }
72                    rusqlite::ErrorCode::ConstraintViolation => {
73                        StorageError::IntegrityError(message)
74                    }
75                    rusqlite::ErrorCode::NotFound => StorageError::NotFoundError(message),
76                    _ => StorageError::QueryError(message),
77                }
78            }
79            _ => StorageError::QueryError(err.to_string()),
80        }
81    }
82}