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

@Mingun

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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions