mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-06-13 18:21:01 +00:00
Return IdentifierDeserializer to just one associated type
The BorrowedDeserializer was added in #1917, but only makes sense for &str and &[u8], not for u64 which also needs to be have an IdentifierDeserializer impl.
This commit is contained in:
+20
-13
@@ -2541,26 +2541,21 @@ mod content {
|
|||||||
// }
|
// }
|
||||||
pub trait IdentifierDeserializer<'de, E: Error> {
|
pub trait IdentifierDeserializer<'de, E: Error> {
|
||||||
type Deserializer: Deserializer<'de, Error = E>;
|
type Deserializer: Deserializer<'de, Error = E>;
|
||||||
type BorrowedDeserializer: Deserializer<'de, Error = E>;
|
|
||||||
|
|
||||||
fn from(self) -> Self::Deserializer;
|
fn from(self) -> Self::Deserializer;
|
||||||
fn borrowed(self) -> Self::BorrowedDeserializer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct Borrowed<'de, T: ?Sized>(pub &'de T);
|
||||||
|
|
||||||
impl<'de, E> IdentifierDeserializer<'de, E> for u64
|
impl<'de, E> IdentifierDeserializer<'de, E> for u64
|
||||||
where
|
where
|
||||||
E: Error,
|
E: Error,
|
||||||
{
|
{
|
||||||
type Deserializer = <u64 as IntoDeserializer<'de, E>>::Deserializer;
|
type Deserializer = <u64 as IntoDeserializer<'de, E>>::Deserializer;
|
||||||
type BorrowedDeserializer = <u64 as IntoDeserializer<'de, E>>::Deserializer;
|
|
||||||
|
|
||||||
fn from(self) -> Self::Deserializer {
|
fn from(self) -> Self::Deserializer {
|
||||||
self.into_deserializer()
|
self.into_deserializer()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn borrowed(self) -> Self::BorrowedDeserializer {
|
|
||||||
self.into_deserializer()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct StrDeserializer<'a, E> {
|
pub struct StrDeserializer<'a, E> {
|
||||||
@@ -2618,7 +2613,6 @@ where
|
|||||||
E: Error,
|
E: Error,
|
||||||
{
|
{
|
||||||
type Deserializer = StrDeserializer<'a, E>;
|
type Deserializer = StrDeserializer<'a, E>;
|
||||||
type BorrowedDeserializer = BorrowedStrDeserializer<'a, E>;
|
|
||||||
|
|
||||||
fn from(self) -> Self::Deserializer {
|
fn from(self) -> Self::Deserializer {
|
||||||
StrDeserializer {
|
StrDeserializer {
|
||||||
@@ -2626,10 +2620,17 @@ where
|
|||||||
marker: PhantomData,
|
marker: PhantomData,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn borrowed(self) -> Self::BorrowedDeserializer {
|
impl<'de, E> IdentifierDeserializer<'de, E> for Borrowed<'de, str>
|
||||||
|
where
|
||||||
|
E: Error,
|
||||||
|
{
|
||||||
|
type Deserializer = BorrowedStrDeserializer<'de, E>;
|
||||||
|
|
||||||
|
fn from(self) -> Self::Deserializer {
|
||||||
BorrowedStrDeserializer {
|
BorrowedStrDeserializer {
|
||||||
value: self,
|
value: self.0,
|
||||||
marker: PhantomData,
|
marker: PhantomData,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2640,14 +2641,20 @@ where
|
|||||||
E: Error,
|
E: Error,
|
||||||
{
|
{
|
||||||
type Deserializer = BytesDeserializer<'a, E>;
|
type Deserializer = BytesDeserializer<'a, E>;
|
||||||
type BorrowedDeserializer = BorrowedBytesDeserializer<'a, E>;
|
|
||||||
|
|
||||||
fn from(self) -> Self::Deserializer {
|
fn from(self) -> Self::Deserializer {
|
||||||
BytesDeserializer::new(self)
|
BytesDeserializer::new(self)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn borrowed(self) -> Self::BorrowedDeserializer {
|
impl<'de, E> IdentifierDeserializer<'de, E> for Borrowed<'de, [u8]>
|
||||||
BorrowedBytesDeserializer::new(self)
|
where
|
||||||
|
E: Error,
|
||||||
|
{
|
||||||
|
type Deserializer = BorrowedBytesDeserializer<'de, E>;
|
||||||
|
|
||||||
|
fn from(self) -> Self::Deserializer {
|
||||||
|
BorrowedBytesDeserializer::new(self.0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1992,18 +1992,21 @@ fn deserialize_custom_identifier(
|
|||||||
(ordinary, Some((fallthrough.clone(), fallthrough)))
|
(ordinary, Some((fallthrough.clone(), fallthrough)))
|
||||||
} else if let Style::Newtype = last.style {
|
} else if let Style::Newtype = last.style {
|
||||||
let ordinary = &variants[..variants.len() - 1];
|
let ordinary = &variants[..variants.len() - 1];
|
||||||
let fallthrough = |method| {
|
let fallthrough = |value| {
|
||||||
quote! {
|
quote! {
|
||||||
_serde::__private::Result::map(
|
_serde::__private::Result::map(
|
||||||
_serde::Deserialize::deserialize(
|
_serde::Deserialize::deserialize(
|
||||||
_serde::__private::de::IdentifierDeserializer::#method(__value)
|
_serde::__private::de::IdentifierDeserializer::from(#value)
|
||||||
),
|
),
|
||||||
#this::#last_ident)
|
#this::#last_ident)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
(
|
(
|
||||||
ordinary,
|
ordinary,
|
||||||
Some((fallthrough(quote!(from)), fallthrough(quote!(borrowed)))),
|
Some((
|
||||||
|
fallthrough(quote!(__value)),
|
||||||
|
fallthrough(quote!(_serde::__private::de::Borrowed(__value))),
|
||||||
|
)),
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
(variants, None)
|
(variants, None)
|
||||||
|
|||||||
Reference in New Issue
Block a user