Skip to main content

breez_sdk_spark/token_conversion/
error.rs

1use flashnet::FlashnetError;
2
3use crate::SdkError;
4
5/// Error type for conversion operations
6#[derive(Debug, thiserror::Error)]
7pub enum ConversionError {
8    #[error("No conversion pools available")]
9    NoPoolsAvailable,
10    #[error("Conversion failed: {0}")]
11    ConversionFailed(String),
12    /// The swap ran and delivered, but the conversion failed afterwards.
13    #[error("Conversion failed: {message}")]
14    FailedAfterSwap {
15        message: String,
16        /// The payment id of the sats sent to the pool. Unset when it could
17        /// not be recorded.
18        sent_payment_id: Option<String>,
19        /// The payment id of what the pool delivered. Unset when it did not
20        /// resolve to a payment id.
21        received_payment_id: Option<String>,
22    },
23    #[error("Duplicate transfer: conversion already handled")]
24    DuplicateTransfer,
25    #[error("Validation failed: {0}")]
26    ValidationFailed(String),
27    #[error("Refund failed: {0}")]
28    RefundFailed(String),
29    #[error("SDK error: {0}")]
30    Sdk(#[from] SdkError),
31    #[error("Storage error: {0}")]
32    Storage(#[from] crate::persist::StorageError),
33    #[error("Wallet error: {0}")]
34    Wallet(#[from] spark_wallet::SparkWalletError),
35}
36
37impl ConversionError {
38    /// Returns `true` if this error indicates the transfer was already handled
39    /// by another instance (duplicate deterministic transfer ID).
40    pub fn is_duplicate_transfer(&self) -> bool {
41        matches!(self, ConversionError::DuplicateTransfer)
42    }
43}
44
45impl From<FlashnetError> for ConversionError {
46    fn from(e: FlashnetError) -> Self {
47        // Detect duplicate transfer from HTTP 409 Conflict
48        if let FlashnetError::Network {
49            code: Some(409), ..
50        } = &e
51        {
52            return ConversionError::DuplicateTransfer;
53        }
54        ConversionError::ConversionFailed(e.to_string())
55    }
56}