flatbuffers_util/
builder.rs

1use flatbuffers::FlatBufferBuilder;
2
3/// Wrapper of FlatBufferBuilder to provide OwnedFB creation.
4/// This is to make type safe when using builder_collapse.
5pub struct FBBuilder<T> {
6    builder: FlatBufferBuilder<'static>,
7    _phantom: std::marker::PhantomData<T>,
8}
9
10impl<T> Default for FBBuilder<T> {
11    fn default() -> Self {
12        Self {
13            builder: FlatBufferBuilder::new(),
14            _phantom: std::marker::PhantomData,
15        }
16    }
17}
18
19impl<T> FBBuilder<T> {
20    pub fn new() -> Self {
21        Self::default()
22    }
23
24    /// Get mutable reference to the builder.
25    pub fn get_mut(&mut self) -> &mut FlatBufferBuilder<'static> {
26        &mut self.builder
27    }
28
29    /// Finish the buffer and create OwnedFB.
30    /// User still need to check the the root is created from this builder, otherwise there
31    /// will be runtime error. (This is not marked unsafe, due to flatbuffers APIs are not
32    /// marked as unsafe.)
33    /// See issue: https://github.com/google/flatbuffers/issues/8698
34    pub fn finish_owned(mut self, root: flatbuffers::WIPOffset<T>) -> crate::OwnedFB<T> {
35        self.builder.finish_minimal(root);
36        let (buf, index) = self.builder.collapse();
37        unsafe { crate::OwnedFB::new_from_builder_collapse((buf, index)) }
38    }
39}