use anyhow::Result;
use super::ledger::{Ledger, SnapshotMeta};
use super::source::SnapshotItemSource;
use super::types::{Snapshot, SnapshotTrigger, SourceDescriptor};
use super::DiffEngine;
impl<S: SnapshotItemSource> DiffEngine<S> {
pub fn take_snapshot(
&self,
source: &SourceDescriptor,
trigger: SnapshotTrigger,
) -> Result<Snapshot> {
let items: Vec<(String, String)> = self
.items
.items_for_source(&source.id)
.into_iter()
.map(|item| (item.item_id, item.content))
.collect();
let meta = SnapshotMeta {
source_id: source.id.clone(),
source_kind: source.kind.clone(),
label: source.label.clone(),
trigger,
};
let now_ms = self.now_ms();
let ledger = self.ledger()?;
ledger.commit_snapshot(&meta, &items, now_ms)
}
pub fn auto_snapshot_after_sync(&self, source: &SourceDescriptor) -> Result<Snapshot> {
self.take_snapshot(source, SnapshotTrigger::Auto)
}
pub fn list_snapshots(&self, source_id: Option<&str>, limit: u32) -> Result<Vec<Snapshot>> {
let ledger = self.ledger()?;
ledger.list_snapshots(source_id, limit)
}
pub(super) fn ledger(&self) -> Result<Ledger> {
Ledger::open(&self.workspace)
}
}