vortex_array/flatbuffers/
traits.rs1use flatbuffers::FlatBufferBuilder;
7use flatbuffers::Follow;
8use flatbuffers::InvalidFlatbuffer;
9use flatbuffers::Verifiable;
10use flatbuffers::WIPOffset;
11use flatbuffers::root;
12use vortex_buffer::ByteBuffer;
13use vortex_buffer::ConstByteBuffer;
14use vortex_error::VortexResult;
15
16pub type FlatBuffer = ConstByteBuffer<8>;
21
22pub trait FlatBufferRoot {}
24
25pub trait ReadFlatBuffer: Sized {
27 type Source<'a>: Verifiable + Follow<'a>;
29 type Error: From<InvalidFlatbuffer>;
31
32 fn read_flatbuffer<'buf>(
34 fb: &<Self::Source<'buf> as Follow<'buf>>::Inner,
35 ) -> Result<Self, Self::Error>;
36
37 fn read_flatbuffer_bytes<'buf>(bytes: &'buf [u8]) -> Result<Self, Self::Error>
39 where
40 <Self as ReadFlatBuffer>::Source<'buf>: 'buf,
41 {
42 let fb = root::<Self::Source<'buf>>(bytes)?;
43 Self::read_flatbuffer(&fb)
44 }
45}
46
47pub trait WriteFlatBuffer {
49 type Target<'a>;
51
52 fn write_flatbuffer<'fb>(
54 &self,
55 fbb: &mut FlatBufferBuilder<'fb>,
56 ) -> VortexResult<WIPOffset<Self::Target<'fb>>>;
57}
58
59pub trait WriteFlatBufferExt: WriteFlatBuffer + FlatBufferRoot {
61 fn write_flatbuffer_bytes(&self) -> VortexResult<FlatBuffer>;
63}
64
65impl<F: WriteFlatBuffer + FlatBufferRoot> WriteFlatBufferExt for F {
66 fn write_flatbuffer_bytes(&self) -> VortexResult<FlatBuffer> {
67 let mut fbb = FlatBufferBuilder::new();
68 let root_offset = self.write_flatbuffer(&mut fbb)?;
69 fbb.finish_minimal(root_offset);
70 let (vec, start) = fbb.collapse();
71 let end = vec.len();
72 Ok(FlatBuffer::align_from(
73 ByteBuffer::from(vec).slice(start..end),
74 ))
75 }
76}