Skip to main content

io_gmail/v1/rest/messages/
insert.rs

1//! Insert a Gmail message (`users.messages.insert`).
2//!
3//! <https://developers.google.com/gmail/api/reference/rest/v1/users.messages/insert>
4
5use 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
19/// Gmail REST message insert, wrapping the inserted `GmailMessage`.
20pub struct GmailMessageInsert {
21    send: GmailSend<GmailMessage>,
22}
23
24impl GmailMessageInsert {
25    /// Builds the `users.messages.insert` request for the given message.
26    ///
27    /// `deleted` marks the message as permanently deleted (not
28    /// trashed), visible only in Google Vault.
29    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}