#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct EpochTag(pub [u8; 32]);
impl EpochTag {
pub const ZERO: Self = Self([0u8; 32]);
#[must_use]
pub fn from_bytes(bytes: [u8; 32]) -> Self {
Self(bytes)
}
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum LsnKind {
SqliteWalFrame {
salt1: u32,
salt2: u32,
frame_seq: u32,
commit_seq: u32,
},
EseLsn(u64),
NtfsLfs { record: u64 },
JournaldSeq(u64),
GitCommitSha(String),
ApfsTransactionId(u64),
BtrfsGeneration(u64),
VssShadowSetId([u8; 16]),
UsnRecord { usn: u64 },
Custom { name: &'static str, value: Vec<u8> },
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum PruneTrigger {
GcRun,
LogRotation,
SpacePressure,
Manual,
AutoCheckpoint,
Other(String),
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum MaterializationSafety {
ReadOnlySafe,
ReadOnlyRequiresCareful,
Destructive,
EphemeralOnce,
AutoPruned { trigger: PruneTrigger },
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum CohortTopology {
DiscreteSet,
LinearJournal { lsn_type: LsnKind },
SubJournalCommits,
Dag,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum TopologyKind {
DiscreteSet,
LinearJournal,
SubJournalCommits,
Dag,
}
impl CohortTopology {
#[must_use]
pub fn kind(&self) -> TopologyKind {
match self {
CohortTopology::DiscreteSet => TopologyKind::DiscreteSet,
CohortTopology::LinearJournal { .. } => TopologyKind::LinearJournal,
CohortTopology::SubJournalCommits => TopologyKind::SubJournalCommits,
CohortTopology::Dag => TopologyKind::Dag,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn epoch_tag_from_bytes_preserves_digest() {
let digest = [0xAB; 32];
assert_eq!(EpochTag::from_bytes(digest), EpochTag(digest));
assert_ne!(EpochTag::from_bytes(digest), EpochTag::ZERO);
}
#[test]
fn kind_maps_every_topology_to_its_payload_free_discriminant() {
assert_eq!(
CohortTopology::DiscreteSet.kind(),
TopologyKind::DiscreteSet
);
assert_eq!(
CohortTopology::LinearJournal {
lsn_type: LsnKind::EseLsn(1),
}
.kind(),
TopologyKind::LinearJournal
);
assert_eq!(
CohortTopology::SubJournalCommits.kind(),
TopologyKind::SubJournalCommits
);
assert_eq!(CohortTopology::Dag.kind(), TopologyKind::Dag);
}
}