Add address_list parser

embed
Manos Pitsidianakis 2018-07-26 17:49:21 +03:00
parent a4b8b4fd4e
commit ea9bdd2074
Signed by: Manos Pitsidianakis
GPG Key ID: 73627C2F690DF710
2 changed files with 21 additions and 2 deletions

View File

@ -198,7 +198,7 @@ impl Envelope {
continue;
}
if name.eq_ignore_ascii_case("to") {
let parse_result = parser::subject(value.as_bytes());
let parse_result = parser::address_list(value.as_bytes());
let value = if parse_result.is_done() {
parse_result.to_full_result().unwrap()
} else {
@ -206,7 +206,7 @@ impl Envelope {
};
self.set_to(value);
} else if name.eq_ignore_ascii_case("from") {
let parse_result = parser::subject(value.as_bytes());
let parse_result = parser::address_list(value.as_bytes());
let value = if parse_result.is_done() {
parse_result.to_full_result().unwrap()
} else {

View File

@ -259,6 +259,25 @@ named!(ascii_token<String>, do_parse!(
String::from_utf8_lossy(word).into_owned()
} )));
named!(pub address_list<String>, ws!(do_parse!(
list: alt_complete!( encoded_word_list | ascii_token) >>
( {
let list: Vec<&str> = list.split(',').collect();
let string_len = list.iter().fold(0, |mut acc, x| { acc+=x.trim().len(); acc }) + list.len() - 1;
let list_len = list.len();
let mut i = 0;
list.iter().fold(String::with_capacity(string_len),
|acc, x| {
let mut acc = acc + &x.replace("\n", "").replace("\t", " ").trim();
if i != list_len - 1 {
acc.push_str(" ");
i+=1;
}
acc
})
} )
)));
named!(pub subject<String>, ws!(do_parse!(
list: many0!(alt_complete!( encoded_word_list | ascii_token)) >>
( {