1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
use bitcoincore_rpc::bitcoin::{
    address::Error as BitcoinAddressError, consensus::encode::Error as BitcoinEncodeError,
    hashes::hex::Error as HexError,
};
use reqwest::{Error as ReqwestError, StatusCode};
use serde_json::Error as SerdeJsonError;
use std::num::{ParseIntError, TryFromIntError};
use thiserror::Error;
use url::ParseError;

#[derive(Error, Debug)]
pub enum Error {
    #[error("No previous output for input")]
    NoPrevOut,
    #[error("Cannot construct address")]
    InvalidAddress,

    #[error("BitcoinAddressError: {0}")]
    BitcoinAddressError(#[from] BitcoinAddressError),
    #[error("BitcoinEncodeError: {0}")]
    BitcoinEncodeError(#[from] BitcoinEncodeError),

    #[error("ReqwestError: {0}")]
    ReqwestError(#[from] ReqwestError),
    #[error("ParseError: {0}")]
    ParseError(#[from] ParseError),

    #[error("SerdeJsonError: {0}")]
    SerdeJsonError(#[from] SerdeJsonError),

    #[error("HexError: {0}")]
    HexError(#[from] HexError),

    #[error("TryFromIntError: {0}")]
    TryFromIntError(#[from] TryFromIntError),
    #[error("ParseIntError: {0}")]
    ParseIntError(#[from] ParseIntError),

    #[error("No txids in block")]
    EmptyBlock,
}

impl Error {
    pub fn is_not_found(&self) -> bool {
        matches!(self, Error::ReqwestError(err) if err.status().contains(&StatusCode::NOT_FOUND))
    }
}