lib3mf-core 0.4.0

Parse and validate 3MF files for manufacturing workflows - production-ready with streaming parser and comprehensive validation
Documentation
use lib3mf_core::archive::ArchiveReader;
use lib3mf_core::model::Model;
use lib3mf_core::parser::parse_model;
use lib3mf_core::utils::diff::compare_models;
use std::path::PathBuf;

fn main() -> anyhow::Result<()> {
    let args: Vec<String> = std::env::args().collect();
    if args.len() < 3 {
        println!("Usage: model_diff <file1.3mf> <file2.3mf>");
        return Ok(());
    }

    let file1 = PathBuf::from(&args[1]);
    let file2 = PathBuf::from(&args[2]);

    println!("Loading models...");
    let model1 = load_model(&file1)?;
    let model2 = load_model(&file2)?;

    println!("Calculating differences...");
    let diff = compare_models(&model1, &model2);

    if diff.is_empty() {
        println!("No differences found!");
    } else {
        println!("{:#?}", diff);
    }

    Ok(())
}

fn load_model(path: &PathBuf) -> anyhow::Result<Model> {
    let file = std::fs::File::open(path)?;
    let mut archiver = lib3mf_core::archive::ZipArchiver::new(file)?;
    let model_path = lib3mf_core::archive::find_model_path(&mut archiver)?;
    let model_data = archiver.read_entry(&model_path)?;
    Ok(parse_model(std::io::Cursor::new(model_data))?)
}