use super::{invalid_data, FileMetadata};
use crate::graph::dir_graph::DirGraph;
use crate::graph::storage::mode::{live_storage_mode, StorageMode};
use std::io;
pub(super) fn recorded_storage_mode_tag(graph: &DirGraph) -> Option<String> {
match live_storage_mode(graph) {
StorageMode::Memory => None,
other => Some(other.as_str().to_string()),
}
}
impl FileMetadata {
fn recorded_storage_mode(&self) -> io::Result<StorageMode> {
match self.storage_mode.as_deref() {
None => Ok(StorageMode::Memory),
Some(tag) => StorageMode::parse(tag).map_err(|_| {
invalid_data(format!(
"graph metadata records storage mode '{tag}', which this build does not \
recognise (known modes: 'memory', 'mapped', 'disk'). The graph was \
probably written by a newer kglite — upgrade kglite, or rebuild the \
graph from its source."
))
}),
}
}
pub(super) fn portable_storage_mode(&self) -> io::Result<StorageMode> {
let mode = self.recorded_storage_mode()?;
if mode == StorageMode::Disk {
return Err(invalid_data(
"portable .kgl metadata records storage mode 'disk', but a disk-mode graph is \
a directory, never a portable file. Refusing to load it as one — open the \
disk graph's directory instead, or rebuild the file from its source.",
));
}
Ok(mode)
}
pub(super) fn validate_disk_storage_mode(&self) -> io::Result<()> {
if self.storage_mode.is_none() {
return Ok(());
}
match self.recorded_storage_mode()? {
StorageMode::Disk => Ok(()),
other => Err(invalid_data(format!(
"disk graph metadata records storage mode '{}', but this is a disk-graph \
directory, whose only valid mode is 'disk'. Refusing to load a graph whose \
metadata contradicts its own layout — restore metadata.json from a backup or \
rebuild the graph.",
other.as_str()
))),
}
}
}