use election::Term;
use log::{LogIndex, LogPosition, LogPrefix, LogSuffix};
use node::NodeId;
#[derive(Debug, Clone)]
#[allow(missing_docs)]
pub enum Message {
RequestVoteCall(RequestVoteCall),
RequestVoteReply(RequestVoteReply),
AppendEntriesCall(AppendEntriesCall),
AppendEntriesReply(AppendEntriesReply),
InstallSnapshotCast(InstallSnapshotCast),
}
impl Message {
pub fn header(&self) -> &MessageHeader {
match self {
Message::RequestVoteCall(m) => &m.header,
Message::RequestVoteReply(m) => &m.header,
Message::AppendEntriesCall(m) => &m.header,
Message::AppendEntriesReply(m) => &m.header,
Message::InstallSnapshotCast(m) => &m.header,
}
}
pub(crate) fn set_destination(&mut self, dst: &NodeId) {
match self {
Message::RequestVoteCall(m) => {
m.header.destination = dst.clone();
}
Message::RequestVoteReply(m) => {
m.header.destination = dst.clone();
}
Message::AppendEntriesCall(m) => {
m.header.destination = dst.clone();
}
Message::AppendEntriesReply(m) => {
m.header.destination = dst.clone();
}
Message::InstallSnapshotCast(m) => {
m.header.destination = dst.clone();
}
}
}
}
impl From<RequestVoteCall> for Message {
fn from(f: RequestVoteCall) -> Self {
Message::RequestVoteCall(f)
}
}
impl From<RequestVoteReply> for Message {
fn from(f: RequestVoteReply) -> Self {
Message::RequestVoteReply(f)
}
}
impl From<AppendEntriesCall> for Message {
fn from(f: AppendEntriesCall) -> Self {
Message::AppendEntriesCall(f)
}
}
impl From<AppendEntriesReply> for Message {
fn from(f: AppendEntriesReply) -> Self {
Message::AppendEntriesReply(f)
}
}
impl From<InstallSnapshotCast> for Message {
fn from(f: InstallSnapshotCast) -> Self {
Message::InstallSnapshotCast(f)
}
}
#[derive(Debug, Clone)]
pub struct MessageHeader {
pub sender: NodeId,
pub destination: NodeId,
pub seq_no: SequenceNumber,
pub term: Term,
}
#[derive(Debug, Clone)]
pub struct RequestVoteCall {
pub header: MessageHeader,
pub log_tail: LogPosition,
}
#[derive(Debug, Clone)]
pub struct RequestVoteReply {
pub header: MessageHeader,
pub voted: bool,
}
#[derive(Debug, Clone)]
pub struct AppendEntriesCall {
pub header: MessageHeader,
pub committed_log_tail: LogIndex,
pub suffix: LogSuffix,
}
#[derive(Debug, Clone)]
pub struct AppendEntriesReply {
pub header: MessageHeader,
pub log_tail: LogPosition,
pub busy: bool,
}
#[derive(Debug, Clone)]
pub struct InstallSnapshotCast {
pub header: MessageHeader,
pub prefix: LogPrefix,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct SequenceNumber(u64);
impl SequenceNumber {
pub fn new(num: u64) -> Self {
SequenceNumber(num)
}
pub fn as_u64(self) -> u64 {
self.0
}
}