From d46c5895f58819db77e8311185f3140044989a90 Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Tue, 13 Jun 2023 13:31:43 +0200 Subject: [PATCH] implement from --- src/headers.rs | 39 ++++++++++++++++++++++++++++----------- src/model.rs | 2 +- 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/headers.rs b/src/headers.rs index 74f4b75..4749c93 100644 --- a/src/headers.rs +++ b/src/headers.rs @@ -15,6 +15,7 @@ use crate::whitespace::{fws, perm_crlf}; use crate::words::vchar_seq; use crate::misc_token::unstructured; use crate::model::{PermissiveHeaderSection, HeaderDate, MailboxRef}; +use crate::address::{mailbox_list}; /// HEADERS @@ -30,6 +31,7 @@ pub fn header_section(input: &str) -> IResult<&str, PermissiveHeaderSection> { HeaderField::Date(d) => { //@FIXME only one date is allowed, what are we doing if multiple dates are //encountered? Currently, we override... + // | orig-date | 1 | 1 | | section.date = d; } HeaderField::Subject(title) => { @@ -38,6 +40,11 @@ pub fn header_section(input: &str) -> IResult<&str, PermissiveHeaderSection> { HeaderField::Optional(name, body) => { section.optional.insert(name, body); } + HeaderField::From(v) => { + //@FIXME override the from field if declared multiple times. + // | from | 1 | 1 | See sender and 3.6.2 | + section.from = v; + } _ => unimplemented!(), }; section @@ -48,13 +55,13 @@ pub fn header_section(input: &str) -> IResult<&str, PermissiveHeaderSection> { Ok((input, headers)) } -#[derive(Debug)] +#[derive(Debug, PartialEq)] enum HeaderField<'a> { // 3.6.1. The Origination Date Field Date(HeaderDate), // 3.6.2. Originator Fields - From, + From(Vec), Sender, ReplyTo, @@ -109,7 +116,10 @@ fn header_field(input: &str) -> IResult<&str, HeaderField> { // Extract field body let (input, hfield) = match field_name { "Date" => datetime(input)?, - "From" => from(input)?, + "From" => { + let (input, body) = mailbox_list(input)?; + (input, HeaderField::From(body)) + }, "Sender" => unimplemented!(), "Subject" => { let (input, body) = unstructured(input)?; @@ -137,17 +147,10 @@ fn datetime(input: &str) -> IResult<&str, HeaderField> { Ok((input, HeaderField::Date(date))) } -fn from(input: &str) -> IResult<&str, HeaderField> { - //let (input, mbox_list) = many0(mailbox)(input)?; - //Ok((input, HeaderField::From(mbox_list))) - unimplemented!(); -} - - - #[cfg(test)] mod tests { use super::*; + use crate::model::AddrSpec; #[test] fn test_datetime() { @@ -159,6 +162,20 @@ mod tests { _ => panic!("Date has not been parsed"), }; } + + #[test] + fn test_from() { + assert_eq!( + header_field("From: \"Joe Q. Public\" \r\n"), + Ok(("", HeaderField::From(vec![MailboxRef { + name: Some("Joe Q. Public".into()), + addrspec: AddrSpec { + local_part: "john.q.public".into(), + domain: "example.com".into(), + } + }]))), + ); + } } diff --git a/src/model.rs b/src/model.rs index e2abbbf..3ee48ac 100644 --- a/src/model.rs +++ b/src/model.rs @@ -1,7 +1,7 @@ use std::collections::HashMap; use chrono::{DateTime,FixedOffset,ParseError}; -#[derive(Debug, Default)] +#[derive(Debug, PartialEq, Default)] pub enum HeaderDate { Parsed(DateTime), Unknown(String, ParseError),