serde_email/email/
serde_support.rs1use ::serde::Deserialize;
2use ::serde::Deserializer;
3use ::serde::Serialize;
4use ::serde::Serializer;
5
6use crate::Email;
7use crate::EmailVisitor;
8
9impl Serialize for Email {
10 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
11 where
12 S: Serializer,
13 {
14 serializer.serialize_str(&self.raw_email)
15 }
16}
17
18impl<'de> Deserialize<'de> for Email {
19 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
20 where
21 D: Deserializer<'de>,
22 {
23 deserializer.deserialize_string(EmailVisitor)
24 }
25}
26
27#[cfg(test)]
28mod test_serialisation {
29 use super::*;
30 use ::serde::Deserialize;
31 use ::serde::Serialize;
32 use ::serde_json;
33
34 #[derive(Serialize, Deserialize)]
35 struct Person {
36 name: String,
37 email: Email,
38 }
39
40 #[test]
41 fn it_should_serialise_email_from_string() {
42 let email = Email::from_str("john@example.com").unwrap();
43 let raw = serde_json::to_string(&email).unwrap();
44
45 assert_eq!(raw, r#""john@example.com""#);
46 }
47}
48
49#[cfg(test)]
50mod test_deserialisation {
51 use super::*;
52 use ::serde::Deserialize;
53 use ::serde::Serialize;
54 use ::serde_json;
55
56 #[derive(Serialize, Deserialize)]
57 struct Person {
58 name: String,
59 email: Email,
60 }
61
62 #[test]
63 fn it_should_not_deserialise_non_email_from_string() {
64 let raw_email = "donkeys";
65
66 let result = serde_json::from_str::<Email>(raw_email);
67
68 assert!(result.is_err());
69 }
70
71 #[test]
72 fn it_should_deserialise_not_structs_from_raw_with_non_email() {
73 let data = r#"
74 {
75 "name": "John Doe",
76 "email": "donkeys"
77 }"#;
78
79 let result = serde_json::from_str::<Person>(data);
80
81 assert!(result.is_err());
82 }
83
84 #[test]
85 fn it_should_deserialise_email_from_string() {
86 let raw_json_email = r#""john@example.com""#;
87
88 let email: Email = serde_json::from_str(raw_json_email).unwrap();
89
90 assert_eq!(email, Email::from_str("john@example.com").unwrap());
91 }
92
93 #[test]
94 fn it_should_deserialise_structs_from_raw() {
95 let data = r#"
96 {
97 "name": "John Doe",
98 "email": "john@example.com"
99 }"#;
100
101 let person = serde_json::from_str::<Person>(data).unwrap();
102
103 assert_eq!(person.email, Email::from_str("john@example.com").unwrap());
104 }
105}