1use crate::FromHex;
18use core::fmt;
19use core::marker::PhantomData;
20use serde::de::{Error, Visitor};
21use serde::Deserializer;
22
23#[cfg(feature = "alloc")]
24mod serialize {
25 use serde::Serializer;
26
27 #[inline]
34 pub fn serialize<S, T>(data: T, serializer: S) -> Result<S::Ok, S::Error>
35 where
36 S: Serializer,
37 T: AsRef<[u8]>,
38 {
39 serializer.serialize_str(&crate::encode_prefixed(data.as_ref()))
40 }
41
42 #[inline]
46 pub fn serialize_upper<S, T>(data: T, serializer: S) -> Result<S::Ok, S::Error>
47 where
48 S: Serializer,
49 T: AsRef<[u8]>,
50 {
51 serializer.serialize_str(&crate::encode_upper_prefixed(data.as_ref()))
52 }
53}
54
55#[cfg(feature = "alloc")]
56pub use serialize::{serialize, serialize_upper};
57
58#[inline]
63pub fn deserialize<'de, D, T>(deserializer: D) -> Result<T, D::Error>
64where
65 D: Deserializer<'de>,
66 T: FromHex,
67 <T as FromHex>::Error: fmt::Display,
68{
69 struct HexStrVisitor<T>(PhantomData<T>);
70
71 impl<T> Visitor<'_> for HexStrVisitor<T>
72 where
73 T: FromHex,
74 <T as FromHex>::Error: fmt::Display,
75 {
76 type Value = T;
77
78 fn expecting(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
79 f.write_str("a hex encoded string")
80 }
81
82 fn visit_bytes<E: Error>(self, data: &[u8]) -> Result<Self::Value, E> {
83 FromHex::from_hex(data).map_err(Error::custom)
84 }
85
86 fn visit_str<E: Error>(self, data: &str) -> Result<Self::Value, E> {
87 FromHex::from_hex(data.as_bytes()).map_err(Error::custom)
88 }
89 }
90
91 deserializer.deserialize_str(HexStrVisitor(PhantomData))
92}