use serde::{Deserialize, Serialize};
pub fn serialize_hex<S>(value: &[u8], serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
if serializer.is_human_readable() {
hex::serde::serialize(value, serializer)
} else {
value.serialize(serializer)
}
}
pub fn deserialize_hex<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error>
where
D: serde::Deserializer<'de>,
{
if deserializer.is_human_readable() {
hex::serde::deserialize(deserializer)
} else {
let bytes: Vec<u8> = Deserialize::deserialize(deserializer)?;
Ok(bytes)
}
}
#[cfg(test)]
mod tests {
use serde::{Deserialize, Serialize};
use super::{deserialize_hex, serialize_hex};
#[derive(Debug, Serialize, Deserialize)]
struct Test(
#[serde(serialize_with = "serialize_hex", deserialize_with = "deserialize_hex")] Vec<u8>,
);
#[test]
fn serialize() {
let mut bytes: Vec<u8> = Vec::new();
let test = Test(vec![1, 2, 3]);
ciborium::ser::into_writer(&test, &mut bytes).unwrap();
assert_eq!(vec![131, 1, 2, 3], bytes);
}
#[test]
fn deserialize() {
let bytes: Vec<u8> = vec![131, 1, 2, 3];
let test: Test = ciborium::de::from_reader(&bytes[..]).unwrap();
assert_eq!(test.0, vec![1, 2, 3]);
}
}