use std::fmt;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct EmailAddress {
local: String,
domain: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum AddressError {
MissingAt,
EmptyLocal,
EmptyDomain,
}
impl EmailAddress {
pub fn parse(s: &str) -> Result<Self, AddressError> {
let (local, domain) = s.rsplit_once('@').ok_or(AddressError::MissingAt)?;
if local.is_empty() {
return Err(AddressError::EmptyLocal);
}
if domain.is_empty() {
return Err(AddressError::EmptyDomain);
}
Ok(Self {
local: local.to_string(),
domain: domain.to_string(),
})
}
pub fn local(&self) -> &str {
&self.local
}
pub fn domain(&self) -> &str {
&self.domain
}
}
impl fmt::Display for EmailAddress {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}@{}", self.local, self.domain)
}
}