use crate::color::{green, red};
use soroban_rpc::GetTransactionResponse;
use crate::{
commands::global,
config::network,
rpc,
xdr::{self, Hash},
};
#[derive(Debug, Clone, clap::Parser)]
pub struct Args {
#[arg(long)]
pub hash: Hash,
#[command(flatten)]
pub network: network::Args,
}
#[derive(thiserror::Error, Debug)]
pub enum Error {
#[error(transparent)]
Network(#[from] network::Error),
#[error(transparent)]
Serde(#[from] serde_json::Error),
#[error(transparent)]
Rpc(#[from] rpc::Error),
#[error(transparent)]
Xdr(#[from] xdr::Error),
#[error("transaction {tx_hash} not found on {network} network")]
NotFound { tx_hash: Hash, network: String },
}
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, clap::ValueEnum, Default)]
pub enum OutputFormat {
#[default]
Json,
JsonFormatted,
Xdr,
}
impl Args {
pub async fn fetch_transaction(
&self,
global_args: &global::Args,
) -> Result<GetTransactionResponse, Error> {
let network = self.network.get(&global_args.locator)?;
let client = network.rpc_client()?;
let tx_hash = self.hash.clone();
let tx = client.get_transaction(&tx_hash).await?;
match tx.status.clone() {
val if val == *"NOT_FOUND" => {
if let Some(n) = &self.network.network {
return Err(Error::NotFound {
tx_hash,
network: n.clone(),
});
}
}
_ => {}
}
Ok(tx)
}
pub fn print_tx_summary(tx: &GetTransactionResponse) {
let status = if tx.status == "SUCCESS" {
green(&tx.status)
} else {
red(&tx.status)
};
println!("Transaction Status: {status}");
if let Some(ledger) = tx.ledger {
println!("Transaction Ledger: {ledger}");
}
println!();
}
}