evobench_tools/serde_types/
regex.rs1use 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}