diff --git a/src/cli/delete_cli.rs b/src/cli/delete_cli.rs new file mode 100644 index 0000000..f1b9731 --- /dev/null +++ b/src/cli/delete_cli.rs @@ -0,0 +1,56 @@ +use clap::Parser; +use cull_gmail::{Delete, Result}; + +/// Command line options for the list subcommand +#[derive(Debug, Parser)] +pub struct DeleteCli { + /// Maximum results per page + #[arg(short, long, default_value = cull_gmail::DEFAULT_MAX_RESULTS)] + max_results: u32, + /// Maximum number of pages (0=all) + #[arg(short, long, default_value = "1")] + pages: u32, + /// Labels to filter the message list + #[arg(short, long)] + labels: Vec, + /// Query string to select messages to list + #[arg(short = 'Q', long)] + query: Option, + /// Execute the delete command + #[arg(short, long)] + execute: bool, +} + +impl DeleteCli { + pub(crate) async fn run(&self, credential_file: &str) -> Result<()> { + let mut messages_to_delete = Delete::new(credential_file).await?; + + if !self.labels.is_empty() { + // add labels if any specified + messages_to_delete + .add_labels(credential_file, &self.labels) + .await?; + } + + if let Some(query) = self.query.as_ref() { + messages_to_delete.set_query(query) + } + + log::trace!("Max results: `{}`", self.max_results); + messages_to_delete.set_max_results(self.max_results); + log::debug!( + "List max results set to {}", + messages_to_delete.max_results() + ); + + messages_to_delete.prepare(self.pages).await?; + + if self.execute { + messages_to_delete.batch_delete().await?; + log::info!("Messages deleted."); + } else { + log::info!("Messages not deleted."); + } + Ok(()) + } +}