use crate::atom::Atom;
use std::fmt;
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum RegistryError {
AlreadyRegistered,
PidAlreadyRegistered,
NotRegistered,
}
impl fmt::Display for RegistryError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::AlreadyRegistered => f.write_str("name is already registered"),
Self::PidAlreadyRegistered => {
f.write_str("pid is already registered under another name")
}
Self::NotRegistered => f.write_str("name is not registered"),
}
}
}
impl std::error::Error for RegistryError {}
pub trait RegistryFacility: Send + Sync {
fn register(&self, name: Atom, pid: u64) -> Result<(), RegistryError>;
fn unregister(&self, name: Atom) -> Result<(), RegistryError>;
fn whereis(&self, name: Atom) -> Option<u64>;
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum RegistryRecord {
Register {
name: Atom,
pid: u64,
},
Unregister {
name: Atom,
},
Whereis {
name: Atom,
},
}