/* * Copyright Stalwart Labs Ltd. See the COPYING * file at the top-level directory of this distribution. * * Licensed under the Apache License, Version 2.0 or the MIT license * , at your * option. This file may not be copied, modified, or distributed * except according to those terms. */ use crate::{ client::Client, core::{ 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, }, Get, Method, Set, }; use super::{ import::{EmailImportRequest, EmailImportResponse}, parse::{EmailParseRequest, EmailParseResponse}, search_snippet::{SearchSnippetGetRequest, SearchSnippetGetResponse}, BodyProperty, Email, Property, }; impl Client { #[maybe_async::maybe_async] pub async fn email_import( &self, raw_message: Vec, mailbox_ids: T, keywords: Option, received_at: Option, ) -> crate::Result where T: IntoIterator, U: Into, V: IntoIterator, W: Into, { self.email_import_account( self.default_account_id(), raw_message, mailbox_ids, keywords, received_at, ) .await } #[maybe_async::maybe_async] pub async fn email_import_account( &self, account_id: &str, raw_message: Vec, mailbox_ids: T, keywords: Option, received_at: Option, ) -> crate::Result where T: IntoIterator, U: Into, V: IntoIterator, W: Into, { let blob_id = self .upload(account_id.into(), raw_message, None) .await? .take_blob_id(); let mut request = self.build(); let import_request = request .import_email() .account_id(account_id) .email(blob_id) .mailbox_ids(mailbox_ids); if let Some(keywords) = keywords { import_request.keywords(keywords); } if let Some(received_at) = received_at { import_request.received_at(received_at); } let id = import_request.create_id(); request .send_single::() .await? .created(&id) } #[maybe_async::maybe_async] pub async fn email_set_mailbox( &self, id: &str, mailbox_id: &str, set: bool, ) -> crate::Result> { let mut request = self.build(); request.set_email().update(id).mailbox_id(mailbox_id, set); request.send_single::().await?.updated(id) } #[maybe_async::maybe_async] pub async fn email_set_mailboxes( &self, id: &str, mailbox_ids: T, ) -> crate::Result> where T: IntoIterator, U: Into, { let mut request = self.build(); request.set_email().update(id).mailbox_ids(mailbox_ids); request.send_single::().await?.updated(id) } #[maybe_async::maybe_async] pub async fn email_set_keyword( &self, id: &str, keyword: &str, set: bool, ) -> crate::Result> { let mut request = self.build(); request.set_email().update(id).keyword(keyword, set); request.send_single::().await?.updated(id) } #[maybe_async::maybe_async] pub async fn email_set_keywords( &self, id: &str, keywords: T, ) -> crate::Result> where T: IntoIterator, U: Into, { let mut request = self.build(); request.set_email().update(id).keywords(keywords); request.send_single::().await?.updated(id) } #[maybe_async::maybe_async] pub async fn email_destroy(&self, id: &str) -> crate::Result<()> { let mut request = self.build(); request.set_email().destroy([id]); request .send_single::() .await? .destroyed(id) } #[maybe_async::maybe_async] pub async fn email_get( &self, id: &str, properties: Option>, ) -> crate::Result>> { let mut request = self.build(); let get_request = request.get_email().ids([id]); if let Some(properties) = properties { get_request.properties(properties); } request .send_single::() .await .map(|mut r| r.take_list().pop()) } #[maybe_async::maybe_async] pub async fn email_changes( &self, since_state: impl Into, max_changes: Option, ) -> crate::Result>> { let mut request = self.build(); let changes_request = request.changes_email(since_state); if let Some(max_changes) = max_changes { changes_request.max_changes(max_changes); } request.send_single().await } #[maybe_async::maybe_async] pub async fn email_query( &self, filter: Option>>, sort: Option>>, ) -> crate::Result { let mut request = self.build(); let query_request = request.query_email(); if let Some(filter) = filter { query_request.filter(filter); } if let Some(sort) = sort { query_request.sort(sort.into_iter()); } request.send_single::().await } #[maybe_async::maybe_async] pub async fn email_query_changes( &self, since_query_state: impl Into, filter: Option>>, ) -> crate::Result { let mut request = self.build(); let query_request = request.query_email_changes(since_query_state); if let Some(filter) = filter { query_request.filter(filter); } request.send_single::().await } #[maybe_async::maybe_async] pub async fn email_parse( &self, blob_id: &str, properties: Option>, body_properties: Option>, max_body_value_bytes: Option, ) -> crate::Result { let mut request = self.build(); let parse_request = request.parse_email().blob_ids([blob_id]); if let Some(properties) = properties { parse_request.properties(properties); } if let Some(body_properties) = body_properties { parse_request.body_properties(body_properties); } if let Some(max_body_value_bytes) = max_body_value_bytes { parse_request .fetch_all_body_values(true) .max_body_value_bytes(max_body_value_bytes); } request .send_single::() .await .and_then(|mut r| r.parsed(blob_id)) } #[maybe_async::maybe_async] pub async fn email_copy( &self, from_account_id: impl Into, id: impl Into, mailbox_ids: T, keywords: Option, received_at: Option, ) -> crate::Result where T: IntoIterator, U: Into, V: IntoIterator, W: Into, { let id = id.into(); let mut request = self.build(); let email = request .copy_email(from_account_id) .create(id.clone()) .mailbox_ids(mailbox_ids); if let Some(keywords) = keywords { email.keywords(keywords); } if let Some(received_at) = received_at { email.received_at(received_at); } request .send_single::() .await? .created(&id) } #[maybe_async::maybe_async] pub async fn search_snippet_get( &self, filter: Option>>, email_ids: impl IntoIterator>, ) -> crate::Result { let mut request = self.build(); let snippet_request = request.get_search_snippet(); if let Some(filter) = filter { snippet_request.filter(filter); } snippet_request.email_ids(email_ids); request.send_single::().await } } 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() } #[maybe_async::maybe_async] 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() } #[maybe_async::maybe_async] 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() } #[maybe_async::maybe_async] 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> { self.add_method_call( Method::QueryChangesEmail, Arguments::email_query_changes( self.params(Method::QueryChangesEmail), since_query_state.into(), ), ) .email_query_changes_mut() } #[maybe_async::maybe_async] 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() } #[maybe_async::maybe_async] 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() } #[maybe_async::maybe_async] 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() } #[maybe_async::maybe_async] 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() } #[maybe_async::maybe_async] pub async fn send_parse_email(self) -> crate::Result { self.send_single().await } pub fn get_search_snippet(&mut self) -> &mut SearchSnippetGetRequest { self.add_method_call( Method::GetSearchSnippet, Arguments::search_snippet_get(self.params(Method::GetSearchSnippet)), ) .search_snippet_get_mut() } #[maybe_async::maybe_async] pub async fn send_get_search_snippet(self) -> crate::Result { self.send_single().await } }