Skip to main content

cargo_spellcheck/config/
regex.rs

1use super::*;
2
3#[derive(Debug)]
4pub struct WrappedRegex(pub Regex);
5
6impl Clone for WrappedRegex {
7    fn clone(&self) -> Self {
8        // @todo inefficient.. but right now this should almost never happen
9        // @todo implement a lazy static `Arc<Mutex<HashMap<&'static str,Regex>>`
10        Self(Regex::new(self.as_str()).unwrap())
11    }
12}
13
14impl std::ops::Deref for WrappedRegex {
15    type Target = Regex;
16    fn deref(&self) -> &Self::Target {
17        &self.0
18    }
19}
20
21impl std::convert::AsRef<Regex> for WrappedRegex {
22    fn as_ref(&self) -> &Regex {
23        &self.0
24    }
25}
26
27impl Serialize for WrappedRegex {
28    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
29    where
30        S: serde::ser::Serializer,
31    {
32        serializer.serialize_str(self.as_str())
33    }
34}
35
36impl<'de> Deserialize<'de> for WrappedRegex {
37    fn deserialize<D>(deserializer: D) -> Result<WrappedRegex, D::Error>
38    where
39        D: serde::de::Deserializer<'de>,
40    {
41        deserializer
42            .deserialize_any(RegexVisitor)
43            .map(WrappedRegex::from)
44    }
45}
46
47impl From<WrappedRegex> for Regex {
48    fn from(val: WrappedRegex) -> Self {
49        val.0
50    }
51}
52
53impl From<Regex> for WrappedRegex {
54    fn from(other: Regex) -> WrappedRegex {
55        WrappedRegex(other)
56    }
57}
58
59struct RegexVisitor;
60
61impl<'de> serde::de::Visitor<'de> for RegexVisitor {
62    type Value = Regex;
63
64    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
65        formatter.write_str("String with valid regex expression")
66    }
67
68    fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
69    where
70        E: serde::de::Error,
71    {
72        let re = Regex::new(value).map_err(E::custom)?;
73        Ok(re)
74    }
75
76    fn visit_string<E>(self, value: String) -> Result<Self::Value, E>
77    where
78        E: serde::de::Error,
79    {
80        self.visit_str::<E>(value.as_str())
81    }
82}