ethers-rs/ethers-providers/src/rpc/transports/ws/error.rs

64 lines
1.7 KiB
Rust

use ethers_core::types::U256;
use crate::{JsonRpcError, ProviderError};
use super::WsError;
#[derive(Debug, thiserror::Error)]
pub enum WsClientError {
/// Thrown if deserialization failed
#[error(transparent)]
JsonError(#[from] serde_json::Error),
/// Thrown if the response could not be parsed
#[error(transparent)]
JsonRpcError(#[from] JsonRpcError),
/// Internal lib error
#[error(transparent)]
InternalError(#[from] WsError),
/// Remote server sent a Close message
#[error("Websocket closed unexpectedly")]
UnexpectedClose,
/// Unexpected channel closure
#[error("Unexpected internal channel closure. This is likely a bug. Please report via github")]
DeadChannel,
/// Thrown if the websocket responds with binary data
#[error("Websocket responded with unexpected binary data")]
UnexpectedBinary(Vec<u8>),
/// PubSubClient asked to listen to an unknown subscription id
#[error("Attempted to listen to unknown subscription: {0:?}")]
UnknownSubscription(U256),
/// Too Many Reconnects
#[error("Reconnect limit reached")]
TooManyReconnects,
}
impl crate::RpcError for WsClientError {
fn as_error_response(&self) -> Option<&JsonRpcError> {
if let WsClientError::JsonRpcError(err) = self {
Some(err)
} else {
None
}
}
fn as_serde_error(&self) -> Option<&serde_json::Error> {
match self {
WsClientError::JsonError(err) => Some(err),
_ => None,
}
}
}
impl From<WsClientError> for ProviderError {
fn from(src: WsClientError) -> Self {
ProviderError::JsonRpcClientError(Box::new(src))
}
}