jmap_client/mailbox/
helpers.rs1use 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}