serde_bytes_wrapper/
lib.rs

1/*!
2![MIT licensed](https://img.shields.io/github/license/dedefer/serde_bytes_wrapper?style=for-the-badge)
3[![Version](https://img.shields.io/crates/v/serde_bytes_wrapper?style=for-the-badge)](https://crates.io/crates/serde_bytes_wrapper/)
4![Code Coverage](https://img.shields.io/coveralls/github/dedefer/serde_bytes_wrapper/main?style=for-the-badge)
5![Downloads](https://img.shields.io/crates/d/serde_bytes_wrapper?style=for-the-badge)
6
7# serde_bytes_wrapper
8
9Wrapper for Vec<u8>, which uses serde_bytes as representation.
10
11It implements Deserialize, Serialize and Deref/DerefMut to Vec<u8>;
12
13[Documentation link](https://docs.rs/serde_bytes_wrapper/)
14
15[Crates.io link](https://crates.io/crates/serde_bytes_wrapper/)
16
17It is useful when you want something like
18```rust
19#[derive(serde::Deserialize, serde::Serialize, Debug)]
20struct Val {
21    #[serde(with = "serde_bytes")]
22    val: Option<Vec<Vec<u8>>>,
23}
24```
25you can use instead
26```rust
27use serde_bytes_wrapper::Bytes;
28
29#[derive(serde::Deserialize, serde::Serialize, Debug)]
30struct Val {
31    val: Option<Vec<Bytes>>,
32}
33```
34
35## Example
36
37```rust
38use serde::{Deserialize, Serialize};
39use serde_bytes_wrapper::Bytes;
40
41#[derive(Deserialize, Serialize, Debug)]
42struct Val {
43    val: Option<Vec<Bytes>>,
44}
45
46fn main() {
47  let result = serde_cbor::to_vec(&Val {
48      val: Some(vec![vec![1, 2, 3].into()])
49    }).unwrap();
50  println!("{:?}", result); // [161, 99, 118, 97, 108, 129, 67, 1, 2, 3]
51}
52```
53*/
54
55use 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}