Skip to main content

mlt_core/frames/v01/geometry/
serialize.rs

1use std::fmt::Debug;
2use std::io::Write;
3
4use integer_encoding::VarIntWriter as _;
5
6use crate::codecs::varint::parse_varint;
7use crate::utils::{AsUsize as _, BinarySerializer as _, OptSeq, checked_sum2};
8use crate::v01::geometry::encode::encode_geometry;
9use crate::v01::{
10    ColumnType, DictionaryType, EncodedGeometry, Geometry, GeometryEncoder, GeometryValues,
11    IntEncoding, RawGeometry, RawStream, RawStreamData, StreamMeta, StreamType,
12};
13use crate::{MltResult, Parser};
14
15impl<'a> RawGeometry<'a> {
16    /// Parse encoded geometry from bytes (expects varint stream count + streams).
17    /// Reserves decoded memory against the parser's budget.
18    pub fn from_bytes(input: &'a [u8], parser: &mut Parser) -> crate::MltRefResult<'a, Self> {
19        let (input, stream_count) = parse_varint::<u32>(input)?;
20        let stream_count = stream_count.as_usize();
21        if stream_count == 0 {
22            return Ok((
23                input,
24                Self {
25                    meta: RawStream::new(
26                        StreamMeta::new(
27                            StreamType::Data(DictionaryType::None),
28                            IntEncoding::none(),
29                            0,
30                        ),
31                        RawStreamData::Encoded(&[]),
32                    ),
33                    items: Vec::new(),
34                },
35            ));
36        }
37
38        let (input, meta) = RawStream::from_bytes(input, parser)?;
39        let (input, items) = RawStream::parse_multiple(input, stream_count - 1, parser)?;
40
41        Ok((input, Self { meta, items }))
42    }
43}
44
45impl EncodedGeometry {
46    pub fn write_columns_meta_to<W: Write>(writer: &mut W) -> MltResult<()> {
47        ColumnType::Geometry.write_to(writer)?;
48        Ok(())
49    }
50
51    pub fn write_to<W: Write>(&self, writer: &mut W) -> MltResult<()> {
52        let items_len = u32::try_from(self.items.len())?;
53        let items_len = checked_sum2(items_len, 1)?;
54        writer.write_varint(items_len)?;
55        writer.write_stream(&self.meta)?;
56        for item in &self.items {
57            writer.write_stream(item)?;
58        }
59        Ok(())
60    }
61
62    pub fn encode(value: &GeometryValues, encoder: GeometryEncoder) -> MltResult<Self> {
63        encode_geometry(value, &encoder, None)
64    }
65}
66
67impl Debug for GeometryValues {
68    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
69        let GeometryValues {
70            vector_types,
71            geometry_offsets,
72            part_offsets,
73            ring_offsets,
74            index_buffer,
75            triangles,
76            vertices,
77        } = self;
78        f.debug_struct("GeometryValues")
79            .field("vector_types", &OptSeq(Some(vector_types)))
80            .field("geometry_offsets", &OptSeq(geometry_offsets.as_deref()))
81            .field("part_offsets", &OptSeq(part_offsets.as_deref()))
82            .field("ring_offsets", &OptSeq(ring_offsets.as_deref()))
83            .field("index_buffer", &OptSeq(index_buffer.as_deref()))
84            .field("triangles", &OptSeq(triangles.as_deref()))
85            .field("vertices", &OptSeq(vertices.as_deref()))
86            .finish()
87    }
88}
89
90impl<'a> Geometry<'a> {
91    #[must_use]
92    pub fn new_raw(meta: RawStream<'a>, items: Vec<RawStream<'a>>) -> Self {
93        Self::Raw(RawGeometry { meta, items })
94    }
95}
96
97impl GeometryValues {
98    #[must_use]
99    pub fn feature_count(&self) -> usize {
100        self.vector_types.len()
101    }
102}