use serde::{Deserialize, Serialize};
use super::AuditSequence;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
#[serde(transparent)]
pub struct StreamVersion(u64);
impl StreamVersion {
pub const EMPTY: Self = Self(0);
#[must_use]
pub const fn new(value: u64) -> Self {
Self(value)
}
#[must_use]
pub fn from_sequence(sequence: AuditSequence) -> Self {
Self(sequence.value())
}
#[must_use]
pub fn value(self) -> u64 {
self.0
}
#[must_use]
pub fn next(self) -> Self {
Self(self.0.saturating_add(1))
}
#[must_use]
pub fn is_empty(self) -> bool {
self == Self::EMPTY
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn an_empty_stream_is_at_version_zero() {
assert_eq!(StreamVersion::EMPTY.value(), 0);
assert!(StreamVersion::EMPTY.is_empty());
assert!(!StreamVersion::EMPTY.next().is_empty());
}
#[test]
fn the_version_after_the_first_record_is_its_sequence() {
assert_eq!(
StreamVersion::from_sequence(AuditSequence::FIRST),
StreamVersion::EMPTY.next()
);
assert_eq!(
StreamVersion::from_sequence(AuditSequence::new(7).unwrap()).value(),
7
);
}
#[test]
fn versions_order_by_length() {
assert!(StreamVersion::EMPTY < StreamVersion::new(1));
assert!(StreamVersion::new(2) < StreamVersion::new(10));
}
}