Flatten Option permits deserialization without Token::Some in the token stream, but non-flatten not
Mingun opened this issue · 0 comments
Mingun commented
I found that test in the sources:
https://github.com/serde-rs/serde/blob/e6f086d85edfa3bde3f4486142301962ec5f1c8c/test_suite/tests/test_annotations.rs#L1824-L1925
Can anybody explain, why deserialize tokens don't match the serialized one (Token::Some
is missed)? For me that seems as an error, because non-flatten option can't be deserialized in the same manner:
use serde::Deserialize;
use serde_test::{assert_de_tokens, Token};
#[derive(Debug, PartialEq, Deserialize)]
struct Outer {
#[serde(flatten)]
inner: Inner,
}
#[derive(Debug, PartialEq, Deserialize)]
struct Inner {
option: Option<u64>,
}
/// Failed with
/// tokens failed to deserialize: invalid type: integer `2`, expected option
#[test]
fn ordinal() {
assert_de_tokens(
&Inner {
option: Some(2),
},
&[
Token::Map { len: None },
Token::Str("option"),
Token::U64(2),
Token::MapEnd,
],
);
}
/// Success (!?)
#[test]
fn flatten() {
assert_de_tokens(
&Outer {
inner: Inner {
option: Some(2),
},
},
&[
Token::Map { len: None },
Token::Str("option"),
Token::U64(2),
Token::MapEnd,
],
);
}