diff --git a/melib/src/jmap/backend_mailbox.rs b/melib/src/jmap/backend_mailbox.rs index 36ea836e..7def8762 100644 --- a/melib/src/jmap/backend_mailbox.rs +++ b/melib/src/jmap/backend_mailbox.rs @@ -25,10 +25,8 @@ use crate::{ backends::{BackendMailbox, LazyCountSet, MailboxPermissions, SpecialUsageMailbox}, error::Result, jmap::{ - objects::{ - email::EmailObject, - mailbox::{JmapRights, MailboxObject}, - }, + email::EmailObject, + mailbox::{JmapRights, MailboxObject}, rfc8620::{Id, State}, }, Mailbox, MailboxHash, diff --git a/melib/src/jmap/connection.rs b/melib/src/jmap/connection.rs index bac53345..4c709797 100644 --- a/melib/src/jmap/connection.rs +++ b/melib/src/jmap/connection.rs @@ -33,14 +33,12 @@ use crate::{ error::{Error, NetworkErrorKind, Result}, jmap::{ deserialize_from_str, - objects::{ - email::{ - EmailChanges, EmailFilterCondition, EmailGet, EmailObject, EmailQueryChanges, - EmailQueryChangesResponse, - }, - identity::{IdentityGet, IdentityObject, IdentitySet}, - mailbox::MailboxObject, + email::{ + EmailChanges, EmailFilterCondition, EmailGet, EmailObject, EmailQueryChanges, + EmailQueryChangesResponse, }, + identity::{IdentityGet, IdentityObject, IdentitySet}, + mailbox::MailboxObject, protocol::{self, JmapMailCapability, Request}, rfc8620::{ argument::Argument, capabilities::*, filters::Filter, AddedItem, Changes, diff --git a/melib/src/jmap/objects/email.rs b/melib/src/jmap/email.rs similarity index 99% rename from melib/src/jmap/objects/email.rs rename to melib/src/jmap/email.rs index a179ef0d..2fca0459 100644 --- a/melib/src/jmap/objects/email.rs +++ b/melib/src/jmap/email.rs @@ -30,7 +30,7 @@ use crate::{ email::address::{Address, MailboxAddress}, jmap::{ deserialize_from_str, - objects::{mailbox::MailboxObject, thread::ThreadObject}, + mailbox::MailboxObject, protocol::Method, rfc8620::{ bool_false, @@ -38,6 +38,7 @@ use crate::{ u64_zero, BlobObject, Changes, Get, Id, Object, Query, QueryChanges, QueryChangesResponse, ResultField, Set, }, + thread::ThreadObject, UtcDate, }, utils::datetime, diff --git a/melib/src/jmap/objects/email/import.rs b/melib/src/jmap/email/import.rs similarity index 98% rename from melib/src/jmap/objects/email/import.rs rename to melib/src/jmap/email/import.rs index 10dc59a9..6366d06d 100644 --- a/melib/src/jmap/objects/email/import.rs +++ b/melib/src/jmap/email/import.rs @@ -26,9 +26,11 @@ use crate::{ error::Result, jmap::{ deserialize_from_str, - objects::{email::EmailObject, mailbox::MailboxObject, thread::ThreadObject}, + email::EmailObject, + mailbox::MailboxObject, protocol::Method, rfc8620::{Account, BlobObject, Id, State}, + thread::ThreadObject, }, }; diff --git a/melib/src/jmap/objects/identity.rs b/melib/src/jmap/identity.rs similarity index 99% rename from melib/src/jmap/objects/identity.rs rename to melib/src/jmap/identity.rs index 5ba22f3b..609cca4f 100644 --- a/melib/src/jmap/objects/identity.rs +++ b/melib/src/jmap/identity.rs @@ -20,7 +20,7 @@ */ use crate::jmap::{ - objects::email::EmailAddress, + email::EmailAddress, protocol::Method, rfc8620::{Changes, Get, Id, Object, Set}, }; diff --git a/melib/src/jmap/objects/mailbox.rs b/melib/src/jmap/mailbox.rs similarity index 100% rename from melib/src/jmap/objects/mailbox.rs rename to melib/src/jmap/mailbox.rs diff --git a/melib/src/jmap/mod.rs b/melib/src/jmap/mod.rs index 5f233f1d..d8d7b7bc 100644 --- a/melib/src/jmap/mod.rs +++ b/melib/src/jmap/mod.rs @@ -98,8 +98,14 @@ use rfc8620::{ pub mod backend_mailbox; use backend_mailbox::JmapMailbox; +pub mod email; +pub mod identity; pub mod mailbox; -pub mod objects; +pub mod submission; +pub mod thread; + +#[cfg(test)] +mod tests; pub fn deserialize_from_str<'de, T: serde::de::Deserialize<'de>>(s: &'de str) -> Result { let jd = &mut serde_json::Deserializer::from_str(s); @@ -260,13 +266,13 @@ pub struct Store { pub main_identity: String, pub extra_identities: Vec, pub byte_cache: Arc>>, - pub id_store: Arc>>>, - pub reverse_id_store: Arc, EnvelopeHash>>>, + pub id_store: Arc>>>, + pub reverse_id_store: Arc, EnvelopeHash>>>, pub blob_id_store: Arc>>>, pub collection: Collection, pub mailboxes: Arc>>, pub mailboxes_index: Arc>>>, - pub mailbox_state: Arc>>, + pub mailbox_state: Arc>>, pub online_status: OnlineStatus, pub is_subscribed: Arc, pub core_capabilities: Arc>>, @@ -274,7 +280,7 @@ pub struct Store { } impl Store { - pub async fn add_envelope(&self, obj: objects::email::EmailObject) -> Envelope { + pub async fn add_envelope(&self, obj: email::EmailObject) -> Envelope { let mut flags = Flag::default(); let mut labels: IndexSet = IndexSet::new(); let id; @@ -335,7 +341,7 @@ impl Store { pub async fn remove_envelope( &self, - obj_id: Id, + obj_id: Id, ) -> Option<(EnvelopeHash, SmallVec<[MailboxHash; 8]>)> { let env_hash = self.reverse_id_store.lock().await.remove(&obj_id)?; self.id_store.lock().await.remove(&env_hash); @@ -517,7 +523,7 @@ impl MailBackend for JmapType { ) .await?; - let mailbox_id: Id = { + let mailbox_id: Id = { let mailboxes_lck = store.mailboxes.read().unwrap(); if let Some(mailbox) = mailboxes_lck.get(&mailbox_hash) { mailbox.id.clone() @@ -538,12 +544,12 @@ impl MailBackend for JmapType { Ok(s) => s, }; let mut req = Request::new(conn.request_no.clone()); - let creation_id: Id = "1".to_string().into(); + let creation_id: Id = "1".to_string().into(); - let import_call: objects::email::EmailImport = objects::email::EmailImport::new() + let import_call: email::EmailImport = email::EmailImport::new() .account_id(mail_account_id) .emails(indexmap! { - creation_id.clone() => objects::email::EmailImportObject::new() + creation_id.clone() => email::EmailImportObject::new() .blob_id(upload_response.blob_id) .mailbox_ids(indexmap! { mailbox_id => true @@ -561,16 +567,16 @@ impl MailBackend for JmapType { } Ok(s) => s, }; - let m = objects::email::EmailImportResponse::try_from(v.method_responses.remove(0)) - .map_err(|err| { - let ierr: Result = - deserialize_from_str(&res_text); + let m = email::EmailImportResponse::try_from(v.method_responses.remove(0)).map_err( + |err| { + let ierr: Result = deserialize_from_str(&res_text); if let Ok(err) = ierr { Error::new(format!("Could not save message: {:?}", err)) } else { err } - })?; + }, + )?; if let Some(err) = m.not_created.and_then(|m| m.get(&creation_id).cloned()) { return Err(Error::new(format!("Could not save message: {:?}", err))); @@ -604,23 +610,21 @@ impl MailBackend for JmapType { .clone(); let mut f = Filter::Condition( - objects::email::EmailFilterCondition::new() + email::EmailFilterCondition::new() .in_mailbox(Some(mailbox_id)) .into(), ); - f &= Filter::::from( - q, - ); + f &= Filter::::from(q); f } else { - Filter::::from(q) + Filter::::from(q) }; Ok(Box::pin(async move { let mut conn = connection.lock().await; conn.connect().await?; let mail_account_id = conn.session_guard().await?.mail_account_id(); - let email_call = objects::email::EmailQuery::new( + let email_call = email::EmailQuery::new( Query::new() .account_id(mail_account_id) .filter(Some(filter)) @@ -642,10 +646,8 @@ impl MailBackend for JmapType { Ok(s) => s, }; store.online_status.update_timestamp(None).await; - let m = QueryResponse::::try_from( - v.method_responses.remove(0), - )?; - let QueryResponse:: { ids, .. } = m; + let m = QueryResponse::::try_from(v.method_responses.remove(0))?; + let QueryResponse:: { ids, .. } = m; let ret = ids.into_iter().map(|id| id.into_hash()).collect(); Ok(ret) })) @@ -670,16 +672,16 @@ impl MailBackend for JmapType { Ok(Box::pin(async move { let mut conn = connection.lock().await; let mail_account_id = conn.session_guard().await?.mail_account_id(); - let mailbox_set_call = objects::mailbox::MailboxSet::new( - Set::::new() + let mailbox_set_call = mailbox::MailboxSet::new( + Set::::new() .account_id(mail_account_id) .create(Some({ - let id: Id = path.as_str().into(); + let id: Id = path.as_str().into(); indexmap! { - id.clone().into() => objects::mailbox::MailboxObject { + id.clone().into() => mailbox::MailboxObject { id, name: path.clone(), - ..objects::mailbox::MailboxObject::default() + ..mailbox::MailboxObject::default() } } })), @@ -767,7 +769,7 @@ impl MailBackend for JmapType { mailboxes_lck[&destination_mailbox_hash].id.clone(), ) }; - let mut update_map: IndexMap>, Value> = + let mut update_map: IndexMap>, Value> = IndexMap::default(); let mut update_keywords: IndexMap = IndexMap::default(); update_keywords.insert( @@ -795,8 +797,8 @@ impl MailBackend for JmapType { let conn = connection.lock().await; let mail_account_id = conn.session_guard().await?.mail_account_id(); - let email_set_call = objects::email::EmailSet::new( - Set::::new() + let email_set_call = email::EmailSet::new( + Set::::new() .account_id(mail_account_id) .update(Some(update_map)), ); @@ -816,8 +818,7 @@ impl MailBackend for JmapType { Ok(s) => s, }; store.online_status.update_timestamp(None).await; - let m = - SetResponse::::try_from(v.method_responses.remove(0))?; + let m = SetResponse::::try_from(v.method_responses.remove(0))?; if let Some(ids) = m.not_updated { if !ids.is_empty() { return Err(Error::new(format!( @@ -842,12 +843,11 @@ impl MailBackend for JmapType { let store = self.store.clone(); let connection = self.connection.clone(); Ok(Box::pin(async move { - let mut update_map: IndexMap>, Value> = + let mut update_map: IndexMap>, Value> = IndexMap::default(); - let mut ids: Vec> = + let mut ids: Vec> = Vec::with_capacity(env_hashes.rest.len() + 1); - let mut id_map: IndexMap, EnvelopeHash> = - IndexMap::default(); + let mut id_map: IndexMap, EnvelopeHash> = IndexMap::default(); let mut update_keywords: IndexMap = IndexMap::default(); for op in flags.iter() { match op { @@ -908,15 +908,15 @@ impl MailBackend for JmapType { let conn = connection.lock().await; let mail_account_id = conn.session_guard().await?.mail_account_id(); - let email_set_call = objects::email::EmailSet::new( - Set::::new() + let email_set_call = email::EmailSet::new( + Set::::new() .account_id(mail_account_id.clone()) .update(Some(update_map)), ); let mut req = Request::new(conn.request_no.clone()); req.add_call(&email_set_call).await; - let email_call = objects::email::EmailGet::new( + let email_call = email::EmailGet::new( Get::new() .ids(Some(Argument::Value(ids))) .account_id(mail_account_id) @@ -944,8 +944,7 @@ impl MailBackend for JmapType { Ok(s) => s, }; store.online_status.update_timestamp(None).await; - let m = - SetResponse::::try_from(v.method_responses.remove(0))?; + let m = SetResponse::::try_from(v.method_responses.remove(0))?; if let Some(ids) = m.not_updated { return Err(Error::new( ids.into_iter() @@ -964,10 +963,8 @@ impl MailBackend for JmapType { } drop(tag_index_lck); } - let e = GetResponse::::try_from( - v.method_responses.pop().unwrap(), - )?; - let GetResponse:: { list, state, .. } = e; + let e = GetResponse::::try_from(v.method_responses.pop().unwrap())?; + let GetResponse:: { list, state, .. } = e; { let (is_empty, is_equal) = { let mailboxes_lck = conn.store.mailboxes.read().unwrap(); @@ -984,11 +981,7 @@ impl MailBackend for JmapType { }; if is_empty { let mut mailboxes_lck = conn.store.mailboxes.write().unwrap(); - debug!( - "{:?}: inserting state {}", - objects::email::EmailObject::NAME, - &state - ); + debug!("{:?}: inserting state {}", email::EmailObject::NAME, &state); mailboxes_lck.entry(mailbox_hash).and_modify(|mbox| { *mbox.email_state.lock().unwrap() = Some(state); }); @@ -1040,31 +1033,30 @@ impl MailBackend for JmapType { // "$draft" flag and moves it from the Drafts folder to the Sent folder. let (draft_mailbox_id, sent_mailbox_id) = { let mailboxes_lck = store.mailboxes.read().unwrap(); - let find_fn = - |usage: SpecialUsageMailbox| -> Result> { - if let Some(sent_folder) = - mailboxes_lck.values().find(|m| m.special_usage() == usage) - { - Ok(sent_folder.id.clone()) - } else if let Some(sent_folder) = mailboxes_lck + let find_fn = |usage: SpecialUsageMailbox| -> Result> { + if let Some(sent_folder) = + mailboxes_lck.values().find(|m| m.special_usage() == usage) + { + Ok(sent_folder.id.clone()) + } else if let Some(sent_folder) = mailboxes_lck + .values() + .find(|m| m.special_usage() == SpecialUsageMailbox::Inbox) + { + Ok(sent_folder.id.clone()) + } else { + Ok(mailboxes_lck .values() - .find(|m| m.special_usage() == SpecialUsageMailbox::Inbox) - { - Ok(sent_folder.id.clone()) - } else { - Ok(mailboxes_lck - .values() - .next() - .ok_or_else(|| { - Error::new(format!( - "Account `{}` has no mailboxes.", - store.account_name - )) - })? - .id - .clone()) - } - }; + .next() + .ok_or_else(|| { + Error::new(format!( + "Account `{}` has no mailboxes.", + store.account_name + )) + })? + .id + .clone()) + } + }; (find_fn(SpecialUsageMailbox::Drafts)?, { if let Some(h) = mailbox_hash { @@ -1107,11 +1099,11 @@ impl MailBackend for JmapType { }; { let mut req = Request::new(conn.request_no.clone()); - let creation_id: Id = "newid".into(); - let import_call: objects::email::EmailImport = objects::email::EmailImport::new() + let creation_id: Id = "newid".into(); + let import_call: email::EmailImport = email::EmailImport::new() .account_id(mail_account_id.clone()) .emails(indexmap! { - creation_id => objects::email::EmailImportObject::new() + creation_id => email::EmailImportObject::new() .blob_id(upload_response.blob_id) .keywords(indexmap! { "$draft".to_string() => true, @@ -1147,11 +1139,11 @@ impl MailBackend for JmapType { ); let mut req = Request::new(conn.request_no.clone()); - let subm_set_call = objects::submission::EmailSubmissionSet::new( - Set::::new() + let subm_set_call = submission::EmailSubmissionSet::new( + Set::::new() .account_id(mail_account_id.clone()) .create(Some(indexmap! { - Argument::from(Id::from("k1490")) => objects::submission::EmailSubmissionObject::new( + Argument::from(Id::from("k1490")) => submission::EmailSubmissionObject::new( /* account_id: */ mail_account_id, /* identity_id: */ identity_id, /* email_id: */ email_id, diff --git a/melib/src/jmap/objects.rs b/melib/src/jmap/objects.rs deleted file mode 100644 index cd5b5af4..00000000 --- a/melib/src/jmap/objects.rs +++ /dev/null @@ -1,29 +0,0 @@ -/* - * meli - jmap module. - * - * Copyright 2019 Manos Pitsidianakis - * - * This file is part of meli. - * - * meli is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * meli is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with meli. If not, see . - */ - -pub mod email; -pub mod identity; -pub mod mailbox; -pub mod submission; -pub mod thread; - -#[cfg(test)] -mod tests; diff --git a/melib/src/jmap/protocol.rs b/melib/src/jmap/protocol.rs index fe09f775..b47117e5 100644 --- a/melib/src/jmap/protocol.rs +++ b/melib/src/jmap/protocol.rs @@ -37,10 +37,8 @@ use crate::{ jmap::{ backend_mailbox::JmapMailbox, deserialize_from_str, - objects::{ - email::{EmailFilterCondition, EmailGet, EmailObject, EmailQuery}, - mailbox::{MailboxGet, MailboxObject}, - }, + email::{EmailFilterCondition, EmailGet, EmailObject, EmailQuery}, + mailbox::{MailboxGet, MailboxObject}, rfc8620::{ argument::Argument, capabilities::*, filters::Filter, Get, GetResponse, Id, MethodResponse, Object, Query, QueryResponse, State, diff --git a/melib/src/jmap/rfc8620/tests.rs b/melib/src/jmap/rfc8620/tests.rs index b9d5608d..1a4e2123 100644 --- a/melib/src/jmap/rfc8620/tests.rs +++ b/melib/src/jmap/rfc8620/tests.rs @@ -26,13 +26,11 @@ use futures::lock::Mutex as FutureMutex; use serde_json::json; use crate::jmap::{ - objects::{ - email::{EmailImport, EmailImportObject, EmailObject}, - mailbox::MailboxObject, - submission::{EmailSubmissionObject, EmailSubmissionSet}, - }, + email::{EmailImport, EmailImportObject, EmailObject}, + mailbox::MailboxObject, protocol::Request, rfc8620::{argument::Argument, BlobObject, Id, ResultField, Set}, + submission::{EmailSubmissionObject, EmailSubmissionSet}, }; #[test] diff --git a/melib/src/jmap/session.rs b/melib/src/jmap/session.rs index 667c193e..e94e500d 100644 --- a/melib/src/jmap/session.rs +++ b/melib/src/jmap/session.rs @@ -26,7 +26,7 @@ use serde_json::Value; use url::Url; use crate::jmap::{ - objects::identity::IdentityObject, + identity::IdentityObject, protocol::JmapMailCapability, rfc8620::{Account, Id, Object, State}, }; diff --git a/melib/src/jmap/objects/submission.rs b/melib/src/jmap/submission.rs similarity index 99% rename from melib/src/jmap/objects/submission.rs rename to melib/src/jmap/submission.rs index 22580d7e..067690ec 100644 --- a/melib/src/jmap/objects/submission.rs +++ b/melib/src/jmap/submission.rs @@ -24,9 +24,11 @@ use serde::ser::{Serialize, SerializeStruct, Serializer}; use serde_json::Value; use crate::jmap::{ - objects::{email::EmailObject, identity::IdentityObject, thread::ThreadObject}, + email::EmailObject, + identity::IdentityObject, protocol::Method, rfc8620::{argument::Argument, Account, BlobObject, Id, Object, PatchObject, Set}, + thread::ThreadObject, }; /// `UndoStatus` diff --git a/melib/src/jmap/objects/tests.rs b/melib/src/jmap/tests.rs similarity index 94% rename from melib/src/jmap/objects/tests.rs rename to melib/src/jmap/tests.rs index 8644e93c..9f2cdcc2 100644 --- a/melib/src/jmap/objects/tests.rs +++ b/melib/src/jmap/tests.rs @@ -27,7 +27,7 @@ fn test_jmap_query() { use futures::lock::Mutex as FutureMutex; use crate::jmap::{ - objects::email::{EmailFilterCondition, EmailObject, EmailQuery}, + email::{EmailFilterCondition, EmailObject, EmailQuery}, protocol::Request, rfc8620::{filters::Filter, Query}, }; @@ -76,12 +76,10 @@ fn test_jmap_undo_status() { use serde_json::json; use crate::jmap::{ - objects::{ - email::EmailObject, - identity::IdentityObject, - submission::{EmailSubmissionObject, UndoStatus}, - }, + email::EmailObject, + identity::IdentityObject, rfc8620::{Account, Id}, + submission::{EmailSubmissionObject, UndoStatus}, }; let account_id: Id = "blahblah".into(); let ident_id: Id = "sdusssssss".into(); @@ -141,12 +139,10 @@ fn test_jmap_email_submission_object() { use serde_json::json; use crate::jmap::{ - objects::{ - email::{EmailImport, EmailObject}, - identity::IdentityObject, - submission::{EmailSubmissionObject, UndoStatus}, - }, + email::{EmailImport, EmailObject}, + identity::IdentityObject, rfc8620::{argument::Argument, Account, Id, ResultField}, + submission::{EmailSubmissionObject, UndoStatus}, }; let account_id: Id = "blahblah".into(); let ident_id: Id = "sdusssssss".into(); @@ -204,7 +200,7 @@ fn test_jmap_identity_methods() { use serde_json::json; use crate::jmap::{ - objects::identity::{IdentityGet, IdentityObject, IdentitySet}, + identity::{IdentityGet, IdentityObject, IdentitySet}, protocol::Request, rfc8620::{Id, Set}, }; diff --git a/melib/src/jmap/objects/thread.rs b/melib/src/jmap/thread.rs similarity index 97% rename from melib/src/jmap/objects/thread.rs rename to melib/src/jmap/thread.rs index 02d395b9..42fe2ee4 100644 --- a/melib/src/jmap/objects/thread.rs +++ b/melib/src/jmap/thread.rs @@ -22,7 +22,7 @@ use std::marker::PhantomData; use crate::jmap::{ - objects::email::{EmailGet, EmailObject}, + email::{EmailGet, EmailObject}, protocol::Method, rfc8620::{Changes, Get, Id, Object, ResultField}, };