Skip to content

Commit

Permalink
Return IdentifierDeserializer to just one associated type
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
dtolnay committed Jan 24, 2021
1 parent 84ad76b commit b6a2d07
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 16 deletions.
33 changes: 20 additions & 13 deletions serde/src/private/de.rs
Expand Up @@ -2541,26 +2541,21 @@ mod content {
// }
pub trait IdentifierDeserializer<'de, E: Error> {
type Deserializer: Deserializer<'de, Error = E>;
type BorrowedDeserializer: Deserializer<'de, Error = E>;

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
where
E: Error,
{
type Deserializer = <u64 as IntoDeserializer<'de, E>>::Deserializer;
type BorrowedDeserializer = <u64 as IntoDeserializer<'de, E>>::Deserializer;

fn from(self) -> Self::Deserializer {
self.into_deserializer()
}

fn borrowed(self) -> Self::BorrowedDeserializer {
self.into_deserializer()
}
}

pub struct StrDeserializer<'a, E> {
Expand Down Expand Up @@ -2618,18 +2613,24 @@ where
E: Error,
{
type Deserializer = StrDeserializer<'a, E>;
type BorrowedDeserializer = BorrowedStrDeserializer<'a, E>;

fn from(self) -> Self::Deserializer {
StrDeserializer {
value: self,
marker: PhantomData,
}
}
}

impl<'de, E> IdentifierDeserializer<'de, E> for Borrowed<'de, str>
where
E: Error,
{
type Deserializer = BorrowedStrDeserializer<'de, E>;

fn borrowed(self) -> Self::BorrowedDeserializer {
fn from(self) -> Self::Deserializer {
BorrowedStrDeserializer {
value: self,
value: self.0,
marker: PhantomData,
}
}
Expand All @@ -2640,14 +2641,20 @@ where
E: Error,
{
type Deserializer = BytesDeserializer<'a, E>;
type BorrowedDeserializer = BorrowedBytesDeserializer<'a, E>;

fn from(self) -> Self::Deserializer {
BytesDeserializer::new(self)
}
}

impl<'de, E> IdentifierDeserializer<'de, E> for Borrowed<'de, [u8]>
where
E: Error,
{
type Deserializer = BorrowedBytesDeserializer<'de, E>;

fn borrowed(self) -> Self::BorrowedDeserializer {
BorrowedBytesDeserializer::new(self)
fn from(self) -> Self::Deserializer {
BorrowedBytesDeserializer::new(self.0)
}
}

Expand Down
9 changes: 6 additions & 3 deletions serde_derive/src/de.rs
Expand Up @@ -1992,18 +1992,21 @@ fn deserialize_custom_identifier(
(ordinary, Some((fallthrough.clone(), fallthrough)))
} else if let Style::Newtype = last.style {
let ordinary = &variants[..variants.len() - 1];
let fallthrough = |method| {
let fallthrough = |value| {
quote! {
_serde::__private::Result::map(
_serde::Deserialize::deserialize(
_serde::__private::de::IdentifierDeserializer::#method(__value)
_serde::__private::de::IdentifierDeserializer::from(#value)
),
#this::#last_ident)
}
};
(
ordinary,
Some((fallthrough(quote!(from)), fallthrough(quote!(borrowed)))),
Some((
fallthrough(quote!(__value)),
fallthrough(quote!(_serde::__private::de::Borrowed(__value))),
)),
)
} else {
(variants, None)
Expand Down

0 comments on commit b6a2d07

Please sign in to comment.