use std::sync::Arc;
use std::time::Duration;
use clap::ArgMatches;
use solana_clap_utils::keypair::{CliSigners, DefaultSigner};
use solana_cli_config::{Config, ConfigInput};
use solana_cli_output::OutputFormat;
use solana_remote_wallet::remote_wallet::RemoteWalletManager;
use solana_sdk::commitment_config::{CommitmentConfig, CommitmentLevel};
use {
clap::{crate_description, crate_name, crate_version},
std::error,
};
use crema_cli::clap_app::ingress::get_clap_app;
use crema_cli::command::{CliCommandInfo, CliConfig, parse_command, process_command};
use crema_cli::display::println_name_value;
pub fn parse_args<'a>(
matches: &'a ArgMatches<'a>,
wallet_manager: &mut Option<Arc<RemoteWalletManager>>,
) -> Result<(CliConfig<'a>, CliSigners), Box<dyn error::Error>> {
let config = if let Some(config_file) = matches.value_of("config_file") {
Config::load(config_file).unwrap_or_default()
} else {
Config::default()
};
let json_rpc_url = config.json_rpc_url;
let rpc_timeout = Duration::from_secs(20);
let commitment = CommitmentConfig {
commitment: CommitmentLevel::Finalized,
};
let confirm_transaction_initial_timeout = Duration::from_secs(10);
let (_, default_signer_path) = ConfigInput::compute_keypair_path_setting(
matches.value_of("owner".to_string()).unwrap_or(""),
&config.keypair_path,
);
let default_signer = DefaultSigner::new("keypair".to_string(), &default_signer_path);
let CliCommandInfo { command, signers } =
parse_command(&matches, &default_signer, wallet_manager)?;
Ok((
CliConfig {
command,
signers: vec![],
json_rpc_url,
rpc_timeout,
commitment,
confirm_transaction_initial_timeout,
output_format: OutputFormat::Display,
},
signers,
))
}
fn main() {
let matches = get_clap_app(crate_name!(), crate_description!(), crate_version!()).get_matches();
let mut wallet_manager = None;
let args_res = parse_args(&matches, &mut wallet_manager);
if args_res.is_err() {
println!("err: {:?}", args_res.err());
return;
};
let (mut config, signers) = args_res.unwrap();
config.signers = signers;
let result = process_command(&mut config);
match result {
Err(err) => println!("err: {}", err),
Ok(sig) => println_name_value("", &sig),
};
}