use crate::messaging::node::{MemberInfo, Peer, PeerState};
use crate::routing::routing_api::{error::Error, peer::PeerUtils};
use xor_name::XorName;
pub const MIN_AGE: u8 = 4;
pub const MIN_ADULT_AGE: u8 = MIN_AGE + 1;
pub trait MemberInfoUtils {
fn joined(peer: Peer) -> MemberInfo;
fn is_mature(&self) -> bool;
fn leave(self) -> Result<MemberInfo, Error>;
fn relocate(self, dst: XorName) -> MemberInfo;
}
impl MemberInfoUtils for MemberInfo {
fn joined(peer: Peer) -> MemberInfo {
MemberInfo {
peer,
state: PeerState::Joined,
}
}
fn is_mature(&self) -> bool {
self.peer.age() > MIN_AGE
}
fn leave(self) -> Result<MemberInfo, Error> {
if let PeerState::Relocated(_) = self.state {
return Err(Error::InvalidState);
}
Ok(MemberInfo {
state: PeerState::Left,
..self
})
}
fn relocate(self, dst: XorName) -> MemberInfo {
MemberInfo {
state: PeerState::Relocated(dst),
..self
}
}
}