bdk-cli 3.0.0

An experimental CLI wallet application and playground, powered by BDK
use bdk_wallet::bitcoin::hex::HexToBytesError;
use bdk_wallet::bitcoin::psbt::ExtractTxError;
use bdk_wallet::bitcoin::{base64, consensus};
use thiserror::Error;

#[derive(Debug, Error)]
pub enum BDKCliError {
    #[error("BIP39 error: {0:?}")]
    BIP39Error(#[from] Option<bdk_wallet::bip39::Error>),

    #[error("BIP32 error: {0}")]
    BIP32Error(#[from] bdk_wallet::bitcoin::bip32::Error),

    #[error("FeeBump error: {0}")]
    BuildFeeBumpError(#[from] bdk_wallet::error::BuildFeeBumpError),

    #[allow(dead_code)]
    #[error("Checksum error")]
    ChecksumMismatch,

    #[error("Create transaction error: {0}")]
    CreateTx(#[from] bdk_wallet::error::CreateTxError),

    #[error("Descriptor error: {0}")]
    DescriptorError(#[from] bdk_wallet::descriptor::error::Error),

    #[error("Descriptor key parse error: {0}")]
    DescriptorKeyParseError(#[from] bdk_wallet::miniscript::descriptor::DescriptorKeyParseError),

    #[error("Base64 decoding error: {0}")]
    DecodeError(#[from] base64::DecodeError),

    #[error("Generic error: {0}")]
    Generic(String),

    #[error("Hex conversion error: {0}")]
    HexToArrayError(#[from] bdk_wallet::bitcoin::hashes::hex::HexToArrayError),

    #[error("Key error: {0}")]
    KeyError(#[from] bdk_wallet::keys::KeyError),

    #[error("LocalChain error: {0}")]
    LocalChainError(#[from] bdk_wallet::chain::local_chain::ApplyHeaderError),

    #[error("Miniscript error: {0}")]
    MiniscriptError(#[from] bdk_wallet::miniscript::Error),

    #[error("ParseError: {0}")]
    ParseError(#[from] bdk_wallet::bitcoin::address::ParseError),

    #[error("ParseOutPointError: {0}")]
    ParseOutPointError(#[from] bdk_wallet::bitcoin::blockdata::transaction::ParseOutPointError),

    #[error("PsbtExtractTxError: {0}")]
    PsbtExtractTxError(Box<ExtractTxError>),

    #[error("PsbtError: {0}")]
    PsbtError(#[from] bdk_wallet::bitcoin::psbt::Error),

    #[cfg(feature = "sqlite")]
    #[error("Rusqlite error: {0}")]
    RusqliteError(Box<bdk_wallet::rusqlite::Error>),

    #[cfg(feature = "redb")]
    #[error("Redb StoreError: {0}")]
    RedbStoreError(Box<bdk_redb::error::StoreError>),

    #[cfg(feature = "redb")]
    #[error("Redb dabtabase error: {0}")]
    RedbDatabaseError(Box<bdk_redb::redb::DatabaseError>),

    #[error("Serde json error: {0}")]
    SerdeJson(#[from] serde_json::Error),

    #[error("Bitcoin consensus encoding error: {0}")]
    Serde(#[from] consensus::encode::Error),

    #[error("Signer error: {0}")]
    SignerError(#[from] bdk_wallet::signer::SignerError),

    #[cfg(feature = "electrum")]
    #[error("Electrum error: {0}")]
    Electrum(#[from] bdk_electrum::electrum_client::Error),

    #[cfg(feature = "esplora")]
    #[error("Esplora error: {0}")]
    Esplora(#[from] bdk_esplora::esplora_client::Error),

    #[error("Chain connect error: {0}")]
    Chain(#[from] bdk_wallet::chain::local_chain::CannotConnectError),

    #[error("Consensus decoding error: {0}")]
    Hex(#[from] HexToBytesError),

    #[cfg(feature = "rpc")]
    #[error("RPC error: {0}")]
    BitcoinCoreRpcError(#[from] bdk_bitcoind_rpc::bitcoincore_rpc::Error),

    #[cfg(feature = "cbf")]
    #[error("BDK-Kyoto builder error: {0}")]
    KyotoBuilderError(#[from] bdk_kyoto::builder::BuilderError),

    #[cfg(feature = "cbf")]
    #[error("BDK-Kyoto update error: {0}")]
    KyotoUpdateError(#[from] bdk_kyoto::UpdateError),

    #[cfg(any(
        feature = "electrum",
        feature = "esplora",
        feature = "rpc",
        feature = "cbf",
    ))]
    #[error("Reqwest error: {0}")]
    ReqwestError(#[from] reqwest::Error),

    #[cfg(feature = "payjoin")]
    #[error("Payjoin URL parse error: {0}")]
    PayjoinUrlParse(#[from] payjoin::IntoUrlError),

    #[cfg(feature = "payjoin")]
    #[error("Payjoin send response error: {0}")]
    PayjoinSendResponse(#[from] payjoin::send::ResponseError),

    #[cfg(feature = "payjoin")]
    #[error("Payjoin sender build error: {0}")]
    PayjoinSenderBuild(#[from] payjoin::send::BuildSenderError),

    #[cfg(feature = "payjoin")]
    #[error("Payjoin receive error: {0}")]
    PayjoinReceive(#[from] payjoin::receive::Error),

    #[cfg(feature = "payjoin")]
    #[error("Payjoin selection error: {0}")]
    PayjoinSelection(#[from] payjoin::receive::SelectionError),

    #[cfg(feature = "payjoin")]
    #[error("Payjoin input contribution error: {0}")]
    PayjoinInputContribution(#[from] payjoin::receive::InputContributionError),

    #[cfg(feature = "payjoin")]
    #[error("Payjoin create request error: {0}")]
    PayjoinCreateRequest(#[from] payjoin::send::v2::CreateRequestError),
}

impl From<ExtractTxError> for BDKCliError {
    fn from(value: ExtractTxError) -> Self {
        BDKCliError::PsbtExtractTxError(Box::new(value))
    }
}

#[cfg(feature = "redb")]
impl From<bdk_redb::error::StoreError> for BDKCliError {
    fn from(err: bdk_redb::error::StoreError) -> Self {
        BDKCliError::RedbStoreError(Box::new(err))
    }
}

#[cfg(feature = "redb")]
impl From<bdk_redb::redb::DatabaseError> for BDKCliError {
    fn from(err: bdk_redb::redb::DatabaseError) -> Self {
        BDKCliError::RedbDatabaseError(Box::new(err))
    }
}

#[cfg(feature = "sqlite")]
impl From<bdk_wallet::rusqlite::Error> for BDKCliError {
    fn from(err: bdk_wallet::rusqlite::Error) -> Self {
        BDKCliError::RusqliteError(Box::new(err))
    }
}