use solana_rpc_client_api::{
client_error::{Error as ClientError, ErrorKind as ClientErrorKind},
request::{RpcError, RpcResponseErrorData},
response::RpcSimulateTransactionResult,
};
use std::{future::Future, pin::Pin};
pub mod extensions;
pub mod tower_client;
pub use extensions::Extensions;
pub use tower_client::TowerClient;
pub type BoxFuture<'a, T> = Pin<Box<dyn Future<Output = T> + Send + 'a>>;
pub type LocalBoxFuture<'a, T> = Pin<Box<dyn Future<Output = T> + 'a>>;
pub fn verbose_solana_error(err: &ClientError) -> String {
use std::fmt::Write;
if let ClientErrorKind::RpcError(RpcError::RpcResponseError {
code,
message,
data,
}) = &*err.kind
{
let mut s = String::new();
writeln!(s, "{message} ({code})").unwrap();
if let RpcResponseErrorData::SendTransactionPreflightFailure(
RpcSimulateTransactionResult {
logs: Some(logs), ..
},
) = data
{
for (i, log) in logs.iter().enumerate() {
writeln!(s, "{}: {}", i + 1, log).unwrap();
}
}
s
} else {
err.to_string()
}
}