use std::{
collections::HashMap,
fmt::{self, Display, Formatter},
};
use crate::{
components::small_network::GossipedAddress,
types::{
json_compatibility::ExecutionResult, Block, BlockHash, BlockHeader, Deploy, DeployHash,
DeployHeader, FinalizedBlock, Item, ProtoBlock,
},
utils::Source,
};
#[derive(Debug)]
#[must_use]
pub enum NetworkAnnouncement<I, P> {
MessageReceived {
sender: I,
payload: P,
},
GossipOurAddress(GossipedAddress),
NewPeer(I),
}
impl<I, P> Display for NetworkAnnouncement<I, P>
where
I: Display,
P: Display,
{
fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
match self {
NetworkAnnouncement::MessageReceived { sender, payload } => {
write!(formatter, "received from {}: {}", sender, payload)
}
NetworkAnnouncement::GossipOurAddress(_) => write!(formatter, "gossip our address"),
NetworkAnnouncement::NewPeer(id) => {
write!(formatter, "new peer connection established to {}", id)
}
}
}
}
#[derive(Debug)]
#[must_use]
pub enum ApiServerAnnouncement {
DeployReceived {
deploy: Box<Deploy>,
},
}
impl Display for ApiServerAnnouncement {
fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
match self {
ApiServerAnnouncement::DeployReceived { deploy } => {
write!(formatter, "api server received {}", deploy.id())
}
}
}
}
#[derive(Debug)]
pub enum DeployAcceptorAnnouncement<I> {
AcceptedNewDeploy {
deploy: Box<Deploy>,
source: Source<I>,
},
InvalidDeploy {
deploy: Box<Deploy>,
source: Source<I>,
},
}
impl<I: Display> Display for DeployAcceptorAnnouncement<I> {
fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
match self {
DeployAcceptorAnnouncement::AcceptedNewDeploy { deploy, source } => write!(
formatter,
"accepted new deploy {} from {}",
deploy.id(),
source
),
DeployAcceptorAnnouncement::InvalidDeploy { deploy, source } => {
write!(formatter, "invalid deploy {} from {}", deploy.id(), source)
}
}
}
}
#[derive(Debug)]
pub enum ConsensusAnnouncement {
Proposed(ProtoBlock),
Finalized(Box<FinalizedBlock>),
Orphaned(ProtoBlock),
Handled(Box<BlockHeader>),
}
impl Display for ConsensusAnnouncement {
fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
match self {
ConsensusAnnouncement::Proposed(block) => {
write!(formatter, "proposed proto block {}", block)
}
ConsensusAnnouncement::Finalized(block) => {
write!(formatter, "finalized proto block {}", block)
}
ConsensusAnnouncement::Orphaned(block) => {
write!(formatter, "orphaned proto block {}", block)
}
ConsensusAnnouncement::Handled(block_header) => write!(
formatter,
"Linear chain block has been handled by consensus, height={}, hash={}",
block_header.height(),
block_header.hash()
),
}
}
}
#[derive(Debug)]
pub enum BlockExecutorAnnouncement {
LinearChainBlock {
block: Block,
execution_results: HashMap<DeployHash, (DeployHeader, ExecutionResult)>,
},
}
impl Display for BlockExecutorAnnouncement {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
BlockExecutorAnnouncement::LinearChainBlock { block, .. } => {
write!(f, "created linear chain block {}", block.hash())
}
}
}
}
#[derive(Debug)]
pub enum GossiperAnnouncement<T: Item> {
NewCompleteItem(T::Id),
}
impl<T: Item> Display for GossiperAnnouncement<T> {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
GossiperAnnouncement::NewCompleteItem(item) => write!(f, "new complete item {}", item),
}
}
}
#[derive(Debug)]
pub enum LinearChainAnnouncement {
BlockAdded {
block_hash: BlockHash,
block_header: Box<BlockHeader>,
},
}
impl Display for LinearChainAnnouncement {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
LinearChainAnnouncement::BlockAdded { block_hash, .. } => {
write!(f, "block added {}", block_hash)
}
}
}
}