use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum ReplicationMessage {
WalEntry {
node_id: u32,
lsn: u64,
timestamp: u64,
data: Vec<u8>,
},
Heartbeat { node_id: u32, lsn: u64 },
RequestFrom { node_id: u32, lsn: u64 },
Acknowledge { node_id: u32, lsn: u64 },
VoteRequest {
node_id: u32,
term: u64,
last_lsn: u64,
},
VoteResponse {
node_id: u32,
voter_id: u32,
term: u64,
granted: bool,
},
Promotion { node_id: u32, term: u64 },
}
impl ReplicationMessage {
pub fn lsn(&self) -> u64 {
match self {
ReplicationMessage::WalEntry { lsn, .. } => *lsn,
ReplicationMessage::Heartbeat { lsn, .. } => *lsn,
ReplicationMessage::RequestFrom { lsn, .. } => *lsn,
ReplicationMessage::Acknowledge { lsn, .. } => *lsn,
ReplicationMessage::VoteRequest { last_lsn, .. } => *last_lsn,
_ => 0,
}
}
pub fn is_wal_entry(&self) -> bool {
matches!(self, ReplicationMessage::WalEntry { .. })
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_message_lsn() {
let msg = ReplicationMessage::WalEntry {
node_id: 1,
lsn: 42,
timestamp: 123456789,
data: vec![1, 2, 3],
};
assert_eq!(msg.lsn(), 42);
assert!(msg.is_wal_entry());
}
#[test]
fn test_heartbeat() {
let msg = ReplicationMessage::Heartbeat {
node_id: 1,
lsn: 100,
};
assert_eq!(msg.lsn(), 100);
assert!(!msg.is_wal_entry());
}
}