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}