1use crate::persist::SerializedEvent;
2use crate::AggregateError;
3use std::error;
4
5#[derive(Debug, thiserror::Error)]
7pub enum PersistenceError {
8 #[error("optimistic lock error")]
10 OptimisticLockError,
11 #[error("{0}")]
13 ConnectionError(Box<dyn std::error::Error + Send + Sync + 'static>),
14 #[error("{0}")]
16 DeserializationError(Box<dyn std::error::Error + Send + Sync + 'static>),
17 #[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}