Skip to main content

io_gmail/v1/rest/messages/
import.rs

1//! Import a Gmail message (`users.messages.import`).
2//!
3//! <https://developers.google.com/gmail/api/reference/rest/v1/users.messages/import>
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 import, wrapping the imported `GmailMessage`.
20pub struct GmailMessageImport {
21    send: GmailSend<GmailMessage>,
22}
23
24impl GmailMessageImport {
25    /// Builds the `users.messages.import` 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        never_mark_spam: bool,
36        process_for_calendar: bool,
37    ) -> Result<Self, GmailSendError> {
38        debug!("prepare gmail message import");
39        trace!("message: {message:?}");
40
41        let mut url =
42            Url::parse(GMAIL_API_BASE)?.join(&format!("users/{user_id}/messages/import"))?;
43
44        {
45            let mut query = url.query_pairs_mut();
46
47            if let Some(ids) = internal_date_source {
48                query.append_pair(
49                    "internalDateSource",
50                    to_variant_name(&ids).unwrap_or_default(),
51                );
52            }
53
54            if deleted {
55                query.append_pair("deleted", "true");
56            }
57
58            if never_mark_spam {
59                query.append_pair("neverMarkSpam", "true");
60            }
61
62            if process_for_calendar {
63                query.append_pair("processForCalendar", "true");
64            }
65        }
66
67        let send = GmailSend::post_json(auth, url, message)?;
68
69        Ok(Self { send })
70    }
71}
72
73impl GmailCoroutine for GmailMessageImport {
74    type Yield = GmailYield;
75    type Return = Result<GmailSendOutput<GmailMessage>, GmailSendError>;
76
77    fn resume(&mut self, arg: Option<&[u8]>) -> GmailCoroutineState<Self::Yield, Self::Return> {
78        let out = gmail_try!(&mut self.send, arg);
79        debug!("message imported");
80        trace!("out: {out:?}");
81        GmailCoroutineState::Complete(Ok(out))
82    }
83}