corsa 0.7.0

Production-oriented Rust bindings, orchestration layers, and Node integration for typescript-go
Documentation
mod args;
mod dataset;
mod measure;
mod process;
mod report;
mod runner;
mod stats;

use std::process::ExitCode;

use corsa::runtime::block_on;

fn main() -> ExitCode {
    let cli = match args::parse() {
        Ok(Some(cli)) => cli,
        Ok(None) => return ExitCode::SUCCESS,
        Err(message) => {
            eprintln!("{message}");
            return ExitCode::FAILURE;
        }
    };
    match block_on(run(cli)) {
        Ok(()) => ExitCode::SUCCESS,
        Err(error) => {
            eprintln!("{error}");
            ExitCode::FAILURE
        }
    }
}

async fn run(cli: args::Cli) -> corsa::Result<()> {
    let datasets = dataset::load(&cli).await?;
    let results = runner::run(&cli, &datasets).await?;
    println!("tsgo: {}", cli.tsgo_path.display());
    println!("node: {}", cli.node_command);
    println!("iterations: {}", cli.iterations);
    println!("warmup_iterations: {}", cli.warmup_iterations);
    println!("timeout_ms: {}", cli.timeout_ms);
    println!();
    println!("dataset\tfiles\tbytes\tlines\tconfig");
    for dataset in &datasets {
        println!(
            "{}\t{}\t{}\t{}\t{}",
            dataset.label,
            dataset.file_count,
            dataset.total_bytes,
            dataset.total_lines,
            dataset.config_path.display()
        );
    }
    println!();
    println!(
        "workload\tdataset\ttool\tsamples\tmedian_ms\tp95_ms\tp99_ms\tmean_ms\tstddev_ms\tcv_pct\tmin_ms\tmax_ms"
    );
    for row in &results {
        println!(
            "{}\t{}\t{}\t{}\t{:.3}\t{:.3}\t{:.3}\t{:.3}\t{:.3}\t{:.2}\t{:.3}\t{:.3}",
            row.workload,
            row.dataset,
            row.tool,
            row.stats.sample_count(),
            row.stats.median_ms(),
            row.stats.p95_ms(),
            row.stats.p99_ms(),
            row.stats.mean_ms(),
            row.stats.stddev_ms(),
            row.stats.cv_percent(),
            row.stats.min_ms(),
            row.stats.max_ms()
        );
    }
    println!();
    println!("project_check vs tsgo baseline");
    println!("dataset\ttool\tmedian_ms\ttsgo_median_ms\tvs_tsgo_x");
    for line in report::project_check_vs_tsgo_lines(&results) {
        println!("{line}");
    }
    println!();
    println!("editor_workflow vs tsgo CLI project_check baseline (not equivalent work)");
    println!("dataset\ttool\tmedian_ms\ttsgo_project_check_median_ms\tvs_tsgo_x");
    for line in report::workflow_vs_tsgo_lines(&results) {
        println!("{line}");
    }
    if let Some(path) = &cli.json_output_path {
        report::write(path, &cli, &datasets, &results)?;
    }
    Ok(())
}