use super::*;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct GraphRoots {
store: StoreInstanceId,
generation: GraphGeneration,
references: [Option<PhysicalRef>; 8],
}
const KINDS: [TreeKind; 8] = [
TreeKind::Nodes,
TreeKind::Relationships,
TreeKind::KeyFences,
TreeKind::Labels,
TreeKind::RelationshipTypes,
TreeKind::OutRanges,
TreeKind::InRanges,
TreeKind::ObjectInventory,
];
impl GraphRoots {
pub fn from_references(
store: StoreInstanceId,
generation: GraphGeneration,
references: [Option<PhysicalRef>; 8],
) -> Result<Self, TreeError> {
for (kind, reference) in KINDS.into_iter().zip(references) {
DirectoryRoot::from_reference(store, kind, generation, reference)?;
}
Ok(Self {
store,
generation,
references,
})
}
pub const fn store(self) -> StoreInstanceId {
self.store
}
pub const fn generation(self) -> GraphGeneration {
self.generation
}
pub const fn references(self) -> [Option<PhysicalRef>; 8] {
self.references
}
pub fn directory(self, kind: TreeKind) -> Result<DirectoryRoot, TreeError> {
let reference = self
.references
.get(kind as usize - 1)
.copied()
.ok_or(TreeError::Invalid("graph root position"))?;
DirectoryRoot::from_reference(self.store, kind, self.generation, reference)
}
pub fn for_generation(self, generation: GraphGeneration) -> Result<Self, TreeError> {
if generation < self.generation {
return Err(TreeError::Invalid("root bundle generation regressed"));
}
Ok(Self { generation, ..self })
}
pub fn replace(&mut self, root: DirectoryRoot) -> Result<(), TreeError> {
if root.store != self.store || root.generation != self.generation {
return Err(TreeError::Invalid(
"mixed store or generation in graph roots",
));
}
*self
.references
.get_mut(root.kind as usize - 1)
.ok_or(TreeError::Invalid("root position"))? = root.reference;
Ok(())
}
}