mdbook_linkcheck2/
hashed_regex.rs1use regex::Regex;
2use serde::{de::Error, Deserialize, Deserializer, Serialize};
3use std::{
4 hash::{Hash, Hasher},
5 ops::Deref,
6 str::FromStr,
7};
8
9#[derive(Serialize, Debug, Clone)]
30#[serde(transparent)]
31pub struct HashedRegex {
32 pub string: String,
34
35 #[serde(skip_serializing)]
37 pub re: Regex,
38}
39
40impl HashedRegex {
41 pub fn new(s: &str) -> Result<Self, regex::Error> {
43 let string = s.to_string();
44 let re = Regex::new(s)?;
45
46 Ok(HashedRegex { string, re })
47 }
48}
49
50impl<'de> Deserialize<'de> for HashedRegex {
51 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
52 where
53 D: Deserializer<'de>,
54 {
55 let string = String::deserialize(deserializer)?;
56 let re = Regex::new(&string).map_err(D::Error::custom)?;
57
58 Ok(HashedRegex { string, re })
59 }
60}
61
62impl Hash for HashedRegex {
63 fn hash<H: Hasher>(&self, state: &mut H) {
64 self.string.hash(state);
65 }
66}
67
68impl PartialEq for HashedRegex {
69 fn eq(&self, other: &Self) -> bool {
70 self.string == other.string
71 }
72}
73
74impl Eq for HashedRegex {}
75
76impl FromStr for HashedRegex {
77 type Err = regex::Error;
78
79 fn from_str(s: &str) -> Result<Self, Self::Err> {
80 HashedRegex::new(s)
81 }
82}
83
84impl Deref for HashedRegex {
85 type Target = regex::Regex;
86
87 fn deref(&self) -> ®ex::Regex {
88 &self.re
89 }
90}