use crate::{error::Result, NetworkAddress};
use super::ChunkProof;
use ant_evm::PaymentQuote;
use bytes::Bytes;
use core::fmt;
use libp2p::Multiaddr;
use serde::{Deserialize, Serialize};
use std::fmt::Debug;
#[derive(Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum QueryResponse {
GetStoreQuote {
quote: Result<PaymentQuote>,
peer_address: NetworkAddress,
storage_proofs: Vec<(NetworkAddress, Result<ChunkProof>)>,
},
CheckNodeInProblem {
reporter_address: NetworkAddress,
target_address: NetworkAddress,
is_in_trouble: bool,
},
GetReplicatedRecord(Result<(NetworkAddress, Bytes)>),
GetChunkExistenceProof(Vec<(NetworkAddress, Result<ChunkProof>)>),
GetClosestPeers {
target: NetworkAddress,
peers: Vec<(NetworkAddress, Vec<Multiaddr>)>,
signature: Option<Vec<u8>>,
},
GetVersion {
peer: NetworkAddress,
version: String,
},
}
impl Debug for QueryResponse {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
QueryResponse::GetStoreQuote {
quote,
peer_address,
storage_proofs,
} => {
let payment_address = quote.as_ref().map(|q| q.rewards_address).ok();
write!(
f,
"GetStoreQuote(quote: {quote:?}, from {peer_address:?} w/ payment_address: {payment_address:?}, and {} storage proofs)",
storage_proofs.len()
)
}
QueryResponse::CheckNodeInProblem {
reporter_address,
target_address,
is_in_trouble,
} => {
write!(
f,
"CheckNodeInProblem({reporter_address:?} report target {target_address:?} as {is_in_trouble:?} in problem"
)
}
QueryResponse::GetReplicatedRecord(result) => match result {
Ok((holder, data)) => {
write!(
f,
"GetReplicatedRecord(Ok((holder: {:?}, datalen: {:?})))",
holder,
data.len()
)
}
Err(err) => {
write!(f, "GetReplicatedRecord(Err({err:?}))")
}
},
QueryResponse::GetChunkExistenceProof(proofs) => {
let addresses: Vec<_> = proofs.iter().map(|(addr, _)| addr.clone()).collect();
write!(f, "GetChunkExistenceProof(checked chunks: {addresses:?})")
}
QueryResponse::GetClosestPeers { target, peers, .. } => {
let addresses: Vec<_> = peers.iter().map(|(addr, _)| addr.clone()).collect();
write!(
f,
"GetClosestPeers target {target:?} close peers {addresses:?}"
)
}
QueryResponse::GetVersion { peer, version } => {
write!(f, "GetVersion peer {peer:?} has version of {version:?}")
}
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum CmdResponse {
Replicate(Result<()>),
FreshReplicate(Result<()>),
PeerConsideredAsBad(Result<()>),
}