melib/email/address: add contains_address,subaddress methods
parent
c0c588be9c
commit
faa12a2d41
|
@ -225,6 +225,65 @@ impl Address {
|
||||||
.1
|
.1
|
||||||
.to_vec())
|
.to_vec())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn contains_address(&self, other: &Address) -> bool {
|
||||||
|
match self {
|
||||||
|
Address::Mailbox(_) => self == other,
|
||||||
|
Address::Group(g) => g
|
||||||
|
.mailbox_list
|
||||||
|
.iter()
|
||||||
|
.any(|addr| addr.contains_address(other)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get subaddress out of an address (e.g. `ken+subaddress@example.org`).
|
||||||
|
///
|
||||||
|
/// Subaddresses are commonly text following a "+" character in an email address's local part
|
||||||
|
/// . They are defined in [RFC5233 `Sieve Email Filtering: Subaddress Extension`](https://tools.ietf.org/html/rfc5233.html)
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// # use melib::email::Address;
|
||||||
|
/// let addr = "ken+sieve@example.org";
|
||||||
|
/// let (rest, val) = melib::email::parser::address::address(addr.as_bytes()).unwrap();
|
||||||
|
/// assert!(rest.is_empty());
|
||||||
|
/// assert_eq!(
|
||||||
|
/// val.subaddress("+"),
|
||||||
|
/// Some((
|
||||||
|
/// Address::new(None, "ken@example.org".to_string()),
|
||||||
|
/// "sieve".to_string()
|
||||||
|
/// ))
|
||||||
|
/// );
|
||||||
|
/// ```
|
||||||
|
pub fn subaddress(&self, separator: &str) -> Option<(Self, String)> {
|
||||||
|
match self {
|
||||||
|
Address::Mailbox(_) => {
|
||||||
|
let email = self.get_email();
|
||||||
|
let (local_part, domain) =
|
||||||
|
match super::parser::address::addr_spec_raw(email.as_bytes())
|
||||||
|
.map_err(|err| Into::<MeliError>::into(err))
|
||||||
|
.and_then(|(_, (l, d))| {
|
||||||
|
Ok((String::from_utf8(l.into())?, String::from_utf8(d.into())?))
|
||||||
|
}) {
|
||||||
|
Ok(v) => v,
|
||||||
|
Err(_) => return None,
|
||||||
|
};
|
||||||
|
let s = local_part.split(separator).collect::<Vec<_>>();
|
||||||
|
if s.len() < 2 {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
let subaddress = &local_part[s[0].len() + separator.len()..];
|
||||||
|
|
||||||
|
let display_name = self.get_display_name();
|
||||||
|
Some((
|
||||||
|
Self::new(display_name, format!("{}@{}", s[0], domain)),
|
||||||
|
subaddress.to_string(),
|
||||||
|
))
|
||||||
|
}
|
||||||
|
Address::Group(_) => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Eq for Address {}
|
impl Eq for Address {}
|
||||||
|
|
Loading…
Reference in New Issue