cala_ledger/tx_template/
error.rs1use 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);