use urna_format::layout::{SECTION_SPACE_EMBEDDINGS_BASE, SECTION_SPACE_TABLE};
use urna_format::reader::UrnaView;
use urna_format::sections::{SpaceEntry, decode_space_table};
use crate::error::RuntimeError;
use urna_format::reader::validate_slab_values;
#[derive(Clone, Debug)]
pub(crate) struct OpenSpace {
pub entry: SpaceEntry,
pub offset: usize,
pub size: usize,
}
pub(crate) fn open_space_sections(view: &UrnaView) -> Result<Option<Vec<OpenSpace>>, RuntimeError> {
let multimodal = view
.manifest
.capabilities_ext
.as_ref()
.and_then(|e| e.supports_multimodal)
.unwrap_or(false);
if !multimodal || view.entry(SECTION_SPACE_TABLE).is_err() {
return Ok(None);
}
let entries = decode_space_table(&view.decoded_section(SECTION_SPACE_TABLE)?)?;
let mut spaces = Vec::with_capacity(entries.len());
for entry in entries {
let band_id = SECTION_SPACE_EMBEDDINGS_BASE + entry.space_index as u32;
let band = view.entry(band_id)?;
validate_slab_values(
band.encoding,
view.get_section_data(band_id)?,
entry.n_vectors as usize,
entry.dim as usize,
)?;
spaces.push(OpenSpace {
entry,
offset: band.offset as usize,
size: band.size as usize,
});
}
Ok(Some(spaces))
}