1use clap::{Parser, Subcommand};
2use colored::Colorize;
3use once_cell::sync::Lazy;
4
5mod commands;
6mod utils;
7
8pub mod configs;
9
10#[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#[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}