use std::{
collections::HashMap,
fmt::{self, Display, Formatter},
};
use itertools::Itertools;
use serde::Serialize;
use casper_types::{EraId, ExecutionResult, PublicKey};
use crate::{
components::{
chainspec_loader::NextUpgrade, deploy_acceptor::Error, small_network::GossipedAddress,
},
effect::Responder,
types::{
Block, Deploy, DeployHash, DeployHeader, FinalitySignature, FinalizedBlock, Item, Timestamp,
},
utils::Source,
};
#[derive(Debug, Serialize)]
#[must_use]
pub(crate) enum ControlAnnouncement {
FatalError {
file: &'static str,
line: u32,
msg: String,
},
}
impl Display for ControlAnnouncement {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
ControlAnnouncement::FatalError { file, line, msg } => {
write!(f, "fatal error [{}:{}]: {}", file, line, msg)
}
}
}
}
#[derive(Debug, Serialize)]
#[must_use]
pub(crate) 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, Serialize)]
#[must_use]
pub(crate) enum RpcServerAnnouncement {
DeployReceived {
deploy: Box<Deploy>,
responder: Option<Responder<Result<(), Error>>>,
},
}
impl Display for RpcServerAnnouncement {
fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
match self {
RpcServerAnnouncement::DeployReceived { deploy, .. } => {
write!(formatter, "api server received {}", deploy.id())
}
}
}
}
#[derive(Debug, Serialize)]
pub(crate) 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, Serialize)]
pub(crate) enum BlockProposerAnnouncement {
DeploysExpired(Vec<DeployHash>),
}
impl Display for BlockProposerAnnouncement {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
BlockProposerAnnouncement::DeploysExpired(hashes) => {
write!(f, "pruned hashes: {}", hashes.iter().join(", "))
}
}
}
}
#[derive(Debug)]
pub(crate) enum ConsensusAnnouncement {
Finalized(Box<FinalizedBlock>),
CreatedFinalitySignature(Box<FinalitySignature>),
Fault {
era_id: EraId,
public_key: Box<PublicKey>,
timestamp: Timestamp,
},
}
impl Display for ConsensusAnnouncement {
fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
match self {
ConsensusAnnouncement::Finalized(block) => {
write!(formatter, "finalized block payload {}", block)
}
ConsensusAnnouncement::CreatedFinalitySignature(fs) => {
write!(formatter, "signed an executed block: {}", fs)
}
ConsensusAnnouncement::Fault {
era_id,
public_key,
timestamp,
} => write!(
formatter,
"Validator fault with public key: {} has been identified at time: {} in era: {}",
public_key, timestamp, era_id,
),
}
}
}
#[derive(Debug, Serialize)]
pub(crate) enum BlocklistAnnouncement<I> {
OffenseCommitted(Box<I>),
}
impl<I> Display for BlocklistAnnouncement<I>
where
I: Display,
{
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
BlocklistAnnouncement::OffenseCommitted(peer) => {
write!(f, "peer {} committed offense", peer)
}
}
}
}
#[derive(Debug)]
pub(crate) struct LinearChainBlock {
pub(crate) block: Block,
pub(crate) execution_results: HashMap<DeployHash, (DeployHeader, ExecutionResult)>,
}
#[derive(Debug)]
pub(crate) enum GossiperAnnouncement<T: Item> {
NewCompleteItem(T::Id),
FinishedGossiping(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),
GossiperAnnouncement::FinishedGossiping(item_id) => {
write!(f, "finished gossiping {}", item_id)
}
}
}
}
#[derive(Debug)]
pub(crate) enum LinearChainAnnouncement {
BlockAdded(Box<Block>),
NewFinalitySignature(Box<FinalitySignature>),
}
impl Display for LinearChainAnnouncement {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
LinearChainAnnouncement::BlockAdded(block) => {
write!(f, "block added {}", block.hash())
}
LinearChainAnnouncement::NewFinalitySignature(fs) => {
write!(f, "new finality signature {}", fs.block_hash)
}
}
}
}
#[derive(Debug, Serialize)]
pub(crate) enum ChainspecLoaderAnnouncement {
UpgradeActivationPointRead(NextUpgrade),
}
impl Display for ChainspecLoaderAnnouncement {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
ChainspecLoaderAnnouncement::UpgradeActivationPointRead(next_upgrade) => {
write!(f, "read {}", next_upgrade)
}
}
}
}