mirror of
https://github.com/serde-rs/serde.git
synced 2025-09-27 04:50:36 +00:00
Cover ContentRefDeserializer::deserialize_option
This commit is contained in:
parent
8514f4119a
commit
2dddc7796d
@ -1898,10 +1898,17 @@ mod content {
|
|||||||
where
|
where
|
||||||
V: Visitor<'de>,
|
V: Visitor<'de>,
|
||||||
{
|
{
|
||||||
|
// Covered by tests/test_enum_untagged.rs
|
||||||
|
// with_optional_field::*
|
||||||
match *self.content {
|
match *self.content {
|
||||||
Content::None => visitor.visit_none(),
|
Content::None => visitor.visit_none(),
|
||||||
Content::Some(ref v) => visitor.visit_some(ContentRefDeserializer::new(v)),
|
Content::Some(ref v) => visitor.visit_some(ContentRefDeserializer::new(v)),
|
||||||
Content::Unit => visitor.visit_unit(),
|
Content::Unit => visitor.visit_unit(),
|
||||||
|
// This case is necessary for formats which does not store marker of optionality of value,
|
||||||
|
// for example, JSON. When `deserialize_any` is requested from such formats, they will
|
||||||
|
// report value without using `Visitor::visit_some`, because they do not known in which
|
||||||
|
// contexts this value will be used.
|
||||||
|
// RON is example of format which preserve markers.
|
||||||
_ => visitor.visit_some(self),
|
_ => visitor.visit_some(self),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -191,6 +191,80 @@ fn newtype_enum() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Reaches crate::private::de::content::ContentRefDeserializer::deserialize_option
|
||||||
|
mod with_optional_field {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||||
|
#[serde(untagged)]
|
||||||
|
enum Enum {
|
||||||
|
Struct { optional: Option<u32> },
|
||||||
|
Null,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn some() {
|
||||||
|
assert_tokens(
|
||||||
|
&Enum::Struct { optional: Some(42) },
|
||||||
|
&[
|
||||||
|
Token::Struct {
|
||||||
|
name: "Enum",
|
||||||
|
len: 1,
|
||||||
|
},
|
||||||
|
Token::Str("optional"),
|
||||||
|
Token::Some,
|
||||||
|
Token::U32(42),
|
||||||
|
Token::StructEnd,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn some_without_marker() {
|
||||||
|
assert_de_tokens(
|
||||||
|
&Enum::Struct { optional: Some(42) },
|
||||||
|
&[
|
||||||
|
Token::Struct {
|
||||||
|
name: "Enum",
|
||||||
|
len: 1,
|
||||||
|
},
|
||||||
|
Token::Str("optional"),
|
||||||
|
Token::U32(42),
|
||||||
|
Token::StructEnd,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn none() {
|
||||||
|
assert_tokens(
|
||||||
|
&Enum::Struct { optional: None },
|
||||||
|
&[
|
||||||
|
Token::Struct {
|
||||||
|
name: "Enum",
|
||||||
|
len: 1,
|
||||||
|
},
|
||||||
|
Token::Str("optional"),
|
||||||
|
Token::None,
|
||||||
|
Token::StructEnd,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn unit() {
|
||||||
|
assert_de_tokens(
|
||||||
|
&Enum::Struct { optional: None },
|
||||||
|
&[
|
||||||
|
Token::Map { len: None },
|
||||||
|
Token::Str("optional"),
|
||||||
|
Token::Unit,
|
||||||
|
Token::MapEnd,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn string_and_bytes() {
|
fn string_and_bytes() {
|
||||||
#[derive(Debug, PartialEq, Deserialize)]
|
#[derive(Debug, PartialEq, Deserialize)]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user