use crate::{error::Error, peer::PeerUtils};
use sn_messaging::node::{MembershipState, NodeState, Peer};
use xor_name::XorName;
pub const MIN_AGE: u8 = 4;
pub const MIN_ADULT_AGE: u8 = MIN_AGE + 1;
pub const FIRST_SECTION_MIN_AGE: u8 = MIN_ADULT_AGE + 1;
pub const FIRST_SECTION_MAX_AGE: u8 = 100;
pub trait NodeStateUtils {
fn joined(peer: Peer) -> NodeState;
fn is_mature(&self) -> bool;
fn leave(self) -> Result<NodeState, Error>;
fn relocate(self, destination: XorName) -> NodeState;
}
impl NodeStateUtils for NodeState {
fn joined(peer: Peer) -> NodeState {
NodeState {
peer,
state: MembershipState::Joined,
}
}
fn is_mature(&self) -> bool {
self.peer.age() > MIN_AGE
}
fn leave(self) -> Result<NodeState, Error> {
if let MembershipState::Relocated(_) = self.state {
return Err(Error::InvalidState);
}
Ok(NodeState {
state: MembershipState::Left,
..self
})
}
fn relocate(self, destination: XorName) -> NodeState {
NodeState {
state: MembershipState::Relocated(destination),
..self
}
}
}