io_gmail/v1/rest/messages/
import.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 GmailMessageImport {
21 send: GmailSend<GmailMessage>,
22}
23
24impl GmailMessageImport {
25 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}