crema-cli 0.1.0

Blockchain, Crema for Solana
Documentation
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),
    };
}