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