vortex_flatbuffers/
lib.rs

1//! A contiguously serialized Vortex array.
2//!
3//! See the `vortex-file` crate for non-contiguous serialization.
4
5#[cfg(feature = "array")]
6#[allow(clippy::all)]
7#[allow(clippy::derive_partial_eq_without_eq)]
8#[allow(clippy::many_single_char_names)]
9#[allow(clippy::unwrap_used)]
10#[allow(clippy::borrow_as_ptr)]
11#[allow(dead_code)]
12#[allow(non_snake_case)]
13#[allow(non_camel_case_types)]
14#[allow(unsafe_op_in_unsafe_fn)]
15#[allow(unused_imports)]
16#[allow(unused_lifetimes)]
17#[allow(unused_qualifications)]
18#[rustfmt::skip]
19#[path = "./generated/array.rs"]
20/// A serialized array without its buffer (i.e. data).
21///
22/// `array.fbs`:
23/// ```flatbuffers
24#[doc = include_str!("../flatbuffers/vortex-array/array.fbs")]
25/// ```
26pub mod array;
27
28#[cfg(feature = "dtype")]
29#[allow(clippy::all)]
30#[allow(clippy::derive_partial_eq_without_eq)]
31#[allow(clippy::many_single_char_names)]
32#[allow(clippy::unwrap_used)]
33#[allow(clippy::borrow_as_ptr)]
34#[allow(dead_code)]
35#[allow(non_snake_case)]
36#[allow(non_camel_case_types)]
37#[allow(unsafe_op_in_unsafe_fn)]
38#[allow(unused_imports)]
39#[allow(unused_lifetimes)]
40#[allow(unused_qualifications)]
41#[rustfmt::skip]
42#[path = "./generated/dtype.rs"]
43/// A serialized data type.
44///
45/// `dtype.fbs`:
46/// ```flatbuffers
47#[doc = include_str!("../flatbuffers/vortex-dtype/dtype.fbs")]
48/// ```
49pub mod dtype;
50
51#[cfg(feature = "file")]
52#[allow(clippy::all)]
53#[allow(clippy::derive_partial_eq_without_eq)]
54#[allow(clippy::many_single_char_names)]
55#[allow(clippy::unwrap_used)]
56#[allow(clippy::borrow_as_ptr)]
57#[allow(dead_code)]
58#[allow(non_snake_case)]
59#[allow(non_camel_case_types)]
60#[allow(unsafe_op_in_unsafe_fn)]
61#[allow(unused_imports)]
62#[allow(unused_lifetimes)]
63#[allow(unused_qualifications)]
64#[rustfmt::skip]
65#[path = "./generated/footer.rs"]
66/// A file format footer containing a serialized `vortex-file` Layout.
67///
68/// `footer.fbs`:
69/// ```flatbuffers
70#[doc = include_str!("../flatbuffers/vortex-file/footer.fbs")]
71/// ```
72pub mod footer;
73
74#[cfg(feature = "layout")]
75#[allow(clippy::all)]
76#[allow(clippy::derive_partial_eq_without_eq)]
77#[allow(clippy::many_single_char_names)]
78#[allow(clippy::unwrap_used)]
79#[allow(clippy::borrow_as_ptr)]
80#[allow(dead_code)]
81#[allow(non_snake_case)]
82#[allow(non_camel_case_types)]
83#[allow(unsafe_op_in_unsafe_fn)]
84#[allow(unused_imports)]
85#[allow(unused_lifetimes)]
86#[allow(unused_qualifications)]
87#[rustfmt::skip]
88#[path = "./generated/layout.rs"]
89/// A serialized sequence of arrays, each with its buffers.
90///
91/// `layout.fbs`:
92/// ```flatbuffers
93#[doc = include_str!("../flatbuffers/vortex-layout/layout.fbs")]
94/// ```
95pub mod layout;
96
97#[cfg(feature = "ipc")]
98#[allow(clippy::all)]
99#[allow(clippy::derive_partial_eq_without_eq)]
100#[allow(clippy::many_single_char_names)]
101#[allow(clippy::unwrap_used)]
102#[allow(clippy::borrow_as_ptr)]
103#[allow(dead_code)]
104#[allow(non_snake_case)]
105#[allow(non_camel_case_types)]
106#[allow(unsafe_op_in_unsafe_fn)]
107#[allow(unused_imports)]
108#[allow(unused_lifetimes)]
109#[allow(unused_qualifications)]
110#[rustfmt::skip]
111#[path = "./generated/message.rs"]
112/// A serialized sequence of arrays, each with its buffers.
113///
114/// `message.fbs`:
115/// ```flatbuffers
116#[doc = include_str!("../flatbuffers/vortex-serde/message.fbs")]
117/// ```
118pub mod message;
119
120use flatbuffers::{FlatBufferBuilder, Follow, InvalidFlatbuffer, Verifiable, WIPOffset, root};
121use vortex_buffer::{ByteBuffer, ConstByteBuffer};
122
123/// We define a const-aligned byte buffer for flatbuffers with 8-byte alignment.
124///
125/// This is based on the assumption that the maximum primitive type is 8 bytes.
126/// See: <https://groups.google.com/g/flatbuffers/c/PSgQeWeTx_g>
127pub type FlatBuffer = ConstByteBuffer<8>;
128
129pub trait FlatBufferRoot {}
130
131pub trait ReadFlatBuffer: Sized {
132    type Source<'a>: Verifiable + Follow<'a>;
133    type Error: From<InvalidFlatbuffer>;
134
135    fn read_flatbuffer<'buf>(
136        fb: &<Self::Source<'buf> as Follow<'buf>>::Inner,
137    ) -> Result<Self, Self::Error>;
138
139    fn read_flatbuffer_bytes<'buf>(bytes: &'buf [u8]) -> Result<Self, Self::Error>
140    where
141        <Self as ReadFlatBuffer>::Source<'buf>: 'buf,
142    {
143        let fb = root::<Self::Source<'buf>>(bytes)?;
144        Self::read_flatbuffer(&fb)
145    }
146}
147
148pub trait WriteFlatBuffer {
149    type Target<'a>;
150
151    fn write_flatbuffer<'fb>(
152        &self,
153        fbb: &mut FlatBufferBuilder<'fb>,
154    ) -> WIPOffset<Self::Target<'fb>>;
155}
156
157pub trait WriteFlatBufferExt: WriteFlatBuffer + FlatBufferRoot {
158    /// Write the flatbuffer into a [`FlatBuffer`].
159    fn write_flatbuffer_bytes(&self) -> FlatBuffer;
160}
161
162impl<F: WriteFlatBuffer + FlatBufferRoot> WriteFlatBufferExt for F {
163    fn write_flatbuffer_bytes(&self) -> FlatBuffer {
164        let mut fbb = FlatBufferBuilder::new();
165        let root_offset = self.write_flatbuffer(&mut fbb);
166        fbb.finish_minimal(root_offset);
167        let (vec, start) = fbb.collapse();
168        let end = vec.len();
169        FlatBuffer::align_from(ByteBuffer::from(vec).slice(start..end))
170    }
171}