1use thiserror::Error;
4
5#[derive(Error, Debug)]
7pub enum StorageError {
8 #[error("Database connection error: {0}")]
10 ConnectionError(String),
11
12 #[error("Query execution error: {0}")]
14 QueryError(String),
15
16 #[error("Serialization error: {0}")]
18 SerializationError(String),
19
20 #[error("Deserialization error: {0}")]
22 DeserializationError(String),
23
24 #[error("Data integrity error: {0}")]
26 IntegrityError(String),
27
28 #[error("Concurrency conflict: {0}")]
30 ConcurrencyError(String),
31
32 #[error("Resource not found: {0}")]
34 NotFoundError(String),
35
36 #[error("Configuration error: {0}")]
38 ConfigError(String),
39
40 #[error("IO error: {0}")]
42 IoError(#[from] std::io::Error),
43
44 #[error("Other error: {0}")]
46 Other(#[from] anyhow::Error),
47}
48
49pub type StorageResult<T> = Result<T, StorageError>;
51
52impl 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}