mod check_api_refs; mod orcx; use std::process::ExitCode; use std::sync::atomic::{AtomicBool, Ordering}; use std::{env, io}; use check_api_refs::check_api_refs; use clap::{Parser, Subcommand}; use orcx::orcx; use crate::orcx::orcxdb; #[derive(Parser)] pub struct Args { #[arg(short, long)] verbose: bool, #[command(subcommand)] command: Commands, } #[derive(Subcommand)] pub enum Commands { CheckApiRefs, Orcx { #[arg(long)] release: bool, #[arg(trailing_var_arg = true, num_args = 1..)] argv: Vec, }, Orcxdb { #[arg(trailing_var_arg = true, num_args = 1..)] argv: Vec, }, } pub static EXIT_OK: AtomicBool = AtomicBool::new(true); fn main() -> io::Result { if let Some(root) = env::var_os("CARGO_WORKSPACE_DIR") { env::set_current_dir(root)?; } let args = Args::parse(); match &args.command { Commands::CheckApiRefs => check_api_refs(&args)?, Commands::Orcx { release, argv } => orcx(*release, &args, argv)?, Commands::Orcxdb { argv } => orcxdb(&args, argv)?, } Ok(if EXIT_OK.load(Ordering::Relaxed) { ExitCode::SUCCESS } else { ExitCode::FAILURE }) }