Skip to main content

bitcoin_internals/
serde.rs

1//! Contains extensions of `serde` and internal reexports.
2
3#[doc(hidden)]
4pub use serde::{de, ser, Deserialize, Deserializer, Serialize, Serializer};
5
6/// Implements `serde::Serialize` by way of `Display`.
7///
8/// `$name` is required to implement `core::fmt::Display`.
9#[macro_export]
10macro_rules! serde_string_serialize_impl {
11    ($name:ty, $expecting:literal) => {
12        impl $crate::serde::Serialize for $name {
13            fn serialize<S>(&self, serializer: S) -> core::result::Result<S::Ok, S::Error>
14            where
15                S: $crate::serde::Serializer,
16            {
17                serializer.collect_str(&self)
18            }
19        }
20    };
21}
22
23/// Implements `serde::Deserialize` by way of `FromStr`.
24///
25/// `$name` is required to implement `core::str::FromStr`.
26#[macro_export]
27macro_rules! serde_string_deserialize_impl {
28    ($name:ty, $expecting:literal) => {
29        impl<'de> $crate::serde::Deserialize<'de> for $name {
30            fn deserialize<D>(deserializer: D) -> core::result::Result<$name, D::Error>
31            where
32                D: $crate::serde::de::Deserializer<'de>,
33            {
34                use core::fmt::Formatter;
35
36                struct Visitor;
37                impl<'de> $crate::serde::de::Visitor<'de> for Visitor {
38                    type Value = $name;
39
40                    fn expecting(&self, f: &mut Formatter) -> core::fmt::Result {
41                        f.write_str($expecting)
42                    }
43
44                    fn visit_str<E>(self, v: &str) -> core::result::Result<Self::Value, E>
45                    where
46                        E: $crate::serde::de::Error,
47                    {
48                        v.parse::<$name>().map_err(E::custom)
49                    }
50                }
51
52                deserializer.deserialize_str(Visitor)
53            }
54        }
55    };
56}
57
58/// Implements `serde::Serialize` and `Deserialize` by way of `Display` and `FromStr` respectively.
59///
60/// `$name` is required to implement `core::fmt::Display` and `core::str::FromStr`.
61#[macro_export]
62macro_rules! serde_string_impl {
63    ($name:ty, $expecting:literal) => {
64        $crate::serde_string_deserialize_impl!($name, $expecting);
65        $crate::serde_string_serialize_impl!($name, $expecting);
66    };
67}