use std::{
collections::HashSet,
fmt::{self, Display, Formatter},
};
use serde::Serialize;
use super::{Item, Message};
use crate::{
types::NodeId,
utils::{DisplayIter, Source},
};
#[derive(Debug, Serialize)]
pub enum Event<T: Item> {
ItemReceived {
item_id: T::Id,
source: Source<NodeId>,
},
GossipedTo {
item_id: T::Id,
requested_count: usize,
peers: HashSet<NodeId>,
},
CheckGossipTimeout { item_id: T::Id, peer: NodeId },
CheckGetFromPeerTimeout { item_id: T::Id, peer: NodeId },
MessageReceived { sender: NodeId, message: Message<T> },
GetFromHolderResult {
item_id: T::Id,
requester: NodeId,
result: Box<Result<T, String>>,
},
}
impl<T: Item> Display for Event<T> {
fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
match self {
Event::ItemReceived { item_id, source } => {
write!(formatter, "new item {} received from {}", item_id, source)
}
Event::GossipedTo { item_id, peers, .. } => write!(
formatter,
"gossiped {} to {}",
item_id,
DisplayIter::new(peers)
),
Event::CheckGossipTimeout { item_id, peer } => write!(
formatter,
"check gossip timeout for {} with {}",
item_id, peer
),
Event::CheckGetFromPeerTimeout { item_id, peer } => write!(
formatter,
"check get from peer timeout for {} with {}",
item_id, peer
),
Event::MessageReceived { sender, message } => {
write!(formatter, "{} received from {}", message, sender)
}
Event::GetFromHolderResult {
item_id, result, ..
} => {
if result.is_ok() {
write!(formatter, "got {} from holder component", item_id)
} else {
write!(formatter, "failed to get {} from holder component", item_id)
}
}
}
}
}