harness_cli/
lib.rs

1use clap::{Parser, Subcommand};
2use colored::Colorize;
3use once_cell::sync::Lazy;
4
5mod commands;
6mod utils;
7
8pub mod configs;
9
10/// The Precise and Reproducible Benchmarking Harness CLI
11#[derive(Parser)]
12pub struct Cli {
13    #[command(subcommand)]
14    command: Commands,
15}
16
17#[derive(Subcommand)]
18enum Commands {
19    Run(commands::run::RunArgs),
20    Upload(commands::upload::UploadResultsArgs),
21    Viz(commands::viz::VizArgs),
22}
23
24/// Plot benchmark results
25#[derive(Parser)]
26struct PlotArgs {}
27
28static CMD_ARGS: Lazy<Cli> = Lazy::new(|| {
29    let mut args = std::env::args().collect::<Vec<_>>();
30    if args.len() > 1 && args[1] == "harness" {
31        args = args[1..].to_vec();
32    }
33    Cli::parse_from(args)
34});
35
36pub fn dump_backtrace(e: &anyhow::Error) {
37    let env = std::env::var("RUST_BACKTRACE");
38    if env.is_ok() && env != Ok("0".to_string()) {
39        eprintln!("BACKTRACE:");
40        eprintln!("{}", e.backtrace());
41    }
42}
43
44#[doc(hidden)]
45pub fn main() -> anyhow::Result<()> {
46    let args = &*CMD_ARGS;
47    let result = entey(args);
48    if result.is_err() {
49        std::process::exit(1);
50    }
51    Ok(())
52}
53
54#[doc(hidden)]
55pub fn entey(args: &Cli) -> anyhow::Result<()> {
56    let git = git_info2::get();
57    let run_result = match &args.command {
58        Commands::Run(cmd) => cmd.run(),
59        Commands::Upload(cmd) => cmd.run(),
60        Commands::Viz(cmd) => cmd.run(),
61    };
62    if let Err(err) = run_result.as_ref() {
63        eprintln!("❌ {}: {}", "ERROR".red().bold(), err.to_string().red());
64        dump_backtrace(err);
65    }
66    let restore_result = utils::git::restore_git_state(&git);
67    if let Err(err) = restore_result.as_ref() {
68        eprintln!("❌ {}: {}", "ERROR".red().bold(), err.to_string().red());
69        dump_backtrace(err);
70    }
71    Ok(())
72}