melib/email/address: add constructors, and fix debug print
parent
46c44ced96
commit
0de39cb658
|
@ -20,6 +20,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
use std::collections::HashSet;
|
||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
use std::hash::{Hash, Hasher};
|
use std::hash::{Hash, Hasher};
|
||||||
|
|
||||||
|
@ -66,6 +67,54 @@ pub enum Address {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Address {
|
impl Address {
|
||||||
|
pub fn new(display_name: Option<String>, address: String) -> Self {
|
||||||
|
Address::Mailbox(if let Some(d) = display_name {
|
||||||
|
MailboxAddress {
|
||||||
|
raw: format!("{} <{}>", d, address).into_bytes(),
|
||||||
|
display_name: StrBuilder {
|
||||||
|
offset: 0,
|
||||||
|
length: d.len(),
|
||||||
|
},
|
||||||
|
address_spec: StrBuilder {
|
||||||
|
offset: d.len() + 2,
|
||||||
|
length: address.len(),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
MailboxAddress {
|
||||||
|
raw: format!("{}", address).into_bytes(),
|
||||||
|
display_name: StrBuilder {
|
||||||
|
offset: 0,
|
||||||
|
length: 0,
|
||||||
|
},
|
||||||
|
address_spec: StrBuilder {
|
||||||
|
offset: 0,
|
||||||
|
length: address.len(),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn new_group(display_name: String, mailbox_list: Vec<Address>) -> Self {
|
||||||
|
Address::Group(GroupAddress {
|
||||||
|
raw: format!(
|
||||||
|
"{}:{};",
|
||||||
|
display_name,
|
||||||
|
mailbox_list
|
||||||
|
.iter()
|
||||||
|
.map(|a| a.to_string())
|
||||||
|
.collect::<Vec<String>>()
|
||||||
|
.join(",")
|
||||||
|
)
|
||||||
|
.into_bytes(),
|
||||||
|
display_name: StrBuilder {
|
||||||
|
offset: 0,
|
||||||
|
length: display_name.len(),
|
||||||
|
},
|
||||||
|
mailbox_list,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
pub fn raw(&self) -> &[u8] {
|
pub fn raw(&self) -> &[u8] {
|
||||||
match self {
|
match self {
|
||||||
Address::Mailbox(m) => m.raw.as_slice(),
|
Address::Mailbox(m) => m.raw.as_slice(),
|
||||||
|
@ -138,10 +187,8 @@ impl PartialEq for Address {
|
||||||
}
|
}
|
||||||
(Address::Group(s), Address::Group(o)) => {
|
(Address::Group(s), Address::Group(o)) => {
|
||||||
s.display_name.display_bytes(&s.raw) == o.display_name.display_bytes(&o.raw)
|
s.display_name.display_bytes(&s.raw) == o.display_name.display_bytes(&o.raw)
|
||||||
&& s.mailbox_list
|
&& s.mailbox_list.iter().collect::<HashSet<_>>()
|
||||||
.iter()
|
== o.mailbox_list.iter().collect::<HashSet<_>>()
|
||||||
.zip(o.mailbox_list.iter())
|
|
||||||
.fold(true, |b, (s, o)| b && (s == o))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -189,7 +236,22 @@ impl fmt::Display for Address {
|
||||||
|
|
||||||
impl fmt::Debug for Address {
|
impl fmt::Debug for Address {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
fmt::Display::fmt(self, f)
|
match self {
|
||||||
|
Address::Mailbox(m) => f
|
||||||
|
.debug_struct("Address::Mailbox")
|
||||||
|
.field("display_name", &m.display_name.display(&m.raw))
|
||||||
|
.field("address_spec", &m.address_spec.display(&m.raw))
|
||||||
|
.finish(),
|
||||||
|
Address::Group(g) => {
|
||||||
|
let attachment_strings: Vec<String> =
|
||||||
|
g.mailbox_list.iter().map(|a| format!("{}", a)).collect();
|
||||||
|
|
||||||
|
f.debug_struct("Address::Group")
|
||||||
|
.field("display_name", &g.display_name.display(&g.raw))
|
||||||
|
.field("addresses", &attachment_strings.join(", "))
|
||||||
|
.finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue