use crate::LineageError;
use dpm_engine::Operation;
use dpm_model::{LineageId, WorkspaceId};
use serde::{Deserialize, Serialize};
use std::path::Path;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RecordedOperation {
#[serde(flatten)]
pub operation: Operation,
pub workspace_id: WorkspaceId,
pub lineage_id: LineageId,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HistoryEntry {
pub sequence: u64,
pub operation: RecordedOperation,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HistoryPage {
pub revision: u64,
pub lineage_id: Option<LineageId>,
pub entries: Vec<HistoryEntry>,
pub next_after_sequence: u64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct StoreLineage {
pub lineage_id: LineageId,
pub archived: bool,
}
impl StoreLineage {
pub fn check_writable(
&self,
expected: Option<LineageId>,
path: &Path,
) -> Result<(), LineageError> {
if self.archived {
return Err(LineageError::Archived {
path: path.to_path_buf(),
});
}
match expected {
Some(expected) if expected != self.lineage_id => Err(LineageError::Mismatch {
expected,
actual: self.lineage_id,
}),
_ => Ok(()),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct StoreRevision {
pub revision: u64,
pub lineage: StoreLineage,
pub history_head: u64,
}