re_log_encoding 0.31.3

Encode/decode and serialize/deserialize RRD streams
Documentation
#![cfg(all(feature = "encoder", feature = "decoder"))]

use re_chunk::{Chunk, RowId, TimePoint, Timeline};
use re_log_encoding::{DecoderApp, Encoder};
use re_log_types::{LogMsg, StoreId};
use re_sdk_types::archetypes::Points3D;
use similar_asserts::assert_eq;

fn no_radii() -> impl Iterator<Item = f32> {
    std::iter::empty()
}

#[test]
fn encode_roundtrip() {
    fn timepoint(time: i64) -> TimePoint {
        TimePoint::default().with(Timeline::new_sequence("my_index"), time)
    }

    let chunk = Chunk::builder("points")
        .with_archetype(
            RowId::new(),
            timepoint(1),
            &Points3D::new([[1., 2., 3.], [4., 5., 6.], [7., 8., 9.]]).with_radii(no_radii()),
        )
        .with_archetype(
            RowId::new(),
            timepoint(1),
            &Points3D::new([[10., 11., 12.]]).with_colors([[255, 0, 0]]),
        )
        .build()
        .unwrap();

    let record_batch = chunk.to_record_batch().unwrap();
    assert_eq!(Chunk::from_record_batch(&record_batch).unwrap(), chunk);

    let arrow_msg = chunk.to_arrow_msg().unwrap();
    assert_eq!(Chunk::from_arrow_msg(&arrow_msg).unwrap(), chunk);

    let store_id = StoreId::empty_recording();
    let messages = [LogMsg::ArrowMsg(store_id, arrow_msg)];

    let encoded = Encoder::encode(messages.iter().cloned().map(Ok)).unwrap();
    let decoded: Vec<_> = DecoderApp::decode_lazy(encoded.as_slice())
        .map(Result::unwrap)
        .collect();
    similar_asserts::assert_eq!(decoded, messages, "Failed to roundtrip chunk");
}