diff --git a/src/client.rs b/src/client.rs index 842d2be..3ce719c 100644 --- a/src/client.rs +++ b/src/client.rs @@ -25,7 +25,7 @@ use crate::{ const DEFAULT_TIMEOUT_MS: u64 = 10 * 1000; static USER_AGENT: &str = concat!("jmap-client/", env!("CARGO_PKG_VERSION")); -#[derive(Debug)] +#[derive(Debug, PartialEq, Eq)] pub enum Credentials { Basic(String), Bearer(String), diff --git a/src/email/helpers.rs b/src/email/helpers.rs index eb9e6a3..4f6dbae 100644 --- a/src/email/helpers.rs +++ b/src/email/helpers.rs @@ -58,10 +58,7 @@ impl Client { V: IntoIterator, W: Into, { - let blob_id = self - .upload(account_id.into(), raw_message, None) - .await? - .take_blob_id(); + let blob_id = self.upload(None, raw_message, None).await?.take_blob_id(); let mut request = self.build(); let import_request = request .import_email() diff --git a/src/email/query.rs b/src/email/query.rs index cf701b4..13d7521 100644 --- a/src/email/query.rs +++ b/src/email/query.rs @@ -108,6 +108,10 @@ pub enum Filter { #[serde(rename = "sentAfter")] value: DateTime, }, + InThread { + #[serde(rename = "inThread")] + value: String, + }, } #[derive(Serialize, Debug, Clone)] @@ -281,6 +285,12 @@ impl Filter { value: from_timestamp(value), } } + + pub fn in_thread(value: impl Into) -> Self { + Filter::InThread { + value: value.into(), + } + } } impl Comparator { diff --git a/src/event_source/stream.rs b/src/event_source/stream.rs index 7c5f0be..d3dddaf 100644 --- a/src/event_source/stream.rs +++ b/src/event_source/stream.rs @@ -62,7 +62,7 @@ impl Client { let mut stream = Client::handle_error( reqwest::Client::builder() - .timeout(Duration::from_millis(self.timeout())) + .connect_timeout(Duration::from_millis(self.timeout())) .default_headers(headers) .build()? .get(event_source_url) diff --git a/src/mailbox/get.rs b/src/mailbox/get.rs index 197b009..e2c2ce1 100644 --- a/src/mailbox/get.rs +++ b/src/mailbox/get.rs @@ -105,14 +105,14 @@ impl MailboxRights { (self.may_read_items, ACL::ReadItems), (self.may_add_items, ACL::AddItems), (self.may_remove_items, ACL::RemoveItems), - (self.may_set_seen, ACL::SetSeen), - (self.may_set_keywords, ACL::SetKeywords), + (self.may_set_seen, ACL::ModifyItems), + (self.may_set_keywords, ACL::ModifyItems), (self.may_create_child, ACL::CreateChild), (self.may_rename, ACL::Modify), (self.may_delete, ACL::Delete), (self.may_submit, ACL::Submit), ] { - if is_set { + if is_set && !acl_list.contains(&acl) { acl_list.push(acl); } } diff --git a/src/mailbox/mod.rs b/src/mailbox/mod.rs index a8280c1..410f48d 100644 --- a/src/mailbox/mod.rs +++ b/src/mailbox/mod.rs @@ -103,7 +103,7 @@ pub(crate) enum ACLPatch { Set(bool), } -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "lowercase")] pub enum Role { #[serde(rename = "archive", alias = "ARCHIVE")] diff --git a/src/mailbox/set.rs b/src/mailbox/set.rs index cf568f5..42a91b2 100644 --- a/src/mailbox/set.rs +++ b/src/mailbox/set.rs @@ -62,10 +62,9 @@ impl Mailbox { } pub fn acl_set(&mut self, id: &str, acl: ACL, set: bool) -> &mut Self { - self.acl_patch.get_or_insert_with(HashMap::new).insert( - format!("acl/{}/{}", id, acl.to_string()), - ACLPatch::Set(set), - ); + self.acl_patch + .get_or_insert_with(HashMap::new) + .insert(format!("acl/{}/{}", id, acl), ACLPatch::Set(set)); self } } diff --git a/src/principal/mod.rs b/src/principal/mod.rs index 03f0563..e18ee5d 100644 --- a/src/principal/mod.rs +++ b/src/principal/mod.rs @@ -104,12 +104,8 @@ pub enum ACL { CreateChild = 7, #[serde(rename = "administer")] Administer = 8, - #[serde(rename = "setSeen")] - SetSeen = 9, - #[serde(rename = "setKeywords")] - SetKeywords = 10, #[serde(rename = "submit")] - Submit = 11, + Submit = 10, } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] @@ -171,8 +167,6 @@ impl Display for ACL { ACL::RemoveItems => write!(f, "removeItems"), ACL::CreateChild => write!(f, "createChild"), ACL::Administer => write!(f, "administer"), - ACL::SetSeen => write!(f, "setSeen"), - ACL::SetKeywords => write!(f, "setKeywords"), ACL::Submit => write!(f, "submit"), } }