diff options
author | Manos Pitsidianakis <el13635@mail.ntua.gr> | 2020-09-19 14:59:23 +0300 |
---|---|---|
committer | Manos Pitsidianakis <el13635@mail.ntua.gr> | 2020-09-19 14:59:23 +0300 |
commit | cfc380b47dbfb5c9bf015864461b437ea9e27db2 (patch) | |
tree | fab149b1b926a68ff0d64700f51bf844ed2b8615 /melib | |
parent | fba69d1e5df667032748d03d62251e57c966a00f (diff) |
melib/jmap: allow empty to,from etc fields in EmailObject
Diffstat (limited to 'melib')
-rw-r--r-- | melib/src/backends/jmap/objects/email.rs | 151 |
1 files changed, 74 insertions, 77 deletions
diff --git a/melib/src/backends/jmap/objects/email.rs b/melib/src/backends/jmap/objects/email.rs index 6fbe7f9d..cf3cb1f5 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<Id, bool>, + pub mailbox_ids: HashMap<Id, bool>, #[serde(default)] - size: u64, + pub size: u64, #[serde(default)] - received_at: String, + pub received_at: String, #[serde(default)] - message_id: Vec<String>, + pub message_id: Vec<String>, #[serde(default)] - to: SmallVec<[EmailAddress; 1]>, + pub to: Option<SmallVec<[EmailAddress; 1]>>, #[serde(default)] - bcc: Option<Vec<EmailAddress>>, + pub bcc: Option<Vec<EmailAddress>>, #[serde(default)] - reply_to: Option<Vec<EmailAddress>>, + pub reply_to: Option<Vec<EmailAddress>>, #[serde(default)] - cc: Option<SmallVec<[EmailAddress; 1]>>, + pub cc: Option<SmallVec<[EmailAddress; 1]>>, #[serde(default)] - sender: Option<Vec<EmailAddress>>, + pub sender: Option<Vec<EmailAddress>>, #[serde(default)] - from: SmallVec<[EmailAddress; 1]>, + pub from: Option<SmallVec<[EmailAddress; 1]>>, #[serde(default)] - in_reply_to: Option<Vec<String>>, + pub in_reply_to: Option<Vec<String>>, #[serde(default)] - references: Option<Vec<String>>, + pub references: Option<Vec<String>>, #[serde(default)] - keywords: HashMap<String, bool>, + pub keywords: HashMap<String, bool>, #[serde(default)] - attached_emails: Option<Id>, + pub attached_emails: Option<Id>, #[serde(default)] - attachments: Vec<Value>, + pub attachments: Vec<Value>, #[serde(default)] - has_attachment: bool, + pub has_attachment: bool, #[serde(default)] #[serde(deserialize_with = "deserialize_header")] - headers: HashMap<String, String>, + pub headers: HashMap<String, String>, #[serde(default)] - html_body: Vec<HtmlBody>, + pub html_body: Vec<HtmlBody>, #[serde(default)] - preview: Option<String>, + pub preview: Option<String>, #[serde(default)] - sent_at: Option<String>, + pub sent_at: Option<String>, #[serde(default)] - subject: Option<String>, + pub subject: Option<String>, #[serde(default)] - text_body: Vec<TextBody>, + pub text_body: Vec<TextBody>, #[serde(default)] - thread_id: Id, + pub thread_id: Id, #[serde(flatten)] - extra: HashMap<String, Value>, + pub extra: HashMap<String, Value>, } 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<String>, +pub struct EmailAddress { + pub email: String, + pub name: Option<String>, } impl Into<crate::email::Address> for EmailAddress { @@ -269,18 +269,22 @@ impl std::convert::From<EmailObject> 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::<SmallVec<[crate::email::Address; 1]>>(), - ); - env.set_to( - std::mem::replace(&mut t.to, SmallVec::new()) - .into_iter() - .map(|addr| addr.into()) - .collect::<SmallVec<[crate::email::Address; 1]>>(), - ); + if let Some(ref mut from) = t.from { + env.set_from( + std::mem::replace(from, SmallVec::new()) + .into_iter() + .map(|addr| addr.into()) + .collect::<SmallVec<[crate::email::Address; 1]>>(), + ); + } + if let Some(ref mut to) = t.to { + env.set_to( + std::mem::replace(to, SmallVec::new()) + .into_iter() + .map(|addr| addr.into()) + .collect::<SmallVec<[crate::email::Address; 1]>>(), + ); + } if let Some(ref mut cc) = t.cc { env.set_cc( @@ -300,15 +304,8 @@ impl std::convert::From<EmailObject> 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<EmailObject> 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<String>, + pub cid: Option<String>, #[serde(default)] - disposition: Option<String>, + pub disposition: Option<String>, #[serde(default)] - headers: Value, + pub headers: Value, #[serde(default)] - language: Option<Vec<String>>, + pub language: Option<Vec<String>>, #[serde(default)] - location: Option<String>, + pub location: Option<String>, #[serde(default)] - name: Option<String>, + pub name: Option<String>, #[serde(default)] - part_id: Option<String>, - size: u64, + pub part_id: Option<String>, + pub size: u64, #[serde(alias = "type")] - content_type: String, + pub content_type: String, #[serde(default)] - sub_parts: Vec<Value>, + pub sub_parts: Vec<Value>, } #[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<String>, + pub cid: Option<String>, #[serde(default)] - disposition: Option<String>, + pub disposition: Option<String>, #[serde(default)] - headers: Value, + pub headers: Value, #[serde(default)] - language: Option<Vec<String>>, + pub language: Option<Vec<String>>, #[serde(default)] - location: Option<String>, + pub location: Option<String>, #[serde(default)] - name: Option<String>, + pub name: Option<String>, #[serde(default)] - part_id: Option<String>, - size: u64, + pub part_id: Option<String>, + pub size: u64, #[serde(alias = "type")] - content_type: String, + pub content_type: String, #[serde(default)] - sub_parts: Vec<Value>, + pub sub_parts: Vec<Value>, } impl Object for EmailObject { |