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:
David Tolnay
2021-01-23 20:00:07 -08:00
parent 84ad76b2e5
commit b6a2d07f26
2 changed files with 26 additions and 16 deletions
+20 -13
View File
@@ -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)
} }
} }
+6 -3
View File
@@ -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)