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}