mirror of
https://github.com/uuid-rs/uuid.git
synced 2025-10-01 15:01:05 +00:00
serialize Uuid as [u8; 16] instead of &[u8]
This commit is contained in:
parent
63170f8d9c
commit
ce3eca7c95
@ -1,80 +0,0 @@
|
||||
//! 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<S>(u: &crate::Uuid, serializer: S) -> Result<S::Ok, S::Error>
|
||||
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<crate::Uuid, D::Error>
|
||||
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,
|
||||
],
|
||||
)
|
||||
}
|
||||
}
|
@ -14,9 +14,6 @@
|
||||
use crate::prelude::*;
|
||||
use crate::std::{borrow::Borrow, fmt, str};
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
pub mod compact;
|
||||
|
||||
/// An adaptor for formatting an [`Uuid`] as a hyphenated string.
|
||||
///
|
||||
/// Takes an owned instance of the [`Uuid`].
|
||||
|
@ -22,7 +22,7 @@ impl Serialize for Uuid {
|
||||
serializer
|
||||
.serialize_str(self.to_hyphenated().encode_lower(&mut [0; 36]))
|
||||
} else {
|
||||
serializer.serialize_bytes(self.as_bytes())
|
||||
self.as_bytes().serialize(serializer)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -65,27 +65,9 @@ impl<'de> Deserialize<'de> for Uuid {
|
||||
|
||||
deserializer.deserialize_str(UuidStringVisitor)
|
||||
} else {
|
||||
struct UuidBytesVisitor;
|
||||
let bytes: [u8; 16] = Deserialize::deserialize(deserializer)?;
|
||||
|
||||
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_slice(value).map_err(de_error)
|
||||
}
|
||||
}
|
||||
|
||||
deserializer.deserialize_bytes(UuidBytesVisitor)
|
||||
Ok(Uuid::from_bytes(bytes))
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -107,7 +89,26 @@ mod serde_tests {
|
||||
fn test_serialize_compact() {
|
||||
let uuid_bytes = b"F9168C5E-CEB2-4F";
|
||||
let u = Uuid::from_slice(uuid_bytes).unwrap();
|
||||
serde_test::assert_tokens(&u.compact(), &[Token::Bytes(uuid_bytes)]);
|
||||
serde_test::assert_tokens(&u.compact(), &[
|
||||
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,
|
||||
]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@ -119,7 +120,7 @@ mod serde_tests {
|
||||
|
||||
serde_test::assert_de_tokens_error::<Compact<Uuid>>(
|
||||
&[Token::Bytes(b"hello_world")],
|
||||
"UUID parsing failed: invalid bytes length: expected 16, found 11",
|
||||
"invalid type: byte array, expected an array of length 16",
|
||||
);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user