jmap_client/email_submission/
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::{EmailSubmissionGetResponse, EmailSubmissionSetResponse},
21 set::{SetObject, SetRequest},
22 },
23 Get, Method, Set, URI,
24};
25
26use super::{Address, EmailSubmission, Property, UndoStatus};
27
28impl Client {
29 #[maybe_async::maybe_async]
30 pub async fn email_submission_create(
31 &self,
32 email_id: impl Into<String>,
33 identity_id: impl Into<String>,
34 ) -> crate::Result<EmailSubmission<Get>> {
35 let mut request = self.build();
36 let id = request
37 .set_email_submission()
38 .create()
39 .email_id(email_id)
40 .identity_id(identity_id)
41 .create_id()
42 .unwrap();
43 request
44 .send_single::<EmailSubmissionSetResponse>()
45 .await?
46 .created(&id)
47 }
48
49 #[maybe_async::maybe_async]
50 pub async fn email_submission_create_envelope<S, T, U>(
51 &self,
52 email_id: impl Into<String>,
53 identity_id: impl Into<String>,
54 mail_from: S,
55 rcpt_to: T,
56 ) -> crate::Result<EmailSubmission<Get>>
57 where
58 S: Into<Address>,
59 T: IntoIterator<Item = U>,
60 U: Into<Address>,
61 {
62 let mut request = self.build();
63 let id = request
64 .set_email_submission()
65 .create()
66 .email_id(email_id)
67 .identity_id(identity_id)
68 .envelope(mail_from, rcpt_to)
69 .create_id()
70 .unwrap();
71 request
72 .send_single::<EmailSubmissionSetResponse>()
73 .await?
74 .created(&id)
75 }
76
77 #[maybe_async::maybe_async]
78 pub async fn email_submission_change_status(
79 &self,
80 id: &str,
81 undo_status: UndoStatus,
82 ) -> crate::Result<Option<EmailSubmission>> {
83 let mut request = self.build();
84 request
85 .set_email_submission()
86 .update(id)
87 .undo_status(undo_status);
88 request
89 .send_single::<EmailSubmissionSetResponse>()
90 .await?
91 .updated(id)
92 }
93
94 #[maybe_async::maybe_async]
95 pub async fn email_submission_destroy(&self, id: &str) -> crate::Result<()> {
96 let mut request = self.build();
97 request.set_email_submission().destroy([id]);
98 request
99 .send_single::<EmailSubmissionSetResponse>()
100 .await?
101 .destroyed(id)
102 }
103
104 #[maybe_async::maybe_async]
105 pub async fn email_submission_get(
106 &self,
107 id: &str,
108 properties: Option<Vec<Property>>,
109 ) -> crate::Result<Option<EmailSubmission>> {
110 let mut request = self.build();
111 let get_request = request.get_email_submission().ids([id]);
112 if let Some(properties) = properties {
113 get_request.properties(properties.into_iter());
114 }
115 request
116 .send_single::<EmailSubmissionGetResponse>()
117 .await
118 .map(|mut r| r.take_list().pop())
119 }
120
121 #[maybe_async::maybe_async]
122 pub async fn email_submission_query(
123 &self,
124 filter: Option<impl Into<Filter<super::query::Filter>>>,
125 sort: Option<impl IntoIterator<Item = Comparator<super::query::Comparator>>>,
126 ) -> crate::Result<QueryResponse> {
127 let mut request = self.build();
128 let query_request = request.query_email_submission();
129 if let Some(filter) = filter {
130 query_request.filter(filter);
131 }
132 if let Some(sort) = sort {
133 query_request.sort(sort.into_iter());
134 }
135 request.send_single::<QueryResponse>().await
136 }
137
138 #[maybe_async::maybe_async]
139 pub async fn email_submission_changes(
140 &self,
141 since_state: impl Into<String>,
142 max_changes: usize,
143 ) -> crate::Result<ChangesResponse<EmailSubmission<Get>>> {
144 let mut request = self.build();
145 request
146 .changes_email_submission(since_state)
147 .max_changes(max_changes);
148 request.send_single().await
149 }
150}
151
152impl Request<'_> {
153 pub fn get_email_submission(&mut self) -> &mut GetRequest<EmailSubmission<Set>> {
154 self.add_capability(URI::Submission);
155 self.add_method_call(
156 Method::GetEmailSubmission,
157 Arguments::email_submission_get(self.params(Method::GetEmailSubmission)),
158 )
159 .email_submission_get_mut()
160 }
161
162 #[maybe_async::maybe_async]
163 pub async fn send_get_email_submission(self) -> crate::Result<EmailSubmissionGetResponse> {
164 self.send_single().await
165 }
166
167 pub fn changes_email_submission(
168 &mut self,
169 since_state: impl Into<String>,
170 ) -> &mut ChangesRequest {
171 self.add_capability(URI::Submission);
172 self.add_method_call(
173 Method::ChangesEmailSubmission,
174 Arguments::changes(
175 self.params(Method::ChangesEmailSubmission),
176 since_state.into(),
177 ),
178 )
179 .changes_mut()
180 }
181
182 #[maybe_async::maybe_async]
183 pub async fn send_changes_email_submission(
184 self,
185 ) -> crate::Result<ChangesResponse<EmailSubmission<Get>>> {
186 self.send_single().await
187 }
188
189 pub fn query_email_submission(&mut self) -> &mut QueryRequest<EmailSubmission<Set>> {
190 self.add_capability(URI::Submission);
191 self.add_method_call(
192 Method::QueryEmailSubmission,
193 Arguments::email_submission_query(self.params(Method::QueryEmailSubmission)),
194 )
195 .email_submission_query_mut()
196 }
197
198 #[maybe_async::maybe_async]
199 pub async fn send_query_email_submission(self) -> crate::Result<QueryResponse> {
200 self.send_single().await
201 }
202
203 pub fn query_email_submission_changes(
204 &mut self,
205 since_query_state: impl Into<String>,
206 ) -> &mut QueryChangesRequest<EmailSubmission<Set>> {
207 self.add_capability(URI::Submission);
208 self.add_method_call(
209 Method::QueryChangesEmailSubmission,
210 Arguments::email_submission_query_changes(
211 self.params(Method::QueryChangesEmailSubmission),
212 since_query_state.into(),
213 ),
214 )
215 .email_submission_query_changes_mut()
216 }
217
218 #[maybe_async::maybe_async]
219 pub async fn send_query_email_submission_changes(self) -> crate::Result<QueryChangesResponse> {
220 self.send_single().await
221 }
222
223 pub fn set_email_submission(&mut self) -> &mut SetRequest<EmailSubmission<Set>> {
224 self.add_capability(URI::Submission);
225 self.add_method_call(
226 Method::SetEmailSubmission,
227 Arguments::email_submission_set(self.params(Method::SetEmailSubmission)),
228 )
229 .email_submission_set_mut()
230 }
231
232 #[maybe_async::maybe_async]
233 pub async fn send_set_email_submission(self) -> crate::Result<EmailSubmissionSetResponse> {
234 self.send_single().await
235 }
236}