sim-cli 0.3.0

CLI tool for running and comparing Solana simulator backtests
mod compare_cmd;
mod fetch;
mod manager;
mod output;
mod ranges_cmd;
mod run_cmd;
mod signals;
mod subscription;
mod summarize_cmd;
mod update_cmd;

use clap::{Parser, Subcommand};
use compare_cmd::CompareArgs;
use eyre::Result;
use ranges_cmd::RangesArgs;
use run_cmd::RunArgs;
use signals::spawn_os_signal_handler;
use summarize_cmd::SummarizeArgs;
use tokio_util::sync::CancellationToken;

/// Simulator CLI
/// Run and compare simulations against historical Solana slots
#[derive(Parser)]
struct Cli {
    #[command(subcommand)]
    command: Command,
}

#[derive(Subcommand)]
enum Command {
    /// Run a backtest simulation over a slot range
    Run(RunArgs),
    /// Compare two simulation output files (baseline vs experiment)
    Compare(CompareArgs),
    /// Extract and print a summary of a simulation output file
    Summarize(SummarizeArgs),
    /// Update the sim binary to the latest published version
    Update,
    /// List available slot ranges on the simulator server
    Ranges(RangesArgs),
}

#[tokio::main]
async fn main() -> Result<()> {
    let _ = rustls::crypto::aws_lc_rs::default_provider()
        .install_default()
        .map_err(|_| ())
        .ok();

    let cli = Cli::parse();
    let cancellation = CancellationToken::new();
    spawn_os_signal_handler(cancellation.clone());

    match cli.command {
        Command::Run(args) => run_cmd::run(args, cancellation.clone()).await,
        Command::Compare(args) => compare_cmd::compare(args).await,
        Command::Summarize(args) => summarize_cmd::summarize(args),
        Command::Update => update_cmd::update().await,
        Command::Ranges(args) => ranges_cmd::ranges(args).await,
    }
}