subcoin_rpc_bitcoind/
error.rs1use bitcoin::consensus::encode::FromHexError;
2use jsonrpsee::types::ErrorObjectOwned;
3use jsonrpsee::types::error::ErrorObject;
4
5#[derive(Debug, thiserror::Error)]
7pub enum Error {
8 #[error("Block not found")]
9 BlockNotFound,
10
11 #[error("Block height out of range")]
12 BlockHeightOutOfRange,
13
14 #[error("Invalid block hash")]
15 InvalidBlockHash,
16
17 #[error("Transaction not found")]
18 TransactionNotFound,
19
20 #[error("Invalid transaction hex")]
21 InvalidTransactionHex,
22
23 #[error("Bitcoin P2P network service unavailable")]
24 NetworkUnavailable,
25
26 #[error("Invalid header: {0:?}")]
27 Header(subcoin_primitives::HeaderError),
28
29 #[error(transparent)]
30 BitcoinIO(#[from] bitcoin::io::Error),
31
32 #[error(transparent)]
33 Blockchain(#[from] sp_blockchain::Error),
34
35 #[error(transparent)]
36 DecodeHex(#[from] FromHexError),
37
38 #[error(transparent)]
39 SerdeJson(#[from] serde_json::Error),
40
41 #[error("Client error: {0}")]
42 Client(#[from] Box<dyn std::error::Error + Send + Sync>),
43
44 #[error("{0}")]
45 Other(String),
46}
47
48#[allow(dead_code)]
51mod rpc_error_code {
52 pub const RPC_VERIFY_ERROR: i32 = -25;
54 pub const RPC_INVALID_ADDRESS_OR_KEY: i32 = -5;
56 pub const RPC_INVALID_PARAMETER: i32 = -8;
58 pub const RPC_DATABASE_ERROR: i32 = -20;
60 pub const RPC_DESERIALIZATION_ERROR: i32 = -22;
62 pub const RPC_MISC_ERROR: i32 = -1;
64}
65
66impl From<Error> for ErrorObjectOwned {
67 fn from(e: Error) -> ErrorObjectOwned {
68 use rpc_error_code::*;
69
70 match e {
71 Error::BlockNotFound | Error::TransactionNotFound => {
72 ErrorObject::owned(RPC_INVALID_ADDRESS_OR_KEY, e.to_string(), None::<()>)
73 }
74 Error::BlockHeightOutOfRange | Error::InvalidBlockHash => {
75 ErrorObject::owned(RPC_INVALID_PARAMETER, e.to_string(), None::<()>)
76 }
77 Error::InvalidTransactionHex | Error::DecodeHex(_) => {
78 ErrorObject::owned(RPC_DESERIALIZATION_ERROR, e.to_string(), None::<()>)
79 }
80 Error::Blockchain(_) => {
81 ErrorObject::owned(RPC_DATABASE_ERROR, e.to_string(), None::<()>)
82 }
83 _ => ErrorObject::owned(RPC_MISC_ERROR, e.to_string(), None::<()>),
84 }
85 }
86}