Skip to main content

rusmes_core/matchers/
header_contains.rs

1//! Matcher for messages with specific header values
2
3use crate::matcher::Matcher;
4use async_trait::async_trait;
5use rusmes_proto::{Mail, MailAddress};
6
7/// Matches messages where a header contains a specific value
8pub struct HeaderContainsMatcher {
9    header_name: String,
10    value: String,
11}
12
13impl HeaderContainsMatcher {
14    /// Create a new HeaderContains matcher
15    pub fn new(header_name: String, value: String) -> Self {
16        Self { header_name, value }
17    }
18}
19
20#[async_trait]
21impl Matcher for HeaderContainsMatcher {
22    async fn match_mail(&self, mail: &Mail) -> anyhow::Result<Vec<MailAddress>> {
23        let headers = mail.message().headers();
24
25        if let Some(header_values) = headers.get(&self.header_name) {
26            for header_value in header_values {
27                if header_value.contains(&self.value) {
28                    return Ok(mail.recipients().to_vec());
29                }
30            }
31        }
32
33        Ok(Vec::new())
34    }
35
36    fn name(&self) -> &str {
37        "HeaderContains"
38    }
39}