serde_email/email/
serde_support.rs

1use ::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}