Skip to content

Commit 00b1b6b

Browse files
committed
Move Content's Deserialize impl from serde_core to serde
1 parent cf141aa commit 00b1b6b

File tree

5 files changed

+234
-234
lines changed

5 files changed

+234
-234
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ resolver = "2"
1111
[patch.crates-io]
1212
serde = { path = "serde" }
1313
serde_core = { path = "serde_core" }
14+
serde_derive = { path = "serde_derive" }
1415

1516
[workspace.dependencies]
1617
proc-macro2 = { version = "1.0.74", default-features = false }

serde/src/private/de.rs

Lines changed: 229 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@ use crate::de::{MapAccess, Unexpected};
1111

1212
#[cfg(any(feature = "std", feature = "alloc"))]
1313
pub use self::content::{
14-
content_as_str, Content, ContentDeserializer, ContentRefDeserializer, EnumDeserializer,
15-
InternallyTaggedUnitVisitor, TagContentOtherField, TagContentOtherFieldVisitor,
16-
TagOrContentField, TagOrContentFieldVisitor, TaggedContentVisitor, UntaggedUnitVisitor,
14+
content_as_str, Content, ContentDeserializer, ContentRefDeserializer, ContentVisitor,
15+
EnumDeserializer, InternallyTaggedUnitVisitor, TagContentOtherField,
16+
TagContentOtherFieldVisitor, TagOrContentField, TagOrContentFieldVisitor, TaggedContentVisitor,
17+
UntaggedUnitVisitor,
1718
};
1819

1920
pub use serde_core::__private::InPlaceSeed;
@@ -212,8 +213,8 @@ mod content {
212213
self, Deserialize, DeserializeSeed, Deserializer, EnumAccess, Expected, IgnoredAny,
213214
MapAccess, SeqAccess, Unexpected, Visitor,
214215
};
216+
use serde_core::__private::size_hint;
215217
pub use serde_core::__private::Content;
216-
use serde_core::__private::{size_hint, ContentVisitor};
217218

218219
pub fn content_as_str<'a, 'de>(content: &'a Content<'de>) -> Option<&'a str> {
219220
match *content {
@@ -283,6 +284,228 @@ mod content {
283284
}
284285
}
285286

