diff --git a/src/blob/copy.rs b/src/blob/copy.rs index e9dcfdf..8ea6bed 100644 --- a/src/blob/copy.rs +++ b/src/blob/copy.rs @@ -2,7 +2,7 @@ use std::collections::HashMap; use serde::{Deserialize, Serialize}; -use crate::core::set::SetError; +use crate::core::{set::SetError, RequestParams}; #[derive(Debug, Clone, Serialize)] pub struct CopyBlobRequest { @@ -27,10 +27,10 @@ pub struct CopyBlobResponse { } impl CopyBlobRequest { - pub fn new(from_account_id: String, account_id: String) -> Self { + pub fn new(params: RequestParams, from_account_id: String) -> Self { CopyBlobRequest { from_account_id, - account_id, + account_id: params.account_id, blob_ids: vec![], } } diff --git a/src/blob/helpers.rs b/src/blob/helpers.rs new file mode 100644 index 0000000..76a65bd --- /dev/null +++ b/src/blob/helpers.rs @@ -0,0 +1,20 @@ +use crate::{ + core::request::{Arguments, Request}, + Method, +}; + +use super::copy::{CopyBlobRequest, CopyBlobResponse}; + +impl Request<'_> { + pub fn copy_blob(&mut self, from_account_id: impl Into) -> &mut CopyBlobRequest { + self.add_method_call( + Method::CopyBlob, + Arguments::blob_copy(self.params(Method::CopyBlob), from_account_id.into()), + ) + .blob_copy_mut() + } + + pub async fn send_copy_blob(self) -> crate::Result { + self.send_single().await + } +} diff --git a/src/blob/mod.rs b/src/blob/mod.rs index 4b30f2e..620b9ae 100644 --- a/src/blob/mod.rs +++ b/src/blob/mod.rs @@ -2,6 +2,7 @@ use crate::core::session::URLParser; pub mod copy; pub mod download; +pub mod helpers; pub mod upload; pub enum URLParameter { diff --git a/src/client.rs b/src/client.rs index eb41c8f..8954ae7 100644 --- a/src/client.rs +++ b/src/client.rs @@ -188,7 +188,7 @@ impl Client { #[cfg(test)] mod tests { - use crate::email::{EmailBodyPart, Header, Property}; + use crate::email::EmailBodyPart; #[test] fn test_serialize() { diff --git a/src/core/changes.rs b/src/core/changes.rs index 8f66259..ade0a27 100644 --- a/src/core/changes.rs +++ b/src/core/changes.rs @@ -1,5 +1,7 @@ use serde::{Deserialize, Serialize}; +use super::RequestParams; + #[derive(Debug, Clone, Serialize)] pub struct ChangesRequest { #[serde(rename = "accountId")] @@ -38,9 +40,9 @@ pub struct ChangesResponse { } impl ChangesRequest { - pub fn new(account_id: String, since_state: String) -> Self { + pub fn new(params: RequestParams, since_state: String) -> Self { ChangesRequest { - account_id, + account_id: params.account_id, since_state, max_changes: None, } diff --git a/src/core/copy.rs b/src/core/copy.rs index e26c706..6fab1c4 100644 --- a/src/core/copy.rs +++ b/src/core/copy.rs @@ -2,7 +2,10 @@ use std::{collections::HashMap, fmt::Display}; use serde::{Deserialize, Serialize}; -use super::set::{Create, SetError}; +use super::{ + set::{Create, SetError}, + RequestParams, +}; #[derive(Debug, Clone, Serialize)] pub struct CopyRequest { @@ -53,11 +56,11 @@ pub struct CopyResponse { } impl CopyRequest { - pub fn new(from_account_id: String, account_id: String) -> Self { + pub fn new(params: RequestParams, from_account_id: String) -> Self { CopyRequest { from_account_id, if_from_in_state: None, - account_id, + account_id: params.account_id, if_in_state: None, create: HashMap::new(), on_success_destroy_original: false, diff --git a/src/core/get.rs b/src/core/get.rs index f476ee3..3108ee4 100644 --- a/src/core/get.rs +++ b/src/core/get.rs @@ -1,9 +1,16 @@ +use std::fmt::Display; + use serde::{Deserialize, Serialize}; -use super::request::ResultReference; +use crate::Method; + +use super::{request::ResultReference, RequestParams}; #[derive(Debug, Clone, Serialize)] -pub struct GetRequest { +pub struct GetRequest { + #[serde(skip)] + method: (Method, usize), + #[serde(rename = "accountId")] account_id: String, @@ -35,10 +42,11 @@ pub struct GetResponse { not_found: Vec, } -impl GetRequest { - pub fn new(account_id: String) -> Self { +impl GetRequest { + pub fn new(params: RequestParams) -> Self { GetRequest { - account_id, + account_id: params.account_id, + method: (params.method, params.call_id), ids: None, ids_ref: None, properties: None, @@ -75,6 +83,14 @@ impl GetRequest { pub fn arguments(&mut self) -> &mut A { &mut self.arguments } + + pub fn result_reference(&self, property: T) -> ResultReference { + ResultReference::new( + self.method.0, + self.method.1, + format!("/list/*/{}", property), + ) + } } impl GetResponse { @@ -97,6 +113,9 @@ impl GetResponse { pub fn unwrap_list(&mut self) -> Vec { std::mem::take(&mut self.list) } + pub fn pop(&mut self) -> Option { + self.list.pop() + } pub fn unwrap_not_found(&mut self) -> Vec { std::mem::take(&mut self.not_found) diff --git a/src/core/mod.rs b/src/core/mod.rs index b77721f..02f3860 100644 --- a/src/core/mod.rs +++ b/src/core/mod.rs @@ -1,3 +1,5 @@ +use crate::Method; + pub mod changes; pub mod copy; pub mod error; @@ -8,3 +10,19 @@ pub mod request; pub mod response; pub mod session; pub mod set; + +pub struct RequestParams { + pub account_id: String, + pub method: Method, + pub call_id: usize, +} + +impl RequestParams { + pub fn new(account_id: impl Into, method: Method, call_id: usize) -> Self { + Self { + account_id: account_id.into(), + method, + call_id, + } + } +} diff --git a/src/core/query.rs b/src/core/query.rs index 1ad4f90..40fdd76 100644 --- a/src/core/query.rs +++ b/src/core/query.rs @@ -1,7 +1,14 @@ use serde::{Deserialize, Serialize}; +use crate::Method; + +use super::{request::ResultReference, RequestParams}; + #[derive(Debug, Clone, Serialize)] pub struct QueryRequest { + #[serde(skip)] + method: (Method, usize), + #[serde(rename = "accountId")] account_id: String, @@ -97,9 +104,10 @@ pub struct QueryResponse { } impl QueryRequest { - pub fn new(account_id: String) -> Self { + pub fn new(params: RequestParams) -> Self { QueryRequest { - account_id, + account_id: params.account_id, + method: (params.method, params.call_id), filter: None, sort: None, position: None, @@ -146,9 +154,18 @@ impl QueryRequest { self } + pub fn calculate_total(&mut self, calculate_total: bool) -> &mut Self { + self.calculate_total = Some(calculate_total); + self + } + pub fn arguments(&mut self) -> &mut A { &mut self.arguments } + + pub fn result_reference(&self) -> ResultReference { + ResultReference::new(self.method.0, self.method.1, "/ids") + } } impl QueryResponse { @@ -160,6 +177,14 @@ impl QueryResponse { &self.ids } + pub fn id(&self, pos: usize) -> &str { + self.ids[pos].as_str() + } + + pub fn unwrap_ids(self) -> Vec { + self.ids + } + pub fn total(&self) -> Option { self.total } @@ -190,8 +215,13 @@ impl Comparator { } } - pub fn is_ascending(mut self, is_ascending: bool) -> Self { - self.is_ascending = is_ascending; + pub fn descending(mut self) -> Self { + self.is_ascending = false; + self + } + + pub fn ascending(mut self) -> Self { + self.is_ascending = true; self } diff --git a/src/core/query_changes.rs b/src/core/query_changes.rs index edba477..a37213e 100644 --- a/src/core/query_changes.rs +++ b/src/core/query_changes.rs @@ -1,6 +1,9 @@ use serde::{Deserialize, Serialize}; -use super::query::{Comparator, Filter}; +use super::{ + query::{Comparator, Filter}, + RequestParams, +}; #[derive(Debug, Clone, Serialize)] pub struct QueryChangesRequest { @@ -56,9 +59,9 @@ pub struct AddedItem { } impl QueryChangesRequest { - pub fn new(account_id: String, since_query_state: String) -> Self { + pub fn new(params: RequestParams, since_query_state: String) -> Self { QueryChangesRequest { - account_id, + account_id: params.account_id, filter: None, sort: None, since_query_state, diff --git a/src/core/request.rs b/src/core/request.rs index f7666fd..4f51f7a 100644 --- a/src/core/request.rs +++ b/src/core/request.rs @@ -23,6 +23,7 @@ use super::{ query_changes::QueryChangesRequest, response::{MethodResponse, Response, SingleMethodResponse}, set::SetRequest, + RequestParams, }; #[derive(Serialize)] @@ -98,103 +99,103 @@ pub enum Arguments { } impl Arguments { - pub fn changes(account_id: String, since_state: String) -> Self { - Arguments::Changes(ChangesRequest::new(account_id, since_state)) + pub fn changes(params: RequestParams, since_state: String) -> Self { + Arguments::Changes(ChangesRequest::new(params, since_state)) } - pub fn push_get(account_id: String) -> Self { - Arguments::PushGet(GetRequest::new(account_id)) + pub fn push_get(params: RequestParams) -> Self { + Arguments::PushGet(GetRequest::new(params)) } - pub fn push_set(account_id: String) -> Self { - Arguments::PushSet(SetRequest::new(account_id)) + pub fn push_set(params: RequestParams) -> Self { + Arguments::PushSet(SetRequest::new(params)) } - pub fn blob_copy(from_account_id: String, account_id: String) -> Self { - Arguments::BlobCopy(CopyBlobRequest::new(from_account_id, account_id)) + pub fn blob_copy(params: RequestParams, from_account_id: String) -> Self { + Arguments::BlobCopy(CopyBlobRequest::new(params, from_account_id)) } - pub fn mailbox_get(account_id: String) -> Self { - Arguments::MailboxGet(GetRequest::new(account_id)) + pub fn mailbox_get(params: RequestParams) -> Self { + Arguments::MailboxGet(GetRequest::new(params)) } - pub fn mailbox_query(account_id: String) -> Self { - Arguments::MailboxQuery(QueryRequest::new(account_id)) + pub fn mailbox_query(params: RequestParams) -> Self { + Arguments::MailboxQuery(QueryRequest::new(params)) } - pub fn mailbox_query_changes(account_id: String, since_query_state: String) -> Self { - Arguments::MailboxQueryChanges(QueryChangesRequest::new(account_id, since_query_state)) + pub fn mailbox_query_changes(params: RequestParams, since_query_state: String) -> Self { + Arguments::MailboxQueryChanges(QueryChangesRequest::new(params, since_query_state)) } - pub fn mailbox_set(account_id: String) -> Self { - Arguments::MailboxSet(SetRequest::new(account_id)) + pub fn mailbox_set(params: RequestParams) -> Self { + Arguments::MailboxSet(SetRequest::new(params)) } - pub fn thread_get(account_id: String) -> Self { - Arguments::ThreadGet(GetRequest::new(account_id)) + pub fn thread_get(params: RequestParams) -> Self { + Arguments::ThreadGet(GetRequest::new(params)) } - pub fn email_get(account_id: String) -> Self { - Arguments::EmailGet(GetRequest::new(account_id)) + pub fn email_get(params: RequestParams) -> Self { + Arguments::EmailGet(GetRequest::new(params)) } - pub fn email_query(account_id: String) -> Self { - Arguments::EmailQuery(QueryRequest::new(account_id)) + pub fn email_query(params: RequestParams) -> Self { + Arguments::EmailQuery(QueryRequest::new(params)) } - pub fn email_query_changes(account_id: String, since_query_state: String) -> Self { - Arguments::EmailQueryChanges(QueryChangesRequest::new(account_id, since_query_state)) + pub fn email_query_changes(params: RequestParams, since_query_state: String) -> Self { + Arguments::EmailQueryChanges(QueryChangesRequest::new(params, since_query_state)) } - pub fn email_set(account_id: String) -> Self { - Arguments::EmailSet(SetRequest::new(account_id)) + pub fn email_set(params: RequestParams) -> Self { + Arguments::EmailSet(SetRequest::new(params)) } - pub fn email_copy(from_account_id: String, account_id: String) -> Self { - Arguments::EmailCopy(CopyRequest::new(from_account_id, account_id)) + pub fn email_copy(params: RequestParams, from_account_id: String) -> Self { + Arguments::EmailCopy(CopyRequest::new(params, from_account_id)) } - pub fn email_import(account_id: String) -> Self { - Arguments::EmailImport(EmailImportRequest::new(account_id)) + pub fn email_import(params: RequestParams) -> Self { + Arguments::EmailImport(EmailImportRequest::new(params)) } - pub fn email_parse(account_id: String) -> Self { - Arguments::EmailParse(EmailParseRequest::new(account_id)) + pub fn email_parse(params: RequestParams) -> Self { + Arguments::EmailParse(EmailParseRequest::new(params)) } - pub fn identity_get(account_id: String) -> Self { - Arguments::IdentityGet(GetRequest::new(account_id)) + pub fn identity_get(params: RequestParams) -> Self { + Arguments::IdentityGet(GetRequest::new(params)) } - pub fn identity_set(account_id: String) -> Self { - Arguments::IdentitySet(SetRequest::new(account_id)) + pub fn identity_set(params: RequestParams) -> Self { + Arguments::IdentitySet(SetRequest::new(params)) } - pub fn email_submission_get(account_id: String) -> Self { - Arguments::EmailSubmissionGet(GetRequest::new(account_id)) + pub fn email_submission_get(params: RequestParams) -> Self { + Arguments::EmailSubmissionGet(GetRequest::new(params)) } - pub fn email_submission_query(account_id: String) -> Self { - Arguments::EmailSubmissionQuery(QueryRequest::new(account_id)) + pub fn email_submission_query(params: RequestParams) -> Self { + Arguments::EmailSubmissionQuery(QueryRequest::new(params)) } - pub fn email_submission_query_changes(account_id: String, since_query_state: String) -> Self { - Arguments::EmailSubmissionQueryChanges(QueryChangesRequest::new( - account_id, - since_query_state, - )) + pub fn email_submission_query_changes( + params: RequestParams, + since_query_state: String, + ) -> Self { + Arguments::EmailSubmissionQueryChanges(QueryChangesRequest::new(params, since_query_state)) } - pub fn email_submission_set(account_id: String) -> Self { - Arguments::EmailSubmissionSet(SetRequest::new(account_id)) + pub fn email_submission_set(params: RequestParams) -> Self { + Arguments::EmailSubmissionSet(SetRequest::new(params)) } - pub fn vacation_response_get(account_id: String) -> Self { - Arguments::VacationResponseGet(GetRequest::new(account_id)) + pub fn vacation_response_get(params: RequestParams) -> Self { + Arguments::VacationResponseGet(GetRequest::new(params)) } - pub fn vacation_response_set(account_id: String) -> Self { - Arguments::VacationResponseSet(SetRequest::new(account_id)) + pub fn vacation_response_set(params: RequestParams) -> Self { + Arguments::VacationResponseSet(SetRequest::new(params)) } pub fn changes_mut(&mut self) -> &mut ChangesRequest { @@ -431,308 +432,41 @@ impl<'x> Request<'x> { } } - fn add_method_call(&mut self, method: Method, arguments: Arguments) -> &mut Arguments { + pub fn params(&self, method: Method) -> RequestParams { + RequestParams { + account_id: self.default_account_id.clone(), + method, + call_id: self.method_calls.len(), + } + } + + pub fn add_method_call(&mut self, method: Method, arguments: Arguments) -> &mut Arguments { let call_id = format!("s{}", self.method_calls.len()); self.method_calls.push((method, arguments, call_id)); &mut self.method_calls.last_mut().unwrap().1 } - pub fn get_push(&mut self) -> &mut GetRequest { - self.add_method_call( - Method::GetPushSubscription, - Arguments::push_get(self.default_account_id.clone()), - ) - .push_get_mut() - } - - pub fn set_push(&mut self) -> &mut SetRequest, ()> { - self.add_method_call( - Method::SetPushSubscription, - Arguments::push_set(self.default_account_id.clone()), - ) - .push_set_mut() - } - - pub fn copy_blob( - &mut self, - from_account_id: impl Into, - account_id: impl Into, - ) -> &mut CopyBlobRequest { - self.add_method_call( - Method::CopyBlob, - Arguments::blob_copy(from_account_id.into(), account_id.into()), - ) - .blob_copy_mut() - } - - pub fn get_mailbox(&mut self) -> &mut GetRequest { - self.add_method_call( - Method::GetMailbox, - Arguments::mailbox_get(self.default_account_id.clone()), - ) - .mailbox_get_mut() - } - - pub fn changes_mailbox(&mut self, since_state: impl Into) -> &mut ChangesRequest { - self.add_method_call( - Method::ChangesMailbox, - Arguments::changes(self.default_account_id.clone(), since_state.into()), - ) - .changes_mut() - } - - pub fn query_mailbox( - &mut self, - ) -> &mut QueryRequest< - mailbox::query::Filter, - mailbox::query::Comparator, - mailbox::QueryArguments, - > { - self.add_method_call( - Method::QueryMailbox, - Arguments::mailbox_query(self.default_account_id.clone()), - ) - .mailbox_query_mut() - } - - pub fn query_mailbox_changes( - &mut self, - since_query_state: impl Into, - ) -> &mut QueryChangesRequest< - mailbox::query::Filter, - mailbox::query::Comparator, - mailbox::QueryArguments, - > { - self.add_method_call( - Method::QueryChangesMailbox, - Arguments::mailbox_query_changes( - self.default_account_id.clone(), - since_query_state.into(), - ), - ) - .mailbox_query_changes_mut() - } - - pub fn set_mailbox(&mut self) -> &mut SetRequest, mailbox::SetArguments> { - self.add_method_call( - Method::SetMailbox, - Arguments::mailbox_set(self.default_account_id.clone()), - ) - .mailbox_set_mut() - } - - pub fn get_thread(&mut self) -> &mut GetRequest { - self.add_method_call( - Method::GetThread, - Arguments::thread_get(self.default_account_id.clone()), - ) - .thread_get_mut() - } - - pub fn changes_thread(&mut self, since_state: impl Into) -> &mut ChangesRequest { - self.add_method_call( - Method::ChangesThread, - Arguments::changes(self.default_account_id.clone(), since_state.into()), - ) - .changes_mut() - } - pub fn get_email(&mut self) -> &mut GetRequest { - self.add_method_call( - Method::GetEmail, - Arguments::email_get(self.default_account_id.clone()), - ) - .email_get_mut() - } - - pub fn changes_email(&mut self, since_state: impl Into) -> &mut ChangesRequest { - self.add_method_call( - Method::ChangesEmail, - Arguments::changes(self.default_account_id.clone(), since_state.into()), - ) - .changes_mut() - } - - pub fn query_email( - &mut self, - ) -> &mut QueryRequest - { - self.add_method_call( - Method::QueryEmail, - Arguments::email_query(self.default_account_id.clone()), - ) - .email_query_mut() - } - - pub fn query_email_changes( - &mut self, - since_query_state: impl Into, - ) -> &mut QueryChangesRequest< - email::query::Filter, - email::query::Comparator, - email::QueryArguments, - > { - self.add_method_call( - Method::QueryChangesEmail, - Arguments::email_query_changes( - self.default_account_id.clone(), - since_query_state.into(), - ), - ) - .email_query_changes_mut() - } - - pub fn set_email(&mut self) -> &mut SetRequest, ()> { - self.add_method_call( - Method::SetEmail, - Arguments::email_set(self.default_account_id.clone()), - ) - .email_set_mut() - } - - pub fn copy_email( - &mut self, - from_account_id: impl Into, - account_id: impl Into, - ) -> &mut CopyRequest> { - self.add_method_call( - Method::CopyEmail, - Arguments::email_copy(from_account_id.into(), account_id.into()), - ) - .email_copy_mut() - } - - pub fn import_email(&mut self) -> &mut EmailImportRequest { - self.add_method_call( - Method::ImportEmail, - Arguments::email_import(self.default_account_id.clone()), - ) - .email_import_mut() - } - - pub fn parse_email(&mut self) -> &mut EmailParseRequest { - self.add_method_call( - Method::ParseEmail, - Arguments::email_parse(self.default_account_id.clone()), - ) - .email_parse_mut() - } - - pub fn get_identity(&mut self) -> &mut GetRequest { - self.add_method_call( - Method::GetIdentity, - Arguments::identity_get(self.default_account_id.clone()), - ) - .identity_get_mut() - } - - pub fn set_identity(&mut self) -> &mut SetRequest, ()> { - self.add_method_call( - Method::SetIdentity, - Arguments::identity_set(self.default_account_id.clone()), - ) - .identity_set_mut() - } - - pub fn get_email_submission(&mut self) -> &mut GetRequest { - if !self.using.contains(&URI::Submission) { - self.using.push(URI::Submission); + pub fn add_capability(&mut self, uri: URI) { + if !self.using.contains(&uri) { + self.using.push(uri); } - self.add_method_call( - Method::GetEmailSubmission, - Arguments::email_submission_get(self.default_account_id.clone()), - ) - .email_submission_get_mut() } - pub fn changes_email_submission( - &mut self, - since_state: impl Into, - ) -> &mut ChangesRequest { - if !self.using.contains(&URI::Submission) { - self.using.push(URI::Submission); - } - self.add_method_call( - Method::ChangesEmailSubmission, - Arguments::changes(self.default_account_id.clone(), since_state.into()), - ) - .changes_mut() - } - - pub fn query_email_submission( - &mut self, - ) -> &mut QueryRequest - { - if !self.using.contains(&URI::Submission) { - self.using.push(URI::Submission); - } - self.add_method_call( - Method::QueryEmailSubmission, - Arguments::email_submission_query(self.default_account_id.clone()), - ) - .email_submission_query_mut() - } - - pub fn query_email_submission_changes( - &mut self, - since_query_state: impl Into, - ) -> &mut QueryChangesRequest< - email_submission::query::Filter, - email_submission::query::Comparator, - (), - > { - if !self.using.contains(&URI::Submission) { - self.using.push(URI::Submission); - } - self.add_method_call( - Method::QueryChangesEmailSubmission, - Arguments::email_submission_query_changes( - self.default_account_id.clone(), - since_query_state.into(), - ), - ) - .email_submission_query_changes_mut() - } - - pub fn set_email_submission( - &mut self, - ) -> &mut SetRequest, email_submission::SetArguments> { - if !self.using.contains(&URI::Submission) { - self.using.push(URI::Submission); - } - self.add_method_call( - Method::SetEmailSubmission, - Arguments::email_submission_set(self.default_account_id.clone()), - ) - .email_submission_set_mut() - } - - pub fn get_vacation_response(&mut self) -> &mut GetRequest { - if !self.using.contains(&URI::VacationResponse) { - self.using.push(URI::VacationResponse); - } - self.add_method_call( - Method::GetVacationResponse, - Arguments::vacation_response_get(self.default_account_id.clone()), - ) - .vacation_response_get_mut() - } - - pub fn set_vacation_response(&mut self) -> &mut SetRequest, ()> { - if !self.using.contains(&URI::VacationResponse) { - self.using.push(URI::VacationResponse); - } - self.add_method_call( - Method::SetVacationResponse, - Arguments::vacation_response_set(self.default_account_id.clone()), - ) - .vacation_response_set_mut() - } - - pub fn result_reference(&self, path: impl Into) -> ResultReference { + pub fn last_result_reference(&self, path: impl Into) -> ResultReference { let last_method = self.method_calls.last().unwrap(); ResultReference { result_of: last_method.2.clone(), - name: last_method.0.clone(), + name: last_method.0, + path: path.into(), + } + } +} + +impl ResultReference { + pub fn new(method: Method, call_id: usize, path: impl Into) -> Self { + ResultReference { + result_of: format!("s{}", call_id), + name: method, path: path.into(), } } diff --git a/src/core/set.rs b/src/core/set.rs index 599764f..b97b843 100644 --- a/src/core/set.rs +++ b/src/core/set.rs @@ -7,7 +7,7 @@ use std::{ use crate::Error; -use super::request::ResultReference; +use super::{request::ResultReference, RequestParams}; #[derive(Debug, Clone, Serialize)] pub struct SetRequest { @@ -72,7 +72,7 @@ where U: Display, { #[serde(rename = "type")] - type_: SetErrorType, + pub type_: SetErrorType, description: Option, properties: Option>, } @@ -131,9 +131,9 @@ pub trait Create: Sized { } impl SetRequest { - pub fn new(account_id: String) -> Self { + pub fn new(params: RequestParams) -> Self { Self { - account_id, + account_id: params.account_id, if_in_state: None, create: None, update: None, @@ -166,6 +166,15 @@ impl SetRequest { .unwrap() } + pub fn create_item(&mut self, item: T) -> String { + let create_id = self.create.as_ref().map_or(0, |c| c.len()); + let create_id_str = format!("c{}", create_id); + self.create + .get_or_insert_with(HashMap::new) + .insert(create_id_str.clone(), item); + create_id_str + } + pub fn update(&mut self, id: impl Into) -> &mut T { let id: String = id.into(); self.update @@ -174,6 +183,12 @@ impl SetRequest { self.update.as_mut().unwrap().get_mut(&id).unwrap() } + pub fn update_item(&mut self, id: impl Into, item: T) { + self.update + .get_or_insert_with(HashMap::new) + .insert(id.into(), item); + } + pub fn destroy(&mut self, ids: U) -> &mut Self where U: IntoIterator, diff --git a/src/email/get.rs b/src/email/get.rs index b13c21a..490a22a 100644 --- a/src/email/get.rs +++ b/src/email/get.rs @@ -10,10 +10,18 @@ impl Email { self.id.as_ref().unwrap() } + pub fn unwrap_id(self) -> String { + self.id.unwrap() + } + pub fn blob_id(&self) -> &str { self.blob_id.as_ref().unwrap() } + pub fn unwrap_blob_id(self) -> String { + self.blob_id.unwrap() + } + pub fn thread_id(&self) -> &str { self.thread_id.as_ref().unwrap() } @@ -184,11 +192,11 @@ impl EmailBodyValue { } pub fn is_encoding_problem(&self) -> bool { - self.is_encoding_problem + self.is_encoding_problem.unwrap_or(false) } pub fn is_truncated(&self) -> bool { - self.is_truncated + self.is_truncated.unwrap_or(false) } } diff --git a/src/email/helpers.rs b/src/email/helpers.rs index e5a478a..0ef4081 100644 --- a/src/email/helpers.rs +++ b/src/email/helpers.rs @@ -1,26 +1,37 @@ use crate::{ client::Client, core::{ - query::{Comparator, Filter, QueryResponse}, - response::{EmailGetResponse, EmailSetResponse}, + changes::{ChangesRequest, ChangesResponse}, + copy::CopyRequest, + get::GetRequest, + query::{Comparator, Filter, QueryRequest, QueryResponse}, + query_changes::{QueryChangesRequest, QueryChangesResponse}, + request::{Arguments, Request}, + response::{EmailCopyResponse, EmailGetResponse, EmailSetResponse}, + set::SetRequest, }, + Method, Set, }; use super::{ - import::EmailImportResponse, parse::EmailParseResponse, BodyProperty, Email, Property, + import::{EmailImportRequest, EmailImportResponse}, + parse::{EmailParseRequest, EmailParseResponse}, + BodyProperty, Email, Property, }; impl Client { - pub async fn email_import( + pub async fn email_import( &mut self, raw_message: Vec, mailbox_ids: T, - keywords: Option, + keywords: Option, received_at: Option, ) -> crate::Result where T: IntoIterator, U: Into, + V: IntoIterator, + W: Into, { let blob_id = self.upload(raw_message, None).await?.unwrap_blob_id(); let mut request = self.build(); @@ -119,6 +130,16 @@ impl Client { .map(|mut r| r.unwrap_list().pop()) } + pub async fn email_changes( + &mut self, + since_state: impl Into, + max_changes: usize, + ) -> crate::Result> { + let mut request = self.build(); + request.changes_email(since_state).max_changes(max_changes); + request.send_single().await + } + pub async fn email_query( &mut self, filter: Option>>, @@ -164,3 +185,117 @@ impl Client { .and_then(|mut r| r.parsed(blob_id)) } } + +impl Request<'_> { + pub fn get_email(&mut self) -> &mut GetRequest { + self.add_method_call( + Method::GetEmail, + Arguments::email_get(self.params(Method::GetEmail)), + ) + .email_get_mut() + } + + pub async fn send_get_email(self) -> crate::Result { + self.send_single().await + } + + pub fn changes_email(&mut self, since_state: impl Into) -> &mut ChangesRequest { + self.add_method_call( + Method::ChangesEmail, + Arguments::changes(self.params(Method::ChangesEmail), since_state.into()), + ) + .changes_mut() + } + + pub async fn send_changes_email(self) -> crate::Result> { + self.send_single().await + } + + pub fn query_email( + &mut self, + ) -> &mut QueryRequest + { + self.add_method_call( + Method::QueryEmail, + Arguments::email_query(self.params(Method::QueryEmail)), + ) + .email_query_mut() + } + + pub async fn send_query_email(self) -> crate::Result { + self.send_single().await + } + + pub fn query_email_changes( + &mut self, + since_query_state: impl Into, + ) -> &mut QueryChangesRequest< + super::query::Filter, + super::query::Comparator, + super::QueryArguments, + > { + self.add_method_call( + Method::QueryChangesEmail, + Arguments::email_query_changes( + self.params(Method::QueryChangesEmail), + since_query_state.into(), + ), + ) + .email_query_changes_mut() + } + + pub async fn send_query_email_changes(self) -> crate::Result { + self.send_single().await + } + + pub fn set_email(&mut self) -> &mut SetRequest, ()> { + self.add_method_call( + Method::SetEmail, + Arguments::email_set(self.params(Method::SetEmail)), + ) + .email_set_mut() + } + + pub async fn send_set_email(self) -> crate::Result { + self.send_single().await + } + + pub fn copy_email( + &mut self, + from_account_id: impl Into, + ) -> &mut CopyRequest> { + self.add_method_call( + Method::CopyEmail, + Arguments::email_copy(self.params(Method::CopyEmail), from_account_id.into()), + ) + .email_copy_mut() + } + + pub async fn send_copy_email(self) -> crate::Result { + self.send_single().await + } + + pub fn import_email(&mut self) -> &mut EmailImportRequest { + self.add_method_call( + Method::ImportEmail, + Arguments::email_import(self.params(Method::ImportEmail)), + ) + .email_import_mut() + } + + pub async fn send_import_email(self) -> crate::Result { + self.send_single().await + } + + pub fn parse_email(&mut self) -> &mut EmailParseRequest { + self.add_method_call( + Method::ParseEmail, + Arguments::email_parse(self.params(Method::ParseEmail)), + ) + .email_parse_mut() + } + + pub async fn send_parse_email(self) -> crate::Result { + self.send_single().await + } +} diff --git a/src/email/import.rs b/src/email/import.rs index fae935b..c89de3f 100644 --- a/src/email/import.rs +++ b/src/email/import.rs @@ -7,6 +7,7 @@ use crate::{ core::{ request::ResultReference, set::{from_timestamp, SetError}, + RequestParams, }, Error, }; @@ -69,9 +70,9 @@ pub struct EmailImportResponse { } impl EmailImportRequest { - pub fn new(account_id: String) -> Self { + pub fn new(params: RequestParams) -> Self { EmailImportRequest { - account_id, + account_id: params.account_id, if_in_state: None, emails: HashMap::new(), } diff --git a/src/email/mod.rs b/src/email/mod.rs index a447741..70eeb7f 100644 --- a/src/email/mod.rs +++ b/src/email/mod.rs @@ -225,10 +225,12 @@ pub struct EmailBodyValue { value: String, #[serde(rename = "isEncodingProblem")] - is_encoding_problem: bool, + #[serde(skip_serializing_if = "Option::is_none")] + is_encoding_problem: Option, #[serde(rename = "isTruncated")] - is_truncated: bool, + #[serde(skip_serializing_if = "Option::is_none")] + is_truncated: Option, } #[derive(Debug, Clone, Serialize, Deserialize)] diff --git a/src/email/parse.rs b/src/email/parse.rs index 94d34ed..fae436b 100644 --- a/src/email/parse.rs +++ b/src/email/parse.rs @@ -2,7 +2,7 @@ use std::collections::HashMap; use serde::{Deserialize, Serialize}; -use crate::Error; +use crate::{core::RequestParams, Error}; use super::{BodyProperty, Email, Property}; @@ -55,9 +55,9 @@ pub struct EmailParseResponse { } impl EmailParseRequest { - pub fn new(account_id: String) -> Self { + pub fn new(params: RequestParams) -> Self { EmailParseRequest { - account_id, + account_id: params.account_id, blob_ids: Vec::new(), properties: None, body_properties: None, diff --git a/src/email/query.rs b/src/email/query.rs index 8fdb417..d67f1c6 100644 --- a/src/email/query.rs +++ b/src/email/query.rs @@ -224,14 +224,13 @@ impl Filter { } } - pub fn header(value: U) -> Self - where - U: IntoIterator, - V: Into, - { - Filter::Header { - value: value.into_iter().map(|v| v.into()).collect(), + pub fn header(header: impl Into, v: Option>) -> Self { + let mut value = Vec::with_capacity(2); + value.push(header.into()); + if let Some(v) = v { + value.push(v.into()); } + Filter::Header { value } } } diff --git a/src/email/set.rs b/src/email/set.rs index f3509c8..32f44b0 100644 --- a/src/email/set.rs +++ b/src/email/set.rs @@ -289,8 +289,8 @@ impl From for EmailBodyValue { fn from(value: String) -> Self { EmailBodyValue { value, - is_encoding_problem: false, - is_truncated: false, + is_encoding_problem: None, + is_truncated: None, _state: Default::default(), } } @@ -300,8 +300,8 @@ impl From<&str> for EmailBodyValue { fn from(value: &str) -> Self { EmailBodyValue { value: value.to_string(), - is_encoding_problem: false, - is_truncated: false, + is_encoding_problem: None, + is_truncated: None, _state: Default::default(), } } diff --git a/src/email_submission/helpers.rs b/src/email_submission/helpers.rs new file mode 100644 index 0000000..056c5fa --- /dev/null +++ b/src/email_submission/helpers.rs @@ -0,0 +1,97 @@ +use crate::{ + core::{ + changes::{ChangesRequest, ChangesResponse}, + get::GetRequest, + query::{QueryRequest, QueryResponse}, + query_changes::{QueryChangesRequest, QueryChangesResponse}, + request::{Arguments, Request}, + response::{EmailSubmissionGetResponse, EmailSubmissionSetResponse}, + set::SetRequest, + }, + Method, Set, URI, +}; + +use super::EmailSubmission; + +impl Request<'_> { + pub fn get_email_submission(&mut self) -> &mut GetRequest { + self.add_capability(URI::Submission); + self.add_method_call( + Method::GetEmailSubmission, + Arguments::email_submission_get(self.params(Method::GetEmailSubmission)), + ) + .email_submission_get_mut() + } + + pub async fn send_get_email_submission(self) -> crate::Result { + self.send_single().await + } + + pub fn changes_email_submission( + &mut self, + since_state: impl Into, + ) -> &mut ChangesRequest { + self.add_capability(URI::Submission); + self.add_method_call( + Method::ChangesEmailSubmission, + Arguments::changes( + self.params(Method::ChangesEmailSubmission), + since_state.into(), + ), + ) + .changes_mut() + } + + pub async fn send_changes_email_submission(self) -> crate::Result> { + self.send_single().await + } + + pub fn query_email_submission( + &mut self, + ) -> &mut QueryRequest { + self.add_capability(URI::Submission); + self.add_method_call( + Method::QueryEmailSubmission, + Arguments::email_submission_query(self.params(Method::QueryEmailSubmission)), + ) + .email_submission_query_mut() + } + + pub async fn send_query_email_submission(self) -> crate::Result { + self.send_single().await + } + + pub fn query_email_submission_changes( + &mut self, + since_query_state: impl Into, + ) -> &mut QueryChangesRequest { + self.add_capability(URI::Submission); + self.add_method_call( + Method::QueryChangesEmailSubmission, + Arguments::email_submission_query_changes( + self.params(Method::QueryChangesEmailSubmission), + since_query_state.into(), + ), + ) + .email_submission_query_changes_mut() + } + + pub async fn send_query_email_submission_changes(self) -> crate::Result { + self.send_single().await + } + + pub fn set_email_submission( + &mut self, + ) -> &mut SetRequest, super::SetArguments> { + self.add_capability(URI::Submission); + self.add_method_call( + Method::SetEmailSubmission, + Arguments::email_submission_set(self.params(Method::SetEmailSubmission)), + ) + .email_submission_set_mut() + } + + pub async fn send_set_email_submission(self) -> crate::Result { + self.send_single().await + } +} diff --git a/src/email_submission/mod.rs b/src/email_submission/mod.rs index 755efcd..635b81b 100644 --- a/src/email_submission/mod.rs +++ b/src/email_submission/mod.rs @@ -1,4 +1,5 @@ pub mod get; +pub mod helpers; pub mod query; pub mod set; diff --git a/src/identity/helpers.rs b/src/identity/helpers.rs new file mode 100644 index 0000000..d2036f3 --- /dev/null +++ b/src/identity/helpers.rs @@ -0,0 +1,37 @@ +use crate::{ + core::{ + get::GetRequest, + request::{Arguments, Request}, + response::{IdentityGetResponse, IdentitySetResponse}, + set::SetRequest, + }, + Method, Set, +}; + +use super::Identity; + +impl Request<'_> { + pub fn get_identity(&mut self) -> &mut GetRequest { + self.add_method_call( + Method::GetIdentity, + Arguments::identity_get(self.params(Method::GetIdentity)), + ) + .identity_get_mut() + } + + pub async fn send_get_identity(self) -> crate::Result { + self.send_single().await + } + + pub fn set_identity(&mut self) -> &mut SetRequest, ()> { + self.add_method_call( + Method::SetIdentity, + Arguments::identity_set(self.params(Method::SetIdentity)), + ) + .identity_set_mut() + } + + pub async fn send_set_identity(self) -> crate::Result { + self.send_single().await + } +} diff --git a/src/identity/mod.rs b/src/identity/mod.rs index f251669..3983b0b 100644 --- a/src/identity/mod.rs +++ b/src/identity/mod.rs @@ -1,4 +1,5 @@ pub mod get; +pub mod helpers; pub mod set; use std::fmt::Display; diff --git a/src/lib.rs b/src/lib.rs index ac2b01b..706f50b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -33,7 +33,7 @@ pub enum URI { Calendars, } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, Serialize, Deserialize)] pub enum Method { #[serde(rename = "Core/echo")] Echo, diff --git a/src/mailbox/helpers.rs b/src/mailbox/helpers.rs index 7cd63de..dd76d4d 100644 --- a/src/mailbox/helpers.rs +++ b/src/mailbox/helpers.rs @@ -1,10 +1,15 @@ use crate::{ client::Client, core::{ - query::{Comparator, Filter, QueryResponse}, + changes::{ChangesRequest, ChangesResponse}, + get::GetRequest, + query::{Comparator, Filter, QueryRequest, QueryResponse}, + query_changes::{QueryChangesRequest, QueryChangesResponse}, + request::{Arguments, Request}, response::{MailboxGetResponse, MailboxSetResponse}, - set::Create, + set::{Create, SetRequest}, }, + Method, Set, }; use super::{Mailbox, Property, Role}; @@ -128,3 +133,80 @@ impl Client { request.send_single::().await } } + +impl Request<'_> { + pub fn get_mailbox(&mut self) -> &mut GetRequest { + self.add_method_call( + Method::GetMailbox, + Arguments::mailbox_get(self.params(Method::GetMailbox)), + ) + .mailbox_get_mut() + } + + pub async fn send_get_mailbox(self) -> crate::Result { + self.send_single().await + } + + pub fn changes_mailbox(&mut self, since_state: impl Into) -> &mut ChangesRequest { + self.add_method_call( + Method::ChangesMailbox, + Arguments::changes(self.params(Method::ChangesMailbox), since_state.into()), + ) + .changes_mut() + } + + pub async fn send_changes_mailbox( + self, + ) -> crate::Result> { + self.send_single().await + } + + pub fn query_mailbox( + &mut self, + ) -> &mut QueryRequest + { + self.add_method_call( + Method::QueryMailbox, + Arguments::mailbox_query(self.params(Method::QueryMailbox)), + ) + .mailbox_query_mut() + } + + pub async fn send_query_mailbox(self) -> crate::Result { + self.send_single().await + } + + pub fn query_mailbox_changes( + &mut self, + since_query_state: impl Into, + ) -> &mut QueryChangesRequest< + super::query::Filter, + super::query::Comparator, + super::QueryArguments, + > { + self.add_method_call( + Method::QueryChangesMailbox, + Arguments::mailbox_query_changes( + self.params(Method::QueryChangesMailbox), + since_query_state.into(), + ), + ) + .mailbox_query_changes_mut() + } + + pub async fn send_query_mailbox_changes(self) -> crate::Result { + self.send_single().await + } + + pub fn set_mailbox(&mut self) -> &mut SetRequest, super::SetArguments> { + self.add_method_call( + Method::SetMailbox, + Arguments::mailbox_set(self.params(Method::SetMailbox)), + ) + .mailbox_set_mut() + } + + pub async fn send_set_mailbox(self) -> crate::Result { + self.send_single().await + } +} diff --git a/src/push_subscription/helpers.rs b/src/push_subscription/helpers.rs new file mode 100644 index 0000000..190d57e --- /dev/null +++ b/src/push_subscription/helpers.rs @@ -0,0 +1,37 @@ +use crate::{ + core::{ + get::GetRequest, + request::{Arguments, Request}, + response::{PushSubscriptionGetResponse, PushSubscriptionSetResponse}, + set::SetRequest, + }, + Method, Set, +}; + +use super::PushSubscription; + +impl Request<'_> { + pub fn get_push_subscription(&mut self) -> &mut GetRequest { + self.add_method_call( + Method::GetPushSubscription, + Arguments::push_get(self.params(Method::GetPushSubscription)), + ) + .push_get_mut() + } + + pub async fn send_get_push_subscription(self) -> crate::Result { + self.send_single().await + } + + pub fn set_push_subscription(&mut self) -> &mut SetRequest, ()> { + self.add_method_call( + Method::SetPushSubscription, + Arguments::push_set(self.params(Method::SetPushSubscription)), + ) + .push_set_mut() + } + + pub async fn send_set_push_subscription(self) -> crate::Result { + self.send_single().await + } +} diff --git a/src/push_subscription/mod.rs b/src/push_subscription/mod.rs index f1e39a0..8c8d78b 100644 --- a/src/push_subscription/mod.rs +++ b/src/push_subscription/mod.rs @@ -1,4 +1,5 @@ pub mod get; +pub mod helpers; pub mod set; use std::fmt::Display; diff --git a/src/thread/helpers.rs b/src/thread/helpers.rs index 5752638..047149f 100644 --- a/src/thread/helpers.rs +++ b/src/thread/helpers.rs @@ -1,4 +1,13 @@ -use crate::{client::Client, core::response::ThreadGetResponse}; +use crate::{ + client::Client, + core::{ + changes::{ChangesRequest, ChangesResponse}, + get::GetRequest, + request::{Arguments, Request}, + response::ThreadGetResponse, + }, + Method, +}; use super::Thread; @@ -12,3 +21,29 @@ impl Client { .map(|mut r| r.unwrap_list().pop()) } } + +impl Request<'_> { + pub fn get_thread(&mut self) -> &mut GetRequest { + self.add_method_call( + Method::GetThread, + Arguments::thread_get(self.params(Method::GetThread)), + ) + .thread_get_mut() + } + + pub async fn send_get_thread(self) -> crate::Result { + self.send_single().await + } + + pub fn changes_thread(&mut self, since_state: impl Into) -> &mut ChangesRequest { + self.add_method_call( + Method::ChangesThread, + Arguments::changes(self.params(Method::ChangesThread), since_state.into()), + ) + .changes_mut() + } + + pub async fn send_changes_thread(self) -> crate::Result> { + self.send_single().await + } +} diff --git a/src/thread/mod.rs b/src/thread/mod.rs index 3e94a41..a2cd68c 100644 --- a/src/thread/mod.rs +++ b/src/thread/mod.rs @@ -1,6 +1,8 @@ pub mod get; pub mod helpers; +use std::fmt::Display; + use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Serialize, Deserialize)] @@ -17,3 +19,12 @@ pub enum Property { #[serde(rename = "emailIds")] EmailIds, } + +impl Display for Property { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Property::Id => write!(f, "id"), + Property::EmailIds => write!(f, "emailIds"), + } + } +} diff --git a/src/vacation_response/helpers.rs b/src/vacation_response/helpers.rs new file mode 100644 index 0000000..16cdc63 --- /dev/null +++ b/src/vacation_response/helpers.rs @@ -0,0 +1,39 @@ +use crate::{ + core::{ + get::GetRequest, + request::{Arguments, Request}, + response::{VacationResponseGetResponse, VacationResponseSetResponse}, + set::SetRequest, + }, + Method, Set, URI, +}; + +use super::VacationResponse; + +impl Request<'_> { + pub fn get_vacation_response(&mut self) -> &mut GetRequest { + self.add_capability(URI::VacationResponse); + self.add_method_call( + Method::GetVacationResponse, + Arguments::vacation_response_get(self.params(Method::GetVacationResponse)), + ) + .vacation_response_get_mut() + } + + pub async fn send_get_vacation_response(self) -> crate::Result { + self.send_single().await + } + + pub fn set_vacation_response(&mut self) -> &mut SetRequest, ()> { + self.add_capability(URI::VacationResponse); + self.add_method_call( + Method::SetVacationResponse, + Arguments::vacation_response_set(self.params(Method::GetVacationResponse)), + ) + .vacation_response_set_mut() + } + + pub async fn send_set_vacation_response(self) -> crate::Result { + self.send_single().await + } +} diff --git a/src/vacation_response/mod.rs b/src/vacation_response/mod.rs index bd6f569..4e3a920 100644 --- a/src/vacation_response/mod.rs +++ b/src/vacation_response/mod.rs @@ -1,4 +1,5 @@ pub mod get; +pub mod helpers; pub mod set; use std::fmt::Display;