sqlx_ledger/
error.rs

1use rust_decimal::Decimal;
2use sqlx::error::DatabaseError;
3use thiserror::Error;
4
5use cel_interpreter::CelError;
6
7use crate::{event::SqlxLedgerEvent, primitives::*, tx_template::ParamDataType};
8
9#[derive(Error, Debug)]
10pub enum SqlxLedgerError {
11    #[error("SqlxLedgerError - Sqlx: {0}")]
12    Sqlx(sqlx::Error),
13    #[error("SqlxLedgerError - DuplicateKey: {0}")]
14    DuplicateKey(Box<dyn DatabaseError>),
15    #[error("SqlxLedgerError - SerdeJson: {0}")]
16    SerdeJson(#[from] serde_json::Error),
17    #[error("SqlxLedgerError - SendEvent: {0}")]
18    SendEvent(#[from] tokio::sync::broadcast::error::SendError<SqlxLedgerEvent>),
19    #[error("SqlxLedgerError - CelError: {0}")]
20    CelError(#[from] CelError),
21    #[error("SqlxLedgerError - TxParamTypeMismatch: expected {0:?}")]
22    TxParamTypeMismatch(ParamDataType),
23    #[error("SqlxLedgerError - TooManyParameters")]
24    TooManyParameters,
25    #[error("SqlxLedgerError - UnknownLayer: {0:?}")]
26    UnknownLayer(String),
27    #[error("SqlxLedgerError - UnknownDebitOrCredit: {0:?}")]
28    UnknownDebitOrCredit(String),
29    #[error("SqlxLedgerError - UnknownCurrency: {0}")]
30    UnknownCurrency(String),
31    #[error("SqlxLedgerError - UnbalancedTransaction: currency {0} amount {1}")]
32    UnbalancedTransaction(Currency, Decimal),
33    #[error("SqlxLedgerError - OptimisticLockingError")]
34    OptimisticLockingError,
35    #[error("SqlxLedgerError - EventSubscriberClosed")]
36    EventSubscriberClosed,
37}
38
39impl From<sqlx::Error> for SqlxLedgerError {
40    fn from(e: sqlx::Error) -> Self {
41        match e {
42            sqlx::Error::Database(err) if err.message().contains("duplicate key") => {
43                SqlxLedgerError::DuplicateKey(err)
44            }
45            e => SqlxLedgerError::Sqlx(e),
46        }
47    }
48}