serde_amqp/primitives/
binary_ref.rs

1use std::fmt::{LowerHex, UpperHex};
2
3use serde::{de, Serialize};
4
5use super::Binary;
6
7/// A wrapper over [`&[u8]`] that allows serialize as an AMQP Binary type and provide custom
8/// implementation for `LowerHex` and `UpperHex`
9#[derive(Debug)]
10pub struct BinaryRef<'a>(pub &'a [u8]);
11
12impl<'a> From<&'a Binary> for BinaryRef<'a> {
13    fn from(value: &'a Binary) -> Self {
14        Self(value.as_ref())
15    }
16}
17
18impl Serialize for BinaryRef<'_> {
19    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
20    where
21        S: serde::Serializer,
22    {
23        serializer.serialize_bytes(self.0)
24    }
25}
26
27impl<'de> de::Deserialize<'de> for BinaryRef<'de> {
28    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
29    where
30        D: serde::Deserializer<'de>,
31    {
32        serde::Deserialize::deserialize(deserializer).map(BinaryRef)
33    }
34}
35
36impl LowerHex for BinaryRef<'_> {
37    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
38        for byte in self.0 {
39            write!(f, "{:x}", byte)?;
40        }
41        Ok(())
42    }
43}
44
45impl UpperHex for BinaryRef<'_> {
46    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
47        for byte in self.0 {
48            write!(f, "{:X}", byte)?;
49        }
50        Ok(())
51    }
52}
53
54#[cfg(test)]
55mod tests {
56    use crate::{from_slice, primitives::Binary, to_vec};
57
58    use super::BinaryRef;
59
60    #[test]
61    fn test_format_lower_hex() {
62        let bref = BinaryRef(b"amqp");
63        let s = format!("{:x}", bref);
64        assert_eq!("616d7170", s);
65    }
66
67    #[test]
68    fn test_format_upper_hex() {
69        let bref = BinaryRef(b"amqp");
70        let s = format!("{:X}", bref);
71        assert_eq!("616D7170", s);
72    }
73
74    #[test]
75    fn test_serialize_binary_ref() {
76        let bref = BinaryRef(b"amqp");
77        let buf = to_vec(&bref).unwrap();
78
79        let b = Binary::from("amqp");
80        let expected = to_vec(&b).unwrap();
81
82        assert_eq!(buf, expected);
83    }
84
85    #[test]
86    fn test_deserialize_binary_ref() {
87        let expected = Binary::from("amqp");
88        let buf = to_vec(&expected).unwrap();
89
90        let bref: BinaryRef = from_slice(&buf).unwrap();
91        assert_eq!(bref.0, expected.as_ref());
92    }
93}