diff --git a/src/trash.rs b/src/trash.rs new file mode 100644 index 0000000..6d1dc6b --- /dev/null +++ b/src/trash.rs @@ -0,0 +1,78 @@ +use google_gmail1::api::BatchModifyMessagesRequest; + +use crate::{Error, MessageList}; + +/// Struct for trashing messages +#[derive(Debug)] +pub struct Trash { + message_list: MessageList, +} + +impl Trash { + /// Create a new Trash struct + pub async fn new(credential: &str) -> Result { + let message_list = MessageList::new(credential).await?; + Ok(Trash { message_list }) + } + + /// Set the maximum results + pub fn set_max_results(&mut self, value: u32) { + self.message_list.set_max_results(value); + } + + /// Report the maximum results value + pub fn max_results(&self) -> u32 { + self.message_list.max_results() + } + + /// Add label to the labels collection + pub fn add_labels(&mut self, label_ids: &[String]) { + self.message_list.add_labels(label_ids) + } + + /// Set the query string + pub fn set_query(&mut self, query: &str) { + self.message_list.set_query(query) + } + + /// Run the trash cli + pub async fn run(&mut self, pages: u32) -> Result<(), Error> { + self.message_list.run(pages).await?; + self.batch_move_to_trash().await?; + + Ok(()) + } + + async fn batch_move_to_trash(&self) -> Result<(), Error> { + let add_label_ids = Some(Vec::from(["TRASH".to_string()])); + let ids = Some(self.message_list.message_ids()); + let remove_label_ids = Some(self.message_list.label_ids()); + + let batch_request = BatchModifyMessagesRequest { + add_label_ids, + ids, + remove_label_ids, + }; + + log::debug!("{batch_request:#?}"); + + let res = self + .message_list + .hub() + .users() + .messages_batch_modify(batch_request, "me") + .add_scope("https://www.googleapis.com/auth/gmail.modify") + .doit() + .await + .map_err(Box::new)?; + + log::debug!("{res:#?}"); + + for id in self.message_list.message_ids() { + // log::info!("Message with subject `{subject}` move to trash."); + log::info!("Message with id `{id}` moved to trash."); + } + + Ok(()) + } +}