use crate::TimeToLive;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ProtocolMessage<T> {
Join(JoinMessage<T>),
ForwardJoin(ForwardJoinMessage<T>),
Neighbor(NeighborMessage<T>),
Shuffle(ShuffleMessage<T>),
ShuffleReply(ShuffleReplyMessage<T>),
Disconnect(DisconnectMessage<T>),
}
impl<T> ProtocolMessage<T> {
pub fn sender(&self) -> &T {
match self {
ProtocolMessage::Join(m) => &m.sender,
ProtocolMessage::ForwardJoin(m) => &m.sender,
ProtocolMessage::Neighbor(m) => &m.sender,
ProtocolMessage::Shuffle(m) => &m.sender,
ProtocolMessage::ShuffleReply(m) => &m.sender,
ProtocolMessage::Disconnect(m) => &m.sender,
}
}
}
impl<T: Clone> ProtocolMessage<T> {
pub(crate) fn join(sender: &T) -> Self {
ProtocolMessage::Join(JoinMessage {
sender: sender.clone(),
})
}
pub(crate) fn forward_join(sender: &T, new_node: T, ttl: TimeToLive) -> Self {
ProtocolMessage::ForwardJoin(ForwardJoinMessage {
sender: sender.clone(),
new_node,
ttl,
})
}
pub(crate) fn neighbor(sender: &T, high_priority: bool) -> Self {
ProtocolMessage::Neighbor(NeighborMessage {
sender: sender.clone(),
high_priority,
})
}
pub(crate) fn shuffle(sender: &T, origin: T, nodes: Vec<T>, ttl: TimeToLive) -> Self {
ProtocolMessage::Shuffle(ShuffleMessage {
sender: sender.clone(),
origin,
nodes,
ttl,
})
}
pub(crate) fn shuffle_reply(sender: &T, nodes: Vec<T>) -> Self {
ProtocolMessage::ShuffleReply(ShuffleReplyMessage {
sender: sender.clone(),
nodes,
})
}
pub(crate) fn disconnect(sender: &T, alive: bool) -> Self {
ProtocolMessage::Disconnect(DisconnectMessage {
sender: sender.clone(),
alive,
})
}
}
impl<T> From<JoinMessage<T>> for ProtocolMessage<T> {
fn from(f: JoinMessage<T>) -> Self {
ProtocolMessage::Join(f)
}
}
impl<T> From<ForwardJoinMessage<T>> for ProtocolMessage<T> {
fn from(f: ForwardJoinMessage<T>) -> Self {
ProtocolMessage::ForwardJoin(f)
}
}
impl<T> From<NeighborMessage<T>> for ProtocolMessage<T> {
fn from(f: NeighborMessage<T>) -> Self {
ProtocolMessage::Neighbor(f)
}
}
impl<T> From<ShuffleMessage<T>> for ProtocolMessage<T> {
fn from(f: ShuffleMessage<T>) -> Self {
ProtocolMessage::Shuffle(f)
}
}
impl<T> From<ShuffleReplyMessage<T>> for ProtocolMessage<T> {
fn from(f: ShuffleReplyMessage<T>) -> Self {
ProtocolMessage::ShuffleReply(f)
}
}
impl<T> From<DisconnectMessage<T>> for ProtocolMessage<T> {
fn from(f: DisconnectMessage<T>) -> Self {
ProtocolMessage::Disconnect(f)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct JoinMessage<T> {
pub sender: T,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ForwardJoinMessage<T> {
pub sender: T,
pub new_node: T,
pub ttl: TimeToLive,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct NeighborMessage<T> {
pub sender: T,
pub high_priority: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ShuffleMessage<T> {
pub sender: T,
pub origin: T,
pub nodes: Vec<T>,
pub ttl: TimeToLive,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ShuffleReplyMessage<T> {
pub sender: T,
pub nodes: Vec<T>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DisconnectMessage<T> {
pub sender: T,
pub alive: bool,
}