use pest::Parser; use pest_derive::Parser;
use thiserror::Error;
#[derive(Parser)]
#[grammar = "grammar.pest"]
pub struct EmailParser;
#[derive(Debug)]
pub struct EmailAddress {
pub local: String,
pub domain_part: String,
}
#[derive(Error, Debug)]
pub enum EmailParseError {
#[error("Parsing error: {0}")]
PestError(#[from] pest::error::Error<Rule>),
}
impl EmailAddress {
pub fn parse(input: &str) -> Result<Self, EmailParseError> {
let mut parsed = EmailParser::parse(Rule::email, input)?;
let email_pair = parsed.next().unwrap();
let mut local = String::new();
let mut domain_part = String::new();
for pair in email_pair.into_inner() {
match pair.as_rule() {
Rule::local_part => {
local = pair.as_str().to_string();
}
Rule::domain => {
domain_part = pair.as_str().to_string();
}
_ => {}
}
}
Ok(EmailAddress { local, domain_part })
}
}