1use std::sync::Arc;
2
3use hopr_crypto_packet::errors::TicketValidationError;
4use hopr_crypto_types::{prelude::CryptoError, types::Hash};
5use hopr_db_entity::errors::DbEntityError;
6use hopr_internal_types::{errors::CoreTypesError, tickets::Ticket};
7use sea_orm::TransactionError;
8use thiserror::Error;
9
10#[derive(Debug, Error)]
11pub enum DbSqlError {
12 #[error("failed to construct the database: {0}")]
13 Construction(String),
14
15 #[error("log status not found")]
16 MissingLogStatus,
17
18 #[error("log not found")]
19 MissingLog,
20
21 #[error("invalid target db")]
22 InvalidDb,
23
24 #[error("inconsistent on-chain logs")]
25 InconsistentLogs,
26
27 #[error("adversarial behavior detected: {0}")]
28 PossibleAdversaryError(String),
29
30 #[error("list of logs is empty")]
31 EmptyLogsList,
32
33 #[error("log status could not be updated")]
34 UpdateLogStatusError,
35
36 #[error("account entry for announcement not found")]
37 MissingAccount,
38
39 #[error("channel not found: {0}")]
40 ChannelNotFound(Hash),
41
42 #[error("can't edit a corrupted channel: {0}")]
43 CorruptedChannelEntry(Hash),
44
45 #[error("missing fixed entry in table {0}")]
46 MissingFixedTableEntry(String),
47
48 #[error("ticket aggregation error: {0}")]
49 TicketAggregationError(String),
50
51 #[error("ticket validation error for {}: {}", .0.0, .0.1)]
52 TicketValidationError(Box<(Ticket, String)>),
53
54 #[error("transaction error: {0}")]
55 TransactionError(Box<dyn std::error::Error + Send + Sync>),
56
57 #[error("error while decoding db entity")]
58 DecodingError,
59
60 #[error("logical error: {0}")]
61 LogicalError(String),
62
63 #[error("ack validation error: {0}")]
64 AcknowledgementValidationError(String),
65
66 #[error(transparent)]
67 BackendError(#[from] sea_orm::DbErr),
68
69 #[error(transparent)]
70 CoreTypesError(#[from] CoreTypesError),
71
72 #[error(transparent)]
73 CryptoError(#[from] CryptoError),
74
75 #[error(transparent)]
76 EntityError(#[from] DbEntityError),
77
78 #[error("error while inserting into cache: {0}")]
79 CacheError(#[from] Arc<Self>),
80
81 #[error(transparent)]
82 NonSpecificError(#[from] hopr_primitive_types::errors::GeneralError),
83}
84
85impl From<TicketValidationError> for DbSqlError {
86 fn from(value: TicketValidationError) -> Self {
87 DbSqlError::TicketValidationError(Box::new((*value.ticket, value.reason)))
88 }
89}
90
91impl<E: std::error::Error + Send + Sync + 'static> From<TransactionError<E>> for DbSqlError {
92 fn from(value: TransactionError<E>) -> Self {
93 match value {
94 TransactionError::Connection(e) => Self::BackendError(e),
95 TransactionError::Transaction(e) => Self::TransactionError(e.into()),
96 }
97 }
98}
99
100pub type Result<T> = std::result::Result<T, DbSqlError>;