use super::types::{CrdtUpdate, UpdateOrigin};
use crate::error::DiaryxError;
pub type StorageResult<T> = Result<T, DiaryxError>;
pub trait CrdtStorage: Send + Sync {
fn load_doc(&self, name: &str) -> StorageResult<Option<Vec<u8>>>;
fn save_doc(&self, name: &str, state: &[u8]) -> StorageResult<()>;
fn delete_doc(&self, name: &str) -> StorageResult<()>;
fn list_docs(&self) -> StorageResult<Vec<String>>;
fn append_update(&self, name: &str, update: &[u8], origin: UpdateOrigin) -> StorageResult<i64> {
self.append_update_with_device(name, update, origin, None, None)
}
fn append_update_with_device(
&self,
name: &str,
update: &[u8],
origin: UpdateOrigin,
device_id: Option<&str>,
device_name: Option<&str>,
) -> StorageResult<i64>;
fn batch_append_updates(
&self,
updates: &[(&str, &[u8], UpdateOrigin)],
) -> StorageResult<Vec<i64>> {
let mut ids = Vec::with_capacity(updates.len());
for (name, update, origin) in updates {
ids.push(self.append_update(name, update, *origin)?);
}
Ok(ids)
}
fn get_updates_since(&self, name: &str, since_id: i64) -> StorageResult<Vec<CrdtUpdate>>;
fn get_all_updates(&self, name: &str) -> StorageResult<Vec<CrdtUpdate>>;
fn get_state_at(&self, name: &str, update_id: i64) -> StorageResult<Option<Vec<u8>>>;
fn compact(&self, name: &str, keep_updates: usize) -> StorageResult<()>;
fn get_latest_update_id(&self, name: &str) -> StorageResult<i64>;
}
#[cfg(test)]
mod tests {
}