use std::{fmt::Debug, sync::Arc};
use crate::{crypto::CryptoError, neo_clients::JsonRpcError, TypeError};
use thiserror::Error;
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum ProviderError {
#[error("nns name not found: {0}")]
NnsError(String),
#[error("reverse nns name not pointing to itself: {0}")]
NnsNotOwned(String),
#[error(transparent)]
SerdeJson(#[from] serde_json::Error),
#[error(transparent)]
HexError(#[from] hex::FromHexError),
#[error(transparent)]
HTTPError(#[from] Arc<reqwest::Error>),
#[error(transparent)]
JsonRpcError(#[from] JsonRpcError),
#[error("custom error: {0}")]
CustomError(String),
#[error("unsupported RPC")]
UnsupportedRPC,
#[error("unsupported node client")]
UnsupportedNodeClient,
#[error("Attempted to sign a transaction with no available signer. Hint: did you mean to use a SignerMiddleware?"
)]
SignerUnavailable,
#[error("Illegal state: {0}")]
IllegalState(String),
#[error("Invalid address")]
InvalidAddress,
#[error(transparent)]
CryptoError(#[from] CryptoError),
#[error(transparent)]
TypeError(#[from] TypeError),
#[error("Invalid password")]
InvalidPassword,
#[error("Parse error: {0}")]
ParseError(String),
#[error("Lock error")]
LockError,
#[error("Protocol not found")]
ProtocolNotFound,
#[error("Network not found")]
NetworkNotFound,
}
impl PartialEq for ProviderError {
fn eq(&self, other: &Self) -> bool {
match (self, other) {
(ProviderError::NnsError(a), ProviderError::NnsError(b)) => a == b,
(ProviderError::NnsNotOwned(a), ProviderError::NnsNotOwned(b)) => a == b,
(ProviderError::SerdeJson(a), ProviderError::SerdeJson(b)) => {
a.to_string() == b.to_string()
},
(ProviderError::HexError(a), ProviderError::HexError(b)) => a == b,
(ProviderError::HTTPError(a), ProviderError::HTTPError(b)) => a.status() == b.status(),
(ProviderError::JsonRpcError(a), ProviderError::JsonRpcError(b)) => a == b,
(ProviderError::CustomError(a), ProviderError::CustomError(b)) => a == b,
(ProviderError::UnsupportedRPC, ProviderError::UnsupportedRPC) => true,
(ProviderError::UnsupportedNodeClient, ProviderError::UnsupportedNodeClient) => true,
(ProviderError::SignerUnavailable, ProviderError::SignerUnavailable) => true,
(ProviderError::IllegalState(a), ProviderError::IllegalState(b)) => a == b,
(ProviderError::InvalidAddress, ProviderError::InvalidAddress) => true,
(ProviderError::CryptoError(a), ProviderError::CryptoError(b)) => a == b,
(ProviderError::TypeError(a), ProviderError::TypeError(b)) => a == b,
(ProviderError::InvalidPassword, ProviderError::InvalidPassword) => true,
(ProviderError::ParseError(a), ProviderError::ParseError(b)) => a == b,
(ProviderError::LockError, ProviderError::LockError) => true,
(ProviderError::ProtocolNotFound, ProviderError::ProtocolNotFound) => true,
(ProviderError::NetworkNotFound, ProviderError::NetworkNotFound) => true,
_ => false,
}
}
}
impl Clone for ProviderError {
fn clone(&self) -> Self {
match self {
ProviderError::NnsError(message) => ProviderError::NnsError(message.clone()),
ProviderError::NnsNotOwned(message) => ProviderError::NnsNotOwned(message.clone()),
ProviderError::SerdeJson(error) => ProviderError::SerdeJson(serde_json::Error::io(
std::io::Error::new(std::io::ErrorKind::Other, error.to_string()),
)),
ProviderError::HexError(error) => ProviderError::HexError(*error),
ProviderError::HTTPError(error) => ProviderError::HTTPError(Arc::clone(error)),
ProviderError::JsonRpcError(error) => ProviderError::JsonRpcError(error.clone()),
ProviderError::CustomError(message) => ProviderError::CustomError(message.clone()),
ProviderError::UnsupportedRPC => ProviderError::UnsupportedRPC,
ProviderError::UnsupportedNodeClient => ProviderError::UnsupportedNodeClient,
ProviderError::SignerUnavailable => ProviderError::SignerUnavailable,
ProviderError::IllegalState(message) => ProviderError::IllegalState(message.clone()),
ProviderError::InvalidAddress => ProviderError::InvalidAddress,
ProviderError::CryptoError(error) => ProviderError::CryptoError(error.clone()),
ProviderError::TypeError(error) => ProviderError::TypeError(error.clone()),
ProviderError::InvalidPassword => ProviderError::InvalidPassword,
ProviderError::ParseError(message) => ProviderError::ParseError(message.clone()),
ProviderError::LockError => ProviderError::LockError,
ProviderError::ProtocolNotFound => ProviderError::ProtocolNotFound,
ProviderError::NetworkNotFound => ProviderError::NetworkNotFound,
}
}
}