1use alloc::vec::Vec;
19use core::fmt;
20
21use serde::{
22 Deserializer, Serializer,
23 de::{self, Visitor},
24};
25
26use crate::{decode, encode};
27
28pub fn serialize<S: Serializer>(data: &[u8], serializer: S) -> Result<S::Ok, S::Error> {
34 if serializer.is_human_readable() {
35 serializer.serialize_str(&encode(data))
36 } else {
37 serializer.serialize_bytes(data)
38 }
39}
40
41pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Vec<u8>, D::Error> {
46 if deserializer.is_human_readable() {
47 deserializer.deserialize_str(HexVisitor)
48 } else {
49 deserializer.deserialize_bytes(HexVisitor)
50 }
51}
52
53struct HexVisitor;
54
55impl<'de> Visitor<'de> for HexVisitor {
56 type Value = Vec<u8>;
57
58 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
59 f.write_str("a hex string")
60 }
61
62 fn visit_str<E: de::Error>(self, v: &str) -> Result<Vec<u8>, E> {
63 decode(v.as_bytes()).map_err(de::Error::custom)
64 }
65
66 fn visit_bytes<E: de::Error>(self, v: &[u8]) -> Result<Vec<u8>, E> {
67 Ok(v.to_vec())
68 }
69}