cargo_spellcheck/config/
regex.rs1use super::*;
2
3#[derive(Debug)]
4pub struct WrappedRegex(pub Regex);
5
6impl Clone for WrappedRegex {
7 fn clone(&self) -> Self {
8 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}