1macro_rules! serde_string_impl {
4 ($name:ident, $expecting:expr) => {
5 #[cfg(feature = "serde")]
6 impl<'de> $crate::serde::Deserialize<'de> for $name {
7 fn deserialize<D>(deserializer: D) -> Result<$name, D::Error>
8 where
9 D: $crate::serde::de::Deserializer<'de>,
10 {
11 use core::fmt::{self, Formatter};
12 use core::str::FromStr;
13 use alloc::string::String;
14
15 struct Visitor;
16 impl<'de> $crate::serde::de::Visitor<'de> for Visitor {
17 type Value = $name;
18
19 fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {
20 formatter.write_str($expecting)
21 }
22
23 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
24 where
25 E: $crate::serde::de::Error,
26 {
27 $name::from_str(v).map_err(E::custom)
28 }
29
30 fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E>
31 where
32 E: $crate::serde::de::Error,
33 {
34 self.visit_str(v)
35 }
36
37 fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
38 where
39 E: $crate::serde::de::Error,
40 {
41 self.visit_str(&v)
42 }
43 }
44
45 deserializer.deserialize_str(Visitor)
46 }
47 }
48
49 #[cfg(feature = "serde")]
50 impl<'de> $crate::serde::Serialize for $name {
51 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
52 where
53 S: $crate::serde::Serializer,
54 {
55 serializer.collect_str(&self)
56 }
57 }
58 };
59}