mod baseline;
mod compare;
mod models;
mod parser;
mod report;
use anyhow::Result;
use clap::{Parser, Subcommand};
use std::path::PathBuf;
#[derive(Parser)]
#[command(name = "bench-tracker")]
#[command(about = "Benchmark regression tracking tool for TensorLogic", long_about = None)]
struct Cli {
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
Save {
#[arg(short, long, default_value = "target/criterion")]
criterion_dir: PathBuf,
#[arg(short, long, default_value = "benchmarks/baseline.json")]
output: PathBuf,
#[arg(short, long)]
name: Option<String>,
},
Compare {
#[arg(short, long, default_value = "target/criterion")]
criterion_dir: PathBuf,
#[arg(short, long, default_value = "benchmarks/baseline.json")]
baseline: PathBuf,
#[arg(short, long, default_value = "5.0")]
threshold: f64,
#[arg(short, long, default_value = "text")]
format: String,
},
List {
#[arg(short, long, default_value = "benchmarks/baseline.json")]
baseline: PathBuf,
},
Stats {
#[arg(short, long)]
name: String,
#[arg(short, long, default_value = "target/criterion")]
criterion_dir: PathBuf,
},
}
fn main() -> Result<()> {
let cli = Cli::parse();
match cli.command {
Commands::Save {
criterion_dir,
output,
name,
} => {
baseline::save_baseline(&criterion_dir, &output, name.as_deref())?;
}
Commands::Compare {
criterion_dir,
baseline,
threshold,
format,
} => {
compare::compare_benchmarks(&criterion_dir, &baseline, threshold, &format)?;
}
Commands::List { baseline } => {
baseline::list_baselines(&baseline)?;
}
Commands::Stats {
name,
criterion_dir,
} => {
report::show_stats(&name, &criterion_dir)?;
}
}
Ok(())
}