hopr_db_sql/
errors.rs

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// TODO: remove the DbSqlError and implement the entire db/sql crate with hopr_db_api::errors::DbError
11#[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>;