solana_banks_client/
error.rs

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