cqrs_es/persist/
error.rs

1use crate::persist::SerializedEvent;
2use crate::AggregateError;
3use std::error;
4
5/// Errors for implementations of a persistent event store.
6#[derive(Debug, thiserror::Error)]
7pub enum PersistenceError {
8    /// Optimistic locking conflict occurred while committing and aggregate.
9    #[error("optimistic lock error")]
10    OptimisticLockError,
11    /// An error occurred connecting to the database.
12    #[error("{0}")]
13    ConnectionError(Box<dyn std::error::Error + Send + Sync + 'static>),
14    /// Error occurred while attempting to deserialize data.
15    #[error("{0}")]
16    DeserializationError(Box<dyn std::error::Error + Send + Sync + 'static>),
17    /// An unexpected error occurred while accessing the database.
18    #[error("{0}")]
19    UnknownError(Box<dyn std::error::Error + Send + Sync + 'static>),
20}
21
22impl<T: std::error::Error> From<PersistenceError> for AggregateError<T> {
23    fn from(err: PersistenceError) -> Self {
24        match err {
25            PersistenceError::OptimisticLockError => Self::AggregateConflict,
26            PersistenceError::ConnectionError(error) => Self::DatabaseConnectionError(error),
27            PersistenceError::DeserializationError(error) => Self::DeserializationError(error),
28            PersistenceError::UnknownError(error) => Self::UnexpectedError(error),
29        }
30    }
31}
32
33impl From<serde_json::Error> for PersistenceError {
34    fn from(err: serde_json::Error) -> Self {
35        match err.classify() {
36            serde_json::error::Category::Data | serde_json::error::Category::Syntax => {
37                Self::DeserializationError(Box::new(err))
38            }
39            serde_json::error::Category::Io | serde_json::error::Category::Eof => {
40                Self::UnknownError(Box::new(err))
41            }
42        }
43    }
44}
45
46impl From<tokio::sync::mpsc::error::SendError<Result<SerializedEvent, Self>>> for PersistenceError {
47    fn from(err: tokio::sync::mpsc::error::SendError<Result<SerializedEvent, Self>>) -> Self {
48        Self::UnknownError(Box::new(err))
49    }
50}
51
52impl<T: error::Error> From<serde_json::error::Error> for AggregateError<T> {
53    fn from(err: serde_json::error::Error) -> Self {
54        match err.classify() {
55            serde_json::error::Category::Data | serde_json::error::Category::Syntax => {
56                Self::DeserializationError(Box::new(err))
57            }
58            serde_json::error::Category::Io | serde_json::error::Category::Eof => {
59                Self::UnexpectedError(Box::new(err))
60            }
61        }
62    }
63}