2021-03-26 20:26:06 -07:00
|
|
|
use {
|
2021-06-01 16:25:53 -07:00
|
|
|
crate::{rpc_request, rpc_response},
|
2021-04-06 00:01:05 -07:00
|
|
|
solana_faucet::faucet::FaucetError,
|
2021-03-26 20:26:06 -07:00
|
|
|
solana_sdk::{
|
|
|
|
signature::SignerError, transaction::TransactionError, transport::TransportError,
|
|
|
|
},
|
|
|
|
std::io,
|
|
|
|
thiserror::Error,
|
2020-03-12 23:20:49 -07:00
|
|
|
};
|
2019-04-25 10:29:44 -07:00
|
|
|
|
2020-12-31 11:10:49 -08:00
|
|
|
pub use reqwest; // export `reqwest` for clients
|
|
|
|
|
2020-02-20 19:04:53 -08:00
|
|
|
#[derive(Error, Debug)]
|
2020-03-12 23:20:49 -07:00
|
|
|
pub enum ClientErrorKind {
|
|
|
|
#[error(transparent)]
|
2020-02-20 19:04:53 -08:00
|
|
|
Io(#[from] io::Error),
|
2020-03-12 23:20:49 -07:00
|
|
|
#[error(transparent)]
|
2020-02-20 19:04:53 -08:00
|
|
|
Reqwest(#[from] reqwest::Error),
|
2020-03-12 23:20:49 -07:00
|
|
|
#[error(transparent)]
|
2020-02-20 19:04:53 -08:00
|
|
|
RpcError(#[from] rpc_request::RpcError),
|
2020-03-12 23:20:49 -07:00
|
|
|
#[error(transparent)]
|
2020-02-20 19:04:53 -08:00
|
|
|
SerdeJson(#[from] serde_json::error::Error),
|
2020-03-12 23:20:49 -07:00
|
|
|
#[error(transparent)]
|
2020-02-20 19:04:53 -08:00
|
|
|
SigningError(#[from] SignerError),
|
2020-03-12 23:20:49 -07:00
|
|
|
#[error(transparent)]
|
2020-02-20 19:04:53 -08:00
|
|
|
TransactionError(#[from] TransactionError),
|
2021-04-06 00:01:05 -07:00
|
|
|
#[error(transparent)]
|
|
|
|
FaucetError(#[from] FaucetError),
|
2020-03-12 23:20:49 -07:00
|
|
|
#[error("Custom: {0}")]
|
|
|
|
Custom(String),
|
2019-04-25 10:29:44 -07:00
|
|
|
}
|
|
|
|
|
2021-06-01 16:25:53 -07:00
|
|
|
impl ClientErrorKind {
|
|
|
|
pub fn get_transaction_error(&self) -> Option<TransactionError> {
|
|
|
|
match self {
|
|
|
|
Self::RpcError(rpc_request::RpcError::RpcResponseError {
|
|
|
|
data:
|
|
|
|
rpc_request::RpcResponseErrorData::SendTransactionPreflightFailure(
|
|
|
|
rpc_response::RpcSimulateTransactionResult {
|
|
|
|
err: Some(tx_err), ..
|
|
|
|
},
|
|
|
|
),
|
|
|
|
..
|
|
|
|
}) => Some(tx_err.clone()),
|
|
|
|
Self::TransactionError(tx_err) => Some(tx_err.clone()),
|
|
|
|
_ => None,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-12 23:20:49 -07:00
|
|
|
impl From<TransportError> for ClientErrorKind {
|
|
|
|
fn from(err: TransportError) -> Self {
|
|
|
|
match err {
|
|
|
|
TransportError::IoError(err) => Self::Io(err),
|
|
|
|
TransportError::TransactionError(err) => Self::TransactionError(err),
|
|
|
|
TransportError::Custom(err) => Self::Custom(err),
|
|
|
|
}
|
2019-04-25 10:29:44 -07:00
|
|
|
}
|
|
|
|
}
|
2020-03-12 23:20:49 -07:00
|
|
|
|
2021-01-23 11:55:15 -08:00
|
|
|
impl From<ClientErrorKind> for TransportError {
|
|
|
|
fn from(client_error_kind: ClientErrorKind) -> Self {
|
|
|
|
match client_error_kind {
|
|
|
|
ClientErrorKind::Io(err) => Self::IoError(err),
|
|
|
|
ClientErrorKind::TransactionError(err) => Self::TransactionError(err),
|
|
|
|
ClientErrorKind::Reqwest(err) => Self::Custom(format!("{:?}", err)),
|
|
|
|
ClientErrorKind::RpcError(err) => Self::Custom(format!("{:?}", err)),
|
|
|
|
ClientErrorKind::SerdeJson(err) => Self::Custom(format!("{:?}", err)),
|
|
|
|
ClientErrorKind::SigningError(err) => Self::Custom(format!("{:?}", err)),
|
2021-04-06 00:01:05 -07:00
|
|
|
ClientErrorKind::FaucetError(err) => Self::Custom(format!("{:?}", err)),
|
2021-01-23 11:55:15 -08:00
|
|
|
ClientErrorKind::Custom(err) => Self::Custom(format!("{:?}", err)),
|
2020-03-12 23:20:49 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Error, Debug)]
|
|
|
|
#[error("{kind}")]
|
|
|
|
pub struct ClientError {
|
2020-10-12 18:06:10 -07:00
|
|
|
pub request: Option<rpc_request::RpcRequest>,
|
2020-05-10 08:51:53 -07:00
|
|
|
|
2020-03-12 23:20:49 -07:00
|
|
|
#[source]
|
2020-10-12 18:06:10 -07:00
|
|
|
pub kind: ClientErrorKind,
|
2020-03-12 23:20:49 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
impl ClientError {
|
2020-05-10 08:51:53 -07:00
|
|
|
pub fn new_with_request(kind: ClientErrorKind, request: rpc_request::RpcRequest) -> Self {
|
2020-03-12 23:20:49 -07:00
|
|
|
Self {
|
2020-05-10 08:51:53 -07:00
|
|
|
request: Some(request),
|
2020-03-12 23:20:49 -07:00
|
|
|
kind,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-05-10 08:51:53 -07:00
|
|
|
pub fn into_with_request(self, request: rpc_request::RpcRequest) -> Self {
|
2020-03-12 23:20:49 -07:00
|
|
|
Self {
|
2020-05-10 08:51:53 -07:00
|
|
|
request: Some(request),
|
2020-03-12 23:20:49 -07:00
|
|
|
..self
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-05-10 08:51:53 -07:00
|
|
|
pub fn request(&self) -> Option<&rpc_request::RpcRequest> {
|
|
|
|
self.request.as_ref()
|
2020-03-12 23:20:49 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
pub fn kind(&self) -> &ClientErrorKind {
|
|
|
|
&self.kind
|
|
|
|
}
|
2021-06-01 16:25:53 -07:00
|
|
|
|
|
|
|
pub fn get_transaction_error(&self) -> Option<TransactionError> {
|
|
|
|
self.kind.get_transaction_error()
|
|
|
|
}
|
2020-03-12 23:20:49 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
impl From<ClientErrorKind> for ClientError {
|
|
|
|
fn from(kind: ClientErrorKind) -> Self {
|
|
|
|
Self {
|
2020-05-10 08:51:53 -07:00
|
|
|
request: None,
|
2020-03-12 23:20:49 -07:00
|
|
|
kind,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<TransportError> for ClientError {
|
|
|
|
fn from(err: TransportError) -> Self {
|
|
|
|
Self {
|
2020-05-10 08:51:53 -07:00
|
|
|
request: None,
|
2020-03-12 23:20:49 -07:00
|
|
|
kind: err.into(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-01-23 11:55:15 -08:00
|
|
|
impl From<ClientError> for TransportError {
|
|
|
|
fn from(client_error: ClientError) -> Self {
|
|
|
|
client_error.kind.into()
|
2020-03-12 23:20:49 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<std::io::Error> for ClientError {
|
|
|
|
fn from(err: std::io::Error) -> Self {
|
|
|
|
Self {
|
2020-05-10 08:51:53 -07:00
|
|
|
request: None,
|
2020-03-12 23:20:49 -07:00
|
|
|
kind: err.into(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<reqwest::Error> for ClientError {
|
|
|
|
fn from(err: reqwest::Error) -> Self {
|
|
|
|
Self {
|
2020-05-10 08:51:53 -07:00
|
|
|
request: None,
|
2020-03-12 23:20:49 -07:00
|
|
|
kind: err.into(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<rpc_request::RpcError> for ClientError {
|
|
|
|
fn from(err: rpc_request::RpcError) -> Self {
|
|
|
|
Self {
|
2020-05-10 08:51:53 -07:00
|
|
|
request: None,
|
2020-03-12 23:20:49 -07:00
|
|
|
kind: err.into(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<serde_json::error::Error> for ClientError {
|
|
|
|
fn from(err: serde_json::error::Error) -> Self {
|
|
|
|
Self {
|
2020-05-10 08:51:53 -07:00
|
|
|
request: None,
|
2020-03-12 23:20:49 -07:00
|
|
|
kind: err.into(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<SignerError> for ClientError {
|
|
|
|
fn from(err: SignerError) -> Self {
|
|
|
|
Self {
|
2020-05-10 08:51:53 -07:00
|
|
|
request: None,
|
2020-03-12 23:20:49 -07:00
|
|
|
kind: err.into(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<TransactionError> for ClientError {
|
|
|
|
fn from(err: TransactionError) -> Self {
|
|
|
|
Self {
|
2020-05-10 08:51:53 -07:00
|
|
|
request: None,
|
2020-03-12 23:20:49 -07:00
|
|
|
kind: err.into(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-04-06 00:01:05 -07:00
|
|
|
impl From<FaucetError> for ClientError {
|
|
|
|
fn from(err: FaucetError) -> Self {
|
|
|
|
Self {
|
|
|
|
request: None,
|
|
|
|
kind: err.into(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-12 23:20:49 -07:00
|
|
|
pub type Result<T> = std::result::Result<T, ClientError>;
|