mod cache;
mod cli;
mod config;
mod inject;
mod loader;
mod pricing;
mod proc;
mod quota;
mod session;
#[cfg(unix)]
mod shim;
mod ui;
mod update;
mod util;
mod watch;
use clap::Parser;
use std::io::IsTerminal;
fn main() -> anyhow::Result<()> {
#[cfg(unix)]
{
let argv: Vec<String> = std::env::args().collect();
let command = match argv.get(1).map(String::as_str) {
Some("run") => Some(&argv[2..]),
Some(word) if !word.starts_with('-') && shim::is_command(word) => Some(&argv[1..]),
_ => None,
};
if let Some(command) = command {
std::process::exit(shim::run(command)?);
}
}
let args = cli::Args::parse();
if args.update {
return update::run(false);
}
if args.clear_cache && cache::clear_session_cache()? {
eprintln!("Cleared cctop session extraction cache.");
}
if args.list || args.json {
pricing::refresh_pricing_blocking();
let mut loader = loader::Loader::new();
let sessions = loader.load(args.plan);
if args.json {
cli::run_json(&sessions, args.plan, &loader)?;
} else {
cli::run_list(&sessions, args.plan);
}
loader.store().save();
return Ok(());
}
if !std::io::stdin().is_terminal() || !std::io::stdout().is_terminal() {
anyhow::bail!("the interactive UI needs a TTY; use --list or --json instead");
}
pricing::load_cached_pricing();
ui::run(&args)
}