serde_bytes_wrapper/
lib.rs1use std::ops::{Deref, DerefMut};
56use serde::{Deserialize, Serialize};
57
58#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
59
60pub struct Bytes(#[serde(with = "serde_bytes")] Vec<u8>);
61
62impl From<Vec<u8>> for Bytes {
63 fn from(val: Vec<u8>) -> Self { Bytes(val) }
64}
65
66impl From<Bytes> for Vec<u8> {
67 fn from(Bytes(val): Bytes) -> Self { val }
68}
69
70impl Deref for Bytes {
71 type Target = Vec<u8>;
72
73 fn deref(&self) -> &Self::Target { &self.0 }
74}
75
76impl DerefMut for Bytes {
77 fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 }
78}
79
80#[cfg(test)]
81mod tests {
82 use serde::{Serialize, Deserialize};
83 use serde_bytes_repr::{ByteFmtDeserializer, ByteFmtSerializer};
84 use crate::Bytes;
85
86
87
88 #[derive(Deserialize, Serialize, PartialEq, Eq, Debug)]
89 struct Val {
90 val: Option<Vec<Bytes>>,
91 }
92
93 #[test]
94 fn test_serialize_json() {
95 let mut raw_res: Vec<u8> = Vec::new();
96 let mut ser = serde_json::Serializer::new(&mut raw_res);
97 let ser = ByteFmtSerializer::base64(&mut ser, base64::STANDARD);
98 Val { val: Some(vec![vec![1, 2 ,3].into()]) }.serialize(ser).unwrap();
99
100 let result = String::from_utf8(raw_res).unwrap();
101 assert_eq!(result, r#"{"val":["AQID"]}"#.to_owned());
102 }
103
104 #[test]
105 fn test_deserialize_json() {
106 let mut de = serde_json::Deserializer::from_str(r#"{"val":["AQID"]}"#);
107 let de = ByteFmtDeserializer::new_base64(&mut de, base64::STANDARD);
108 let result: Val = Deserialize::deserialize(de).unwrap();
109 assert_eq!(result, Val { val: Some(vec![vec![1, 2 ,3].into()]) });
110 }
111
112 #[test]
113 fn test_deref() {
114 let mut result: Bytes = vec![1, 2, 3].into();
115 for byte in result.iter_mut() {
116 *byte = 100
117 }
118 result.push(100);
119 let sum = result.iter().fold(0u32, |sum, &el| sum + el as u32);
120 let v: Vec<u8> = result.into();
121 assert_eq!((v, sum), (vec![100, 100, 100, 100], 400));
122 }
123
124 #[test]
125 fn test_serialize_cbor() {
126 let result = serde_cbor::to_vec(&Val { val: Some(vec![vec![1, 2 ,3].into()]) }).unwrap();
127 assert_eq!(result, vec![161, 99, 118, 97, 108, 129, 67, 1, 2, 3]);
128 }
129
130 #[test]
131 fn test_deserialize_cbor() {
132 let result: Val = serde_cbor::from_slice(&[161, 99, 118, 97, 108, 129, 67, 1, 2, 3]).unwrap();
133 assert_eq!(result, Val { val: Some(vec![vec![1, 2 ,3].into()]) });
134 }
135}