Skip to main content

io_gmail/v1/rest/messages/
list.rs

1//! List the Gmail messages (`users.messages.list`).
2//!
3//! <https://developers.google.com/gmail/api/reference/rest/v1/users.messages/list>
4
5use alloc::{format, string::String, vec::Vec};
6
7use io_http::rfc6750::bearer::HttpAuthBearer;
8use log::{debug, trace};
9use serde::{Deserialize, Serialize};
10use url::Url;
11
12use crate::{
13    coroutine::*,
14    gmail_try,
15    v1::{
16        query::{is_false, to_query_pairs},
17        rest::messages::GmailMessageId,
18        send::{GMAIL_API_BASE, GmailSend, GmailSendError, GmailSendOutput},
19    },
20};
21
22/// Query parameters for listing messages (`users.messages.list`).
23#[derive(Debug, Clone, Default, Serialize, Eq, PartialEq)]
24#[serde(rename_all = "camelCase")]
25pub struct GmailMessagesListParams<'a> {
26    /// The search query filtering the returned messages, using the
27    /// Gmail search box syntax.
28    pub q: Option<&'a str>,
29    /// The label ids the returned messages must all carry.
30    pub label_ids: &'a [String],
31    /// The maximum number of messages to return per page.
32    pub max_results: Option<u32>,
33    /// The page token from a previous list response.
34    pub page_token: Option<&'a str>,
35    /// Whether to include messages from SPAM and TRASH in the results.
36    #[serde(skip_serializing_if = "is_false")]
37    pub include_spam_trash: bool,
38}
39
40/// Gmail REST message listing response (one page of message ids).
41#[derive(Debug, Clone, Default, Deserialize, Serialize, Eq, PartialEq)]
42#[serde(rename_all = "camelCase")]
43pub struct GmailMessagesListResponse {
44    /// The messages of the current page, each carrying only an id
45    /// and a thread id.
46    #[serde(default)]
47    pub messages: Vec<GmailMessageId>,
48    /// The token retrieving the next page of results, absent on the
49    /// last page.
50    #[serde(default)]
51    pub next_page_token: Option<String>,
52    /// The estimated total number of results.
53    #[serde(default)]
54    pub result_size_estimate: Option<u64>,
55}
56
57/// Gmail REST message listing, wrapping a page of message ids.
58pub struct GmailMessagesList {
59    send: GmailSend<GmailMessagesListResponse>,
60}
61
62impl GmailMessagesList {
63    /// Builds the `users.messages.list` request from the given
64    /// query parameters.
65    pub fn new(
66        auth: &HttpAuthBearer,
67        user_id: &str,
68        params: &GmailMessagesListParams,
69    ) -> Result<Self, GmailSendError> {
70        debug!("prepare gmail messages listing");
71        trace!("params: {params:?}");
72
73        let mut url = Url::parse(GMAIL_API_BASE)?.join(&format!("users/{user_id}/messages"))?;
74        url.query_pairs_mut().extend_pairs(to_query_pairs(params));
75
76        let send = GmailSend::get(auth, url);
77
78        Ok(Self { send })
79    }
80}
81
82impl GmailCoroutine for GmailMessagesList {
83    type Yield = GmailYield;
84    type Return = Result<GmailSendOutput<GmailMessagesListResponse>, GmailSendError>;
85
86    fn resume(&mut self, arg: Option<&[u8]>) -> GmailCoroutineState<Self::Yield, Self::Return> {
87        let out = gmail_try!(&mut self.send, arg);
88        debug!("messages listed");
89        trace!("out: {out:?}");
90        GmailCoroutineState::Complete(Ok(out))
91    }
92}