Skip to main content

azoth_core/
error.rs

1use std::io;
2use thiserror::Error;
3
4#[derive(Error, Debug)]
5pub enum AzothError {
6    #[error("IO error: {0}")]
7    Io(#[from] io::Error),
8
9    #[error("Serialization error: {0}")]
10    Serialization(String),
11
12    #[error("Transaction error: {0}")]
13    Transaction(String),
14
15    #[error("Store is sealed at event {0}")]
16    Sealed(u64),
17
18    #[error("Store is paused, ingestion suspended")]
19    Paused,
20
21    #[error("Configuration error: {0}")]
22    Config(String),
23
24    #[error("Backup error: {0}")]
25    Backup(String),
26
27    #[error("Restore error: {0}")]
28    Restore(String),
29
30    #[error("Encryption error: {0}")]
31    Encryption(String),
32
33    #[error("Projection error: {0}")]
34    Projection(String),
35
36    #[error("Event decoding error: {0}")]
37    EventDecode(String),
38
39    #[error("Preflight validation error: {0}")]
40    PreflightFailed(String),
41
42    #[error("Lock error: {0}")]
43    Lock(String),
44
45    #[error("Not found: {0}")]
46    NotFound(String),
47
48    #[error("Invalid state: {0}")]
49    InvalidState(String),
50
51    #[error("Timeout: {0}")]
52    Timeout(String),
53
54    #[error(
55        "Lock acquisition timed out after {timeout_ms}ms (possible deadlock or high contention)"
56    )]
57    LockTimeout { timeout_ms: u64 },
58
59    #[error("Attempted to access undeclared key '{key}' - all keys must be declared via keys() before access")]
60    UndeclaredKeyAccess { key: String },
61
62    #[error("Circuit breaker is open, rejecting request")]
63    CircuitBreakerOpen,
64
65    #[error("Internal error: {0}")]
66    Internal(String),
67
68    #[error("Other error: {0}")]
69    Other(#[from] anyhow::Error),
70}
71
72pub type Result<T> = std::result::Result<T, AzothError>;
73
74// Custom Error Types:
75//
76// Azoth supports custom error types through the `#[from] anyhow::Error` variant.
77// Any error implementing `std::error::Error + Send + Sync + 'static` can be
78// converted to `AzothError::Other`.
79//
80// For better control, implement `From<YourError> for AzothError` directly.
81//
82// Example:
83//
84// use thiserror::Error;
85//
86// #[derive(Error, Debug)]
87// pub enum MyAppError {
88//     #[error("Business logic error: {0}")]
89//     BusinessLogic(String),
90//
91//     #[error("Authorization error: {0}")]
92//     Unauthorized(String),
93//
94//     #[error(transparent)]
95//     Azoth(#[from] AzothError),
96// }
97//
98// impl From<MyAppError> for AzothError {
99//     fn from(err: MyAppError) -> Self {
100//         match err {
101//             MyAppError::Azoth(e) => e,
102//             other => AzothError::Other(other.into()),
103//         }
104//     }
105// }