bip39/
internal_macros.rs

1/// Implement serde serialization based on the
2/// fmt::Display and std::FromStr traits.
3macro_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}