Merge pull request #2822 from dtolnay/mapcontentdeserializer

Remove explicit ContentDeserializer construction in visit functions
This commit is contained in:
David Tolnay 2024-09-07 16:41:38 -07:00 committed by GitHub
commit 4487cb26c7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -313,6 +313,17 @@ mod content {
} }
} }
impl<'a, 'de, E> de::IntoDeserializer<'de, E> for &'a Content<'de>
where
E: de::Error,
{
type Deserializer = ContentRefDeserializer<'a, 'de, E>;
fn into_deserializer(self) -> Self::Deserializer {
ContentRefDeserializer::new(self)
}
}
/// Used to capture data in [`Content`] from other deserializers. /// Used to capture data in [`Content`] from other deserializers.
/// Cannot capture externally tagged enums, `i128` and `u128`. /// Cannot capture externally tagged enums, `i128` and `u128`.
struct ContentVisitor<'de> { struct ContentVisitor<'de> {
@ -1100,8 +1111,7 @@ mod content {
V: Visitor<'de>, V: Visitor<'de>,
E: de::Error, E: de::Error,
{ {
let seq = content.into_iter().map(ContentDeserializer::new); let mut seq_visitor = SeqDeserializer::new(content.into_iter());
let mut seq_visitor = SeqDeserializer::new(seq);
let value = tri!(visitor.visit_seq(&mut seq_visitor)); let value = tri!(visitor.visit_seq(&mut seq_visitor));
tri!(seq_visitor.end()); tri!(seq_visitor.end());
Ok(value) Ok(value)
@ -1115,14 +1125,7 @@ mod content {
V: Visitor<'de>, V: Visitor<'de>,
E: de::Error, E: de::Error,
{ {
fn content_deserializer_pair<'de, E>( let mut map_visitor = MapDeserializer::new(content.into_iter());
(k, v): (Content<'de>, Content<'de>),
) -> (ContentDeserializer<'de, E>, ContentDeserializer<'de, E>) {
(ContentDeserializer::new(k), ContentDeserializer::new(v))
}
let map = content.into_iter().map(content_deserializer_pair);
let mut map_visitor = MapDeserializer::new(map);
let value = tri!(visitor.visit_map(&mut map_visitor)); let value = tri!(visitor.visit_map(&mut map_visitor));
tri!(map_visitor.end()); tri!(map_visitor.end());
Ok(value) Ok(value)
@ -1700,8 +1703,7 @@ mod content {
V: Visitor<'de>, V: Visitor<'de>,
E: de::Error, E: de::Error,
{ {
let seq = content.iter().map(ContentRefDeserializer::new); let mut seq_visitor = SeqDeserializer::new(content.iter());
let mut seq_visitor = SeqDeserializer::new(seq);
let value = tri!(visitor.visit_seq(&mut seq_visitor)); let value = tri!(visitor.visit_seq(&mut seq_visitor));
tri!(seq_visitor.end()); tri!(seq_visitor.end());
Ok(value) Ok(value)
@ -1715,16 +1717,10 @@ mod content {
V: Visitor<'de>, V: Visitor<'de>,
E: de::Error, E: de::Error,
{ {
fn content_ref_deserializer_pair<'a, 'de, E>( fn content_ref_deserializer_pair<'a, 'de>(
(k, v): &'a (Content<'de>, Content<'de>), (k, v): &'a (Content<'de>, Content<'de>),
) -> ( ) -> (&'a Content<'de>, &'a Content<'de>) {
ContentRefDeserializer<'a, 'de, E>, (k, v)
ContentRefDeserializer<'a, 'de, E>,
) {
(
ContentRefDeserializer::new(k),
ContentRefDeserializer::new(v),
)
} }
let map = content.iter().map(content_ref_deserializer_pair); let map = content.iter().map(content_ref_deserializer_pair);