cala_ledger/tx_template/
error.rs

1use rust_decimal::Decimal;
2use thiserror::Error;
3
4use cala_types::primitives::{Currency, Layer};
5use cel_interpreter::CelError;
6
7#[derive(Error, Debug)]
8pub enum TxTemplateError {
9    #[error("TxTemplateError - Sqlx: {0}")]
10    Sqlx(sqlx::Error),
11    #[error("TxTemplateError - DuplicateCode: code already exists")]
12    DuplicateCode,
13    #[error("TxTemplateError - DuplicateId: id already exists")]
14    DuplicateId,
15    #[error("TxTemplateError - CelError: {0}")]
16    CelError(#[from] CelError),
17    #[error("TxTemplateError - NotFound")]
18    NotFound,
19    #[error("TxTemplateError - SerdeJson: {0}")]
20    SerdeJson(#[from] serde_json::Error),
21    #[error("TxTemplateError - UnbalancedTransaction: currency {0}, layer {1:?}, amount {2}")]
22    UnbalancedTransaction(Currency, Layer, Decimal),
23    #[error("TxTemplateError - NotFound: code '{0}' not found")]
24    CouldNotFindByCode(String),
25    #[error("{0}")]
26    ParamError(#[from] crate::param::error::ParamError),
27    #[error("TxTemplateError - EsEntityError: {0}")]
28    EsEntityError(es_entity::EsEntityError),
29    #[error("TxTemplateError - CursorDestructureError: {0}")]
30    CursorDestructureError(#[from] es_entity::CursorDestructureError),
31}
32
33impl From<sqlx::Error> for TxTemplateError {
34    fn from(e: sqlx::Error) -> Self {
35        match e {
36            sqlx::Error::Database(ref err) if err.is_unique_violation() => {
37                let Some(constraint) = err.constraint() else {
38                    return Self::Sqlx(e);
39                };
40                if constraint.contains("code") {
41                    Self::DuplicateCode
42                } else if constraint.contains("id") {
43                    Self::DuplicateId
44                } else {
45                    Self::Sqlx(e)
46                }
47            }
48            e => Self::Sqlx(e),
49        }
50    }
51}
52
53es_entity::from_es_entity_error!(TxTemplateError);