mod init; use std::path::PathBuf; fn main() { let args: Vec = std::env::args().collect(); match args.get(1).map(String::as_str) { Some("init") => { let is_lib = args.iter().any(|a| a == "--lib"); let dir = args .iter() .skip(2) .find(|a| !a.starts_with('-')) .map(String::as_str) .unwrap_or("."); init::run(dir, is_lib); } Some(_) => compile(&args), None => { print_usage(); std::process::exit(1); } } } fn compile(args: &[String]) { let input_path = PathBuf::from(&args[1]); let src = match std::fs::read_to_string(&input_path) { Ok(s) => s, Err(e) => { eprintln!("error reading {}: {}", input_path.display(), e); std::process::exit(1); } }; let ast = match misses::parse(&src) { Ok(a) => a, Err(e) => { eprintln!("parse error: {}", e); std::process::exit(1); } }; let generated = misses::codegen(&ast); if args.len() >= 3 { let output_path = PathBuf::from(&args[2]); if let Err(e) = std::fs::write(&output_path, &generated) { eprintln!("error writing {}: {}", output_path.display(), e); std::process::exit(1); } } else { print!("{}", generated); } } fn print_usage() { eprintln!("Usage:"); eprintln!(" misses [output.rs] Compile a .mrs file to Rust"); eprintln!(" misses init [--lib] [dir] Scaffold a new misses project"); eprintln!(); eprintln!("Modes for `misses init`:"); eprintln!(" (default) Binary — .mrs sources are compiled at build time via build.rs;"); eprintln!(" generated code lives in \\$OUT_DIR and is never committed."); eprintln!(" --lib Library — generated code is committed to generated/ so"); eprintln!(" downstream users need no misses install. Rebuild with"); eprintln!(" `cargo build --features misses-source`."); }