mod args; mod context; mod driver; mod parse; mod paths; mod pin; mod recipe; mod resolve; mod task; mod template; use clap::Parser; use runner::Runner; #[derive(Parser)] #[clap(version = clap::crate_version!())] struct Opts { /// Allow N jobs at once. /// Defaults to the number of available CPUs #[clap(short, long)] jobs: Option, /// The tasks to run #[clap(name = "task", required = true)] tasks: Vec, } fn main() { let opts: Opts = Opts::parse(); let runner = unsafe { Runner::new(&runner::Options { jobs: opts.jobs }) }.unwrap(); let ctx = context::Context::new( recipe::read_recipes("examples/recipes").unwrap(), pin::read_pins("examples/pins.yml").unwrap(), ) .unwrap(); let mut rsv = resolve::Resolver::new(&ctx); for task in opts.tasks { let task_ref = match ctx.parse(&task) { Ok(task_ref) => task_ref, Err(err) => { eprintln!("{}", err); std::process::exit(1); } }; let errors = rsv.add_goal(&task_ref); if !errors.is_empty() { for error in errors { eprintln!("{}", error); } std::process::exit(1); } } let taskset = rsv.into_taskset(); let mut driver = driver::Driver::new(&ctx, taskset).unwrap(); if let Err(error) = driver.run(&runner) { eprintln!("{}", error); std::process::exit(1); } }