jmap_client/mailbox/
helpers.rs

1/*
2 * Copyright Stalwart Labs LLC See the COPYING
3 * file at the top-level directory of this distribution.
4 *
5 * Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 * https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 * <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
8 * option. This file may not be copied, modified, or distributed
9 * except according to those terms.
10 */
11
12use crate::{
13    client::Client,
14    core::{
15        changes::{ChangesRequest, ChangesResponse},
16        get::GetRequest,
17        query::{Comparator, Filter, QueryRequest, QueryResponse},
18        query_changes::{QueryChangesRequest, QueryChangesResponse},
19        request::{Arguments, Request},
20        response::{MailboxGetResponse, MailboxSetResponse},
21        set::{SetObject, SetRequest},
22    },
23    principal::ACL,
24    Get, Method, Set,
25};
26
27use super::{Mailbox, Property, Role};
28
29impl Client {
30    #[maybe_async::maybe_async]
31    pub async fn mailbox_create(
32        &self,
33        name: impl Into<String>,
34        parent_id: Option<impl Into<String>>,
35        role: Role,
36    ) -> crate::Result<Mailbox> {
37        let mut request = self.build();
38        let id = request
39            .set_mailbox()
40            .create()
41            .name(name)
42            .role(role)
43            .parent_id(parent_id)
44            .create_id()
45            .unwrap();
46        request
47            .send_single::<MailboxSetResponse>()
48            .await?
49            .created(&id)
50    }
51
52    #[maybe_async::maybe_async]
53    pub async fn mailbox_rename(
54        &self,
55        id: &str,
56        name: impl Into<String>,
57    ) -> crate::Result<Option<Mailbox>> {
58        let mut request = self.build();
59        request.set_mailbox().update(id).name(name);
60        request
61            .send_single::<MailboxSetResponse>()
62            .await?
63            .updated(id)
64    }
65
66    #[maybe_async::maybe_async]
67    pub async fn mailbox_move(
68        &self,
69        id: &str,
70        parent_id: Option<impl Into<String>>,
71    ) -> crate::Result<Option<Mailbox>> {
72        let mut request = self.build();
73        request.set_mailbox().update(id).parent_id(parent_id);
74        request
75            .send_single::<MailboxSetResponse>()
76            .await?
77            .updated(id)
78    }
79
80    #[maybe_async::maybe_async]
81    pub async fn mailbox_update_role(
82        &self,
83        id: &str,
84        role: Role,
85    ) -> crate::Result<Option<Mailbox>> {
86        let mut request = self.build();
87        request.set_mailbox().update(id).role(role);
88        request
89            .send_single::<MailboxSetResponse>()
90            .await?
91            .updated(id)
92    }
93
94    #[maybe_async::maybe_async]
95    pub async fn mailbox_update_acl(
96        &self,
97        id: &str,
98        account_id: &str,
99        acl: impl IntoIterator<Item = ACL>,
100    ) -> crate::Result<Option<Mailbox>> {
101        let mut request = self.build();
102        request.set_mailbox().update(id).acl(account_id, acl);
103        request
104            .send_single::<MailboxSetResponse>()
105            .await?
106            .updated(id)
107    }
108
109    #[maybe_async::maybe_async]
110    pub async fn mailbox_update_sort_order(
111        &self,
112        id: &str,
113        sort_order: u32,
114    ) -> crate::Result<Option<Mailbox>> {
115        let mut request = self.build();
116        request.set_mailbox().update(id).sort_order(sort_order);
117        request
118            .send_single::<MailboxSetResponse>()
119            .await?
120            .updated(id)
121    }
122
123    #[maybe_async::maybe_async]
124    pub async fn mailbox_subscribe(
125        &self,
126        id: &str,
127        is_subscribed: bool,
128    ) -> crate::Result<Option<Mailbox>> {
129        let mut request = self.build();
130        request
131            .set_mailbox()
132            .update(id)
133            .is_subscribed(is_subscribed);
134        request
135            .send_single::<MailboxSetResponse>()
136            .await?
137            .updated(id)
138    }
139
140    #[maybe_async::maybe_async]
141    pub async fn mailbox_destroy(&self, id: &str, delete_emails: bool) -> crate::Result<()> {
142        let mut request = self.build();
143        request
144            .set_mailbox()
145            .destroy([id])
146            .arguments()
147            .on_destroy_remove_emails(delete_emails);
148        request
149            .send_single::<MailboxSetResponse>()
150            .await?
151            .destroyed(id)
152    }
153
154    #[maybe_async::maybe_async]
155    pub async fn mailbox_get(
156        &self,
157        id: &str,
158        properties: Option<impl IntoIterator<Item = Property>>,
159    ) -> crate::Result<Option<Mailbox>> {
160        let mut request = self.build();
161        let get_request = request.get_mailbox().ids([id]);
162        if let Some(properties) = properties {
163            get_request.properties(properties.into_iter());
164        }
165        request
166            .send_single::<MailboxGetResponse>()
167            .await
168            .map(|mut r| r.take_list().pop())
169    }
170
171    #[maybe_async::maybe_async]
172    pub async fn mailbox_query(
173        &self,
174        filter: Option<impl Into<Filter<super::query::Filter>>>,
175        sort: Option<impl IntoIterator<Item = Comparator<super::query::Comparator>>>,
176    ) -> crate::Result<QueryResponse> {
177        let mut request = self.build();
178        let query_request = request.query_mailbox();
179        if let Some(filter) = filter {
180            query_request.filter(filter);
181        }
182        if let Some(sort) = sort {
183            query_request.sort(sort.into_iter());
184        }
185        request.send_single::<QueryResponse>().await
186    }
187
188    #[maybe_async::maybe_async]
189    pub async fn mailbox_changes(
190        &self,
191        since_state: impl Into<String>,
192        max_changes: usize,
193    ) -> crate::Result<ChangesResponse<Mailbox<Get>>> {
194        let mut request = self.build();
195        request
196            .changes_mailbox(since_state)
197            .max_changes(max_changes);
198        request.send_single().await
199    }
200}
201
202impl Request<'_> {
203    pub fn get_mailbox(&mut self) -> &mut GetRequest<Mailbox<Set>> {
204        self.add_method_call(
205            Method::GetMailbox,
206            Arguments::mailbox_get(self.params(Method::GetMailbox)),
207        )
208        .mailbox_get_mut()
209    }
210
211    #[maybe_async::maybe_async]
212    pub async fn send_get_mailbox(self) -> crate::Result<MailboxGetResponse> {
213        self.send_single().await
214    }
215
216    pub fn changes_mailbox(&mut self, since_state: impl Into<String>) -> &mut ChangesRequest {
217        self.add_method_call(
218            Method::ChangesMailbox,
219            Arguments::changes(self.params(Method::ChangesMailbox), since_state.into()),
220        )
221        .changes_mut()
222    }
223
224    #[maybe_async::maybe_async]
225    pub async fn send_changes_mailbox(self) -> crate::Result<ChangesResponse<Mailbox<Get>>> {
226        self.send_single().await
227    }
228
229    pub fn query_mailbox(&mut self) -> &mut QueryRequest<Mailbox<Set>> {
230        self.add_method_call(
231            Method::QueryMailbox,
232            Arguments::mailbox_query(self.params(Method::QueryMailbox)),
233        )
234        .mailbox_query_mut()
235    }
236
237    #[maybe_async::maybe_async]
238    pub async fn send_query_mailbox(self) -> crate::Result<QueryResponse> {
239        self.send_single().await
240    }
241
242    pub fn query_mailbox_changes(
243        &mut self,
244        since_query_state: impl Into<String>,
245    ) -> &mut QueryChangesRequest<Mailbox<Set>> {
246        self.add_method_call(
247            Method::QueryChangesMailbox,
248            Arguments::mailbox_query_changes(
249                self.params(Method::QueryChangesMailbox),
250                since_query_state.into(),
251            ),
252        )
253        .mailbox_query_changes_mut()
254    }
255
256    #[maybe_async::maybe_async]
257    pub async fn send_query_mailbox_changes(self) -> crate::Result<QueryChangesResponse> {
258        self.send_single().await
259    }
260
261    pub fn set_mailbox(&mut self) -> &mut SetRequest<Mailbox<Set>> {
262        self.add_method_call(
263            Method::SetMailbox,
264            Arguments::mailbox_set(self.params(Method::SetMailbox)),
265        )
266        .mailbox_set_mut()
267    }
268
269    #[maybe_async::maybe_async]
270    pub async fn send_set_mailbox(self) -> crate::Result<MailboxSetResponse> {
271        self.send_single().await
272    }
273}