xcassets 0.2.0

Parse Xcode .xcassets catalogs into a typed Rust tree with diagnostics.
Documentation
use std::{env, hint::black_box, path::PathBuf, time::Instant};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut args = env::args().skip(1);
    let path = args.next().map(PathBuf::from).ok_or(
        "usage: cargo run --release --example bench_references -- <catalog-path> [iterations]",
    )?;
    let iterations = args
        .next()
        .map(|value| value.parse::<u32>())
        .transpose()?
        .unwrap_or(10);

    if iterations == 0 {
        return Err("iterations must be greater than zero".into());
    }

    let start = Instant::now();
    let mut diagnostics = 0usize;
    let mut references = 0usize;

    for _ in 0..iterations {
        let index = xcassets::index_asset_references(&path)?;
        diagnostics = index.diagnostics.len();
        references = index.references.len();
        black_box(index);
    }

    let elapsed = start.elapsed();
    let average_ms = elapsed.as_secs_f64() * 1_000.0 / f64::from(iterations);

    println!("path: {}", path.display());
    println!("iterations: {iterations}");
    println!("total_ms: {:.3}", elapsed.as_secs_f64() * 1_000.0);
    println!("avg_ms: {:.3}", average_ms);
    println!("last_run_references: {references}");
    println!("last_run_diagnostics: {diagnostics}");

    Ok(())
}