use bls::PublicKey as BlsPublicKey;
use serde::{Deserialize, Serialize};
use xor_name::{Prefix, XorName};
#[derive(Clone, Copy, Eq, PartialEq, Hash, Serialize, Deserialize, Debug)]
pub struct EndUser(pub XorName);
#[derive(Clone, Copy, Eq, PartialEq, Hash, Serialize, Deserialize, Debug)]
pub enum SrcLocation {
EndUser(EndUser),
Node {
name: XorName,
section_pk: BlsPublicKey,
},
Section {
name: XorName,
section_pk: BlsPublicKey,
},
}
impl SrcLocation {
pub fn name(&self) -> XorName {
match self {
Self::EndUser(user) => user.0,
Self::Node { name, .. } => *name,
Self::Section { name, .. } => *name,
}
}
pub fn to_dst(self) -> DstLocation {
match self {
Self::EndUser(user) => DstLocation::EndUser(user),
Self::Node { name, section_pk } => DstLocation::Node { name, section_pk },
Self::Section { name, section_pk } => DstLocation::Section { name, section_pk },
}
}
}
#[derive(Clone, Copy, Eq, PartialEq, Hash, Serialize, Deserialize, Debug)]
pub enum DstLocation {
EndUser(EndUser),
Node {
name: XorName,
section_pk: BlsPublicKey,
},
Section {
name: XorName,
section_pk: BlsPublicKey,
},
}
impl DstLocation {
pub fn section_pk(&self) -> Option<BlsPublicKey> {
match self {
Self::EndUser(_) => None,
Self::Node { section_pk, .. } => Some(*section_pk),
Self::Section { section_pk, .. } => Some(*section_pk),
}
}
pub fn set_section_pk(&mut self, pk: BlsPublicKey) {
match self {
Self::EndUser(_) => {}
Self::Node { section_pk, .. } => *section_pk = pk,
Self::Section { section_pk, .. } => *section_pk = pk,
}
}
pub fn contains(&self, name: &XorName, prefix: &Prefix) -> bool {
if !prefix.matches(name) {
return false;
}
match self {
Self::EndUser(user) => prefix.matches(&user.0),
Self::Node {
name: self_name, ..
} => name == self_name,
Self::Section {
name: self_name, ..
} => prefix.matches(self_name),
}
}
pub fn name(&self) -> XorName {
match self {
Self::EndUser(user) => user.0,
Self::Node { name, .. } => *name,
Self::Section { name, .. } => *name,
}
}
pub fn set_name(&mut self, new_name: XorName) {
match self {
Self::EndUser(EndUser(name)) => *name = new_name,
Self::Node { name, .. } => *name = new_name,
Self::Section { name, .. } => *name = new_name,
}
}
pub fn is_to_node(&self) -> bool {
matches!(self, Self::Node { .. })
}
}