evobench_tools/serde_types/
regex.rs

1use std::{
2    fmt::{Debug, Display},
3    ops::Deref,
4    str::FromStr,
5};
6
7use kstring::KString;
8use regex::Regex;
9use serde::de::Visitor;
10
11#[derive(Clone)]
12pub struct SerializableRegex {
13    s: KString,
14    r: Regex,
15}
16
17impl Debug for SerializableRegex {
18    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
19        f.debug_tuple("SerializableRegex").field(&self.s).finish()
20    }
21}
22
23impl Display for SerializableRegex {
24    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
25        write!(f, "{:?}", self.s.as_str())
26    }
27}
28
29impl PartialEq for SerializableRegex {
30    fn eq(&self, other: &Self) -> bool {
31        self.s == other.s
32    }
33}
34
35impl FromStr for SerializableRegex {
36    type Err = anyhow::Error;
37
38    fn from_str(s: &str) -> Result<Self, Self::Err> {
39        let r = Regex::new(s)?;
40        Ok(Self {
41            s: KString::from_ref(s),
42            r,
43        })
44    }
45}
46
47impl Deref for SerializableRegex {
48    type Target = Regex;
49
50    fn deref(&self) -> &Self::Target {
51        &self.r
52    }
53}
54
55impl AsRef<str> for SerializableRegex {
56    fn as_ref(&self) -> &str {
57        &self.s
58    }
59}
60
61impl AsRef<Regex> for SerializableRegex {
62    fn as_ref(&self) -> &Regex {
63        &self.r
64    }
65}
66
67struct OurVisitor;
68impl<'de> Visitor<'de> for OurVisitor {
69    type Value = SerializableRegex;
70
71    fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
72        formatter.write_str(
73            "a string representing a regular expression as supported \
74             by the `regex` crate",
75        )
76    }
77
78    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
79    where
80        E: serde::de::Error,
81    {
82        v.parse().map_err(E::custom)
83    }
84}
85
86impl<'de> serde::Deserialize<'de> for SerializableRegex {
87    fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
88        deserializer.deserialize_str(OurVisitor)
89    }
90}
91
92impl serde::Serialize for SerializableRegex {
93    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
94    where
95        S: serde::Serializer,
96    {
97        serializer.serialize_str(self.s.as_str())
98    }
99}