use std::fmt;
use std::hash::Hash;
use crate::types::Version;
pub trait Id: Copy + Eq + Ord + Hash + fmt::Display + fmt::Debug + Send + Sync + 'static {
fn as_u64(self) -> u64;
fn from_u64(value: u64) -> Self;
}
pub trait Versioned {
fn version(&self) -> Version;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ChangeKind {
Insert,
Update,
Delete,
}
#[cfg(test)]
mod tests {
use super::*;
use crate::ids::*;
#[test]
fn all_ids_implement_id_trait() {
fn assert_id<I: Id>(id: I, raw: u64) {
assert_eq!(id.as_u64(), raw);
assert_eq!(I::from_u64(raw), id);
}
assert_id(TableId::from_u64(1), 1);
assert_id(RowId::from_u64(2), 2);
assert_id(ColumnId::from_u64(3), 3);
assert_id(PartitionId::from_u64(4), 4);
assert_id(TransactionId::from_u64(5), 5);
assert_id(ReducerId::from_u64(6), 6);
assert_id(SubscriptionId::from_u64(7), 7);
}
#[test]
fn change_kind_is_comparable() {
assert_eq!(ChangeKind::Insert, ChangeKind::Insert);
assert_ne!(ChangeKind::Insert, ChangeKind::Update);
assert_ne!(ChangeKind::Update, ChangeKind::Delete);
}
}