use std::sync::Arc;
use flatbuffers::FlatBufferBuilder;
use flatbuffers::WIPOffset;
use vortex_error::VortexResult;
use vortex_flatbuffers::FlatBufferRoot;
use vortex_flatbuffers::WriteFlatBuffer;
use vortex_flatbuffers::footer as fb;
use vortex_session::registry::ReadContext;
use crate::footer::segment::SegmentSpec;
pub(crate) struct FooterFlatBufferWriter {
pub(crate) ctx: ReadContext,
pub(crate) layout_ctx: ReadContext,
pub(crate) segment_specs: Arc<[SegmentSpec]>,
}
impl FlatBufferRoot for FooterFlatBufferWriter {}
impl WriteFlatBuffer for FooterFlatBufferWriter {
type Target<'a> = fb::Footer<'a>;
fn write_flatbuffer<'fb>(
&self,
fbb: &mut FlatBufferBuilder<'fb>,
) -> VortexResult<WIPOffset<Self::Target<'fb>>> {
let segment_specs =
fbb.create_vector_from_iter(self.segment_specs.iter().map(fb::SegmentSpec::from));
let array_specs = self
.ctx
.ids()
.iter()
.map(|e| {
let id = fbb.create_string(e.as_ref());
fb::ArraySpec::create(fbb, &fb::ArraySpecArgs { id: Some(id) })
})
.collect::<Vec<_>>();
let array_specs = fbb.create_vector(array_specs.as_slice());
let layout_specs = self
.layout_ctx
.ids()
.iter()
.map(|e| {
let id = fbb.create_string(e.as_ref());
fb::LayoutSpec::create(fbb, &fb::LayoutSpecArgs { id: Some(id) })
})
.collect::<Vec<_>>();
let layout_specs = fbb.create_vector(layout_specs.as_slice());
Ok(fb::Footer::create(
fbb,
&fb::FooterArgs {
segment_specs: Some(segment_specs),
array_specs: Some(array_specs),
layout_specs: Some(layout_specs),
compression_specs: None,
encryption_specs: None,
},
))
}
}