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