acadrust 0.6.5

A pure Rust library for reading and writing CAD files in DXF format (ASCII and Binary) and DWG format (Binary).
Documentation
use std::io::Cursor;

use acadrust::tables::Layer;
use acadrust::types::{Color, DxfVersion};
use acadrust::{CadDocument, DwgReader, DwgWriter, DxfWriter};

const RGB: Color = Color::from_rgb(200, 100, 50);

fn document() -> CadDocument {
    let mut document = CadDocument::with_version(DxfVersion::AC1032);
    document.layers.add(Layer::with_color("L1", RGB)).unwrap();
    document
}

fn assert_layer_color(dxf: &[u8]) {
    let text = String::from_utf8_lossy(dxf);
    let lines: Vec<_> = text.lines().map(str::trim).collect();
    let groups: Vec<_> = lines
        .chunks_exact(2)
        .map(|pair| (pair[0], pair[1]))
        .collect();
    let layer = groups
        .split(|pair| *pair == ("0", "LAYER"))
        .map(|record| {
            record
                .iter()
                .take_while(|(code, _)| *code != "0")
                .copied()
                .collect::<Vec<_>>()
        })
        .find(|record| record.contains(&("2", "L1")))
        .expect("L1 layer record");
    let aci: i16 = layer
        .iter()
        .find(|(code, _)| *code == "62")
        .and_then(|(_, value)| value.parse().ok())
        .expect("layer group 62");
    let true_color: u32 = layer
        .iter()
        .find(|(code, _)| *code == "420")
        .and_then(|(_, value)| value.parse().ok())
        .expect("layer group 420");
    assert_eq!(aci, RGB.approximate_index());
    assert_eq!(true_color, 13_132_850);
}

#[test]
fn rgb_layer_writes_nearest_aci_and_true_color() {
    let document = document();
    let dxf = DxfWriter::new(&document).write_to_vec().unwrap();
    assert_layer_color(&dxf);
}

#[test]
fn rgb_layer_keeps_nearest_aci_after_dwg_roundtrip() {
    let document = document();
    let dwg = DwgWriter::write_to_vec(&document).unwrap();
    let restored = DwgReader::from_stream(Cursor::new(dwg)).read().unwrap();
    let dxf = DxfWriter::new(&restored).write_to_vec().unwrap();
    assert_layer_color(&dxf);
}