use serde_json;
use solana_tools_lite::adapters::io_adapter::{
read_input_transaction, read_lookup_tables,
};
use solana_tools_lite::handlers::analysis::{analyze_transaction, build_signing_summary};
use solana_tools_lite::models::{InputTransaction, PubkeyBase58, Transaction};
use std::convert::TryFrom;
use crate::flows::presenter::{Presentable, AnalysisPresenter};
use crate::shell::error::CliError;
pub fn execute(
input: Option<&str>,
pubkey: Option<&str>,
lookup_tables_path: Option<&str>,
summary_json: bool,
) -> Result<(), CliError> {
let input_tx: InputTransaction = read_input_transaction(input)?;
let tx: Transaction = Transaction::try_from(input_tx)
.map_err(|e| CliError::Core(solana_tools_lite::ToolError::TransactionParse(e)))?;
let message = &tx.message;
let analyze_pubkey = if let Some(pk_str) = pubkey {
PubkeyBase58::try_from(pk_str)
.map_err(|e| CliError::Core(solana_tools_lite::ToolError::InvalidInput(
format!("Invalid pubkey: {}", e)
)))?
} else {
let account_keys = message.account_keys();
account_keys
.get(0)
.cloned()
.ok_or_else(|| CliError::Core(solana_tools_lite::ToolError::InvalidInput(
"No accounts in message".to_string()
)))?
};
let tables = lookup_tables_path.map(read_lookup_tables).transpose()?;
let analysis = analyze_transaction(message, &analyze_pubkey, tables.as_ref());
let analysis_presenter = AnalysisPresenter {
analysis: Some(&analysis),
summary_payload: None,
};
analysis_presenter.present(false, false, true)?;
if summary_json {
let summary = build_signing_summary(&tx, &analysis)?;
let payload = serde_json::to_string_pretty(&summary)
.map_err(|e| CliError::SummaryEncode(e.to_string()))?;
println!("{}", payload);
}
Ok(())
}