flow_lib/utils/
mod.rs

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}