1use crate::{Delete, EolAction, Error, Result, Trash, config::EolRule};
4
5#[derive(Debug)]
7pub struct Processor<'a> {
8 credential_file: String,
9 rule: &'a EolRule,
10 execute: bool,
11}
12
13#[derive(Debug)]
15pub struct ProcessorBuilder<'a> {
16 credential_file: String,
17 rule: &'a EolRule,
18 execute: bool,
19}
20
21impl<'a> ProcessorBuilder<'a> {
22 pub fn set_execute(&mut self, value: bool) -> &mut Self {
24 self.execute = value;
25 self
26 }
27
28 pub fn build(&'_ self) -> Processor<'_> {
30 Processor {
31 credential_file: self.credential_file.clone(),
32 rule: self.rule,
33 execute: self.execute,
34 }
35 }
36}
37
38impl<'a> Processor<'a> {
39 pub fn builder(credential_file: &str, rule: &'a EolRule) -> ProcessorBuilder<'a> {
41 ProcessorBuilder {
42 credential_file: credential_file.to_string(),
43 rule,
44 execute: false,
45 }
46 }
47
48 pub fn action(&self) -> Option<EolAction> {
50 self.rule.action()
51 }
52
53 pub async fn trash_messages(&self, label: &str) -> Result<()> {
55 let mut messages_to_trash = Trash::new(&self.credential_file).await?;
56 messages_to_trash
57 .message_list()
58 .add_labels(&self.credential_file, &[label.to_string()])
59 .await?;
60
61 if messages_to_trash.message_list().label_ids().is_empty() {
62 return Err(Error::LabelNotFoundInMailbox(label.to_string()));
63 }
64
65 let Some(query) = self.rule.eol_query() else {
66 return Err(Error::NoQueryStringCalculated(self.rule.id()));
67 };
68 messages_to_trash.message_list().set_query(&query);
69
70 log::info!("{messages_to_trash:?}");
71 log::info!("Ready to run");
72 messages_to_trash.prepare(0).await?;
73 if self.execute {
74 log::info!("***executing final delete messages***");
75 messages_to_trash.batch_trash().await
76 } else {
77 log::warn!("Execution stopped for dry run");
78 Ok(())
79 }
80 }
81
82 pub async fn delete_messages(&self, label: &str) -> Result<()> {
84 let mut messages_to_delete = Delete::new(&self.credential_file).await?;
85
86 messages_to_delete
87 .message_list()
88 .add_labels(&self.credential_file, &[label.to_string()])
89 .await?;
90
91 if messages_to_delete.message_list().label_ids().is_empty() {
92 return Err(Error::LabelNotFoundInMailbox(label.to_string()));
93 }
94
95 let Some(query) = self.rule.eol_query() else {
96 return Err(Error::NoQueryStringCalculated(self.rule.id()));
97 };
98 messages_to_delete.message_list().set_query(&query);
99
100 log::info!("{messages_to_delete:?}");
101 log::info!("Ready to run");
102 messages_to_delete.prepare(0).await?;
103 if self.execute {
104 log::info!("***executing final delete messages***");
105 messages_to_delete.batch_delete().await
106 } else {
107 log::warn!("Execution stopped for dry run");
108
109 Ok(())
110 }
111 }
112}