1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
extern crate serde; use core::fmt; use self::serde::{de, Deserialize, Deserializer, Serialize, Serializer}; use Uuid; impl Serialize for Uuid { fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> { if serializer.is_human_readable() { serializer.collect_str(&self.hyphenated()) } else { serializer.serialize_bytes(self.as_bytes()) } } } impl<'de> Deserialize<'de> for Uuid { fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> { if deserializer.is_human_readable() { struct UuidStringVisitor; impl<'vi> de::Visitor<'vi> for UuidStringVisitor { type Value = Uuid; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { write!(formatter, "a UUID string") } fn visit_str<E: de::Error>(self, value: &str) -> Result<Uuid, E> { value.parse::<Uuid>().map_err(E::custom) } fn visit_bytes<E: de::Error>(self, value: &[u8]) -> Result<Uuid, E> { Uuid::from_bytes(value).map_err(E::custom) } } deserializer.deserialize_str(UuidStringVisitor) } else { struct UuidBytesVisitor; impl<'vi> de::Visitor<'vi> for UuidBytesVisitor { type Value = Uuid; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { write!(formatter, "bytes") } fn visit_bytes<E: de::Error>(self, value: &[u8]) -> Result<Uuid, E> { Uuid::from_bytes(value).map_err(E::custom) } } deserializer.deserialize_bytes(UuidBytesVisitor) } } } #[cfg(test)] mod tests { extern crate serde_test; use self::serde_test::{assert_tokens, Configure, Token}; use Uuid; #[test] fn test_serialize_readable() { let uuid_str = "f9168c5e-ceb2-4faa-b6bf-329bf39fa1e4"; let u = Uuid::parse_str(uuid_str).unwrap(); assert_tokens(&u.readable(), &[Token::Str(uuid_str)]); } #[test] fn test_serialize_compact() { let uuid_bytes = b"F9168C5E-CEB2-4F"; let u = Uuid::from_bytes(uuid_bytes).unwrap(); assert_tokens(&u.compact(), &[Token::Bytes(uuid_bytes)]); } }