overlord/
serde_hex.rs

1use std::fmt;
2
3use bytes::Bytes;
4use hummer::coding::{hex_decode, hex_encode};
5use serde::{de, Deserializer, Serializer};
6
7/// serialize Bytes with hex
8pub fn serialize<S>(val: &Bytes, s: S) -> Result<S::Ok, S::Error>
9where
10    S: Serializer,
11{
12    s.serialize_str(&hex_encode(val))
13}
14
15struct StringVisit;
16
17/// deserialize Bytes with hex
18pub fn deserialize<'de, D>(deserializer: D) -> Result<Bytes, D::Error>
19where
20    D: Deserializer<'de>,
21{
22    deserializer.deserialize_str(StringVisit)
23}
24
25impl<'de> de::Visitor<'de> for StringVisit {
26    type Value = Bytes;
27
28    fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
29        formatter.write_str("byte array")
30    }
31
32    #[inline]
33    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
34    where
35        E: de::Error,
36    {
37        let value = hex_decode(v).map_err(de::Error::custom)?;
38        Ok(Bytes::from(value))
39    }
40}