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    #[error("Duplicate transfer: conversion already handled")]
13    DuplicateTransfer,
14    #[error("Validation failed: {0}")]
15    ValidationFailed(String),
16    #[error("Refund failed: {0}")]
17    RefundFailed(String),
18    #[error("SDK error: {0}")]
19    Sdk(#[from] SdkError),
20    #[error("Storage error: {0}")]
21    Storage(#[from] crate::persist::StorageError),
22    #[error("Wallet error: {0}")]
23    Wallet(#[from] spark_wallet::SparkWalletError),
24}
25
26impl ConversionError {
27    /// Returns `true` if this error indicates the transfer was already handled
28    /// by another instance (duplicate deterministic transfer ID).
29    pub fn is_duplicate_transfer(&self) -> bool {
30        matches!(self, ConversionError::DuplicateTransfer)
31    }
32}
33
34impl From<FlashnetError> for ConversionError {
35    fn from(e: FlashnetError) -> Self {
36        // Detect duplicate transfer from HTTP 409 Conflict
37        if let FlashnetError::Network {
38            code: Some(409), ..
39        } = &e
40        {
41            return ConversionError::DuplicateTransfer;
42        }
43        ConversionError::ConversionFailed(e.to_string())
44    }
45}