mlt_core/frames/v01/geometry/
serialize.rs1use 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 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}