acadrust 0.6.1

A pure Rust library for reading and writing CAD files in DXF format (ASCII and Binary) and DWG format (Binary).
Documentation
use acadrust::objects::{Dictionary, Material, ObjectType, XRecord, XRecordEntry};
use acadrust::{CadDocument, Handle};

fn checker_record(name: &str, handle: Handle, owner: Handle) -> XRecord {
    let mut record = XRecord::named(name);
    record.handle = handle;
    record.owner = owner;
    record.entries = vec![
        XRecordEntry::string(300, "Container"),
        XRecordEntry::string(300, "Shader"),
        XRecordEntry::string(301, "Checker"),
        XRecordEntry::string(300, "Map1"),
        XRecordEntry::string(300, "Color"),
        XRecordEntry::int32(420, 0x102030),
        XRecordEntry::string(300, "Map2"),
        XRecordEntry::string(300, "Color"),
        XRecordEntry::int32(420, 0xD0E0F0),
        XRecordEntry::string(300, "Mapper"),
    ];
    record
}

#[test]
fn resolves_checker_asset_records_into_material_maps() {
    let material_handle = Handle::new(0x10);
    let dictionary_handle = Handle::new(0x20);
    let diffuse_handle = Handle::new(0x21);
    let opacity_handle = Handle::new(0x22);
    let mut document = CadDocument::new();

    let mut material = Material::new();
    material.handle = material_handle;
    material.xdictionary_handle = Some(dictionary_handle);

    let mut dictionary = Dictionary::new();
    dictionary.handle = dictionary_handle;
    dictionary.add_entry("DIFFUSE", diffuse_handle);
    dictionary.add_entry("OPACITY", opacity_handle);

    document
        .objects
        .insert(material_handle, ObjectType::Material(material));
    document
        .objects
        .insert(dictionary_handle, ObjectType::Dictionary(dictionary));
    document.objects.insert(
        diffuse_handle,
        ObjectType::XRecord(checker_record("DIFFUSE", diffuse_handle, dictionary_handle)),
    );
    document.objects.insert(
        opacity_handle,
        ObjectType::XRecord(checker_record("OPACITY", opacity_handle, dictionary_handle)),
    );

    document.resolve_xrecord_backed_properties();

    let ObjectType::Material(material) = document
        .objects
        .get(&material_handle)
        .expect("material object")
    else {
        panic!("expected material");
    };
    for map in [&material.diffuse_map, &material.opacity_map] {
        assert_eq!(map.source, 2);
        assert!(map.file_name.is_empty());
        let texture = map.texture.as_ref().expect("checker texture");
        assert_eq!(texture.color1.rgb, Some(0x102030));
        assert_eq!(texture.color2.rgb, Some(0xD0E0F0));
    }
}