qrunap2 0.1.1

A documented subset of QNAP2 for queueing network simulation
Documentation
fn main() {
    let args: Vec<String> = std::env::args().collect();
    let result = (|| -> Result<(), String> {
        if args.len() == 2 && args[1] == "--version" {
            println!("QRUNAP2 {}", env!("CARGO_PKG_VERSION"));
            return Ok(());
        }
        if args.len() < 3 || args.len() > 4 || !["check", "run"].contains(&args[1].as_str()) {
            return Err(
                "Usage: qrunap2 check FILE | qrunap2 run FILE [SEED] | qrunap2 --version".into(),
            );
        }
        let source = std::fs::read_to_string(&args[2]).map_err(|e| e.to_string())?;
        let model = qrunap2::parse(&source)?;
        if args[1] == "check" {
            println!("OK: {} stations", model.stations.len());
        } else {
            let seed = args
                .get(3)
                .map(|s| s.parse::<u32>().map_err(|_| "Invalid seed".to_string()))
                .transpose()?
                .unwrap_or(42);
            println!(
                "{}",
                serde_json::to_string_pretty(&qrunap2::simulate(&model, seed)?)
                    .map_err(|e| e.to_string())?
            );
        }
        Ok(())
    })();
    if let Err(e) = result {
        eprintln!("{e}");
        std::process::exit(1);
    }
}