sync_guid/
serde_support.rs
1use std::fmt;
6
7use serde::{
8 de::{self, Deserialize, Deserializer, Visitor},
9 ser::{Serialize, Serializer},
10};
11
12use crate::Guid;
13
14struct GuidVisitor;
15impl Visitor<'_> for GuidVisitor {
16 type Value = Guid;
17 #[inline]
18 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
19 formatter.write_str("a sync guid")
20 }
21 #[inline]
22 fn visit_str<E: de::Error>(self, s: &str) -> Result<Self::Value, E> {
23 Ok(Guid::from_slice(s.as_ref()))
24 }
25}
26
27impl<'de> Deserialize<'de> for Guid {
28 #[inline]
29 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
30 where
31 D: Deserializer<'de>,
32 {
33 deserializer.deserialize_str(GuidVisitor)
34 }
35}
36
37impl Serialize for Guid {
38 #[inline]
39 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
40 serializer.serialize_str(self.as_str())
41 }
42}
43
44#[cfg(test)]
45mod test {
46 use super::*;
47 use serde_test::{assert_tokens, Token};
48 #[test]
49 fn test_ser_de() {
50 let guid = Guid::from("asdffdsa12344321");
51 assert_tokens(&guid, &[Token::Str("asdffdsa12344321")]);
52
53 let guid = Guid::from("");
54 assert_tokens(&guid, &[Token::Str("")]);
55
56 let guid = Guid::from(&b"abcd43211234"[..]);
57 assert_tokens(&guid, &[Token::Str("abcd43211234")]);
58 }
59}