mod args; mod fs; mod log; mod metal; mod oklab; mod rng; mod sampling; mod pipeline; use crate::pipeline::{process_dir, process_one, ResolvedOutput}; use std::path::{Path, PathBuf}; use std::process::ExitCode; fn main() -> ExitCode { match real_main() { Ok(()) => ExitCode::SUCCESS, Err(msg) => { eprintln!("{msg}"); ExitCode::FAILURE } } } fn real_main() -> Result<(), String> { let args = std::env::args().collect::>(); let cfg = args::Config::parse(&args)?; log::set_level(cfg.log); let input_path = Path::new(&cfg.input); if input_path.is_dir() { if cfg.current.is_some() { return Err("-c/--current is not supported when input is a directory".into()); } let out_root = fs::validate_and_prepare_dir_output(&cfg)?; return process_dir(&cfg, input_path, &out_root); } let output = ResolvedOutput::from_config(&cfg, PathBuf::from(&cfg.output)); let final_path = process_one(&cfg, input_path, output)?; println!("output: {}", final_path.display()); Ok(()) }