1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 
5 #![cfg(feature = "serde_support")]
6 
7 use std::fmt;
8 
9 use serde::{
10     de::{self, Deserialize, Deserializer, Visitor},
11     ser::{Serialize, Serializer},
12 };
13 
14 use crate::Guid;
15 
16 struct GuidVisitor;
17 impl<'de> Visitor<'de> for GuidVisitor {
18     type Value = Guid;
19     #[inline]
expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result20     fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
21         formatter.write_str("a sync guid")
22     }
23     #[inline]
visit_str<E: de::Error>(self, s: &str) -> Result<Self::Value, E>24     fn visit_str<E: de::Error>(self, s: &str) -> Result<Self::Value, E> {
25         Ok(Guid::from_slice(s.as_ref()))
26     }
27 }
28 
29 impl<'de> Deserialize<'de> for Guid {
30     #[inline]
deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>,31     fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
32     where
33         D: Deserializer<'de>,
34     {
35         deserializer.deserialize_str(GuidVisitor)
36     }
37 }
38 
39 impl Serialize for Guid {
40     #[inline]
serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error>41     fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
42         serializer.serialize_str(self.as_str())
43     }
44 }
45 
46 #[cfg(test)]
47 mod test {
48     use super::*;
49     use serde_test::{assert_tokens, Token};
50     #[test]
test_ser_de()51     fn test_ser_de() {
52         let guid = Guid::from("asdffdsa12344321");
53         assert_tokens(&guid, &[Token::Str("asdffdsa12344321")]);
54 
55         let guid = Guid::from("");
56         assert_tokens(&guid, &[Token::Str("")]);
57 
58         let guid = Guid::from(&b"abcd43211234"[..]);
59         assert_tokens(&guid, &[Token::Str("abcd43211234")]);
60     }
61 }
62