1use std::fmt;
2
3use bytes::Bytes;
4use hummer::coding::{hex_decode, hex_encode};
5use serde::{de, Deserializer, Serializer};
6
7pub 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
17pub 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}