use loro::{LoroDoc, VersionVector};
use crate::error::{HydrateError, ReconcileError};
use crate::hydrate::Hydrate;
use crate::reconcile::{Reconcile, RootReconciler};
pub trait DocSync: Hydrate + Reconcile {
const ROOT_KEY: &'static str;
fn from_doc(doc: &LoroDoc) -> Result<Self, HydrateError> {
let map = doc.get_map(Self::ROOT_KEY);
Self::hydrate_map(&map)
}
fn to_doc(&self, doc: &LoroDoc) -> Result<(), ReconcileError> {
let map = doc.get_map(Self::ROOT_KEY);
let reconciler = RootReconciler::new(map);
self.reconcile(reconciler)
}
}
pub struct VersionGuard {
vv: VersionVector,
}
impl VersionGuard {
pub fn capture(doc: &LoroDoc) -> Self {
Self { vv: doc.oplog_vv() }
}
pub fn check(&self, doc: &LoroDoc) -> Result<(), ReconcileError> {
if doc.oplog_vv() != self.vv {
return Err(ReconcileError::StaleHeads);
}
Ok(())
}
}