cull_gmail/
processor.rs

1// use crate::EolRule;
2
3use crate::{Delete, EolAction, Error, Result, Trash, config::EolRule};
4
5/// Rule processor
6#[derive(Debug)]
7pub struct Processor<'a> {
8    credential_file: String,
9    rule: &'a EolRule,
10    execute: bool,
11}
12
13/// Rule processor builder
14#[derive(Debug)]
15pub struct ProcessorBuilder<'a> {
16    credential_file: String,
17    rule: &'a EolRule,
18    execute: bool,
19}
20
21impl<'a> ProcessorBuilder<'a> {
22    /// Set the execute flag
23    pub fn set_execute(&mut self, value: bool) -> &mut Self {
24        self.execute = value;
25        self
26    }
27
28    /// Build the Processor
29    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    /// Initialise a new processor
40    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    /// The action set in the rule  
49    pub fn action(&self) -> Option<EolAction> {
50        self.rule.action()
51    }
52
53    /// Trash the messages
54    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    /// Delete the messages
83    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}