#![allow(clippy::mutable_key_type)]
use crate::storage::DataTypes;
use crate::{storage::ValidationType, NetworkAddress};
use ant_evm::ProofOfPayment;
use serde::{Deserialize, Serialize};
#[derive(Eq, PartialEq, Clone, Serialize, Deserialize)]
pub enum Cmd {
Replicate {
holder: NetworkAddress,
keys: Vec<(NetworkAddress, ValidationType)>,
},
FreshReplicate {
holder: NetworkAddress,
keys: Vec<(
NetworkAddress,
DataTypes,
ValidationType,
Option<ProofOfPayment>,
)>,
},
PeerConsideredAsBad {
detected_by: NetworkAddress,
bad_peer: NetworkAddress,
bad_behaviour: String,
},
}
impl std::fmt::Debug for Cmd {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Cmd::Replicate { holder, keys } => {
let first_ten_keys: Vec<_> = keys.iter().take(10).collect();
f.debug_struct("Cmd::Replicate")
.field("holder", holder)
.field("keys_len", &keys.len())
.field("first_ten_keys", &first_ten_keys)
.finish()
}
Cmd::FreshReplicate { holder, keys } => {
let first_ten_keys: Vec<_> = keys.iter().take(10).collect();
f.debug_struct("Cmd::FreshReplicate")
.field("holder", holder)
.field("keys_len", &keys.len())
.field("first_ten_keys", &first_ten_keys)
.finish()
}
Cmd::PeerConsideredAsBad {
detected_by,
bad_peer,
bad_behaviour,
} => f
.debug_struct("Cmd::PeerConsideredAsBad")
.field("detected_by", detected_by)
.field("bad_peer", bad_peer)
.field("bad_behaviour", bad_behaviour)
.finish(),
}
}
}
impl Cmd {
pub fn dst(&self) -> NetworkAddress {
match self {
Cmd::Replicate { holder, .. } => holder.clone(),
Cmd::FreshReplicate { holder, .. } => holder.clone(),
Cmd::PeerConsideredAsBad { bad_peer, .. } => bad_peer.clone(),
}
}
}
impl std::fmt::Display for Cmd {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Cmd::Replicate { holder, keys } => {
write!(
f,
"Cmd::Replicate({:?} has {} keys)",
holder.as_peer_id(),
keys.len()
)
}
Cmd::FreshReplicate { holder, keys } => {
write!(
f,
"Cmd::Replicate({:?} has {} keys)",
holder.as_peer_id(),
keys.len()
)
}
Cmd::PeerConsideredAsBad {
detected_by,
bad_peer,
bad_behaviour,
} => {
write!(
f,
"Cmd::PeerConsideredAsBad({detected_by:?} consider peer {bad_peer:?} as bad, due to {bad_behaviour:?})")
}
}
}
}