vortex_flatbuffers/
lib.rs1#![deny(missing_docs)]
9
10#[cfg(feature = "array")]
11#[allow(clippy::all)]
12#[allow(clippy::derive_partial_eq_without_eq)]
13#[allow(clippy::many_single_char_names)]
14#[allow(clippy::unwrap_used)]
15#[allow(clippy::absolute_paths)]
16#[allow(clippy::borrow_as_ptr)]
17#[allow(dead_code)]
18#[allow(mismatched_lifetime_syntaxes)]
19#[allow(non_snake_case)]
20#[allow(non_camel_case_types)]
21#[allow(unused_imports)]
22#[allow(unused_lifetimes)]
23#[allow(unused_qualifications)]
24#[allow(missing_docs)]
25#[rustfmt::skip]
26#[path = "./generated/array.rs"]
27#[doc = include_str!("../flatbuffers/vortex-array/array.fbs")]
32pub mod array;
34
35#[cfg(feature = "dtype")]
36#[allow(clippy::all)]
37#[allow(clippy::derive_partial_eq_without_eq)]
38#[allow(clippy::many_single_char_names)]
39#[allow(clippy::unwrap_used)]
40#[allow(clippy::absolute_paths)]
41#[allow(clippy::borrow_as_ptr)]
42#[allow(dead_code)]
43#[allow(mismatched_lifetime_syntaxes)]
44#[allow(non_snake_case)]
45#[allow(non_camel_case_types)]
46#[allow(unused_imports)]
47#[allow(unused_lifetimes)]
48#[allow(unused_qualifications)]
49#[allow(missing_docs)]
50#[rustfmt::skip]
51#[path = "./generated/dtype.rs"]
52#[doc = include_str!("../flatbuffers/vortex-dtype/dtype.fbs")]
57pub mod dtype;
59
60#[cfg(feature = "file")]
61#[allow(clippy::all)]
62#[allow(clippy::derive_partial_eq_without_eq)]
63#[allow(clippy::many_single_char_names)]
64#[allow(clippy::unwrap_used)]
65#[allow(clippy::absolute_paths)]
66#[allow(clippy::borrow_as_ptr)]
67#[allow(dead_code)]
68#[allow(mismatched_lifetime_syntaxes)]
69#[allow(non_snake_case)]
70#[allow(non_camel_case_types)]
71#[allow(unused_imports)]
72#[allow(unused_lifetimes)]
73#[allow(unused_qualifications)]
74#[allow(missing_docs)]
75#[rustfmt::skip]
76#[path = "./generated/footer.rs"]
77#[doc = include_str!("../flatbuffers/vortex-file/footer.fbs")]
82pub mod footer;
84
85#[cfg(feature = "layout")]
86#[allow(clippy::all)]
87#[allow(clippy::derive_partial_eq_without_eq)]
88#[allow(clippy::many_single_char_names)]
89#[allow(clippy::unwrap_used)]
90#[allow(clippy::absolute_paths)]
91#[allow(clippy::borrow_as_ptr)]
92#[allow(dead_code)]
93#[allow(mismatched_lifetime_syntaxes)]
94#[allow(non_snake_case)]
95#[allow(non_camel_case_types)]
96#[allow(unused_imports)]
97#[allow(unused_lifetimes)]
98#[allow(unused_qualifications)]
99#[allow(missing_docs)]
100#[rustfmt::skip]
101#[path = "./generated/layout.rs"]
102#[doc = include_str!("../flatbuffers/vortex-layout/layout.fbs")]
107pub mod layout;
109
110#[cfg(feature = "ipc")]
111#[allow(clippy::all)]
112#[allow(clippy::derive_partial_eq_without_eq)]
113#[allow(clippy::many_single_char_names)]
114#[allow(clippy::unwrap_used)]
115#[allow(clippy::absolute_paths)]
116#[allow(clippy::borrow_as_ptr)]
117#[allow(dead_code)]
118#[allow(mismatched_lifetime_syntaxes)]
119#[allow(non_snake_case)]
120#[allow(non_camel_case_types)]
121#[allow(unused_imports)]
122#[allow(unused_lifetimes)]
123#[allow(unused_qualifications)]
124#[allow(missing_docs)]
125#[rustfmt::skip]
126#[path = "./generated/message.rs"]
127#[doc = include_str!("../flatbuffers/vortex-serde/message.fbs")]
132pub mod message;
134
135use flatbuffers::FlatBufferBuilder;
136use flatbuffers::Follow;
137use flatbuffers::InvalidFlatbuffer;
138use flatbuffers::Verifiable;
139use flatbuffers::WIPOffset;
140use flatbuffers::root;
141use vortex_buffer::ByteBuffer;
142use vortex_buffer::ConstByteBuffer;
143use vortex_error::VortexResult;
144
145pub type FlatBuffer = ConstByteBuffer<8>;
150
151pub trait FlatBufferRoot {}
153
154pub trait ReadFlatBuffer: Sized {
156 type Source<'a>: Verifiable + Follow<'a>;
158 type Error: From<InvalidFlatbuffer>;
160
161 fn read_flatbuffer<'buf>(
163 fb: &<Self::Source<'buf> as Follow<'buf>>::Inner,
164 ) -> Result<Self, Self::Error>;
165
166 fn read_flatbuffer_bytes<'buf>(bytes: &'buf [u8]) -> Result<Self, Self::Error>
168 where
169 <Self as ReadFlatBuffer>::Source<'buf>: 'buf,
170 {
171 let fb = root::<Self::Source<'buf>>(bytes)?;
172 Self::read_flatbuffer(&fb)
173 }
174}
175
176pub trait WriteFlatBuffer {
178 type Target<'a>;
180
181 fn write_flatbuffer<'fb>(
183 &self,
184 fbb: &mut FlatBufferBuilder<'fb>,
185 ) -> VortexResult<WIPOffset<Self::Target<'fb>>>;
186}
187
188pub trait WriteFlatBufferExt: WriteFlatBuffer + FlatBufferRoot {
190 fn write_flatbuffer_bytes(&self) -> VortexResult<FlatBuffer>;
192}
193
194impl<F: WriteFlatBuffer + FlatBufferRoot> WriteFlatBufferExt for F {
195 fn write_flatbuffer_bytes(&self) -> VortexResult<FlatBuffer> {
196 let mut fbb = FlatBufferBuilder::new();
197 let root_offset = self.write_flatbuffer(&mut fbb)?;
198 fbb.finish_minimal(root_offset);
199 let (vec, start) = fbb.collapse();
200 let end = vec.len();
201 Ok(FlatBuffer::align_from(
202 ByteBuffer::from(vec).slice(start..end),
203 ))
204 }
205}