287+
pub struct ContentVisitor<'de> {
288+
value: PhantomData<Content<'de>>,
289+
}
290+
291+
impl<'de> ContentVisitor<'de> {
292+
pub fn new() -> Self {
293+
ContentVisitor { value: PhantomData }
294+
}
295+
}
296+
297+
impl<'de> DeserializeSeed<'de> for ContentVisitor<'de> {
298+
type Value = Content<'de>;
299+
300+
fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
301+
where
302+
D: Deserializer<'de>,
303+
{
304+
deserializer.__deserialize_content_v1(self)
305+
}
306+
}
307+
308+
impl<'de> Visitor<'de> for ContentVisitor<'de> {
309+
type Value = Content<'de>;
310+
311+
fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
312+
fmt.write_str("any value")
313+
}
314+
315+
fn visit_bool<F>(self, value: bool) -> Result<Self::Value, F>
316+
where
317+
F: de::Error,
318+
{
319+
Ok(Content::Bool(value))
320+
}
321+
322+
fn visit_i8<F>(self, value: i8) -> Result<Self::Value, F>
323+
where
324+
F: de::Error,
325+
{
326+
Ok(Content::I8(value))
327+
}
328+
329+
fn visit_i16<F>(self, value: i16) -> Result<Self::Value, F>
330+
where
331+
F: de::Error,
332+
{
333+
Ok(Content::I16(value))
334+
}
335+
336+
fn visit_i32<F>(self, value: i32) -> Result<Self::Value, F>
337+
where
338+
F: de::Error,
339+
{
340+
Ok(Content::I32(value))
341+
}
342+
343+
fn visit_i64<F>(self, value: i64) -> Result<Self::Value, F>
344+
where
345+
F: de::Error,
346+
{
347+
Ok(Content::I64(value))
348+
}
349+
350+
fn visit_u8<F>(self, value: u8) -> Result<Self::Value, F>
351+
where
352+
F: de::Error,
353+
{
354+
Ok(Content::U8(value))
355+
}
356+
357+
fn visit_u16<F>(self, value: u16) -> Result<Self::Value, F>
358+
where
359+
F: de::Error,
360+
{
361+
Ok(Content::U16(value))
362+
}
363+
364+
fn visit_u32<F>(self, value: u32) -> Result<Self::Value, F>
365+
where
366+
F: de::Error,
367+
{
368+
Ok(Content::U32(value))
369+
}
370+
371+
fn visit_u64<F>(self, value: u64) -> Result<Self::Value, F>
372+
where
373+
F: de::Error,
374+
{
375+
Ok(Content::U64(value))
376+
}
377+
378+
fn visit_f32<F>(self, value: f32) -> Result<Self::Value, F>
379+
where
380+
F: de::Error,
381+
{
382+
Ok(Content::F32(value))
383+
}
384+
385+
fn visit_f64<F>(self, value: f64) -> Result<Self::Value, F>
386+
where
387+
F: de::Error,
388+
{
389+
Ok(Content::F64(value))
390+
}
391+
392+
fn visit_char<F>(self, value: char) -> Result<Self::Value, F>
393+
where
394+
F: de::Error,
395+
{
396+
Ok(Content::Char(value))
397+
}
398+
399+
fn visit_str<F>(self, value: &str) -> Result<Self::Value, F>
400+
where
401+
F: de::Error,
402+
{
403+
Ok(Content::String(value.into()))
404+
}
405+
406+
fn visit_borrowed_str<F>(self, value: &'de str) -> Result<Self::Value, F>
407+
where
408+
F: de::Error,
409+
{
410+
Ok(Content::Str(value))
411+
}
412+
413+
fn visit_string<F>(self, value: String) -> Result<Self::Value, F>
414+
where
415+
F: de::Error,
416+
{
417+
Ok(Content::String(value))
418+
}
419+
420+
fn visit_bytes<F>(self, value: &[u8]) -> Result<Self::Value, F>
421+
where
422+
F: de::Error,
423+
{
424+
Ok(Content::ByteBuf(value.into()))
425+
}
426+
427+
fn visit_borrowed_bytes<F>(self, value: &'de [u8]) -> Result<Self::Value, F>
428+
where
429+
F: de::Error,
430+
{
431+
Ok(Content::Bytes(value))
432+
}
433+
434+
fn visit_byte_buf<F>(self, value: Vec<u8>) -> Result<Self::Value, F>
435+
where
436+
F: de::Error,
437+
{
438+
Ok(Content::ByteBuf(value))
439+
}
440+
441+
fn visit_unit<F>(self) -> Result<Self::Value, F>
442+
where
443+
F: de::Error,
444+
{
445+
Ok(Content::Unit)
446+
}
447+
448+
fn visit_none<F>(self) -> Result<Self::Value, F>
449+
where
450+
F: de::Error,
451+
{
452+
Ok(Content::None)
453+
}
454+
455+
fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
456+
where
457+
D: Deserializer<'de>,
458+
{
459+
let v = tri!(ContentVisitor::new().deserialize(deserializer));
460+
Ok(Content::Some(Box::new(v)))
461+
}
462+
463+
fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
464+
where
465+
D: Deserializer<'de>,
466+
{
467+
let v = tri!(ContentVisitor::new().deserialize(deserializer));
468+
Ok(Content::Newtype(Box::new(v)))
469+
}
470+
471+
fn visit_seq<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
472+
where
473+
V: SeqAccess<'de>,
474+
{
475+
let mut vec =
476+
Vec::<Content>::with_capacity(size_hint::cautious::<Content>(visitor.size_hint()));
477+
while let Some(e) = tri!(visitor.next_element_seed(ContentVisitor::new())) {
478+
vec.push(e);
479+
}
480+
Ok(Content::Seq(vec))
481+
}
482+
483+
fn visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
484+
where
485+
V: MapAccess<'de>,
486+
{
487+
let mut vec =
488+
Vec::<(Content, Content)>::with_capacity(
489+
size_hint::cautious::<(Content, Content)>(visitor.size_hint()),
490+
);
491+
while let Some(kv) =
492+
tri!(visitor.next_entry_seed(ContentVisitor::new(), ContentVisitor::new()))
493+
{
494+
vec.push(kv);
495+
}
496+
Ok(Content::Map(vec))
497+
}
498+
499+
fn visit_enum<V>(self, _visitor: V) -> Result<Self::Value, V::Error>
500+
where
501+
V: EnumAccess<'de>,
502+
{
503+
Err(de::Error::custom(
504+
"untagged and internally tagged enums do not support enum input",
505+
))
506+
}
507+
}
508+
286509
/// This is the type of the map keys in an internally tagged enum.
287510
///
288511
/// Not public API.
@@ -622,7 +845,7 @@ mod content {
622845
}
623846
};
624847
let rest = de::value::SeqAccessDeserializer::new(seq);
625-
Ok((tag, tri!(Content::deserialize(rest))))
848+
Ok((tag, tri!(ContentVisitor::new().deserialize(rest))))
626849
}
627850

628851
fn visit_map<M>(self, mut map: M) -> Result<Self::Value, M::Error>
@@ -643,7 +866,7 @@ mod content {
643866
tag = Some(tri!(map.next_value()));
644867
}
645868
TagOrContent::Content(k) => {
646-
let v = tri!(map.next_value());
869+
let v = tri!(map.next_value_seed(ContentVisitor::new()));
647870
vec.push((k, v));
648871
}
649872
}

0 commit comments

Comments
 (0)