Skip to content
This repository was archived by the owner on Dec 17, 2024. It is now read-only.
This repository was archived by the owner on Dec 17, 2024. It is now read-only.

Flatten Option permits deserialization without Token::Some in the token stream, but non-flatten not #3

Description

@Mingun

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,
    ],
  );
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions