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
43#[cfg(feature = "alloc")]
44pub use serialize::serialize;
45
46#[inline]
51pub fn deserialize<'de, D, T>(deserializer: D) -> Result<T, D::Error>
52where
53 D: Deserializer<'de>,
54 T: FromHex,
55 <T as FromHex>::Error: fmt::Display,
56{
57 struct HexStrVisitor<T>(PhantomData<T>);
58
59 impl<T> Visitor<'_> for HexStrVisitor<T>
60 where
61 T: FromHex,
62 <T as FromHex>::Error: fmt::Display,
63 {
64 type Value = T;
65
66 fn expecting(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
67 f.write_str("a hex encoded string")
68 }
69
70 fn visit_bytes<E: Error>(self, data: &[u8]) -> Result<Self::Value, E> {
71 FromHex::from_hex(data).map_err(Error::custom)
72 }
73
74 fn visit_str<E: Error>(self, data: &str) -> Result<Self::Value, E> {
75 FromHex::from_hex(data.as_bytes()).map_err(Error::custom)
76 }
77 }
78
79 deserializer.deserialize_str(HexStrVisitor(PhantomData))
80}