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}