use xor_name::XorName;
use sodiumoxide::crypto::{sign, hash};
use std::fmt::{Debug, Formatter, Error};
#[derive(RustcEncodable, RustcDecodable, PartialEq, PartialOrd, Eq, Ord, Clone, Hash)]
pub enum Authority {
ClientManager(XorName),
NaeManager(XorName),
NodeManager(XorName),
ManagedNode(XorName),
Client {
client_key: sign::PublicKey,
proxy_node_name: XorName,
},
}
impl Authority {
pub fn is_group(&self) -> bool {
match *self {
Authority::ClientManager(_) => true,
Authority::NaeManager(_) => true,
Authority::NodeManager(_) => true,
Authority::ManagedNode(_) => false,
Authority::Client { .. } => false,
}
}
pub fn get_name(&self) -> &XorName {
match *self {
Authority::ClientManager(ref name) => name,
Authority::NaeManager(ref name) => name,
Authority::NodeManager(ref name) => name,
Authority::ManagedNode(ref name) => name,
Authority::Client { ref proxy_node_name, .. } => proxy_node_name,
}
}
}
impl Debug for Authority {
fn fmt(&self, f: &mut Formatter) -> ::std::fmt::Result {
match *self {
Authority::ClientManager(ref name) => write!(f, "ClientManager(name:{:?})", name),
Authority::NaeManager(ref name) => write!(f, "NaeManager(name:{:?})", name),
Authority::NodeManager(ref name) => write!(f, "NodeManager(name:{:?})", name),
Authority::ManagedNode(ref name) => write!(f, "ManagedNode(name:{:?})", name),
Authority::Client { ref client_key, ref proxy_node_name, } => {
write!(f,
"Client {{ client_name: {:?}, proxy_node_name: {:?} }}",
XorName::new(hash::sha512::hash(&client_key[..]).0),
proxy_node_name)
}
}
}
}