From f7db97dd07c621e20e263fe70e2d8876873b7ff1 Mon Sep 17 00:00:00 2001 From: Jeremiah Russell Date: Tue, 14 Oct 2025 16:20:58 +0100 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor(cli):=20consolida?= =?UTF-8?q?te=20message=20handling=20and=20remove=20delete=20command?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 【Refactor】: Move `set_parameters` function from `Message` trait implementation for `DeleteCli` to `MessageCli` to avoid duplication. - 【Feature】: Add `Delete` action to `MessageAction` enum to allow direct deletion of messages. - 【Cleanup】: Remove `delete_cli.rs` and `message_trait.rs` as their functionalities are now integrated into `message_cli.rs`. --- src/cli/delete_cli.rs | 52 ---------------------------------------- src/cli/main.rs | 6 ----- src/cli/message_cli.rs | 20 ++++++++++++++-- src/cli/message_trait.rs | 43 --------------------------------- 4 files changed, 18 insertions(+), 103 deletions(-) delete mode 100644 src/cli/delete_cli.rs delete mode 100644 src/cli/message_trait.rs diff --git a/src/cli/delete_cli.rs b/src/cli/delete_cli.rs deleted file mode 100644 index cb4d6e4..0000000 --- a/src/cli/delete_cli.rs +++ /dev/null @@ -1,52 +0,0 @@ -use clap::Parser; -use cull_gmail::{GmailClient, Result, RuleProcessor}; - -use crate::message_trait::Message; - -/// 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, client: &mut GmailClient) -> Result<()> { - self.set_parameters(client)?; - - client.prepare(self.pages).await?; - - if self.execute { - client.batch_delete().await?; - log::info!("Messages deleted."); - } else { - log::info!("Messages not deleted."); - } - Ok(()) - } - - pub(crate) fn labels(&self) -> &Vec { - &self.labels - } - - pub(crate) fn query(&self) -> &Option { - &self.query - } - - pub(crate) fn max_results(&self) -> u32 { - self.max_results - } -} diff --git a/src/cli/main.rs b/src/cli/main.rs index f07a9ca..5e17380 100644 --- a/src/cli/main.rs +++ b/src/cli/main.rs @@ -1,17 +1,14 @@ use clap::{Parser, Subcommand}; mod config_cli; -mod delete_cli; mod label_cli; mod message_cli; -mod message_trait; mod run_cli; use cull_gmail::{Config, GmailClient, Result}; use std::error::Error as stdError; use config_cli::ConfigCli; -use delete_cli::DeleteCli; use label_cli::LabelCli; use message_cli::MessageCli; use run_cli::RunCli; @@ -40,8 +37,6 @@ enum SubCmds { /// List labels #[clap(name = "label", display_order = 2, next_help_heading = "Labels")] Labels(LabelCli), - #[clap(name = "delete", display_order = 5, next_help_heading = "Messages")] - Delete(DeleteCli), /// Run the rules from the rules configuration #[clap(name = "run", display_order = 6, next_help_heading = "Rule Processing")] Run(RunCli), @@ -80,7 +75,6 @@ async fn run(args: Cli) -> Result<()> { SubCmds::Config(config_cli) => config_cli.run(config), SubCmds::Message(list_cli) => list_cli.run(&mut client).await, SubCmds::Labels(label_cli) => label_cli.run(client).await, - SubCmds::Delete(delete_cli) => delete_cli.run(&mut client).await, SubCmds::Run(run_cli) => run_cli.run(&mut client, config).await, } } diff --git a/src/cli/message_cli.rs b/src/cli/message_cli.rs index 560fb47..a203598 100644 --- a/src/cli/message_cli.rs +++ b/src/cli/message_cli.rs @@ -1,12 +1,11 @@ use clap::{Parser, Subcommand}; use cull_gmail::{GmailClient, MessageList, Result, RuleProcessor}; -use crate::message_trait::Message; - #[derive(Debug, Subcommand)] enum MessageAction { List, Trash, + Delete, } /// Command line options for the list subcommand @@ -50,11 +49,28 @@ impl MessageCli { } } MessageAction::Trash => client.batch_trash().await, + MessageAction::Delete => client.batch_delete().await, } // Ok(()) } + fn set_parameters(&self, client: &mut GmailClient) -> Result<()> { + if !self.labels().is_empty() { + client.add_labels(self.labels())?; + } + + if let Some(query) = self.query().as_ref() { + client.set_query(query) + } + + log::trace!("Max results: `{}`", self.max_results()); + client.set_max_results(self.max_results()); + log::debug!("List max results set to {}", client.max_results()); + + Ok(()) + } + pub(crate) fn labels(&self) -> &Vec { &self.labels } diff --git a/src/cli/message_trait.rs b/src/cli/message_trait.rs deleted file mode 100644 index d81551d..0000000 --- a/src/cli/message_trait.rs +++ /dev/null @@ -1,43 +0,0 @@ -use cull_gmail::{GmailClient, MessageList, Result}; - -use crate::{delete_cli::DeleteCli, message_cli::MessageCli}; - -pub trait Message { - fn set_parameters(&self, client: &mut GmailClient) -> Result<()>; -} - -impl Message for MessageCli { - fn set_parameters(&self, client: &mut GmailClient) -> Result<()> { - if !self.labels().is_empty() { - client.add_labels(self.labels())?; - } - - if let Some(query) = self.query().as_ref() { - client.set_query(query) - } - - log::trace!("Max results: `{}`", self.max_results()); - client.set_max_results(self.max_results()); - log::debug!("List max results set to {}", client.max_results()); - - Ok(()) - } -} - -impl Message for DeleteCli { - fn set_parameters(&self, client: &mut GmailClient) -> Result<()> { - if !self.labels().is_empty() { - client.add_labels(self.labels())?; - } - - if let Some(query) = self.query().as_ref() { - client.set_query(query) - } - - log::trace!("Max results: `{}`", self.max_results()); - client.set_max_results(self.max_results()); - log::debug!("List max results set to {}", client.max_results()); - - Ok(()) - } -}