pcd-rs 0.13.0

Working with PCD file format in Rust
Documentation
use eyre::Result;
use itertools::Itertools as _;
use pcd_rs::{DataKind, DynRecord, Field, Reader, Schema, ValueKind, WriterInit};
use tempfile::NamedTempFile;

#[test]
fn write_ascii_untyped() -> Result<()> {
    let file = NamedTempFile::new()?;
    let dump_points = vec![
        DynRecord(vec![
            Field::F32(vec![3.5]),
            Field::U8(vec![2, 1, 7]),
            Field::I32(vec![-5]),
        ]),
        DynRecord(vec![
            Field::F32(vec![-0.0]),
            Field::U8(vec![254, 6, 98]),
            Field::I32(vec![7]),
        ]),
        DynRecord(vec![
            Field::F32(vec![5.6]),
            Field::U8(vec![4, 0, 111]),
            Field::I32(vec![-100000]),
        ]),
    ];

    let schema = Schema::from_iter([
        ("x", ValueKind::F32, 1),
        ("y", ValueKind::U8, 3),
        ("z", ValueKind::I32, 1),
    ]);

    let mut writer = WriterInit {
        width: 300,
        height: 1,
        viewpoint: Default::default(),
        data_kind: DataKind::Ascii,
        schema: Some(schema),
        version: None,
    }
    .create(file.path())?;

    for point in &dump_points {
        writer.push(point)?;
    }

    writer.finish()?;

    let reader: Reader<DynRecord, _> = Reader::open(file.path())?;
    let load_points: Result<Vec<DynRecord>, _> = reader.collect();

    assert_eq!(dump_points, load_points?);

    Ok(())
}

#[test]
fn write_binary_untyped() -> Result<()> {
    let file = NamedTempFile::new()?;

    let dump_points = vec![
        DynRecord(vec![
            Field::F32(vec![3.5]),
            Field::U8(vec![2, 1, 7]),
            Field::I32(vec![-5]),
        ]),
        DynRecord(vec![
            Field::F32(vec![-0.0]),
            Field::U8(vec![254, 6, 98]),
            Field::I32(vec![7]),
        ]),
        DynRecord(vec![
            Field::F32(vec![5.6]),
            Field::U8(vec![4, 0, 111]),
            Field::I32(vec![-100000]),
        ]),
    ];

    let schema = Schema::from_iter([
        ("x", ValueKind::F32, 1),
        ("y", ValueKind::U8, 3),
        ("z", ValueKind::I32, 1),
    ]);

    let mut writer = WriterInit {
        width: 300,
        height: 1,
        viewpoint: Default::default(),
        data_kind: DataKind::Binary,
        schema: Some(schema),
        version: None,
    }
    .create(file.path())?;

    for point in &dump_points {
        writer.push(point)?;
    }

    writer.finish()?;

    let reader = Reader::open(file.path())?;
    let load_points: Vec<DynRecord> = reader.try_collect()?;

    assert_eq!(dump_points, load_points);

    Ok(())
}