use bytes::Bytes;
use ed25519_dalek::Keypair;
use hex_fmt::HexFmt;
pub use qp2p::{RecvStream, SendStream};
use sn_messaging::{client::ClientMsg, node::Signed, DstLocation, EndUser, SrcLocation};
use std::{
collections::BTreeSet,
fmt::{self, Debug, Formatter},
net::SocketAddr,
sync::Arc,
};
use xor_name::{Prefix, XorName};
#[derive(Debug)]
pub enum NodeElderChange {
Promoted,
Demoted,
None,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Elders {
pub prefix: Prefix,
pub key: bls::PublicKey,
pub remaining: BTreeSet<XorName>,
pub added: BTreeSet<XorName>,
pub removed: BTreeSet<XorName>,
}
#[allow(clippy::large_enum_variant)]
pub enum Event {
MessageReceived {
content: Bytes,
src: SrcLocation,
dst: DstLocation,
signed: Option<Signed>,
section_pk: bls::PublicKey,
},
MemberJoined {
name: XorName,
previous_name: Option<XorName>,
age: u8,
},
MemberLeft {
name: XorName,
age: u8,
},
SectionSplit {
elders: Elders,
sibling_elders: Elders,
self_status_change: NodeElderChange,
},
EldersChanged {
elders: Elders,
self_status_change: NodeElderChange,
},
RelocationStarted {
previous_name: XorName,
},
Relocated {
previous_name: XorName,
new_keypair: Arc<Keypair>,
},
RestartRequired,
ClientMsgReceived {
msg: Box<ClientMsg>,
user: EndUser,
},
ClientLost(SocketAddr),
AdultsChanged {
remaining: BTreeSet<XorName>,
added: BTreeSet<XorName>,
removed: BTreeSet<XorName>,
},
}
impl Debug for Event {
fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
match self {
Self::MessageReceived {
content, src, dst, ..
} => write!(
formatter,
"MessageReceived {{ content: \"{:<8}\", src: {:?}, dst: {:?} }}",
HexFmt(content),
src,
dst
),
Self::MemberJoined {
name,
previous_name,
age,
} => formatter
.debug_struct("MemberJoined")
.field("name", name)
.field("previous_name", previous_name)
.field("age", age)
.finish(),
Self::MemberLeft { name, age } => formatter
.debug_struct("MemberLeft")
.field("name", name)
.field("age", age)
.finish(),
Self::SectionSplit {
elders,
sibling_elders,
self_status_change,
} => formatter
.debug_struct("EldersChanged")
.field("elders", elders)
.field("sibling_elders", sibling_elders)
.field("self_status_change", self_status_change)
.finish(),
Self::EldersChanged {
elders,
self_status_change,
} => formatter
.debug_struct("EldersChanged")
.field("elders", elders)
.field("self_status_change", self_status_change)
.finish(),
Self::RelocationStarted { previous_name } => formatter
.debug_struct("RelocationStarted")
.field("previous_name", previous_name)
.finish(),
Self::Relocated {
previous_name,
new_keypair,
} => formatter
.debug_struct("Relocated")
.field("previous_name", previous_name)
.field("new_keypair", new_keypair)
.finish(),
Self::RestartRequired => write!(formatter, "RestartRequired"),
Self::ClientMsgReceived { msg, user, .. } => write!(
formatter,
"ClientMsgReceived {{ msg: {:?}, src: {:?} }}",
msg, user,
),
Self::ClientLost(addr) => write!(formatter, "ClientLost({:?})", addr),
Self::AdultsChanged {
remaining,
added,
removed,
} => formatter
.debug_struct("AdultsChanged")
.field("remaining", remaining)
.field("added", added)
.field("removed", removed)
.finish(),
}
}
}