anytest/
named_pattern.rs

1use regex::{Error, Regex};
2
3pub struct NamedPattern {
4    pattern: Result<Regex, Error>,
5    name: Option<String>,
6}
7
8impl NamedPattern {
9    pub fn new(pattern: &str, name: Option<&str>) -> Self {
10        Self {
11            pattern: Regex::new(pattern),
12            name: name.map(|s| s.to_string()),
13        }
14    }
15
16    pub fn pattern(&self) -> Result<&Regex, &Error> {
17        self.pattern.as_ref()
18    }
19
20    pub fn name(&self) -> Option<&String> {
21        self.name.as_ref()
22    }
23
24    pub fn find(&self, haystack: &str) -> Option<(String, Option<&String>)> {
25        match self.pattern() {
26            Ok(pattern) => pattern.captures(haystack).map(|c| {
27                (
28                    c.get(1).map(|m| m.as_str().to_string()).unwrap_or_default(),
29                    self.name(),
30                )
31            }),
32            Err(error) => {
33                log::warn!("{}", error);
34                None
35            }
36        }
37    }
38}
39
40impl From<&str> for NamedPattern {
41    fn from(s: &str) -> Self {
42        Self::new(s, None)
43    }
44}
45
46impl From<String> for NamedPattern {
47    fn from(s: String) -> Self {
48        s.as_str().into()
49    }
50}