mirror of
https://github.com/serde-rs/serde.git
synced 2025-10-02 15:25:38 +00:00
Merge pull request #2822 from dtolnay/mapcontentdeserializer
Remove explicit ContentDeserializer construction in visit functions
This commit is contained in:
commit
4487cb26c7
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user