mod commands;
mod fetch;
mod output;
mod subscription;
use clap::{Parser, Subcommand};
use commands::{
compare::{self, CompareArgs},
ranges::{self, RangesArgs},
run::{self, RunArgs},
summarize::{self, SummarizeArgs},
update,
usage::{self, UsageArgs},
};
use console::style;
use sim_cli::signals::spawn_os_signal_handler;
use tokio_util::sync::CancellationToken;
#[derive(Parser)]
struct Cli {
#[arg(
long,
global = true,
env = "SIMULATOR_URL",
default_value = "simulator.termina.technology"
)]
url: String,
#[arg(long, global = true, env = "SIMULATOR_API_KEY", default_value = "")]
api_key: String,
#[command(subcommand)]
command: Command,
}
#[derive(Subcommand)]
enum Command {
Run(RunArgs),
Compare(CompareArgs),
Summarize(SummarizeArgs),
Update,
Ranges(RangesArgs),
Usage(UsageArgs),
}
#[tokio::main]
async fn main() {
let _ = rustls::crypto::aws_lc_rs::default_provider()
.install_default()
.map_err(|_| ())
.ok();
let cli = Cli::parse();
let cancellation = CancellationToken::new();
if matches!(cli.command, Command::Run(_)) {
spawn_os_signal_handler(cancellation.clone());
}
let result = match cli.command {
Command::Run(args) => run::run(args, cli.url, cli.api_key, cancellation.clone()).await,
Command::Compare(args) => compare::compare(args).await,
Command::Summarize(args) => summarize::summarize(args),
Command::Update => update::update().await,
Command::Ranges(args) => ranges::ranges(args, cli.url).await,
Command::Usage(args) => usage::usage(args, cli.url, cli.api_key).await,
};
if let Err(e) = result {
eprintln!("{} {:#}", style("✖").red().bold(), e);
std::process::exit(1);
}
}