Skip to main content

rusmes_core/matchers/
sender_is.rs

1//! Matcher for specific sender addresses
2
3use crate::matcher::Matcher;
4use async_trait::async_trait;
5use rusmes_proto::{Mail, MailAddress};
6
7/// Matches messages from specific senders
8pub struct SenderIsMatcher {
9    senders: Vec<String>,
10}
11
12impl SenderIsMatcher {
13    /// Create a new SenderIs matcher
14    pub fn new(senders: Vec<String>) -> Self {
15        Self { senders }
16    }
17}
18
19#[async_trait]
20impl Matcher for SenderIsMatcher {
21    async fn match_mail(&self, mail: &Mail) -> anyhow::Result<Vec<MailAddress>> {
22        if let Some(sender) = mail.sender() {
23            let sender_str = sender.as_string();
24            if self.senders.iter().any(|s| sender_str.contains(s)) {
25                return Ok(mail.recipients().to_vec());
26            }
27        }
28        Ok(Vec::new())
29    }
30
31    fn name(&self) -> &str {
32        "SenderIs"
33    }
34}