email_format/rfc5322/
email_address.rs1
2use super::types::{AddressList, Address, Mailbox, Group, NameAddr, AddrSpec,
3 GroupList, MailboxList};
4
5pub 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}