solana_banks_client/
error.rs1use {
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#[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}