cull_gmail/
trash.rs

1use google_gmail1::api::BatchModifyMessagesRequest;
2
3use crate::{MessageList, Result};
4
5/// Struct for trashing messages
6#[derive(Debug)]
7pub struct Trash {
8    message_list: MessageList,
9}
10
11impl Trash {
12    /// Create a new Trash struct
13    pub async fn new(credential: &str) -> Result<Self> {
14        let message_list = MessageList::new(credential).await?;
15        Ok(Trash { message_list })
16    }
17
18    /// return the message list struct
19    pub fn message_list(&mut self) -> &mut MessageList {
20        &mut self.message_list
21    }
22
23    /// Prepare the trash cli
24    pub async fn prepare(&mut self, pages: u32) -> Result<()> {
25        self.message_list.run(pages).await?;
26
27        Ok(())
28    }
29
30    /// Move the messages to trash
31    pub async fn batch_trash(&self) -> Result<()> {
32        self.batch_move_to_trash().await
33    }
34
35    async fn batch_move_to_trash(&self) -> Result<()> {
36        let add_label_ids = Some(Vec::from(["TRASH".to_string()]));
37        let ids = Some(self.message_list.message_ids());
38        let remove_label_ids = Some(self.message_list.label_ids());
39
40        let batch_request = BatchModifyMessagesRequest {
41            add_label_ids,
42            ids,
43            remove_label_ids,
44        };
45
46        log::trace!("{batch_request:#?}");
47
48        let _res = self
49            .message_list
50            .hub()
51            .users()
52            .messages_batch_modify(batch_request, "me")
53            .add_scope("https://www.googleapis.com/auth/gmail.modify")
54            .doit()
55            .await
56            .map_err(Box::new)?;
57
58        for m in self.message_list.messages() {
59            log::info!("Message with subject `{}` moved to trash.", m.subject());
60        }
61
62        Ok(())
63    }
64}