-
Notifications
You must be signed in to change notification settings - Fork 127
/
Copy path436_untagged_bytes.rs
102 lines (77 loc) · 2.5 KB
/
436_untagged_bytes.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#[test]
fn test_serde_bytes() {
#[derive(Debug, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
#[serde(rename = "b")]
struct BytesVal {
pub b: serde_bytes::ByteBuf,
}
#[derive(Debug, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
#[serde(untagged)]
enum Bad {
Bytes(BytesVal),
}
let s = ron::to_string(&serde_bytes::Bytes::new(b"test")).unwrap();
assert_eq!(s, r#"b"test""#);
let v: Bad = ron::from_str(r#"(b: b"test")"#).unwrap();
assert_eq!(
format!("{:?}", v),
"Bytes(BytesVal { b: [116, 101, 115, 116] })"
);
let s = ron::to_string(&v).unwrap();
assert_eq!(s, r#"(b:b"test")"#);
}
#[test]
fn test_bytes() {
#[derive(Debug, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
#[serde(rename = "b")]
struct BytesVal {
pub b: bytes::Bytes,
}
#[derive(Debug, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
#[serde(untagged)]
enum Bad {
Bytes(BytesVal),
}
let s = ron::to_string(&bytes::Bytes::from("test")).unwrap();
assert_eq!(s, r#"b"test""#);
let v: Bad = ron::from_str(r#"(b: b"test")"#).unwrap();
assert_eq!(format!("{:?}", v), r#"Bytes(BytesVal { b: b"test" })"#);
let s = ron::to_string(&v).unwrap();
assert_eq!(s, r#"(b:b"test")"#);
}
#[test]
fn test_strongly_typed_base64() {
use base64::engine::{general_purpose::STANDARD as BASE64, Engine};
enum Base64 {}
impl Base64 {
fn serialize<S: serde::Serializer>(data: &[u8], serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_str(&BASE64.encode(data))
}
fn deserialize<'de, D: serde::Deserializer<'de>>(
deserializer: D,
) -> Result<Vec<u8>, D::Error> {
let base64_str: &str = serde::Deserialize::deserialize(deserializer)?;
BASE64.decode(base64_str).map_err(serde::de::Error::custom)
}
}
#[derive(Debug, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
#[serde(rename = "b")]
struct BytesVal {
#[serde(with = "Base64")]
pub b: Vec<u8>,
}
#[derive(Debug, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
#[serde(untagged)]
enum Bad {
Bytes(BytesVal),
}
let v: Bad = ron::from_str(r#"(b: "dGVzdA==")"#).unwrap();
assert_eq!(
v,
Bad::Bytes(BytesVal {
b: b"test".to_vec()
})
);
let s = ron::to_string(&v).unwrap();
assert_eq!(s, r#"(b:"dGVzdA==")"#);
}