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