use std::{error::Error, fmt::Debug};
use thiserror::Error;
use crate::JsonRpcError;
pub trait RpcError: Error + Debug + Send + Sync {
fn as_error_response(&self) -> Option<&JsonRpcError>;
fn is_error_response(&self) -> bool {
self.as_error_response().is_some()
}
fn as_serde_error(&self) -> Option<&serde_json::Error>;
fn is_serde_error(&self) -> bool {
self.as_serde_error().is_some()
}
}
pub trait MiddlewareError: Error + Sized + Send + Sync {
type Inner: MiddlewareError;
fn from_err(e: Self::Inner) -> Self;
fn as_inner(&self) -> Option<&Self::Inner>;
fn is_inner(&self) -> bool {
self.as_inner().is_some()
}
fn as_serde_error(&self) -> Option<&serde_json::Error> {
self.as_inner()?.as_serde_error()
}
fn is_serde_error(&self) -> bool {
self.as_serde_error().is_some()
}
fn as_provider_error(&self) -> Option<&ProviderError> {
self.as_inner()?.as_provider_error()
}
fn from_provider_err(p: ProviderError) -> Self {
Self::from_err(Self::Inner::from_provider_err(p))
}
fn as_error_response(&self) -> Option<&JsonRpcError> {
self.as_inner()?.as_error_response()
}
fn is_error_response(&self) -> bool {
self.as_error_response().is_some()
}
}
#[derive(Debug, Error)]
pub enum ProviderError {
#[error("{0}")]
JsonRpcClientError(Box<dyn crate::RpcError + Send + Sync>),
#[error("ens name not found: {0}")]
EnsError(String),
#[error("reverse ens name not pointing to itself: {0}")]
EnsNotOwned(String),
#[error(transparent)]
SerdeJson(#[from] serde_json::Error),
#[error(transparent)]
HexError(#[from] hex::FromHexError),
#[error(transparent)]
HTTPError(#[from] reqwest::Error),
#[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,
}
impl RpcError for ProviderError {
fn as_error_response(&self) -> Option<&super::JsonRpcError> {
if let ProviderError::JsonRpcClientError(err) = self {
err.as_error_response()
} else {
None
}
}
fn as_serde_error(&self) -> Option<&serde_json::Error> {
match self {
ProviderError::JsonRpcClientError(e) => e.as_serde_error(),
ProviderError::SerdeJson(e) => Some(e),
_ => None,
}
}
}
impl MiddlewareError for ProviderError {
type Inner = Self;
fn as_error_response(&self) -> Option<&super::JsonRpcError> {
RpcError::as_error_response(self)
}
fn as_serde_error(&self) -> Option<&serde_json::Error> {
RpcError::as_serde_error(self)
}
fn from_err(e: Self::Inner) -> Self {
e
}
fn as_inner(&self) -> Option<&Self::Inner> {
None
}
}