use crate::{NetworkAddress, messages::Nonce};
use libp2p::kad::U256;
use serde::{Deserialize, Serialize};
#[derive(Eq, PartialEq, PartialOrd, Clone, Serialize, Deserialize, custom_debug::Debug)]
pub enum Query {
GetStoreQuote {
key: NetworkAddress,
data_type: u32,
data_size: usize,
nonce: Option<Nonce>,
difficulty: usize,
},
GetReplicatedRecord {
requester: NetworkAddress,
key: NetworkAddress,
},
GetChunkExistenceProof {
key: NetworkAddress,
nonce: Nonce,
difficulty: usize,
},
CheckNodeInProblem(NetworkAddress),
GetClosestPeers {
key: NetworkAddress,
num_of_peers: Option<usize>,
range: Option<[u8; 32]>,
sign_result: bool,
},
GetVersion(NetworkAddress),
PutRecord {
holder: NetworkAddress,
#[debug(skip)]
serialized_record: Vec<u8>,
address: NetworkAddress,
},
GetMerkleCandidateQuote {
key: NetworkAddress,
data_type: u32,
data_size: usize,
merkle_payment_timestamp: u64,
},
#[cfg(feature = "developer")]
DevGetClosestPeersFromNetwork {
key: NetworkAddress,
num_of_peers: Option<usize>,
},
}
impl Query {
pub fn dst(&self) -> NetworkAddress {
match self {
Query::CheckNodeInProblem(address) | Query::GetVersion(address) => address.clone(),
Query::GetStoreQuote { key, .. }
| Query::GetReplicatedRecord { key, .. }
| Query::GetChunkExistenceProof { key, .. }
| Query::GetClosestPeers { key, .. }
| Query::GetMerkleCandidateQuote { key, .. } => key.clone(),
#[cfg(feature = "developer")]
Query::DevGetClosestPeersFromNetwork { key, .. } => key.clone(),
Query::PutRecord { holder, .. } => holder.clone(),
}
}
}
impl std::fmt::Display for Query {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Query::GetStoreQuote {
key,
data_type,
data_size,
nonce,
difficulty,
} => {
write!(
f,
"Query::GetStoreQuote({key:?} {data_type} {data_size} {nonce:?} {difficulty})"
)
}
Query::GetReplicatedRecord { key, requester } => {
write!(f, "Query::GetReplicatedRecord({requester:?} {key:?})")
}
Query::GetChunkExistenceProof {
key,
nonce,
difficulty,
} => {
write!(
f,
"Query::GetChunkExistenceProof({key:?} {nonce:?} {difficulty})"
)
}
Query::CheckNodeInProblem(address) => {
write!(f, "Query::CheckNodeInProblem({address:?})")
}
Query::GetClosestPeers {
key,
num_of_peers,
range,
sign_result,
} => {
let distance = range.as_ref().map(|value| U256::from_big_endian(value));
write!(
f,
"Query::GetClosestPeers({key:?} {num_of_peers:?} {distance:?} {sign_result})"
)
}
Query::GetVersion(address) => {
write!(f, "Query::GetVersion({address:?})")
}
Query::PutRecord {
holder,
address,
serialized_record,
} => {
write!(
f,
"Cmd::PutRecord(To {:?}, with record {address:?} has {} data_size)",
holder.as_peer_id(),
serialized_record.len()
)
}
Query::GetMerkleCandidateQuote {
key,
data_type,
data_size,
merkle_payment_timestamp,
} => {
write!(
f,
"Query::GetMerkleCandidateQuote({key:?} {data_type} {data_size} timestamp={merkle_payment_timestamp})"
)
}
#[cfg(feature = "developer")]
Query::DevGetClosestPeersFromNetwork { key, num_of_peers } => {
write!(
f,
"Query::DevGetClosestPeersFromNetwork({key:?} {num_of_peers:?})"
)
}
}
}
}