use crate::{messages::Nonce, NetworkAddress};
use libp2p::kad::U256;
use serde::{Deserialize, Serialize};
#[derive(Eq, PartialEq, PartialOrd, Clone, Serialize, Deserialize, 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),
}
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, .. } => key.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:?})")
}
}
}
}