serde_amqp/primitives/
binary_ref.rs1use std::fmt::{LowerHex, UpperHex};
2
3use serde::{de, Serialize};
4
5use super::Binary;
6
7#[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}