//! Module for use with `#[serde(with = "...")]` to serialize a [`Uuid`] //! as a `[u8; 16]`. //! //! [`Uuid`]: ../../struct.Uuid.html /// Serializer for a [`Uuid`] into a `[u8; 16]` /// /// [`Uuid`]: ../../struct.Uuid.html pub fn serialize(u: &crate::Uuid, serializer: S) -> Result where S: serde::Serializer, { serde::Serialize::serialize(u.as_bytes(), serializer) } /// Deserializer from a `[u8; 16]` into a [`Uuid`] /// /// [`Uuid`]: ../../struct.Uuid.html pub fn deserialize<'de, D>(deserializer: D) -> Result where D: serde::Deserializer<'de>, { let bytes: [u8; 16] = serde::Deserialize::deserialize(deserializer)?; Ok(crate::Uuid::from_bytes(bytes)) } #[cfg(test)] mod tests { use serde_test; #[test] fn test_serialize_compact() { #[derive( serde_derive::Serialize, Debug, serde_derive::Deserialize, PartialEq, )] struct UuidContainer { #[serde(with = "super")] u: crate::Uuid, } use serde_test::Configure; let uuid_bytes = b"F9168C5E-CEB2-4F"; let container = UuidContainer { u: crate::Uuid::from_slice(uuid_bytes).unwrap(), }; // more complex because of the struct wrapping the actual UUID // serialization serde_test::assert_tokens( &container.compact(), &[ serde_test::Token::Struct { name: "UuidContainer", len: 1, }, serde_test::Token::Str("u"), serde_test::Token::Tuple { len: 16 }, serde_test::Token::U8(uuid_bytes[0]), serde_test::Token::U8(uuid_bytes[1]), serde_test::Token::U8(uuid_bytes[2]), serde_test::Token::U8(uuid_bytes[3]), serde_test::Token::U8(uuid_bytes[4]), serde_test::Token::U8(uuid_bytes[5]), serde_test::Token::U8(uuid_bytes[6]), serde_test::Token::U8(uuid_bytes[7]), serde_test::Token::U8(uuid_bytes[8]), serde_test::Token::U8(uuid_bytes[9]), serde_test::Token::U8(uuid_bytes[10]), serde_test::Token::U8(uuid_bytes[11]), serde_test::Token::U8(uuid_bytes[12]), serde_test::Token::U8(uuid_bytes[13]), serde_test::Token::U8(uuid_bytes[14]), serde_test::Token::U8(uuid_bytes[15]), serde_test::Token::TupleEnd, serde_test::Token::StructEnd, ], ) } }