diff --git a/src/mime/field.rs b/src/mime/field.rs index 4be6223..0a69804 100644 --- a/src/mime/field.rs +++ b/src/mime/field.rs @@ -8,7 +8,7 @@ use nom::{ use crate::text::whitespace::obs_crlf; use crate::text::misc_token::{Unstructured, unstructured}; use crate::rfc5322::identification::{MessageID, msg_id}; -use crate::header::{field_name, header, CompFieldList}; +use crate::header::{field_name}; use crate::mime::r#type::{NaiveType, naive_type}; use crate::mime::mechanism::{Mechanism, mechanism}; //use crate::mime::mime::MIME; @@ -24,7 +24,7 @@ pub enum Content<'a> { pub fn to_mime(&self) -> MIME { self.into() } }*/ -fn content(input: &[u8]) -> IResult<&[u8], Content> { +pub fn content(input: &[u8]) -> IResult<&[u8], Content> { terminated(alt(( preceded(field_name(b"content-type"), map(naive_type, Content::Type)), preceded(field_name(b"content-transfer-encoding"), map(mechanism, Content::TransferEncoding)), @@ -40,6 +40,7 @@ mod tests { use crate::mime::charset::EmailCharset; use crate::text::misc_token::MIMEWord; use crate::text::quoted::QuotedString; + use crate::header::{header, CompFieldList}; #[test] fn test_content_type() { diff --git a/src/mime/mime.rs b/src/mime/mime.rs index c8208c8..986f5f8 100644 --- a/src/mime/mime.rs +++ b/src/mime/mime.rs @@ -1,28 +1,30 @@ +use crate::mime::r#type::NaiveType; +use crate::mime::mechanism::Mechanism; +use crate::rfc5322::identification::MessageID; +use crate::text::misc_token::Unstructured; +use crate::mime::field::Content; #[derive(Debug, PartialEq, Default)] -pub struct MIMESection<'a> { - pub content_type: Option<&'a Type<'a>>, +pub struct MIME<'a> { + pub content_type: Option<&'a NaiveType<'a>>, pub content_transfer_encoding: Option<&'a Mechanism<'a>>, - pub content_id: Option<&'a MessageId<'a>>, - pub content_description: Option<&'a Unstructured>, - pub optional: HashMap<&'a str, &'a Unstructured>, - pub unparsed: Vec<&'a str>, + pub content_id: Option<&'a MessageID<'a>>, + pub content_description: Option<&'a Unstructured<'a>>, } - -impl<'a> FromIterator<&'a MIMEField<'a>> for MIMESection<'a> { - fn from_iter>>(iter: I) -> Self { - let mut section = MIMESection::default(); - for field in iter { - match field { - MIMEField::ContentType(v) => section.content_type = Some(v), - MIMEField::ContentTransferEncoding(v) => section.content_transfer_encoding = Some(v), - MIMEField::ContentID(v) => section.content_id = Some(v), - MIMEField::ContentDescription(v) => section.content_description = Some(v), - MIMEField::Optional(k, v) => { section.optional.insert(k, v); }, - MIMEField::Rescue(v) => section.unparsed.push(v), - }; - } - section +impl<'a> FromIterator<&'a Content<'a>> for MIME<'a> { + fn from_iter>>(source: I) -> Self { + source.into_iter().fold( + MIME::default(), + |mut section, field| { + match field { + Content::Type(v) => section.content_type = Some(v), + Content::TransferEncoding(v) => section.content_transfer_encoding = Some(v), + Content::ID(v) => section.content_id = Some(v), + Content::Description(v) => section.content_description = Some(v), + }; + section + } + ) } } diff --git a/src/mime/mod.rs b/src/mime/mod.rs index a128165..9893c40 100644 --- a/src/mime/mod.rs +++ b/src/mime/mod.rs @@ -2,3 +2,4 @@ pub mod charset; pub mod mechanism; pub mod r#type; pub mod field; +pub mod mime; diff --git a/src/rfc5322/field.rs b/src/rfc5322/field.rs index 1423ce4..50f2eca 100644 --- a/src/rfc5322/field.rs +++ b/src/rfc5322/field.rs @@ -3,11 +3,10 @@ use nom::{ IResult, branch::alt, combinator::map, - multi::many0, sequence::{preceded, terminated}, }; -use crate::text::whitespace::{obs_crlf, foldable_line}; +use crate::text::whitespace::{obs_crlf}; use crate::rfc5322::address::{AddressList, address_list, nullable_address_list, mailbox_list}; use crate::rfc5322::datetime::section as date; use crate::rfc5322::mailbox::{MailboxRef, MailboxList, AddrSpec, mailbox}; @@ -15,7 +14,7 @@ use crate::rfc5322::identification::{MessageID, MessageIDList, msg_id, msg_list} use crate::rfc5322::trace::{ReceivedLog, return_path, received_log}; use crate::rfc5322::mime::{Version, version}; use crate::rfc5322::message::Message; -use crate::header::{header, field_name, CompFieldList}; +use crate::header::{field_name}; use crate::text::misc_token::{Unstructured, PhraseList, unstructured, phrase_list}; #[derive(Debug, PartialEq)] @@ -94,6 +93,7 @@ mod tests { use crate::rfc5322::mailbox::*; use crate::rfc5322::address::*; use crate::text::misc_token::*; + use crate::header::header; #[test] fn test_header() {