hopr_db_node/
errors.rs

1use std::sync::Arc;
2
3use hopr_crypto_packet::errors::TicketValidationError;
4use hopr_internal_types::prelude::Ticket;
5use sea_orm::TransactionError;
6
7#[derive(Debug, thiserror::Error)]
8pub enum NodeDbError {
9    #[error("cannot find a surb: {0}")]
10    NoSurbAvailable(String),
11
12    #[error("ticket validation error for {}: {}", .0.0, .0.1)]
13    TicketValidationError(Box<(Ticket, String)>),
14
15    #[error("failed to process acknowledgement: {0}")]
16    AcknowledgementValidationError(String),
17
18    #[error("logical error: {0}")]
19    LogicalError(String),
20
21    #[error("orm error: {0}")]
22    Orm(#[from] sea_orm::error::DbErr),
23
24    #[error("sqlite error: {0}")]
25    Sqlite(#[from] sqlx::Error),
26
27    #[error("other error: {0}")]
28    Other(Box<dyn std::error::Error + Send + Sync>),
29
30    #[error("error while inserting into cache: {0}")]
31    Cache(#[from] Arc<Self>),
32
33    #[error("custom error: {0}")]
34    Custom(String),
35
36    #[error(transparent)]
37    EntityError(#[from] hopr_db_entity::errors::DbEntityError),
38
39    #[error(transparent)]
40    PacketError(#[from] hopr_crypto_packet::errors::PacketError),
41
42    #[error(transparent)]
43    TypeError(#[from] hopr_primitive_types::errors::GeneralError),
44
45    #[error(transparent)]
46    CoreTypeError(#[from] hopr_internal_types::errors::CoreTypesError),
47
48    #[error(transparent)]
49    CryptoError(#[from] hopr_crypto_types::errors::CryptoError),
50}
51
52impl<E: std::error::Error + Send + Sync + 'static> From<TransactionError<E>> for NodeDbError {
53    fn from(value: TransactionError<E>) -> Self {
54        match value {
55            TransactionError::Connection(c) => Self::Orm(c),
56            TransactionError::Transaction(e) => Self::Other(e.into()),
57        }
58    }
59}
60
61impl<E: std::error::Error + Send + Sync + 'static> From<Arc<TransactionError<E>>> for NodeDbError {
62    fn from(value: Arc<TransactionError<E>>) -> Self {
63        Self::Custom(format!("in-cache transaction error: {value}"))
64    }
65}
66
67impl From<TicketValidationError> for NodeDbError {
68    fn from(value: TicketValidationError) -> Self {
69        Self::TicketValidationError(Box::new((*value.ticket, value.reason)))
70    }
71}