use noxu_util::vlsn::Vlsn;
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub enum ReplicationContext {
#[default]
NoReplicate,
Master,
Client {
vlsn: Vlsn,
},
}
impl ReplicationContext {
pub const fn no_replicate() -> Self {
ReplicationContext::NoReplicate
}
pub const fn master() -> Self {
ReplicationContext::Master
}
pub fn client(vlsn: Vlsn) -> Self {
ReplicationContext::Client { vlsn }
}
pub fn in_replication_stream(&self) -> bool {
matches!(
self,
ReplicationContext::Master | ReplicationContext::Client { .. }
)
}
pub fn must_generate_vlsn(&self) -> bool {
matches!(self, ReplicationContext::Master)
}
pub fn client_vlsn(&self) -> Option<Vlsn> {
match self {
ReplicationContext::Client { vlsn } => Some(*vlsn),
_ => None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_no_replicate() {
let ctx = ReplicationContext::no_replicate();
assert!(!ctx.in_replication_stream());
assert!(!ctx.must_generate_vlsn());
assert_eq!(ctx.client_vlsn(), None);
}
#[test]
fn test_master() {
let ctx = ReplicationContext::master();
assert!(ctx.in_replication_stream());
assert!(ctx.must_generate_vlsn());
assert_eq!(ctx.client_vlsn(), None);
}
#[test]
fn test_client() {
let vlsn = Vlsn::new(42);
let ctx = ReplicationContext::client(vlsn);
assert!(ctx.in_replication_stream());
assert!(!ctx.must_generate_vlsn());
assert_eq!(ctx.client_vlsn(), Some(vlsn));
}
#[test]
fn test_default() {
let ctx = ReplicationContext::default();
assert_eq!(ctx, ReplicationContext::NoReplicate);
}
}