solana_banks_client/
error.rs

1use {
2    solana_sdk::{transaction::TransactionError, transport::TransportError},
3    solana_transaction_context::TransactionReturnData,
4    std::io,
5    tarpc::client::RpcError,
6    thiserror::Error,
7};
8
9/// Errors from BanksClient
10#[derive(Error, Debug)]
11pub enum BanksClientError {
12    #[error("client error: {0}")]
13    ClientError(&'static str),
14
15    #[error(transparent)]
16    Io(#[from] io::Error),
17
18    #[error(transparent)]
19    RpcError(#[from] RpcError),
20
21    #[error("transport transaction error: {0}")]
22    TransactionError(#[from] TransactionError),
23
24    #[error("simulation error: {err:?}, logs: {logs:?}, units_consumed: {units_consumed:?}")]
25    SimulationError {
26        err: TransactionError,
27        logs: Vec<String>,
28        units_consumed: u64,
29        return_data: Option<TransactionReturnData>,
30    },
31}
32
33impl BanksClientError {
34    pub fn unwrap(&self) -> TransactionError {
35        match self {
36            BanksClientError::TransactionError(err)
37            | BanksClientError::SimulationError { err, .. } => err.clone(),
38            _ => panic!("unexpected transport error"),
39        }
40    }
41}
42
43impl From<BanksClientError> for io::Error {
44    fn from(err: BanksClientError) -> Self {
45        match err {
46            BanksClientError::ClientError(err) => Self::new(io::ErrorKind::Other, err.to_string()),
47            BanksClientError::Io(err) => err,
48            BanksClientError::RpcError(err) => Self::new(io::ErrorKind::Other, err.to_string()),
49            BanksClientError::TransactionError(err) => {
50                Self::new(io::ErrorKind::Other, err.to_string())
51            }
52            BanksClientError::SimulationError { err, .. } => {
53                Self::new(io::ErrorKind::Other, err.to_string())
54            }
55        }
56    }
57}
58
59impl From<BanksClientError> for TransportError {
60    fn from(err: BanksClientError) -> Self {
61        match err {
62            BanksClientError::ClientError(err) => {
63                Self::IoError(io::Error::new(io::ErrorKind::Other, err.to_string()))
64            }
65            BanksClientError::Io(err) => {
66                Self::IoError(io::Error::new(io::ErrorKind::Other, err.to_string()))
67            }
68            BanksClientError::RpcError(err) => {
69                Self::IoError(io::Error::new(io::ErrorKind::Other, err.to_string()))
70            }
71            BanksClientError::TransactionError(err) => Self::TransactionError(err),
72            BanksClientError::SimulationError { err, .. } => Self::TransactionError(err),
73        }
74    }
75}