email_format/rfc5322/
email_address.rs

1
2use super::types::{AddressList, Address, Mailbox, Group, NameAddr, AddrSpec,
3                   GroupList, MailboxList};
4
5/// This type represents an Email Address in a way that is simpler and more
6/// directly useful than the ABNF-based rfc5322 types. It is not used by the
7/// main parser, but may be useful to consumers of this library.
8pub struct EmailAddress {
9    pub display_name: Option<String>,
10    pub local_part: String,
11    pub domain: String,
12}
13
14impl EmailAddress {
15    pub fn from_addresses(addr: &AddressList) -> Vec<EmailAddress>
16    {
17        let mut output: Vec<EmailAddress> = Vec::new();
18        for address in &addr.0 {
19            output.extend( EmailAddress::from_address(address).into_iter() );
20        }
21        output
22    }
23
24    pub fn from_address(addr: &Address) -> Vec<EmailAddress>
25    {
26        match *addr {
27            Address::Mailbox(ref mbox) => vec![ EmailAddress::from_mailbox(mbox) ],
28            Address::Group(ref group) => EmailAddress::from_group(group),
29        }
30    }
31
32    pub fn from_mailbox(mbox: &Mailbox) -> EmailAddress
33    {
34        match *mbox {
35            Mailbox::NameAddr(ref name_addr) => EmailAddress::from_name_addr(name_addr),
36            Mailbox::AddrSpec(ref addr_spec) => EmailAddress::from_addr_spec(addr_spec),
37        }
38    }
39
40    pub fn from_name_addr(name_addr: &NameAddr) -> EmailAddress
41    {
42        let mut email_address = EmailAddress::from_addr_spec(
43            &name_addr.angle_addr.addr_spec);
44        if let Some(ref display_name) = name_addr.display_name {
45            email_address.display_name = Some(format!("{}", display_name));
46        }
47        email_address
48    }
49
50    pub fn from_addr_spec(addr_spec: &AddrSpec) -> EmailAddress
51    {
52        EmailAddress {
53            display_name: None,
54            local_part: format!("{}", addr_spec.local_part),
55            domain: format!("{}", addr_spec.domain),
56        }
57    }
58
59    pub fn from_group(group: &Group) -> Vec<EmailAddress>
60    {
61        match group.group_list {
62            Some(ref gl) => EmailAddress::from_group_list(gl),
63            None => Vec::new(),
64        }
65    }
66
67    pub fn from_group_list(group_list: &GroupList) -> Vec<EmailAddress>
68    {
69        match *group_list {
70            GroupList::MailboxList(ref mbl) => EmailAddress::from_mailbox_list(mbl),
71            _ => Vec::new(),
72        }
73    }
74
75    pub fn from_mailbox_list(mbl: &MailboxList) -> Vec<EmailAddress>
76    {
77        let mut output: Vec<EmailAddress> = Vec::new();
78        for mailbox in &mbl.0 {
79            output.push( EmailAddress::from_mailbox(mailbox) );
80        }
81        output
82    }
83}