use crate::peer::PeerUtils;
use ed25519_dalek::Keypair;
use sn_data_types::PublicKey;
use sn_messaging::node::Peer;
use std::{
fmt::{self, Debug, Display, Formatter},
net::SocketAddr,
sync::Arc,
};
use xor_name::{XorName, XOR_NAME_LEN};
#[derive(Clone)]
pub struct Node {
pub keypair: Arc<Keypair>,
pub addr: SocketAddr,
}
impl Node {
pub fn new(keypair: Keypair, addr: SocketAddr) -> Self {
Self {
keypair: Arc::new(keypair),
addr,
}
}
pub fn peer(&self) -> Peer {
Peer::new(self.name(), self.addr)
}
pub fn name(&self) -> XorName {
XorName::from(PublicKey::from(self.keypair.public))
}
pub fn age(&self) -> u8 {
self.name()[XOR_NAME_LEN - 1]
}
}
impl Display for Node {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
write!(f, "{}", self.name())
}
}
impl Debug for Node {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
f.debug_struct("Node")
.field("name", &self.name())
.field("addr", &self.addr)
.field("age", &self.age())
.finish()
}
}
#[cfg(test)]
pub(crate) mod test_utils {
use super::*;
use crate::ed25519;
use itertools::Itertools;
use proptest::{collection::SizeRange, prelude::*};
pub(crate) fn arbitrary_node() -> impl Strategy<Value = Node> {
(
ed25519::test_utils::arbitrary_keypair(),
any::<SocketAddr>(),
)
.prop_map(|(keypair, addr)| Node::new(keypair, addr))
}
pub(crate) fn arbitrary_unique_nodes(
count: impl Into<SizeRange>,
) -> impl Strategy<Value = Vec<Node>> {
proptest::collection::vec(arbitrary_node(), count).prop_filter("non-unique keys", |nodes| {
nodes
.iter()
.unique_by(|node| node.keypair.secret.as_bytes())
.count()
== nodes.len()
})
}
}