From cfc380b47dbfb5c9bf015864461b437ea9e27db2 Mon Sep 17 00:00:00 2001 From: Manos Pitsidianakis Date: Sat, 19 Sep 2020 14:59:23 +0300 Subject: [PATCH] melib/jmap: allow empty to,from etc fields in EmailObject --- melib/src/backends/jmap/objects/email.rs | 151 +++++++++++------------ 1 file changed, 74 insertions(+), 77 deletions(-) diff --git a/melib/src/backends/jmap/objects/email.rs b/melib/src/backends/jmap/objects/email.rs index 6fbe7f9d3..cf3cb1f51 100644 --- a/melib/src/backends/jmap/objects/email.rs +++ b/melib/src/backends/jmap/objects/email.rs @@ -134,54 +134,54 @@ pub struct EmailObject { #[serde(default)] pub blob_id: String, #[serde(default)] - mailbox_ids: HashMap, + pub mailbox_ids: HashMap, #[serde(default)] - size: u64, + pub size: u64, #[serde(default)] - received_at: String, + pub received_at: String, #[serde(default)] - message_id: Vec, + pub message_id: Vec, #[serde(default)] - to: SmallVec<[EmailAddress; 1]>, + pub to: Option>, #[serde(default)] - bcc: Option>, + pub bcc: Option>, #[serde(default)] - reply_to: Option>, + pub reply_to: Option>, #[serde(default)] - cc: Option>, + pub cc: Option>, #[serde(default)] - sender: Option>, + pub sender: Option>, #[serde(default)] - from: SmallVec<[EmailAddress; 1]>, + pub from: Option>, #[serde(default)] - in_reply_to: Option>, + pub in_reply_to: Option>, #[serde(default)] - references: Option>, + pub references: Option>, #[serde(default)] - keywords: HashMap, + pub keywords: HashMap, #[serde(default)] - attached_emails: Option, + pub attached_emails: Option, #[serde(default)] - attachments: Vec, + pub attachments: Vec, #[serde(default)] - has_attachment: bool, + pub has_attachment: bool, #[serde(default)] #[serde(deserialize_with = "deserialize_header")] - headers: HashMap, + pub headers: HashMap, #[serde(default)] - html_body: Vec, + pub html_body: Vec, #[serde(default)] - preview: Option, + pub preview: Option, #[serde(default)] - sent_at: Option, + pub sent_at: Option, #[serde(default)] - subject: Option, + pub subject: Option, #[serde(default)] - text_body: Vec, + pub text_body: Vec, #[serde(default)] - thread_id: Id, + pub thread_id: Id, #[serde(flatten)] - extra: HashMap, + pub extra: HashMap, } impl EmailObject { @@ -190,9 +190,9 @@ impl EmailObject { #[derive(Deserialize, Serialize, Debug, Default)] #[serde(rename_all = "camelCase")] -struct Header { - name: String, - value: String, +pub struct Header { + pub name: String, + pub value: String, } fn deserialize_header<'de, D>( @@ -207,9 +207,9 @@ where #[derive(Deserialize, Serialize, Debug, Default)] #[serde(rename_all = "camelCase")] -struct EmailAddress { - email: String, - name: Option, +pub struct EmailAddress { + pub email: String, + pub name: Option, } impl Into for EmailAddress { @@ -269,18 +269,22 @@ impl std::convert::From for crate::Envelope { env.set_subject(std::mem::replace(subject, String::new()).into_bytes()); } - env.set_from( - std::mem::replace(&mut t.from, SmallVec::new()) - .into_iter() - .map(|addr| addr.into()) - .collect::>(), - ); - env.set_to( - std::mem::replace(&mut t.to, SmallVec::new()) - .into_iter() - .map(|addr| addr.into()) - .collect::>(), - ); + if let Some(ref mut from) = t.from { + env.set_from( + std::mem::replace(from, SmallVec::new()) + .into_iter() + .map(|addr| addr.into()) + .collect::>(), + ); + } + if let Some(ref mut to) = t.to { + env.set_to( + std::mem::replace(to, SmallVec::new()) + .into_iter() + .map(|addr| addr.into()) + .collect::>(), + ); + } if let Some(ref mut cc) = t.cc { env.set_cc( @@ -300,15 +304,8 @@ impl std::convert::From for crate::Envelope { ); } - if env.references.is_some() { - if let Some(pos) = env - .references - .as_ref() - .map(|r| &r.refs) - .unwrap() - .iter() - .position(|r| r == env.message_id()) - { + if let Some(ref r) = env.references { + if let Some(pos) = r.refs.iter().position(|r| r == env.message_id()) { env.references.as_mut().unwrap().refs.remove(pos); } } @@ -322,56 +319,56 @@ impl std::convert::From for crate::Envelope { #[derive(Deserialize, Serialize, Debug)] #[serde(rename_all = "camelCase")] -struct HtmlBody { - blob_id: Id, +pub struct HtmlBody { + pub blob_id: Id, #[serde(default)] - charset: String, + pub charset: String, #[serde(default)] - cid: Option, + pub cid: Option, #[serde(default)] - disposition: Option, + pub disposition: Option, #[serde(default)] - headers: Value, + pub headers: Value, #[serde(default)] - language: Option>, + pub language: Option>, #[serde(default)] - location: Option, + pub location: Option, #[serde(default)] - name: Option, + pub name: Option, #[serde(default)] - part_id: Option, - size: u64, + pub part_id: Option, + pub size: u64, #[serde(alias = "type")] - content_type: String, + pub content_type: String, #[serde(default)] - sub_parts: Vec, + pub sub_parts: Vec, } #[derive(Deserialize, Serialize, Debug)] #[serde(rename_all = "camelCase")] -struct TextBody { - blob_id: Id, +pub struct TextBody { + pub blob_id: Id, #[serde(default)] - charset: String, + pub charset: String, #[serde(default)] - cid: Option, + pub cid: Option, #[serde(default)] - disposition: Option, + pub disposition: Option, #[serde(default)] - headers: Value, + pub headers: Value, #[serde(default)] - language: Option>, + pub language: Option>, #[serde(default)] - location: Option, + pub location: Option, #[serde(default)] - name: Option, + pub name: Option, #[serde(default)] - part_id: Option, - size: u64, + pub part_id: Option, + pub size: u64, #[serde(alias = "type")] - content_type: String, + pub content_type: String, #[serde(default)] - sub_parts: Vec, + pub sub_parts: Vec, } impl Object for EmailObject {