435 lines
13 KiB
Rust
435 lines
13 KiB
Rust
/*
|
|
* Copyright Stalwart Labs Ltd. See the COPYING
|
|
* file at the top-level directory of this distribution.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
* https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
* <LICENSE-MIT or https://opensource.org/licenses/MIT>, 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<T, U, V, W>(
|
|
&self,
|
|
raw_message: Vec<u8>,
|
|
mailbox_ids: T,
|
|
keywords: Option<V>,
|
|
received_at: Option<i64>,
|
|
) -> crate::Result<Email>
|
|
where
|
|
T: IntoIterator<Item = U>,
|
|
U: Into<String>,
|
|
V: IntoIterator<Item = W>,
|
|
W: Into<String>,
|
|
{
|
|
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<T, U, V, W>(
|
|
&self,
|
|
account_id: &str,
|
|
raw_message: Vec<u8>,
|
|
mailbox_ids: T,
|
|
keywords: Option<V>,
|
|
received_at: Option<i64>,
|
|
) -> crate::Result<Email>
|
|
where
|
|
T: IntoIterator<Item = U>,
|
|
U: Into<String>,
|
|
V: IntoIterator<Item = W>,
|
|
W: Into<String>,
|
|
{
|
|
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::<EmailImportResponse>()
|
|
.await?
|
|
.created(&id)
|
|
}
|
|
|
|
#[maybe_async::maybe_async]
|
|
pub async fn email_set_mailbox(
|
|
&self,
|
|
id: &str,
|
|
mailbox_id: &str,
|
|
set: bool,
|
|
) -> crate::Result<Option<Email>> {
|
|
let mut request = self.build();
|
|
request.set_email().update(id).mailbox_id(mailbox_id, set);
|
|
request.send_single::<EmailSetResponse>().await?.updated(id)
|
|
}
|
|
|
|
#[maybe_async::maybe_async]
|
|
pub async fn email_set_mailboxes<T, U>(
|
|
&self,
|
|
id: &str,
|
|
mailbox_ids: T,
|
|
) -> crate::Result<Option<Email>>
|
|
where
|
|
T: IntoIterator<Item = U>,
|
|
U: Into<String>,
|
|
{
|
|
let mut request = self.build();
|
|
request.set_email().update(id).mailbox_ids(mailbox_ids);
|
|
request.send_single::<EmailSetResponse>().await?.updated(id)
|
|
}
|
|
|
|
#[maybe_async::maybe_async]
|
|
pub async fn email_set_keyword(
|
|
&self,
|
|
id: &str,
|
|
keyword: &str,
|
|
set: bool,
|
|
) -> crate::Result<Option<Email>> {
|
|
let mut request = self.build();
|
|
request.set_email().update(id).keyword(keyword, set);
|
|
request.send_single::<EmailSetResponse>().await?.updated(id)
|
|
}
|
|
|
|
#[maybe_async::maybe_async]
|
|
pub async fn email_set_keywords<T, U>(
|
|
&self,
|
|
id: &str,
|
|
keywords: T,
|
|
) -> crate::Result<Option<Email>>
|
|
where
|
|
T: IntoIterator<Item = U>,
|
|
U: Into<String>,
|
|
{
|
|
let mut request = self.build();
|
|
request.set_email().update(id).keywords(keywords);
|
|
request.send_single::<EmailSetResponse>().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::<EmailSetResponse>()
|
|
.await?
|
|
.destroyed(id)
|
|
}
|
|
|
|
#[maybe_async::maybe_async]
|
|
pub async fn email_get(
|
|
&self,
|
|
id: &str,
|
|
properties: Option<impl IntoIterator<Item = Property>>,
|
|
) -> crate::Result<Option<Email<Get>>> {
|
|
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::<EmailGetResponse>()
|
|
.await
|
|
.map(|mut r| r.take_list().pop())
|
|
}
|
|
|
|
#[maybe_async::maybe_async]
|
|
pub async fn email_changes(
|
|
&self,
|
|
since_state: impl Into<String>,
|
|
max_changes: Option<usize>,
|
|
) -> crate::Result<ChangesResponse<Email<Get>>> {
|
|
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<impl Into<Filter<super::query::Filter>>>,
|
|
sort: Option<impl IntoIterator<Item = Comparator<super::query::Comparator>>>,
|
|
) -> crate::Result<QueryResponse> {
|
|
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::<QueryResponse>().await
|
|
}
|
|
|
|
#[maybe_async::maybe_async]
|
|
pub async fn email_query_changes(
|
|
&self,
|
|
since_query_state: impl Into<String>,
|
|
filter: Option<impl Into<Filter<super::query::Filter>>>,
|
|
) -> crate::Result<QueryChangesResponse> {
|
|
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::<QueryChangesResponse>().await
|
|
}
|
|
|
|
#[maybe_async::maybe_async]
|
|
pub async fn email_parse(
|
|
&self,
|
|
blob_id: &str,
|
|
properties: Option<impl IntoIterator<Item = Property>>,
|
|
body_properties: Option<impl IntoIterator<Item = BodyProperty>>,
|
|
max_body_value_bytes: Option<usize>,
|
|
) -> crate::Result<Email> {
|
|
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::<EmailParseResponse>()
|
|
.await
|
|
.and_then(|mut r| r.parsed(blob_id))
|
|
}
|
|
|
|
#[maybe_async::maybe_async]
|
|
pub async fn email_copy<T, U, V, W>(
|
|
&self,
|
|
from_account_id: impl Into<String>,
|
|
id: impl Into<String>,
|
|
mailbox_ids: T,
|
|
keywords: Option<V>,
|
|
received_at: Option<i64>,
|
|
) -> crate::Result<Email>
|
|
where
|
|
T: IntoIterator<Item = U>,
|
|
U: Into<String>,
|
|
V: IntoIterator<Item = W>,
|
|
W: Into<String>,
|
|
{
|
|
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::<EmailCopyResponse>()
|
|
.await?
|
|
.created(&id)
|
|
}
|
|
|
|
#[maybe_async::maybe_async]
|
|
pub async fn search_snippet_get(
|
|
&self,
|
|
filter: Option<impl Into<Filter<super::query::Filter>>>,
|
|
email_ids: impl IntoIterator<Item = impl Into<String>>,
|
|
) -> crate::Result<SearchSnippetGetResponse> {
|
|
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::<SearchSnippetGetResponse>().await
|
|
}
|
|
}
|
|
|
|
impl Request<'_> {
|
|
pub fn get_email(&mut self) -> &mut GetRequest<Email<Set>> {
|
|
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<EmailGetResponse> {
|
|
self.send_single().await
|
|
}
|
|
|
|
pub fn changes_email(&mut self, since_state: impl Into<String>) -> &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<ChangesResponse<Email<Get>>> {
|
|
self.send_single().await
|
|
}
|
|
|
|
pub fn query_email(&mut self) -> &mut QueryRequest<Email<Set>> {
|
|
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<QueryResponse> {
|
|
self.send_single().await
|
|
}
|
|
|
|
pub fn query_email_changes(
|
|
&mut self,
|
|
since_query_state: impl Into<String>,
|
|
) -> &mut QueryChangesRequest<Email<Set>> {
|
|
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<QueryChangesResponse> {
|
|
self.send_single().await
|
|
}
|
|
|
|
pub fn set_email(&mut self) -> &mut SetRequest<Email<Set>> {
|
|
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<EmailSetResponse> {
|
|
self.send_single().await
|
|
}
|
|
|
|
pub fn copy_email(
|
|
&mut self,
|
|
from_account_id: impl Into<String>,
|
|
) -> &mut CopyRequest<Email<Set>> {
|
|
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<EmailCopyResponse> {
|
|
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<EmailImportResponse> {
|
|
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<EmailParseResponse> {
|
|
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<SearchSnippetGetResponse> {
|
|
self.send_single().await
|
|
}
|
|
}
|