1use solana_rpc_client_api::{
2 client_error::{Error as ClientError, ErrorKind as ClientErrorKind},
3 request::{RpcError, RpcResponseErrorData},
4 response::RpcSimulateTransactionResult,
5};
6
7use std::{future::Future, pin::Pin};
8
9pub mod extensions;
10pub mod tower_client;
11
12pub use extensions::Extensions;
13pub use tower_client::TowerClient;
14
15pub type BoxFuture<'a, T> = Pin<Box<dyn Future<Output = T> + Send + 'a>>;
16pub type LocalBoxFuture<'a, T> = Pin<Box<dyn Future<Output = T> + 'a>>;
17
18pub fn verbose_solana_error(err: &ClientError) -> String {
19 use std::fmt::Write;
20 if let ClientErrorKind::RpcError(RpcError::RpcResponseError {
21 code,
22 message,
23 data,
24 }) = &err.kind
25 {
26 let mut s = String::new();
27 writeln!(s, "{message} ({code})").unwrap();
28 if let RpcResponseErrorData::SendTransactionPreflightFailure(
29 RpcSimulateTransactionResult {
30 logs: Some(logs), ..
31 },
32 ) = data
33 {
34 for (i, log) in logs.iter().enumerate() {
35 writeln!(s, "{}: {}", i + 1, log).unwrap();
36 }
37 }
38 s
39 } else {
40 err.to_string()
41 }
42}