1use crate::serde_hex;
16
17pub fn serialize_as_byte_str<S>(bytes: &[u8], serializer: S) -> Result<S::Ok, S::Error>
19where
20 S: serde::Serializer,
21{
22 if bytes.is_empty() {
23 return serializer.serialize_str("")
25 }
26 serde_hex::serialize(bytes, serializer)
27}
28
29pub fn deserialize_from_byte_str<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error>
31where
32 D: serde::Deserializer<'de>,
33{
34 struct Visitor;
35
36 impl<'b> serde::de::Visitor<'b> for Visitor {
37 type Value = Vec<u8>;
38
39 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
40 write!(formatter, "hex string with optional 0x prefix")
41 }
42
43 fn visit_str<E: serde::de::Error>(self, v: &str) -> Result<Self::Value, E> {
44 let result = if v.starts_with("0x") {
45 serde_hex::from_hex(v)
46 } else {
47 serde_hex::from_hex(&format!("0x{}", v))
48 };
49 result.map_err(E::custom)
50 }
51
52 fn visit_string<E: serde::de::Error>(self, v: String) -> Result<Self::Value, E> {
53 self.visit_str(&v)
54 }
55 }
56
57 deserializer.deserialize_str(Visitor)
58}