use std::{
cmp::Ordering,
fmt::{self, Display, Formatter},
hash::{Hash, Hasher},
net::SocketAddr,
};
use xor_name::{XorName, XOR_NAME_LEN};
#[derive(Copy, Clone, Debug, serde::Serialize, serde::Deserialize)]
pub struct Peer {
name: XorName,
addr: SocketAddr,
}
impl Peer {
pub fn new(name: XorName, addr: SocketAddr) -> Self {
Self { name, addr }
}
pub fn name(&self) -> XorName {
self.name
}
pub fn addr(&self) -> SocketAddr {
self.addr
}
pub fn age(&self) -> u8 {
self.name[XOR_NAME_LEN - 1]
}
pub fn id(&self) -> (XorName, SocketAddr) {
(self.name, self.addr)
}
pub fn from(addr: SocketAddr, public_key: ed25519_dalek::PublicKey) -> Peer {
Peer {
addr,
name: XorName::from(super::PublicKey::from(public_key)),
}
}
}
impl Display for Peer {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
write!(f, "{} at {}", self.name(), self.addr(),)
}
}
impl Eq for Peer {}
impl Hash for Peer {
fn hash<H: Hasher>(&self, state: &mut H) {
self.name().hash(state);
self.addr().hash(state);
}
}
impl Ord for Peer {
fn cmp(&self, other: &Self) -> Ordering {
self.name()
.cmp(&other.name())
.then_with(|| self.addr().cmp(&other.addr()))
}
}
impl PartialEq for Peer {
fn eq(&self, other: &Self) -> bool {
self.name() == other.name() && self.addr() == other.addr()
}
}
impl PartialEq<&Self> for Peer {
fn eq(&self, other: &&Self) -> bool {
self.name() == other.name() && self.addr() == other.addr()
}
}
impl PartialOrd for Peer {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}