From 6e7cb5500ce478976c98013ac912c56a1fbb7b2b Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Wed, 19 Jul 2023 15:56:03 +0200 Subject: [PATCH] fix address --- src/rfc5322/address.rs | 87 +++++++++++++++++++++--------------------- src/rfc5322/mod.rs | 1 + 2 files changed, 44 insertions(+), 44 deletions(-) diff --git a/src/rfc5322/address.rs b/src/rfc5322/address.rs index c829ac3..a324ae0 100644 --- a/src/rfc5322/address.rs +++ b/src/rfc5322/address.rs @@ -8,36 +8,34 @@ use nom::{ }; use crate::error::IMFError; -use crate::fragments::lazy; -use crate::fragments::mailbox::mailbox; -use crate::fragments::misc_token::phrase; -//use crate::fragments::model::{AddressList, AddressRef, GroupRef, MailboxList, MailboxRef}; -use crate::fragments::whitespace::cfws; +use crate::rfc5322::mailbox::{mailbox, MailboxRef}; +use crate::text::misc_token::{phrase, Phrase}; +use crate::text::whitespace::cfws; #[derive(Debug, PartialEq)] -pub struct GroupRef { - pub name: String, - pub participants: Vec, +pub struct GroupRef<'a> { + pub name: Phrase<'a>, + pub participants: Vec>, } #[derive(Debug, PartialEq)] -pub enum AddressRef { - Single(MailboxRef), - Many(GroupRef), +pub enum AddressRef<'a> { + Single(MailboxRef<'a>), + Many(GroupRef<'a>), } -impl From for AddressRef { - fn from(mx: MailboxRef) -> Self { +impl<'a> From> for AddressRef<'a> { + fn from(mx: MailboxRef<'a>) -> Self { AddressRef::Single(mx) } } -impl From for AddressRef { - fn from(grp: GroupRef) -> Self { +impl<'a> From> for AddressRef<'a> { + fn from(grp: GroupRef<'a>) -> Self { AddressRef::Many(grp) } } -pub type AddressList = Vec; +pub type AddressList<'a> = Vec>; -impl<'a> TryFrom<&'a lazy::Mailbox<'a>> for MailboxRef { +/*impl<'a> TryFrom<&'a lazy::Mailbox<'a>> for MailboxRef { type Error = IMFError<'a>; fn try_from(mx: &'a lazy::Mailbox<'a>) -> Result { @@ -75,14 +73,14 @@ impl<'a> TryFrom<&'a lazy::NullableAddressList<'a>> for AddressList { .map(|(_, a)| a.unwrap_or(vec![])) .map_err(|e| IMFError::NullableAddressList(e)) } -} +}*/ /// Address (section 3.4 of RFC5322) /// /// ```abnf /// address = mailbox / group /// ``` -pub fn address(input: &str) -> IResult<&str, AddressRef> { +pub fn address(input: &[u8]) -> IResult<&[u8], AddressRef> { alt((into(mailbox), into(group)))(input) } @@ -92,7 +90,7 @@ pub fn address(input: &str) -> IResult<&str, AddressRef> { /// group = display-name ":" [group-list] ";" [CFWS] /// display-name = phrase /// ``` -pub fn group(input: &str) -> IResult<&str, GroupRef> { +pub fn group(input: &[u8]) -> IResult<&[u8], GroupRef> { let (input, (grp_name, _, grp_list, _, _)) = tuple((phrase, tag(":"), opt(group_list), tag(";"), opt(cfws)))(input)?; @@ -110,11 +108,11 @@ pub fn group(input: &str) -> IResult<&str, GroupRef> { /// ```abnf /// group-list = mailbox-list / CFWS / obs-group-list /// ``` -pub fn group_list(input: &str) -> IResult<&str, Vec> { +pub fn group_list(input: &[u8]) -> IResult<&[u8], Vec> { alt((mailbox_list, mailbox_cfws))(input) } -fn mailbox_cfws(input: &str) -> IResult<&str, Vec> { +fn mailbox_cfws(input: &[u8]) -> IResult<&[u8], Vec> { let (input, _) = cfws(input)?; Ok((input, vec![])) } @@ -124,7 +122,7 @@ fn mailbox_cfws(input: &str) -> IResult<&str, Vec> { /// ```abnf /// mailbox-list = (mailbox *("," mailbox)) / obs-mbox-list /// ``` -pub fn mailbox_list(input: &str) -> IResult<&str, Vec> { +pub fn mailbox_list(input: &[u8]) -> IResult<&[u8], Vec> { separated_list1(tag(","), mailbox)(input) } @@ -133,11 +131,11 @@ pub fn mailbox_list(input: &str) -> IResult<&str, Vec> { /// ```abnf /// address-list = (address *("," address)) / obs-addr-list /// ``` -pub fn address_list(input: &str) -> IResult<&str, Vec> { +pub fn address_list(input: &[u8]) -> IResult<&[u8], Vec> { separated_list1(tag(","), address)(input) } -pub fn address_list_cfws(input: &str) -> IResult<&str, Vec> { +pub fn address_list_cfws(input: &[u8]) -> IResult<&[u8], Vec> { let (input, _) = cfws(input)?; Ok((input, vec![])) } @@ -145,19 +143,20 @@ pub fn address_list_cfws(input: &str) -> IResult<&str, Vec> { #[cfg(test)] mod tests { use super::*; - use crate::fragments::model::AddrSpec; + use crate::text::misc_token::{Phrase, Word}; + use crate::rfc5322::mailbox::{AddrSpec, Domain, LocalPart, LocalPartToken}; #[test] fn test_mailbox_list() { - match mailbox_list(r#"Pete(A nice \) chap) "#) { - Ok(("", _)) => (), + match mailbox_list(r#"Pete(A nice \) chap) "#.as_bytes()) { + Ok((rest, _)) => assert_eq!(&b""[..], rest), _ => panic!(), }; match mailbox_list( - r#"Mary Smith , jdoe@example.org, Who? , , "Giant; \"Big\" Box" "#, + r#"Mary Smith , jdoe@example.org, Who? , , "Giant; \"Big\" Box" "#.as_bytes(), ) { - Ok(("", _)) => (), + Ok((rest, _)) => assert_eq!(&b""[..], rest), _ => panic!(), }; } @@ -166,42 +165,42 @@ mod tests { fn test_address_list() { assert_eq!( address_list( - r#"A Group:Ed Jones ,joe@where.test,John ;, Mary Smith "# + r#"A Group:Ed Jones ,joe@where.test,John ;, Mary Smith "#.as_bytes() ), Ok(( - "", + &b""[..], vec![ AddressRef::Many(GroupRef { - name: "A Group".to_string(), + name: Phrase(vec![Word::Atom(&b"A"[..]), Word::Atom(&b"Group"[..])]), participants: vec![ MailboxRef { - name: Some("Ed Jones".into()), + name: Some(Phrase(vec![Word::Atom(&b"Ed"[..]), Word::Atom(&b"Jones"[..])])), addrspec: AddrSpec { - local_part: "c".into(), - domain: "a.test".into() + local_part: LocalPart(vec![LocalPartToken::Word(Word::Atom(&b"c"[..]))]), + domain: Domain::Atoms(vec![&b"a"[..], &b"test"[..]]), }, }, MailboxRef { name: None, addrspec: AddrSpec { - local_part: "joe".into(), - domain: "where.test".into() + local_part: LocalPart(vec![LocalPartToken::Word(Word::Atom(&b"joe"[..]))]), + domain: Domain::Atoms(vec![&b"where"[..], &b"test"[..]]) }, }, MailboxRef { - name: Some("John".into()), + name: Some(Phrase(vec![Word::Atom(&b"John"[..])])), addrspec: AddrSpec { - local_part: "jdoe".into(), - domain: "one.test".into() + local_part: LocalPart(vec![LocalPartToken::Word(Word::Atom(&b"jdoe"[..]))]), + domain: Domain::Atoms(vec![&b"one"[..], &b"test"[..]]) }, }, ], }), AddressRef::Single(MailboxRef { - name: Some("Mary Smith".into()), + name: Some(Phrase(vec![Word::Atom(&b"Mary"[..]), Word::Atom(&b"Smith"[..])])), addrspec: AddrSpec { - local_part: "mary".into(), - domain: "x.test".into() + local_part: LocalPart(vec![LocalPartToken::Word(Word::Atom(&b"mary"[..]))]), + domain: Domain::Atoms(vec![&b"x"[..], &b"test"[..]]) }, }), ] diff --git a/src/rfc5322/mod.rs b/src/rfc5322/mod.rs index 808ccf2..9e01c4d 100644 --- a/src/rfc5322/mod.rs +++ b/src/rfc5322/mod.rs @@ -1 +1,2 @@ pub mod mailbox; +pub mod address;