pcd-rs 0.13.0

Working with PCD file format in Rust
Documentation
#![cfg(feature = "derive")]

use eyre::Result;
use itertools::Itertools as _;
use pcd_rs::{DataKind, PcdDeserialize, PcdSerialize, Reader, WriterInit};
use tempfile::NamedTempFile;

#[derive(Debug, PcdDeserialize, PcdSerialize, PartialEq)]
pub struct Point {
    #[pcd(rename = "new_x")]
    x: f32,
    y: [u8; 3],
    z: i32,
}

#[test]
fn write_ascii_typed() -> Result<()> {
    let file = NamedTempFile::new()?;
    let dump_points = vec![
        Point {
            x: 3.5,
            y: [2, 1, 7],
            z: -5,
        },
        Point {
            x: -0.0,
            y: [254, 6, 98],
            z: 7,
        },
        Point {
            x: 5.6,
            y: [4, 0, 111],
            z: -100000,
        },
    ];

    let mut writer = WriterInit {
        width: 300,
        height: 1,
        viewpoint: Default::default(),
        data_kind: DataKind::Ascii,
        schema: None,
        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<Point> = reader.try_collect()?;

    assert_eq!(dump_points, load_points);

    Ok(())
}

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

    let dump_points = vec![
        Point {
            x: 3.5,
            y: [2, 1, 7],
            z: -5,
        },
        Point {
            x: -0.0,
            y: [254, 6, 98],
            z: 7,
        },
        Point {
            x: 5.6,
            y: [4, 0, 111],
            z: -100000,
        },
    ];

    let mut writer = WriterInit {
        width: 300,
        height: 1,
        viewpoint: Default::default(),
        data_kind: DataKind::Binary,
        schema: None,
        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<Point> = reader.try_collect()?;

    assert_eq!(dump_points, load_points);

    Ok(())
}