io_gmail/v1/rest/messages/
insert.rs1use alloc::format;
6
7use io_http::rfc6750::bearer::HttpAuthBearer;
8use log::{debug, trace};
9use serde_variant::to_variant_name;
10use url::Url;
11
12use crate::{
13 coroutine::*,
14 gmail_try,
15 v1::rest::messages::{GmailInternalDateSource, GmailMessage},
16 v1::send::{GMAIL_API_BASE, GmailSend, GmailSendError, GmailSendOutput},
17};
18
19pub struct GmailMessageInsert {
21 send: GmailSend<GmailMessage>,
22}
23
24impl GmailMessageInsert {
25 pub fn new(
30 auth: &HttpAuthBearer,
31 user_id: &str,
32 message: &GmailMessage,
33 internal_date_source: Option<GmailInternalDateSource>,
34 deleted: bool,
35 ) -> Result<Self, GmailSendError> {
36 debug!("prepare gmail message insertion");
37 trace!("message: {message:?}");
38
39 let mut url = Url::parse(GMAIL_API_BASE)?.join(&format!("users/{user_id}/messages"))?;
40
41 {
42 let mut query = url.query_pairs_mut();
43
44 if let Some(ids) = internal_date_source {
45 query.append_pair(
46 "internalDateSource",
47 to_variant_name(&ids).unwrap_or_default(),
48 );
49 }
50
51 if deleted {
52 query.append_pair("deleted", "true");
53 }
54 }
55
56 let send = GmailSend::post_json(auth, url, message)?;
57
58 Ok(Self { send })
59 }
60}
61
62impl GmailCoroutine for GmailMessageInsert {
63 type Yield = GmailYield;
64 type Return = Result<GmailSendOutput<GmailMessage>, GmailSendError>;
65
66 fn resume(&mut self, arg: Option<&[u8]>) -> GmailCoroutineState<Self::Yield, Self::Return> {
67 let out = gmail_try!(&mut self.send, arg);
68 debug!("message inserted");
69 trace!("out: {out:?}");
70 GmailCoroutineState::Complete(Ok(out))
71 }
72}