use loro::LoroDoc;
use crate::error::{CrdtError, Result};
use super::core::CrdtState;
impl CrdtState {
pub fn export_snapshot(&self) -> Result<Vec<u8>> {
self.doc
.export(loro::ExportMode::Snapshot)
.map_err(|e| CrdtError::Loro(format!("snapshot export failed: {e}")))
}
pub fn import(&self, data: &[u8]) -> Result<()> {
self.doc
.import(data)
.map_err(|e| CrdtError::DeltaApplyFailed(e.to_string()))?;
Ok(())
}
pub fn compact_history(&mut self) -> Result<()> {
let frontiers = self.doc.oplog_frontiers();
let snapshot = self
.doc
.export(loro::ExportMode::shallow_snapshot(&frontiers))
.map_err(|e| CrdtError::Loro(format!("shallow snapshot export: {e}")))?;
let new_doc = LoroDoc::new();
new_doc
.set_peer_id(self.peer_id)
.map_err(|e| CrdtError::Loro(format!("failed to set peer_id on compacted doc: {e}")))?;
new_doc
.import(&snapshot)
.map_err(|e| CrdtError::Loro(format!("shallow snapshot import: {e}")))?;
self.doc = new_doc;
Ok(())
}
pub fn estimated_memory_bytes(&self) -> usize {
self.doc
.export(loro::ExportMode::Snapshot)
.map(|s| s.len())
.unwrap_or(0)
}
}