nyauser_types/
regex_wrapper.rs

1use std::borrow::Cow;
2use std::ops::Deref;
3
4use regex::Regex;
5use serde::{de::Unexpected, Deserialize, Serialize};
6
7#[derive(Clone, Debug)]
8pub struct RegexWrapper(pub Regex);
9
10impl PartialEq for RegexWrapper {
11    fn eq(&self, other: &Self) -> bool {
12        self.0.as_str() == other.0.as_str()
13    }
14}
15
16impl Serialize for RegexWrapper {
17    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
18    where
19        S: serde::Serializer,
20    {
21        self.0.as_str().serialize(serializer)
22    }
23}
24
25impl<'de> Deserialize<'de> for RegexWrapper {
26    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
27    where
28        D: serde::Deserializer<'de>,
29    {
30        let r: Cow<'de, str> = Deserialize::deserialize(deserializer)?;
31
32        Ok(Self(Regex::new(&r).map_err(|e| {
33            serde::de::Error::invalid_value(Unexpected::Str(&r), &e.to_string().deref())
34        })?))
35    }
36}
37
38impl Deref for RegexWrapper {
39    type Target = Regex;
40
41    fn deref(&self) -> &Self::Target {
42        &self.0
43    }
44}