[
  {
    "path": ".github/FUNDING.yml",
    "content": "github: dtolnay\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/1-problem.md",
    "content": "---\nname: Problem\nabout: Something does not seem right\n\n---\n\n\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/2-suggestion.md",
    "content": "---\nname: Suggestion\nabout: Share how Serde could support your use case better\n\n---\n\n\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/3-documentation.md",
    "content": "---\nname: Documentation\nabout: Certainly there is room for improvement\n\n---\n\n\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/4-other.md",
    "content": "---\nname: Anything else!\nabout: Whatever is on your mind\n\n---\n\n\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "content": "name: CI\n\non:\n  push:\n  pull_request:\n  workflow_dispatch:\n  schedule: [cron: \"40 1 * * *\"]\n\npermissions:\n  contents: read\n\nenv:\n  RUSTFLAGS: -Dwarnings\n\njobs:\n  test:\n    name: Test suite\n    runs-on: ubuntu-latest\n    timeout-minutes: 45\n    steps:\n      - uses: actions/checkout@v6\n      - uses: dtolnay/rust-toolchain@nightly\n      - run: cd test_suite && cargo test --features unstable\n      - uses: actions/upload-artifact@v6\n        if: always()\n        with:\n          name: Cargo.lock\n          path: Cargo.lock\n        continue-on-error: true\n\n  windows:\n    name: Test suite (windows)\n    runs-on: windows-latest\n    timeout-minutes: 45\n    steps:\n      - uses: actions/checkout@v6\n      - uses: dtolnay/rust-toolchain@nightly\n      - run: cd test_suite && cargo test --features unstable -- --skip ui --exact\n\n  stable:\n    name: Rust ${{matrix.rust}}\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        rust: [stable, beta]\n    timeout-minutes: 45\n    steps:\n      - uses: actions/checkout@v6\n      - uses: dtolnay/rust-toolchain@master\n        with:\n          toolchain: ${{matrix.rust}}\n      - run: cd serde && cargo build --features rc\n      - run: cd serde && cargo build --no-default-features\n      - run: cd test_suite/no_std && cargo build\n\n  nightly:\n    name: Rust nightly${{matrix.os == 'windows' && ' (windows)' || ''}}\n    runs-on: ${{matrix.os}}-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        os: [ubuntu, windows]\n    timeout-minutes: 45\n    steps:\n      - uses: actions/checkout@v6\n      - uses: dtolnay/rust-toolchain@nightly\n      - run: cd serde && cargo build\n      - run: cd serde && cargo build --no-default-features\n      - run: cd serde && cargo build --no-default-features --features alloc\n      - run: cd serde && cargo build --no-default-features --features rc,alloc\n      - run: cd serde && cargo build --no-default-features --features unstable\n      - run: cd serde_core && cargo test --features rc,unstable\n      - run: cd test_suite/no_std && cargo build\n        if: matrix.os != 'windows'\n      - run: cd serde_derive && cargo check --tests\n        env:\n          RUSTFLAGS: --cfg exhaustive ${{env.RUSTFLAGS}}\n        if: matrix.os != 'windows'\n\n  build:\n    name: Rust ${{matrix.rust}}\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        rust: [1.56.0, 1.60.0]\n    timeout-minutes: 45\n    steps:\n      - uses: actions/checkout@v6\n      - uses: dtolnay/rust-toolchain@master\n        with:\n          toolchain: ${{matrix.rust}}\n      - run: sed -i '/\"test_suite\"/d' Cargo.toml\n      - run: cd serde && cargo build --features rc\n      - run: cd serde && cargo build --no-default-features\n      - run: cd serde && cargo build --no-default-features --features alloc\n      - run: cd serde && cargo build\n\n  derive:\n    name: Rust 1.71.0\n    runs-on: ubuntu-latest\n    timeout-minutes: 45\n    steps:\n      - uses: actions/checkout@v6\n      - uses: dtolnay/rust-toolchain@1.71.0\n      - run: |\n          sed -i 's/proc-macro2 = { workspace = true/proc-macro2 = { version = \"1\"/' serde_derive*/Cargo.toml\n          sed -i 's/quote = { workspace = true/quote = { version = \"1\"/' serde_derive*/Cargo.toml\n          sed -i 's/syn = { workspace = true/syn = { version = \"2\"/' serde_derive*/Cargo.toml\n      - run: cd serde && cargo check --no-default-features\n      - run: cd serde && cargo check\n      - run: cd serde_derive && cargo check\n\n  minimal:\n    name: Minimal versions\n    runs-on: ubuntu-latest\n    timeout-minutes: 45\n    steps:\n      - uses: actions/checkout@v6\n      - uses: dtolnay/rust-toolchain@nightly\n      - run: cargo generate-lockfile -Z minimal-versions\n      - run: cargo check --locked --workspace\n\n  doc:\n    name: Documentation\n    runs-on: ubuntu-latest\n    timeout-minutes: 45\n    env:\n      RUSTDOCFLAGS: -Dwarnings\n    steps:\n      - uses: actions/checkout@v6\n      - uses: dtolnay/rust-toolchain@nightly\n      - uses: dtolnay/install@cargo-docs-rs\n      - run: cargo docs-rs -p serde\n      - run: cargo docs-rs -p serde_core\n      - run: cargo docs-rs -p serde_derive\n      - run: cargo docs-rs -p serde_derive_internals\n\n  clippy:\n    name: Clippy\n    runs-on: ubuntu-latest\n    if: github.event_name != 'pull_request'\n    timeout-minutes: 45\n    steps:\n      - uses: actions/checkout@v6\n      - uses: dtolnay/rust-toolchain@clippy\n      - run: cd serde && cargo clippy --features rc,unstable -- -Dclippy::all -Dclippy::pedantic\n      - run: cd serde_core && cargo clippy --features rc,unstable -- -Dclippy::all -Dclippy::pedantic\n      - run: cd serde_derive && cargo clippy -- -Dclippy::all -Dclippy::pedantic\n      - run: cd serde_derive_internals && cargo clippy -- -Dclippy::all -Dclippy::pedantic\n      - run: cd test_suite && cargo clippy --tests --features unstable -- -Dclippy::all -Dclippy::pedantic\n      - run: cd test_suite/no_std && cargo clippy -- -Dclippy::all -Dclippy::pedantic\n\n  miri:\n    name: Miri\n    runs-on: ubuntu-latest\n    timeout-minutes: 45\n    steps:\n      - uses: actions/checkout@v6\n      - uses: dtolnay/rust-toolchain@miri\n      - run: cargo miri setup\n      - run: cd serde_core && cargo miri test --features rc,unstable\n        env:\n          MIRIFLAGS: -Zmiri-strict-provenance\n      - run: cd test_suite && cargo miri test --features unstable\n        env:\n          MIRIFLAGS: -Zmiri-strict-provenance\n\n  outdated:\n    name: Outdated\n    runs-on: ubuntu-latest\n    if: github.event_name != 'pull_request'\n    timeout-minutes: 45\n    steps:\n      - uses: actions/checkout@v6\n      - uses: dtolnay/rust-toolchain@stable\n      - uses: dtolnay/install@cargo-outdated\n      - run: cargo outdated --workspace --exit-code 1\n"
  },
  {
    "path": ".gitignore",
    "content": "/target/\n/Cargo.lock\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing to Serde\n\nSerde welcomes contribution from everyone in the form of suggestions, bug\nreports, pull requests, and feedback. This document gives some guidance if you\nare thinking of helping us.\n\n## Submitting bug reports and feature requests\n\nSerde development is spread across lots of repositories, but this serde-rs/serde\nrepository is always a safe choice for opening any issues related to Serde.\n\nWhen reporting a bug or asking for help, please include enough details so that\nthe people helping you can reproduce the behavior you are seeing. For some tips\non how to approach this, read about how to produce a [Minimal, Complete, and\nVerifiable example].\n\n[Minimal, Complete, and Verifiable example]: https://stackoverflow.com/help/mcve\n\nWhen making a feature request, please make it clear what problem you intend to\nsolve with the feature, any ideas for how Serde could support solving that\nproblem, any possible alternatives, and any disadvantages.\n\n## Running the test suite\n\nWe encourage you to check that the test suite passes locally before submitting a\npull request with your changes. If anything does not pass, typically it will be\neasier to iterate and fix it locally than waiting for the CI servers to run\ntests for you.\n\n##### In the [`serde_core`] directory\n\n```sh\n# Test all the example code in Serde documentation\ncargo test\n```\n\n##### In the [`test_suite`] directory\n\n```sh\n# Run the full test suite, including tests of unstable functionality\ncargo +nightly test --features unstable\n```\n\nNote that this test suite currently only supports running on a nightly compiler.\n\n[`serde_core`]: https://github.com/serde-rs/serde/tree/master/serde_core\n[`test_suite`]: https://github.com/serde-rs/serde/tree/master/test_suite\n\n## Conduct\n\nIn all Serde-related forums, we follow the [Rust Code of Conduct]. For\nescalation or moderation issues please contact Erick (erick.tryzelaar@gmail.com)\ninstead of the Rust moderation team.\n\n[Rust Code of Conduct]: https://www.rust-lang.org/policies/code-of-conduct\n"
  },
  {
    "path": "Cargo.toml",
    "content": "[workspace]\nmembers = [\n    \"serde\",\n    \"serde_core\",\n    \"serde_derive\",\n    \"serde_derive_internals\",\n    \"test_suite\",\n]\nresolver = \"2\"\n\n[patch.crates-io]\nserde = { path = \"serde\" }\nserde_core = { path = \"serde_core\" }\nserde_derive = { path = \"serde_derive\" }\n\n[workspace.dependencies]\nproc-macro2 = { version = \"1.0.74\", default-features = false }\nquote = { version = \"1.0.35\", default-features = false }\nsyn = { version = \"2.0.81\", default-features = false }\n"
  },
  {
    "path": "LICENSE-APACHE",
    "content": "                              Apache License\n                        Version 2.0, January 2004\n                     http://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n   \"License\" shall mean the terms and conditions for use, reproduction,\n   and distribution as defined by Sections 1 through 9 of this document.\n\n   \"Licensor\" shall mean the copyright owner or entity authorized by\n   the copyright owner that is granting the License.\n\n   \"Legal Entity\" shall mean the union of the acting entity and all\n   other entities that control, are controlled by, or are under common\n   control with that entity. For the purposes of this definition,\n   \"control\" means (i) the power, direct or indirect, to cause the\n   direction or management of such entity, whether by contract or\n   otherwise, or (ii) ownership of fifty percent (50%) or more of the\n   outstanding shares, or (iii) beneficial ownership of such entity.\n\n   \"You\" (or \"Your\") shall mean an individual or Legal Entity\n   exercising permissions granted by this License.\n\n   \"Source\" form shall mean the preferred form for making modifications,\n   including but not limited to software source code, documentation\n   source, and configuration files.\n\n   \"Object\" form shall mean any form resulting from mechanical\n   transformation or translation of a Source form, including but\n   not limited to compiled object code, generated documentation,\n   and conversions to other media types.\n\n   \"Work\" shall mean the work of authorship, whether in Source or\n   Object form, made available under the License, as indicated by a\n   copyright notice that is included in or attached to the work\n   (an example is provided in the Appendix below).\n\n   \"Derivative Works\" shall mean any work, whether in Source or Object\n   form, that is based on (or derived from) the Work and for which the\n   editorial revisions, annotations, elaborations, or other modifications\n   represent, as a whole, an original work of authorship. For the purposes\n   of this License, Derivative Works shall not include works that remain\n   separable from, or merely link (or bind by name) to the interfaces of,\n   the Work and Derivative Works thereof.\n\n   \"Contribution\" shall mean any work of authorship, including\n   the original version of the Work and any modifications or additions\n   to that Work or Derivative Works thereof, that is intentionally\n   submitted to Licensor for inclusion in the Work by the copyright owner\n   or by an individual or Legal Entity authorized to submit on behalf of\n   the copyright owner. For the purposes of this definition, \"submitted\"\n   means any form of electronic, verbal, or written communication sent\n   to the Licensor or its representatives, including but not limited to\n   communication on electronic mailing lists, source code control systems,\n   and issue tracking systems that are managed by, or on behalf of, the\n   Licensor for the purpose of discussing and improving the Work, but\n   excluding communication that is conspicuously marked or otherwise\n   designated in writing by the copyright owner as \"Not a Contribution.\"\n\n   \"Contributor\" shall mean Licensor and any individual or Legal Entity\n   on behalf of whom a Contribution has been received by Licensor and\n   subsequently incorporated within the Work.\n\n2. Grant of Copyright License. Subject to the terms and conditions of\n   this License, each Contributor hereby grants to You a perpetual,\n   worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n   copyright license to reproduce, prepare Derivative Works of,\n   publicly display, publicly perform, sublicense, and distribute the\n   Work and such Derivative Works in Source or Object form.\n\n3. Grant of Patent License. Subject to the terms and conditions of\n   this License, each Contributor hereby grants to You a perpetual,\n   worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n   (except as stated in this section) patent license to make, have made,\n   use, offer to sell, sell, import, and otherwise transfer the Work,\n   where such license applies only to those patent claims licensable\n   by such Contributor that are necessarily infringed by their\n   Contribution(s) alone or by combination of their Contribution(s)\n   with the Work to which such Contribution(s) was submitted. If You\n   institute patent litigation against any entity (including a\n   cross-claim or counterclaim in a lawsuit) alleging that the Work\n   or a Contribution incorporated within the Work constitutes direct\n   or contributory patent infringement, then any patent licenses\n   granted to You under this License for that Work shall terminate\n   as of the date such litigation is filed.\n\n4. Redistribution. You may reproduce and distribute copies of the\n   Work or Derivative Works thereof in any medium, with or without\n   modifications, and in Source or Object form, provided that You\n   meet the following conditions:\n\n   (a) You must give any other recipients of the Work or\n       Derivative Works a copy of this License; and\n\n   (b) You must cause any modified files to carry prominent notices\n       stating that You changed the files; and\n\n   (c) You must retain, in the Source form of any Derivative Works\n       that You distribute, all copyright, patent, trademark, and\n       attribution notices from the Source form of the Work,\n       excluding those notices that do not pertain to any part of\n       the Derivative Works; and\n\n   (d) If the Work includes a \"NOTICE\" text file as part of its\n       distribution, then any Derivative Works that You distribute must\n       include a readable copy of the attribution notices contained\n       within such NOTICE file, excluding those notices that do not\n       pertain to any part of the Derivative Works, in at least one\n       of the following places: within a NOTICE text file distributed\n       as part of the Derivative Works; within the Source form or\n       documentation, if provided along with the Derivative Works; or,\n       within a display generated by the Derivative Works, if and\n       wherever such third-party notices normally appear. The contents\n       of the NOTICE file are for informational purposes only and\n       do not modify the License. You may add Your own attribution\n       notices within Derivative Works that You distribute, alongside\n       or as an addendum to the NOTICE text from the Work, provided\n       that such additional attribution notices cannot be construed\n       as modifying the License.\n\n   You may add Your own copyright statement to Your modifications and\n   may provide additional or different license terms and conditions\n   for use, reproduction, or distribution of Your modifications, or\n   for any such Derivative Works as a whole, provided Your use,\n   reproduction, and distribution of the Work otherwise complies with\n   the conditions stated in this License.\n\n5. Submission of Contributions. Unless You explicitly state otherwise,\n   any Contribution intentionally submitted for inclusion in the Work\n   by You to the Licensor shall be under the terms and conditions of\n   this License, without any additional terms or conditions.\n   Notwithstanding the above, nothing herein shall supersede or modify\n   the terms of any separate license agreement you may have executed\n   with Licensor regarding such Contributions.\n\n6. Trademarks. This License does not grant permission to use the trade\n   names, trademarks, service marks, or product names of the Licensor,\n   except as required for reasonable and customary use in describing the\n   origin of the Work and reproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty. Unless required by applicable law or\n   agreed to in writing, Licensor provides the Work (and each\n   Contributor provides its Contributions) on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n   implied, including, without limitation, any warranties or conditions\n   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n   PARTICULAR PURPOSE. You are solely responsible for determining the\n   appropriateness of using or redistributing the Work and assume any\n   risks associated with Your exercise of permissions under this License.\n\n8. Limitation of Liability. In no event and under no legal theory,\n   whether in tort (including negligence), contract, or otherwise,\n   unless required by applicable law (such as deliberate and grossly\n   negligent acts) or agreed to in writing, shall any Contributor be\n   liable to You for damages, including any direct, indirect, special,\n   incidental, or consequential damages of any character arising as a\n   result of this License or out of the use or inability to use the\n   Work (including but not limited to damages for loss of goodwill,\n   work stoppage, computer failure or malfunction, or any and all\n   other commercial damages or losses), even if such Contributor\n   has been advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability. While redistributing\n   the Work or Derivative Works thereof, You may choose to offer,\n   and charge a fee for, acceptance of support, warranty, indemnity,\n   or other liability obligations and/or rights consistent with this\n   License. However, in accepting such obligations, You may act only\n   on Your own behalf and on Your sole responsibility, not on behalf\n   of any other Contributor, and only if You agree to indemnify,\n   defend, and hold each Contributor harmless for any liability\n   incurred by, or claims asserted against, such Contributor by reason\n   of your accepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n"
  },
  {
    "path": "LICENSE-MIT",
    "content": "Permission is hereby granted, free of charge, to any\nperson obtaining a copy of this software and associated\ndocumentation files (the \"Software\"), to deal in the\nSoftware without restriction, including without\nlimitation the rights to use, copy, modify, merge,\npublish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software\nis furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice\nshall be included in all copies or substantial portions\nof the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\nANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\nTO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\nPARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT\nSHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR\nIN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# Serde &emsp; [![Build Status]][actions] [![Latest Version]][crates.io] [![serde msrv]][Rust 1.56] [![serde_derive msrv]][Rust 1.71]\n\n[Build Status]: https://img.shields.io/github/actions/workflow/status/serde-rs/serde/ci.yml?branch=master\n[actions]: https://github.com/serde-rs/serde/actions?query=branch%3Amaster\n[Latest Version]: https://img.shields.io/crates/v/serde.svg\n[crates.io]: https://crates.io/crates/serde\n[serde msrv]: https://img.shields.io/crates/msrv/serde.svg?label=serde%20msrv&color=lightgray\n[serde_derive msrv]: https://img.shields.io/crates/msrv/serde_derive.svg?label=serde_derive%20msrv&color=lightgray\n[Rust 1.56]: https://blog.rust-lang.org/2021/10/21/Rust-1.56.0/\n[Rust 1.71]: https://blog.rust-lang.org/2023/07/13/Rust-1.71.0/\n\n**Serde is a framework for *ser*ializing and *de*serializing Rust data structures efficiently and generically.**\n\n---\n\nYou may be looking for:\n\n- [An overview of Serde](https://serde.rs)\n- [Data formats supported by Serde](https://serde.rs/#data-formats)\n- [Setting up `#[derive(Serialize, Deserialize)]`](https://serde.rs/derive.html)\n- [Examples](https://serde.rs/examples.html)\n- [API documentation](https://docs.rs/serde)\n- [Release notes](https://github.com/serde-rs/serde/releases)\n\n## Serde in action\n\n<details>\n<summary>\nClick to show Cargo.toml.\n<a href=\"https://play.rust-lang.org/?edition=2021&gist=72755f28f99afc95e01d63174b28c1f5\" target=\"_blank\">Run this code in the playground.</a>\n</summary>\n\n```toml\n[dependencies]\n\n# The core APIs, including the Serialize and Deserialize traits. Always\n# required when using Serde. The \"derive\" feature is only required when\n# using #[derive(Serialize, Deserialize)] to make Serde work with structs\n# and enums defined in your crate.\nserde = { version = \"1.0\", features = [\"derive\"] }\n\n# Each data format lives in its own crate; the sample code below uses JSON\n# but you may be using a different one.\nserde_json = \"1.0\"\n```\n\n</details>\n<p></p>\n\n```rust\nuse serde::{Deserialize, Serialize};\n\n#[derive(Serialize, Deserialize, Debug)]\nstruct Point {\n    x: i32,\n    y: i32,\n}\n\nfn main() {\n    let point = Point { x: 1, y: 2 };\n\n    // Convert the Point to a JSON string.\n    let serialized = serde_json::to_string(&point).unwrap();\n\n    // Prints serialized = {\"x\":1,\"y\":2}\n    println!(\"serialized = {}\", serialized);\n\n    // Convert the JSON string back to a Point.\n    let deserialized: Point = serde_json::from_str(&serialized).unwrap();\n\n    // Prints deserialized = Point { x: 1, y: 2 }\n    println!(\"deserialized = {:?}\", deserialized);\n}\n```\n\n## Getting help\n\nSerde is one of the most widely used Rust libraries so any place that Rustaceans\ncongregate will be able to help you out. For chat, consider trying the\n[#rust-questions] or [#rust-beginners] channels of the unofficial community\nDiscord (invite: <https://discord.gg/rust-lang-community>), the [#rust-usage] or\n[#beginners] channels of the official Rust Project Discord (invite:\n<https://discord.gg/rust-lang>), or the [#general][zulip] stream in Zulip. For\nasynchronous, consider the [\\[rust\\] tag on StackOverflow][stackoverflow], the\n[/r/rust] subreddit which has a pinned weekly easy questions post, or the Rust\n[Discourse forum][discourse]. It's acceptable to file a support issue in this\nrepo but they tend not to get as many eyes as any of the above and may get\nclosed without a response after some time.\n\n[#rust-questions]: https://discord.com/channels/273534239310479360/274215136414400513\n[#rust-beginners]: https://discord.com/channels/273534239310479360/273541522815713281\n[#rust-usage]: https://discord.com/channels/442252698964721669/443150878111694848\n[#beginners]: https://discord.com/channels/442252698964721669/448238009733742612\n[zulip]: https://rust-lang.zulipchat.com/#narrow/stream/122651-general\n[stackoverflow]: https://stackoverflow.com/questions/tagged/rust\n[/r/rust]: https://www.reddit.com/r/rust\n[discourse]: https://users.rust-lang.org\n\n<br>\n\n#### License\n\n<sup>\nLicensed under either of <a href=\"LICENSE-APACHE\">Apache License, Version\n2.0</a> or <a href=\"LICENSE-MIT\">MIT license</a> at your option.\n</sup>\n\n<br>\n\n<sub>\nUnless you explicitly state otherwise, any contribution intentionally submitted\nfor inclusion in Serde by you, as defined in the Apache-2.0 license, shall be\ndual licensed as above, without any additional terms or conditions.\n</sub>\n"
  },
  {
    "path": "crates-io.md",
    "content": "<!-- Serde readme rendered on crates.io -->\n\n**Serde is a framework for *ser*ializing and *de*serializing Rust data structures efficiently and generically.**\n\n---\n\nYou may be looking for:\n\n- [An overview of Serde](https://serde.rs)\n- [Data formats supported by Serde](https://serde.rs/#data-formats)\n- [Setting up `#[derive(Serialize, Deserialize)]`](https://serde.rs/derive.html)\n- [Examples](https://serde.rs/examples.html)\n- [API documentation](https://docs.rs/serde)\n- [Release notes](https://github.com/serde-rs/serde/releases)\n\n## Serde in action\n\n```rust\nuse serde::{Deserialize, Serialize};\n\n#[derive(Serialize, Deserialize, Debug)]\nstruct Point {\n    x: i32,\n    y: i32,\n}\n\nfn main() {\n    let point = Point { x: 1, y: 2 };\n\n    // Convert the Point to a JSON string.\n    let serialized = serde_json::to_string(&point).unwrap();\n\n    // Prints serialized = {\"x\":1,\"y\":2}\n    println!(\"serialized = {}\", serialized);\n\n    // Convert the JSON string back to a Point.\n    let deserialized: Point = serde_json::from_str(&serialized).unwrap();\n\n    // Prints deserialized = Point { x: 1, y: 2 }\n    println!(\"deserialized = {:?}\", deserialized);\n}\n```\n\n## Getting help\n\nSerde is one of the most widely used Rust libraries so any place that Rustaceans\ncongregate will be able to help you out. For chat, consider trying the\n[#rust-questions] or [#rust-beginners] channels of the unofficial community\nDiscord (invite: <https://discord.gg/rust-lang-community>), the [#rust-usage]\nor [#beginners] channels of the official Rust Project Discord (invite:\n<https://discord.gg/rust-lang>), or the [#general][zulip] stream in Zulip. For\nasynchronous, consider the [\\[rust\\] tag on StackOverflow][stackoverflow], the\n[/r/rust] subreddit which has a pinned weekly easy questions post, or the Rust\n[Discourse forum][discourse]. It's acceptable to file a support issue in this\nrepo but they tend not to get as many eyes as any of the above and may get\nclosed without a response after some time.\n\n[#rust-questions]: https://discord.com/channels/273534239310479360/274215136414400513\n[#rust-beginners]: https://discord.com/channels/273534239310479360/273541522815713281\n[#rust-usage]: https://discord.com/channels/442252698964721669/443150878111694848\n[#beginners]: https://discord.com/channels/442252698964721669/448238009733742612\n[zulip]: https://rust-lang.zulipchat.com/#narrow/stream/122651-general\n[stackoverflow]: https://stackoverflow.com/questions/tagged/rust\n[/r/rust]: https://www.reddit.com/r/rust\n[discourse]: https://users.rust-lang.org\n"
  },
  {
    "path": "serde/Cargo.toml",
    "content": "[package]\nname = \"serde\"\nversion = \"1.0.228\"\nauthors = [\"Erick Tryzelaar <erick.tryzelaar@gmail.com>\", \"David Tolnay <dtolnay@gmail.com>\"]\nbuild = \"build.rs\"\ncategories = [\"encoding\", \"no-std\", \"no-std::no-alloc\"]\ndescription = \"A generic serialization/deserialization framework\"\ndocumentation = \"https://docs.rs/serde\"\nedition = \"2021\"\nhomepage = \"https://serde.rs\"\nkeywords = [\"serde\", \"serialization\", \"no_std\"]\nlicense = \"MIT OR Apache-2.0\"\nreadme = \"crates-io.md\"\nrepository = \"https://github.com/serde-rs/serde\"\nrust-version = \"1.56\"\n\n[dependencies]\nserde_core = { version = \"=1.0.228\", path = \"../serde_core\", default-features = false, features = [\"result\"] }\nserde_derive = { version = \"1\", optional = true, path = \"../serde_derive\" }\n\n[package.metadata.playground]\nfeatures = [\"derive\", \"rc\"]\n\n[package.metadata.docs.rs]\nfeatures = [\"derive\", \"rc\", \"unstable\"]\ntargets = [\"x86_64-unknown-linux-gnu\"]\nrustdoc-args = [\n    \"--generate-link-to-definition\",\n    \"--generate-macro-expansion\",\n    \"--extern-html-root-url=core=https://doc.rust-lang.org\",\n    \"--extern-html-root-url=alloc=https://doc.rust-lang.org\",\n    \"--extern-html-root-url=std=https://doc.rust-lang.org\",\n]\n\n\n### FEATURES #################################################################\n\n[features]\ndefault = [\"std\"]\n\n# Provide derive(Serialize, Deserialize) macros.\nderive = [\"serde_derive\"]\n\n# Provide impls for common standard library types like Vec<T> and HashMap<K, V>.\n# Requires a dependency on the Rust standard library.\nstd = [\"serde_core/std\"]\n\n# Provide impls for types that require unstable functionality. For tracking and\n# discussion of unstable functionality please refer to this issue:\n#\n#    https://github.com/serde-rs/serde/issues/812\nunstable = [\"serde_core/unstable\"]\n\n# Provide impls for types in the Rust core allocation and collections library\n# including String, Box<T>, Vec<T>, and Cow<T>. This is a subset of std but may\n# be enabled without depending on all of std.\nalloc = [\"serde_core/alloc\"]\n\n# Opt into impls for Rc<T> and Arc<T>. Serializing and deserializing these types\n# does not preserve identity and may result in multiple copies of the same data.\n# Be sure that this is what you want before enabling this feature.\nrc = [\"serde_core/rc\"]\n"
  },
  {
    "path": "serde/build.rs",
    "content": "use std::env;\nuse std::fs;\nuse std::path::PathBuf;\nuse std::process::Command;\nuse std::str;\n\nconst PRIVATE: &str = \"\\\n#[doc(hidden)]\npub mod __private$$ {\n    #[doc(hidden)]\n    pub use crate::private::*;\n}\nuse serde_core::__private$$ as serde_core_private;\n\";\n\n// The rustc-cfg strings below are *not* public API. Please let us know by\n// opening a GitHub issue if your build environment requires some way to enable\n// these cfgs other than by executing our build script.\nfn main() {\n    println!(\"cargo:rerun-if-changed=build.rs\");\n\n    println!(\"cargo:rustc-cfg=if_docsrs_then_no_serde_core\");\n\n    let out_dir = PathBuf::from(env::var_os(\"OUT_DIR\").unwrap());\n    let patch_version = env::var(\"CARGO_PKG_VERSION_PATCH\").unwrap();\n    let module = PRIVATE.replace(\"$$\", &patch_version);\n    fs::write(out_dir.join(\"private.rs\"), module).unwrap();\n\n    let minor = match rustc_minor_version() {\n        Some(minor) => minor,\n        None => return,\n    };\n\n    if minor >= 77 {\n        println!(\"cargo:rustc-check-cfg=cfg(feature, values(\\\"result\\\"))\");\n        println!(\"cargo:rustc-check-cfg=cfg(if_docsrs_then_no_serde_core)\");\n        println!(\"cargo:rustc-check-cfg=cfg(no_core_cstr)\");\n        println!(\"cargo:rustc-check-cfg=cfg(no_core_error)\");\n        println!(\"cargo:rustc-check-cfg=cfg(no_core_net)\");\n        println!(\"cargo:rustc-check-cfg=cfg(no_core_num_saturating)\");\n        println!(\"cargo:rustc-check-cfg=cfg(no_diagnostic_namespace)\");\n        println!(\"cargo:rustc-check-cfg=cfg(no_serde_derive)\");\n        println!(\"cargo:rustc-check-cfg=cfg(no_std_atomic)\");\n        println!(\"cargo:rustc-check-cfg=cfg(no_std_atomic64)\");\n        println!(\"cargo:rustc-check-cfg=cfg(no_target_has_atomic)\");\n    }\n\n    // Current minimum supported version of serde_derive crate is Rust 1.71.\n    if minor < 71 {\n        println!(\"cargo:rustc-cfg=no_serde_derive\");\n    }\n\n    // Support for the `#[diagnostic]` tool attribute namespace\n    // https://blog.rust-lang.org/2024/05/02/Rust-1.78.0.html#diagnostic-attributes\n    if minor < 78 {\n        println!(\"cargo:rustc-cfg=no_diagnostic_namespace\");\n    }\n}\n\nfn rustc_minor_version() -> Option<u32> {\n    let rustc = env::var_os(\"RUSTC\")?;\n    let output = Command::new(rustc).arg(\"--version\").output().ok()?;\n    let version = str::from_utf8(&output.stdout).ok()?;\n    let mut pieces = version.split('.');\n    if pieces.next() != Some(\"rustc 1\") {\n        return None;\n    }\n    pieces.next()?.parse().ok()\n}\n"
  },
  {
    "path": "serde/src/integer128.rs",
    "content": "#[macro_export]\n#[deprecated = \"\nThis macro has no effect on any version of Serde released in the past 2 years.\nIt was used long ago in crates that needed to support Rustc older than 1.26.0,\nor Emscripten targets older than 1.40.0, which did not yet have 128-bit integer\nsupport. These days Serde requires a Rust compiler newer than that so 128-bit\nintegers are always supported.\n\"]\n#[doc(hidden)]\nmacro_rules! serde_if_integer128 {\n    ($($tt:tt)*) => {\n        $($tt)*\n    };\n}\n"
  },
  {
    "path": "serde/src/lib.rs",
    "content": "//! # Serde\n//!\n//! Serde is a framework for ***ser***ializing and ***de***serializing Rust data\n//! structures efficiently and generically.\n//!\n//! The Serde ecosystem consists of data structures that know how to serialize\n//! and deserialize themselves along with data formats that know how to\n//! serialize and deserialize other things. Serde provides the layer by which\n//! these two groups interact with each other, allowing any supported data\n//! structure to be serialized and deserialized using any supported data format.\n//!\n//! See the Serde website <https://serde.rs> for additional documentation and\n//! usage examples.\n//!\n//! ## Design\n//!\n//! Where many other languages rely on runtime reflection for serializing data,\n//! Serde is instead built on Rust's powerful trait system. A data structure\n//! that knows how to serialize and deserialize itself is one that implements\n//! Serde's `Serialize` and `Deserialize` traits (or uses Serde's derive\n//! attribute to automatically generate implementations at compile time). This\n//! avoids any overhead of reflection or runtime type information. In fact in\n//! many situations the interaction between data structure and data format can\n//! be completely optimized away by the Rust compiler, leaving Serde\n//! serialization to perform the same speed as a handwritten serializer for the\n//! specific selection of data structure and data format.\n//!\n//! ## Data formats\n//!\n//! The following is a partial list of data formats that have been implemented\n//! for Serde by the community.\n//!\n//! - [JSON], the ubiquitous JavaScript Object Notation used by many HTTP APIs.\n//! - [Postcard], a no\\_std and embedded-systems friendly compact binary format.\n//! - [CBOR], a Concise Binary Object Representation designed for small message\n//!   size without the need for version negotiation.\n//! - [YAML], a self-proclaimed human-friendly configuration language that ain't\n//!   markup language.\n//! - [MessagePack], an efficient binary format that resembles a compact JSON.\n//! - [TOML], a minimal configuration format used by [Cargo].\n//! - [Pickle], a format common in the Python world.\n//! - [RON], a Rusty Object Notation.\n//! - [BSON], the data storage and network transfer format used by MongoDB.\n//! - [Avro], a binary format used within Apache Hadoop, with support for schema\n//!   definition.\n//! - [JSON5], a superset of JSON including some productions from ES5.\n//! - [URL] query strings, in the x-www-form-urlencoded format.\n//! - [Starlark], the format used for describing build targets by the Bazel and\n//!   Buck build systems. *(serialization only)*\n//! - [Envy], a way to deserialize environment variables into Rust structs.\n//!   *(deserialization only)*\n//! - [Envy Store], a way to deserialize [AWS Parameter Store] parameters into\n//!   Rust structs. *(deserialization only)*\n//! - [S-expressions], the textual representation of code and data used by the\n//!   Lisp language family.\n//! - [D-Bus]'s binary wire format.\n//! - [FlexBuffers], the schemaless cousin of Google's FlatBuffers zero-copy\n//!   serialization format.\n//! - [Bencode], a simple binary format used in the BitTorrent protocol.\n//! - [Token streams], for processing Rust procedural macro input.\n//!   *(deserialization only)*\n//! - [DynamoDB Items], the format used by [rusoto_dynamodb] to transfer data to\n//!   and from DynamoDB.\n//! - [Hjson], a syntax extension to JSON designed around human reading and\n//!   editing. *(deserialization only)*\n//! - [CSV], Comma-separated values is a tabular text file format.\n//!\n//! [JSON]: https://github.com/serde-rs/json\n//! [Postcard]: https://github.com/jamesmunns/postcard\n//! [CBOR]: https://github.com/enarx/ciborium\n//! [YAML]: https://github.com/dtolnay/serde-yaml\n//! [MessagePack]: https://github.com/3Hren/msgpack-rust\n//! [TOML]: https://docs.rs/toml\n//! [Pickle]: https://github.com/birkenfeld/serde-pickle\n//! [RON]: https://github.com/ron-rs/ron\n//! [BSON]: https://github.com/mongodb/bson-rust\n//! [Avro]: https://docs.rs/apache-avro\n//! [JSON5]: https://github.com/callum-oakley/json5-rs\n//! [URL]: https://docs.rs/serde_qs\n//! [Starlark]: https://github.com/dtolnay/serde-starlark\n//! [Envy]: https://github.com/softprops/envy\n//! [Envy Store]: https://github.com/softprops/envy-store\n//! [Cargo]: https://doc.rust-lang.org/cargo/reference/manifest.html\n//! [AWS Parameter Store]: https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html\n//! [S-expressions]: https://github.com/rotty/lexpr-rs\n//! [D-Bus]: https://docs.rs/zvariant\n//! [FlexBuffers]: https://github.com/google/flatbuffers/tree/master/rust/flexbuffers\n//! [Bencode]: https://github.com/P3KI/bendy\n//! [Token streams]: https://github.com/oxidecomputer/serde_tokenstream\n//! [DynamoDB Items]: https://docs.rs/serde_dynamo\n//! [rusoto_dynamodb]: https://docs.rs/rusoto_dynamodb\n//! [Hjson]: https://github.com/Canop/deser-hjson\n//! [CSV]: https://docs.rs/csv\n\n////////////////////////////////////////////////////////////////////////////////\n\n// Serde types in rustdoc of other crates get linked to here.\n#![doc(html_root_url = \"https://docs.rs/serde/1.0.228\")]\n// Support using Serde without the standard library!\n#![cfg_attr(not(feature = \"std\"), no_std)]\n// Show which crate feature enables conditionally compiled APIs in documentation.\n#![cfg_attr(docsrs, feature(doc_cfg, rustdoc_internals))]\n#![cfg_attr(docsrs, allow(internal_features))]\n// Unstable functionality only if the user asks for it. For tracking and\n// discussion of these features please refer to this issue:\n//\n//    https://github.com/serde-rs/serde/issues/812\n#![cfg_attr(all(feature = \"unstable\", docsrs), feature(never_type))]\n#![allow(\n    unknown_lints,\n    bare_trait_objects,\n    deprecated,\n    mismatched_lifetime_syntaxes\n)]\n// Ignored clippy and clippy_pedantic lints\n#![allow(\n    // clippy bug: https://github.com/rust-lang/rust-clippy/issues/5704\n    clippy::unnested_or_patterns,\n    // clippy bug: https://github.com/rust-lang/rust-clippy/issues/7768\n    clippy::semicolon_if_nothing_returned,\n    // not available in our oldest supported compiler\n    clippy::empty_enums,\n    clippy::type_repetition_in_bounds, // https://github.com/rust-lang/rust-clippy/issues/8772\n    // integer and float ser/de requires these sorts of casts\n    clippy::cast_possible_truncation,\n    clippy::cast_possible_wrap,\n    clippy::cast_precision_loss,\n    clippy::cast_sign_loss,\n    // things are often more readable this way\n    clippy::cast_lossless,\n    clippy::module_name_repetitions,\n    clippy::single_match_else,\n    clippy::type_complexity,\n    clippy::use_self,\n    clippy::zero_prefixed_literal,\n    // correctly used\n    clippy::derive_partial_eq_without_eq,\n    clippy::enum_glob_use,\n    clippy::explicit_auto_deref,\n    clippy::incompatible_msrv,\n    clippy::let_underscore_untyped,\n    clippy::map_err_ignore,\n    clippy::new_without_default,\n    clippy::result_unit_err,\n    clippy::wildcard_imports,\n    // not practical\n    clippy::needless_pass_by_value,\n    clippy::similar_names,\n    clippy::too_many_lines,\n    // preference\n    clippy::doc_markdown,\n    clippy::elidable_lifetime_names,\n    clippy::needless_lifetimes,\n    clippy::unseparated_literal_suffix,\n    // false positive\n    clippy::needless_doctest_main,\n    // noisy\n    clippy::missing_errors_doc,\n    clippy::must_use_candidate,\n)]\n// Restrictions\n#![deny(clippy::question_mark_used)]\n// Rustc lints.\n#![deny(missing_docs, unused_imports)]\n\n////////////////////////////////////////////////////////////////////////////////\n\n#[cfg(feature = \"alloc\")]\nextern crate alloc;\n\n// Rustdoc has a lot of shortcomings related to cross-crate re-exports that make\n// the rendered documentation of serde_core traits in serde more challenging to\n// understand than the equivalent documentation of the same items in serde_core.\n// https://github.com/rust-lang/rust/labels/A-cross-crate-reexports\n// So, just for the purpose of docs.rs documentation, we inline the contents of\n// serde_core into serde. This sidesteps all the cross-crate rustdoc bugs.\n#[cfg(docsrs)]\n#[macro_use]\n#[path = \"core/crate_root.rs\"]\nmod crate_root;\n\n#[cfg(docsrs)]\n#[macro_use]\n#[path = \"core/macros.rs\"]\nmod macros;\n\n#[cfg(not(docsrs))]\nmacro_rules! crate_root {\n    () => {\n        /// A facade around all the types we need from the `std`, `core`, and `alloc`\n        /// crates. This avoids elaborate import wrangling having to happen in every\n        /// module.\n        mod lib {\n            mod core {\n                #[cfg(not(feature = \"std\"))]\n                pub use core::*;\n                #[cfg(feature = \"std\")]\n                pub use std::*;\n            }\n\n            pub use self::core::{f32, f64};\n            pub use self::core::{ptr, str};\n\n            #[cfg(any(feature = \"std\", feature = \"alloc\"))]\n            pub use self::core::slice;\n\n            pub use self::core::clone;\n            pub use self::core::convert;\n            pub use self::core::default;\n            pub use self::core::fmt::{self, Debug, Display, Write as FmtWrite};\n            pub use self::core::marker::{self, PhantomData};\n            pub use self::core::option;\n            pub use self::core::result;\n\n            #[cfg(all(feature = \"alloc\", not(feature = \"std\")))]\n            pub use alloc::borrow::{Cow, ToOwned};\n            #[cfg(feature = \"std\")]\n            pub use std::borrow::{Cow, ToOwned};\n\n            #[cfg(all(feature = \"alloc\", not(feature = \"std\")))]\n            pub use alloc::string::{String, ToString};\n            #[cfg(feature = \"std\")]\n            pub use std::string::{String, ToString};\n\n            #[cfg(all(feature = \"alloc\", not(feature = \"std\")))]\n            pub use alloc::vec::Vec;\n            #[cfg(feature = \"std\")]\n            pub use std::vec::Vec;\n\n            #[cfg(all(feature = \"alloc\", not(feature = \"std\")))]\n            pub use alloc::boxed::Box;\n            #[cfg(feature = \"std\")]\n            pub use std::boxed::Box;\n        }\n\n        // None of this crate's error handling needs the `From::from` error conversion\n        // performed implicitly by the `?` operator or the standard library's `try!`\n        // macro. This simplified macro gives a 5.5% improvement in compile time\n        // compared to standard `try!`, and 9% improvement compared to `?`.\n        #[cfg(not(no_serde_derive))]\n        macro_rules! tri {\n            ($expr:expr) => {\n                match $expr {\n                    Ok(val) => val,\n                    Err(err) => return Err(err),\n                }\n            };\n        }\n\n        ////////////////////////////////////////////////////////////////////////////////\n\n        pub use serde_core::{\n            de, forward_to_deserialize_any, ser, Deserialize, Deserializer, Serialize, Serializer,\n        };\n\n        // Used by generated code and doc tests. Not public API.\n        #[doc(hidden)]\n        mod private;\n\n        include!(concat!(env!(\"OUT_DIR\"), \"/private.rs\"));\n    };\n}\n\ncrate_root!();\n\nmod integer128;\n\n// Re-export #[derive(Serialize, Deserialize)].\n//\n// The reason re-exporting is not enabled by default is that disabling it would\n// be annoying for crates that provide handwritten impls or data formats. They\n// would need to disable default features and then explicitly re-enable std.\n#[cfg(feature = \"serde_derive\")]\nextern crate serde_derive;\n\n/// Derive macro available if serde is built with `features = [\"derive\"]`.\n#[cfg(feature = \"serde_derive\")]\n#[cfg_attr(docsrs, doc(cfg(feature = \"derive\")))]\npub use serde_derive::{Deserialize, Serialize};\n\n#[macro_export]\n#[doc(hidden)]\nmacro_rules! __require_serde_not_serde_core {\n    () => {};\n}\n"
  },
  {
    "path": "serde/src/private/de.rs",
    "content": "use crate::lib::*;\n\nuse crate::de::value::{BorrowedBytesDeserializer, BytesDeserializer};\nuse crate::de::{\n    Deserialize, DeserializeSeed, Deserializer, EnumAccess, Error, IntoDeserializer, VariantAccess,\n    Visitor,\n};\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nuse crate::de::{MapAccess, Unexpected};\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\npub use self::content::{\n    content_as_str, Content, ContentDeserializer, ContentRefDeserializer, ContentVisitor,\n    EnumDeserializer, InternallyTaggedUnitVisitor, TagContentOtherField,\n    TagContentOtherFieldVisitor, TagOrContentField, TagOrContentFieldVisitor, TaggedContentVisitor,\n    UntaggedUnitVisitor,\n};\n\npub use crate::serde_core_private::InPlaceSeed;\n\n/// If the missing field is of type `Option<T>` then treat is as `None`,\n/// otherwise it is an error.\npub fn missing_field<'de, V, E>(field: &'static str) -> Result<V, E>\nwhere\n    V: Deserialize<'de>,\n    E: Error,\n{\n    struct MissingFieldDeserializer<E>(&'static str, PhantomData<E>);\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'de, E> Deserializer<'de> for MissingFieldDeserializer<E>\n    where\n        E: Error,\n    {\n        type Error = E;\n\n        fn deserialize_any<V>(self, _visitor: V) -> Result<V::Value, E>\n        where\n            V: Visitor<'de>,\n        {\n            Err(Error::missing_field(self.0))\n        }\n\n        fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, E>\n        where\n            V: Visitor<'de>,\n        {\n            visitor.visit_none()\n        }\n\n        serde_core::forward_to_deserialize_any! {\n            bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string\n            bytes byte_buf unit unit_struct newtype_struct seq tuple\n            tuple_struct map struct enum identifier ignored_any\n        }\n    }\n\n    let deserializer = MissingFieldDeserializer(field, PhantomData);\n    Deserialize::deserialize(deserializer)\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\npub fn borrow_cow_str<'de: 'a, 'a, D, R>(deserializer: D) -> Result<R, D::Error>\nwhere\n    D: Deserializer<'de>,\n    R: From<Cow<'a, str>>,\n{\n    struct CowStrVisitor;\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'a> Visitor<'a> for CowStrVisitor {\n        type Value = Cow<'a, str>;\n\n        fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n            formatter.write_str(\"a string\")\n        }\n\n        fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            Ok(Cow::Owned(v.to_owned()))\n        }\n\n        fn visit_borrowed_str<E>(self, v: &'a str) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            Ok(Cow::Borrowed(v))\n        }\n\n        fn visit_string<E>(self, v: String) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            Ok(Cow::Owned(v))\n        }\n\n        fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            match str::from_utf8(v) {\n                Ok(s) => Ok(Cow::Owned(s.to_owned())),\n                Err(_) => Err(Error::invalid_value(Unexpected::Bytes(v), &self)),\n            }\n        }\n\n        fn visit_borrowed_bytes<E>(self, v: &'a [u8]) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            match str::from_utf8(v) {\n                Ok(s) => Ok(Cow::Borrowed(s)),\n                Err(_) => Err(Error::invalid_value(Unexpected::Bytes(v), &self)),\n            }\n        }\n\n        fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            match String::from_utf8(v) {\n                Ok(s) => Ok(Cow::Owned(s)),\n                Err(e) => Err(Error::invalid_value(\n                    Unexpected::Bytes(&e.into_bytes()),\n                    &self,\n                )),\n            }\n        }\n    }\n\n    deserializer.deserialize_str(CowStrVisitor).map(From::from)\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\npub fn borrow_cow_bytes<'de: 'a, 'a, D, R>(deserializer: D) -> Result<R, D::Error>\nwhere\n    D: Deserializer<'de>,\n    R: From<Cow<'a, [u8]>>,\n{\n    struct CowBytesVisitor;\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'a> Visitor<'a> for CowBytesVisitor {\n        type Value = Cow<'a, [u8]>;\n\n        fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n            formatter.write_str(\"a byte array\")\n        }\n\n        fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            Ok(Cow::Owned(v.as_bytes().to_vec()))\n        }\n\n        fn visit_borrowed_str<E>(self, v: &'a str) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            Ok(Cow::Borrowed(v.as_bytes()))\n        }\n\n        fn visit_string<E>(self, v: String) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            Ok(Cow::Owned(v.into_bytes()))\n        }\n\n        fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            Ok(Cow::Owned(v.to_vec()))\n        }\n\n        fn visit_borrowed_bytes<E>(self, v: &'a [u8]) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            Ok(Cow::Borrowed(v))\n        }\n\n        fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            Ok(Cow::Owned(v))\n        }\n    }\n\n    deserializer\n        .deserialize_bytes(CowBytesVisitor)\n        .map(From::from)\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nmod content {\n    // This module is private and nothing here should be used outside of\n    // generated code.\n    //\n    // We will iterate on the implementation for a few releases and only have to\n    // worry about backward compatibility for the `untagged` and `tag` attributes\n    // rather than for this entire mechanism.\n    //\n    // This issue is tracking making some of this stuff public:\n    // https://github.com/serde-rs/serde/issues/741\n\n    use crate::lib::*;\n\n    use crate::de::{\n        self, Deserialize, DeserializeSeed, Deserializer, EnumAccess, Expected, IgnoredAny,\n        MapAccess, SeqAccess, Unexpected, Visitor,\n    };\n    use crate::serde_core_private::size_hint;\n    pub use crate::serde_core_private::Content;\n\n    pub fn content_as_str<'a, 'de>(content: &'a Content<'de>) -> Option<&'a str> {\n        match *content {\n            Content::Str(x) => Some(x),\n            Content::String(ref x) => Some(x),\n            Content::Bytes(x) => str::from_utf8(x).ok(),\n            Content::ByteBuf(ref x) => str::from_utf8(x).ok(),\n            _ => None,\n        }\n    }\n\n    fn content_clone<'de>(content: &Content<'de>) -> Content<'de> {\n        match content {\n            Content::Bool(b) => Content::Bool(*b),\n            Content::U8(n) => Content::U8(*n),\n            Content::U16(n) => Content::U16(*n),\n            Content::U32(n) => Content::U32(*n),\n            Content::U64(n) => Content::U64(*n),\n            Content::I8(n) => Content::I8(*n),\n            Content::I16(n) => Content::I16(*n),\n            Content::I32(n) => Content::I32(*n),\n            Content::I64(n) => Content::I64(*n),\n            Content::F32(f) => Content::F32(*f),\n            Content::F64(f) => Content::F64(*f),\n            Content::Char(c) => Content::Char(*c),\n            Content::String(s) => Content::String(s.clone()),\n            Content::Str(s) => Content::Str(*s),\n            Content::ByteBuf(b) => Content::ByteBuf(b.clone()),\n            Content::Bytes(b) => Content::Bytes(b),\n            Content::None => Content::None,\n            Content::Some(content) => Content::Some(Box::new(content_clone(content))),\n            Content::Unit => Content::Unit,\n            Content::Newtype(content) => Content::Newtype(Box::new(content_clone(content))),\n            Content::Seq(seq) => Content::Seq(seq.iter().map(content_clone).collect()),\n            Content::Map(map) => Content::Map(\n                map.iter()\n                    .map(|(k, v)| (content_clone(k), content_clone(v)))\n                    .collect(),\n            ),\n        }\n    }\n\n    #[cold]\n    fn content_unexpected<'a, 'de>(content: &'a Content<'de>) -> Unexpected<'a> {\n        match *content {\n            Content::Bool(b) => Unexpected::Bool(b),\n            Content::U8(n) => Unexpected::Unsigned(n as u64),\n            Content::U16(n) => Unexpected::Unsigned(n as u64),\n            Content::U32(n) => Unexpected::Unsigned(n as u64),\n            Content::U64(n) => Unexpected::Unsigned(n),\n            Content::I8(n) => Unexpected::Signed(n as i64),\n            Content::I16(n) => Unexpected::Signed(n as i64),\n            Content::I32(n) => Unexpected::Signed(n as i64),\n            Content::I64(n) => Unexpected::Signed(n),\n            Content::F32(f) => Unexpected::Float(f as f64),\n            Content::F64(f) => Unexpected::Float(f),\n            Content::Char(c) => Unexpected::Char(c),\n            Content::String(ref s) => Unexpected::Str(s),\n            Content::Str(s) => Unexpected::Str(s),\n            Content::ByteBuf(ref b) => Unexpected::Bytes(b),\n            Content::Bytes(b) => Unexpected::Bytes(b),\n            Content::None | Content::Some(_) => Unexpected::Option,\n            Content::Unit => Unexpected::Unit,\n            Content::Newtype(_) => Unexpected::NewtypeStruct,\n            Content::Seq(_) => Unexpected::Seq,\n            Content::Map(_) => Unexpected::Map,\n        }\n    }\n\n    pub struct ContentVisitor<'de> {\n        value: PhantomData<Content<'de>>,\n    }\n\n    impl<'de> ContentVisitor<'de> {\n        pub fn new() -> Self {\n            ContentVisitor { value: PhantomData }\n        }\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'de> DeserializeSeed<'de> for ContentVisitor<'de> {\n        type Value = Content<'de>;\n\n        fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>\n        where\n            D: Deserializer<'de>,\n        {\n            deserializer.__deserialize_content_v1(self)\n        }\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'de> Visitor<'de> for ContentVisitor<'de> {\n        type Value = Content<'de>;\n\n        fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result {\n            fmt.write_str(\"any value\")\n        }\n\n        fn visit_bool<F>(self, value: bool) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            Ok(Content::Bool(value))\n        }\n\n        fn visit_i8<F>(self, value: i8) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            Ok(Content::I8(value))\n        }\n\n        fn visit_i16<F>(self, value: i16) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            Ok(Content::I16(value))\n        }\n\n        fn visit_i32<F>(self, value: i32) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            Ok(Content::I32(value))\n        }\n\n        fn visit_i64<F>(self, value: i64) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            Ok(Content::I64(value))\n        }\n\n        fn visit_u8<F>(self, value: u8) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            Ok(Content::U8(value))\n        }\n\n        fn visit_u16<F>(self, value: u16) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            Ok(Content::U16(value))\n        }\n\n        fn visit_u32<F>(self, value: u32) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            Ok(Content::U32(value))\n        }\n\n        fn visit_u64<F>(self, value: u64) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            Ok(Content::U64(value))\n        }\n\n        fn visit_f32<F>(self, value: f32) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            Ok(Content::F32(value))\n        }\n\n        fn visit_f64<F>(self, value: f64) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            Ok(Content::F64(value))\n        }\n\n        fn visit_char<F>(self, value: char) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            Ok(Content::Char(value))\n        }\n\n        fn visit_str<F>(self, value: &str) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            Ok(Content::String(value.into()))\n        }\n\n        fn visit_borrowed_str<F>(self, value: &'de str) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            Ok(Content::Str(value))\n        }\n\n        fn visit_string<F>(self, value: String) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            Ok(Content::String(value))\n        }\n\n        fn visit_bytes<F>(self, value: &[u8]) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            Ok(Content::ByteBuf(value.into()))\n        }\n\n        fn visit_borrowed_bytes<F>(self, value: &'de [u8]) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            Ok(Content::Bytes(value))\n        }\n\n        fn visit_byte_buf<F>(self, value: Vec<u8>) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            Ok(Content::ByteBuf(value))\n        }\n\n        fn visit_unit<F>(self) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            Ok(Content::Unit)\n        }\n\n        fn visit_none<F>(self) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            Ok(Content::None)\n        }\n\n        fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>\n        where\n            D: Deserializer<'de>,\n        {\n            let v = tri!(ContentVisitor::new().deserialize(deserializer));\n            Ok(Content::Some(Box::new(v)))\n        }\n\n        fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>\n        where\n            D: Deserializer<'de>,\n        {\n            let v = tri!(ContentVisitor::new().deserialize(deserializer));\n            Ok(Content::Newtype(Box::new(v)))\n        }\n\n        fn visit_seq<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>\n        where\n            V: SeqAccess<'de>,\n        {\n            let mut vec =\n                Vec::<Content>::with_capacity(size_hint::cautious::<Content>(visitor.size_hint()));\n            while let Some(e) = tri!(visitor.next_element_seed(ContentVisitor::new())) {\n                vec.push(e);\n            }\n            Ok(Content::Seq(vec))\n        }\n\n        fn visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>\n        where\n            V: MapAccess<'de>,\n        {\n            let mut vec =\n                Vec::<(Content, Content)>::with_capacity(\n                    size_hint::cautious::<(Content, Content)>(visitor.size_hint()),\n                );\n            while let Some(kv) =\n                tri!(visitor.next_entry_seed(ContentVisitor::new(), ContentVisitor::new()))\n            {\n                vec.push(kv);\n            }\n            Ok(Content::Map(vec))\n        }\n\n        fn visit_enum<V>(self, _visitor: V) -> Result<Self::Value, V::Error>\n        where\n            V: EnumAccess<'de>,\n        {\n            Err(de::Error::custom(\n                \"untagged and internally tagged enums do not support enum input\",\n            ))\n        }\n    }\n\n    /// This is the type of the map keys in an internally tagged enum.\n    ///\n    /// Not public API.\n    pub enum TagOrContent<'de> {\n        Tag,\n        Content(Content<'de>),\n    }\n\n    /// Serves as a seed for deserializing a key of internally tagged enum.\n    /// Cannot capture externally tagged enums, `i128` and `u128`.\n    struct TagOrContentVisitor<'de> {\n        name: &'static str,\n        value: PhantomData<TagOrContent<'de>>,\n    }\n\n    impl<'de> TagOrContentVisitor<'de> {\n        fn new(name: &'static str) -> Self {\n            TagOrContentVisitor {\n                name,\n                value: PhantomData,\n            }\n        }\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'de> DeserializeSeed<'de> for TagOrContentVisitor<'de> {\n        type Value = TagOrContent<'de>;\n\n        fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>\n        where\n            D: Deserializer<'de>,\n        {\n            // Internally tagged enums are only supported in self-describing\n            // formats.\n            deserializer.deserialize_any(self)\n        }\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'de> Visitor<'de> for TagOrContentVisitor<'de> {\n        type Value = TagOrContent<'de>;\n\n        fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result {\n            write!(fmt, \"a type tag `{}` or any other value\", self.name)\n        }\n\n        fn visit_bool<F>(self, value: bool) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            ContentVisitor::new()\n                .visit_bool(value)\n                .map(TagOrContent::Content)\n        }\n\n        fn visit_i8<F>(self, value: i8) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            ContentVisitor::new()\n                .visit_i8(value)\n                .map(TagOrContent::Content)\n        }\n\n        fn visit_i16<F>(self, value: i16) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            ContentVisitor::new()\n                .visit_i16(value)\n                .map(TagOrContent::Content)\n        }\n\n        fn visit_i32<F>(self, value: i32) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            ContentVisitor::new()\n                .visit_i32(value)\n                .map(TagOrContent::Content)\n        }\n\n        fn visit_i64<F>(self, value: i64) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            ContentVisitor::new()\n                .visit_i64(value)\n                .map(TagOrContent::Content)\n        }\n\n        fn visit_u8<F>(self, value: u8) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            ContentVisitor::new()\n                .visit_u8(value)\n                .map(TagOrContent::Content)\n        }\n\n        fn visit_u16<F>(self, value: u16) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            ContentVisitor::new()\n                .visit_u16(value)\n                .map(TagOrContent::Content)\n        }\n\n        fn visit_u32<F>(self, value: u32) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            ContentVisitor::new()\n                .visit_u32(value)\n                .map(TagOrContent::Content)\n        }\n\n        fn visit_u64<F>(self, value: u64) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            ContentVisitor::new()\n                .visit_u64(value)\n                .map(TagOrContent::Content)\n        }\n\n        fn visit_f32<F>(self, value: f32) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            ContentVisitor::new()\n                .visit_f32(value)\n                .map(TagOrContent::Content)\n        }\n\n        fn visit_f64<F>(self, value: f64) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            ContentVisitor::new()\n                .visit_f64(value)\n                .map(TagOrContent::Content)\n        }\n\n        fn visit_char<F>(self, value: char) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            ContentVisitor::new()\n                .visit_char(value)\n                .map(TagOrContent::Content)\n        }\n\n        fn visit_str<F>(self, value: &str) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            if value == self.name {\n                Ok(TagOrContent::Tag)\n            } else {\n                ContentVisitor::new()\n                    .visit_str(value)\n                    .map(TagOrContent::Content)\n            }\n        }\n\n        fn visit_borrowed_str<F>(self, value: &'de str) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            if value == self.name {\n                Ok(TagOrContent::Tag)\n            } else {\n                ContentVisitor::new()\n                    .visit_borrowed_str(value)\n                    .map(TagOrContent::Content)\n            }\n        }\n\n        fn visit_string<F>(self, value: String) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            if value == self.name {\n                Ok(TagOrContent::Tag)\n            } else {\n                ContentVisitor::new()\n                    .visit_string(value)\n                    .map(TagOrContent::Content)\n            }\n        }\n\n        fn visit_bytes<F>(self, value: &[u8]) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            if value == self.name.as_bytes() {\n                Ok(TagOrContent::Tag)\n            } else {\n                ContentVisitor::new()\n                    .visit_bytes(value)\n                    .map(TagOrContent::Content)\n            }\n        }\n\n        fn visit_borrowed_bytes<F>(self, value: &'de [u8]) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            if value == self.name.as_bytes() {\n                Ok(TagOrContent::Tag)\n            } else {\n                ContentVisitor::new()\n                    .visit_borrowed_bytes(value)\n                    .map(TagOrContent::Content)\n            }\n        }\n\n        fn visit_byte_buf<F>(self, value: Vec<u8>) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            if value == self.name.as_bytes() {\n                Ok(TagOrContent::Tag)\n            } else {\n                ContentVisitor::new()\n                    .visit_byte_buf(value)\n                    .map(TagOrContent::Content)\n            }\n        }\n\n        fn visit_unit<F>(self) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            ContentVisitor::new()\n                .visit_unit()\n                .map(TagOrContent::Content)\n        }\n\n        fn visit_none<F>(self) -> Result<Self::Value, F>\n        where\n            F: de::Error,\n        {\n            ContentVisitor::new()\n                .visit_none()\n                .map(TagOrContent::Content)\n        }\n\n        fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>\n        where\n            D: Deserializer<'de>,\n        {\n            ContentVisitor::new()\n                .visit_some(deserializer)\n                .map(TagOrContent::Content)\n        }\n\n        fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>\n        where\n            D: Deserializer<'de>,\n        {\n            ContentVisitor::new()\n                .visit_newtype_struct(deserializer)\n                .map(TagOrContent::Content)\n        }\n\n        fn visit_seq<V>(self, visitor: V) -> Result<Self::Value, V::Error>\n        where\n            V: SeqAccess<'de>,\n        {\n            ContentVisitor::new()\n                .visit_seq(visitor)\n                .map(TagOrContent::Content)\n        }\n\n        fn visit_map<V>(self, visitor: V) -> Result<Self::Value, V::Error>\n        where\n            V: MapAccess<'de>,\n        {\n            ContentVisitor::new()\n                .visit_map(visitor)\n                .map(TagOrContent::Content)\n        }\n\n        fn visit_enum<V>(self, visitor: V) -> Result<Self::Value, V::Error>\n        where\n            V: EnumAccess<'de>,\n        {\n            ContentVisitor::new()\n                .visit_enum(visitor)\n                .map(TagOrContent::Content)\n        }\n    }\n\n    /// Used by generated code to deserialize an internally tagged enum.\n    ///\n    /// Captures map or sequence from the original deserializer and searches\n    /// a tag in it (in case of sequence, tag is the first element of sequence).\n    ///\n    /// Not public API.\n    pub struct TaggedContentVisitor<T> {\n        tag_name: &'static str,\n        expecting: &'static str,\n        value: PhantomData<T>,\n    }\n\n    impl<T> TaggedContentVisitor<T> {\n        /// Visitor for the content of an internally tagged enum with the given\n        /// tag name.\n        pub fn new(name: &'static str, expecting: &'static str) -> Self {\n            TaggedContentVisitor {\n                tag_name: name,\n                expecting,\n                value: PhantomData,\n            }\n        }\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'de, T> Visitor<'de> for TaggedContentVisitor<T>\n    where\n        T: Deserialize<'de>,\n    {\n        type Value = (T, Content<'de>);\n\n        fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result {\n            fmt.write_str(self.expecting)\n        }\n\n        fn visit_seq<S>(self, mut seq: S) -> Result<Self::Value, S::Error>\n        where\n            S: SeqAccess<'de>,\n        {\n            let tag = match tri!(seq.next_element()) {\n                Some(tag) => tag,\n                None => {\n                    return Err(de::Error::missing_field(self.tag_name));\n                }\n            };\n            let rest = de::value::SeqAccessDeserializer::new(seq);\n            Ok((tag, tri!(ContentVisitor::new().deserialize(rest))))\n        }\n\n        fn visit_map<M>(self, mut map: M) -> Result<Self::Value, M::Error>\n        where\n            M: MapAccess<'de>,\n        {\n            let mut tag = None;\n            let mut vec = Vec::<(Content, Content)>::with_capacity(size_hint::cautious::<(\n                Content,\n                Content,\n            )>(map.size_hint()));\n            while let Some(k) = tri!(map.next_key_seed(TagOrContentVisitor::new(self.tag_name))) {\n                match k {\n                    TagOrContent::Tag => {\n                        if tag.is_some() {\n                            return Err(de::Error::duplicate_field(self.tag_name));\n                        }\n                        tag = Some(tri!(map.next_value()));\n                    }\n                    TagOrContent::Content(k) => {\n                        let v = tri!(map.next_value_seed(ContentVisitor::new()));\n                        vec.push((k, v));\n                    }\n                }\n            }\n            match tag {\n                None => Err(de::Error::missing_field(self.tag_name)),\n                Some(tag) => Ok((tag, Content::Map(vec))),\n            }\n        }\n    }\n\n    /// Used by generated code to deserialize an adjacently tagged enum.\n    ///\n    /// Not public API.\n    pub enum TagOrContentField {\n        Tag,\n        Content,\n    }\n\n    /// Not public API.\n    pub struct TagOrContentFieldVisitor {\n        /// Name of the tag field of the adjacently tagged enum\n        pub tag: &'static str,\n        /// Name of the content field of the adjacently tagged enum\n        pub content: &'static str,\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'de> DeserializeSeed<'de> for TagOrContentFieldVisitor {\n        type Value = TagOrContentField;\n\n        fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>\n        where\n            D: Deserializer<'de>,\n        {\n            deserializer.deserialize_identifier(self)\n        }\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'de> Visitor<'de> for TagOrContentFieldVisitor {\n        type Value = TagOrContentField;\n\n        fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n            write!(formatter, \"{:?} or {:?}\", self.tag, self.content)\n        }\n\n        fn visit_u64<E>(self, field_index: u64) -> Result<Self::Value, E>\n        where\n            E: de::Error,\n        {\n            match field_index {\n                0 => Ok(TagOrContentField::Tag),\n                1 => Ok(TagOrContentField::Content),\n                _ => Err(de::Error::invalid_value(\n                    Unexpected::Unsigned(field_index),\n                    &self,\n                )),\n            }\n        }\n\n        fn visit_str<E>(self, field: &str) -> Result<Self::Value, E>\n        where\n            E: de::Error,\n        {\n            if field == self.tag {\n                Ok(TagOrContentField::Tag)\n            } else if field == self.content {\n                Ok(TagOrContentField::Content)\n            } else {\n                Err(de::Error::invalid_value(Unexpected::Str(field), &self))\n            }\n        }\n\n        fn visit_bytes<E>(self, field: &[u8]) -> Result<Self::Value, E>\n        where\n            E: de::Error,\n        {\n            if field == self.tag.as_bytes() {\n                Ok(TagOrContentField::Tag)\n            } else if field == self.content.as_bytes() {\n                Ok(TagOrContentField::Content)\n            } else {\n                Err(de::Error::invalid_value(Unexpected::Bytes(field), &self))\n            }\n        }\n    }\n\n    /// Used by generated code to deserialize an adjacently tagged enum when\n    /// ignoring unrelated fields is allowed.\n    ///\n    /// Not public API.\n    pub enum TagContentOtherField {\n        Tag,\n        Content,\n        Other,\n    }\n\n    /// Not public API.\n    pub struct TagContentOtherFieldVisitor {\n        /// Name of the tag field of the adjacently tagged enum\n        pub tag: &'static str,\n        /// Name of the content field of the adjacently tagged enum\n        pub content: &'static str,\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'de> DeserializeSeed<'de> for TagContentOtherFieldVisitor {\n        type Value = TagContentOtherField;\n\n        fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>\n        where\n            D: Deserializer<'de>,\n        {\n            deserializer.deserialize_identifier(self)\n        }\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'de> Visitor<'de> for TagContentOtherFieldVisitor {\n        type Value = TagContentOtherField;\n\n        fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n            write!(\n                formatter,\n                \"{:?}, {:?}, or other ignored fields\",\n                self.tag, self.content\n            )\n        }\n\n        fn visit_u64<E>(self, field_index: u64) -> Result<Self::Value, E>\n        where\n            E: de::Error,\n        {\n            match field_index {\n                0 => Ok(TagContentOtherField::Tag),\n                1 => Ok(TagContentOtherField::Content),\n                _ => Ok(TagContentOtherField::Other),\n            }\n        }\n\n        fn visit_str<E>(self, field: &str) -> Result<Self::Value, E>\n        where\n            E: de::Error,\n        {\n            self.visit_bytes(field.as_bytes())\n        }\n\n        fn visit_bytes<E>(self, field: &[u8]) -> Result<Self::Value, E>\n        where\n            E: de::Error,\n        {\n            if field == self.tag.as_bytes() {\n                Ok(TagContentOtherField::Tag)\n            } else if field == self.content.as_bytes() {\n                Ok(TagContentOtherField::Content)\n            } else {\n                Ok(TagContentOtherField::Other)\n            }\n        }\n    }\n\n    /// Not public API\n    pub struct ContentDeserializer<'de, E> {\n        content: Content<'de>,\n        err: PhantomData<E>,\n    }\n\n    impl<'de, E> ContentDeserializer<'de, E>\n    where\n        E: de::Error,\n    {\n        #[cold]\n        fn invalid_type(self, exp: &dyn Expected) -> E {\n            de::Error::invalid_type(content_unexpected(&self.content), exp)\n        }\n\n        fn deserialize_integer<V>(self, visitor: V) -> Result<V::Value, E>\n        where\n            V: Visitor<'de>,\n        {\n            match self.content {\n                Content::U8(v) => visitor.visit_u8(v),\n                Content::U16(v) => visitor.visit_u16(v),\n                Content::U32(v) => visitor.visit_u32(v),\n                Content::U64(v) => visitor.visit_u64(v),\n                Content::I8(v) => visitor.visit_i8(v),\n                Content::I16(v) => visitor.visit_i16(v),\n                Content::I32(v) => visitor.visit_i32(v),\n                Content::I64(v) => visitor.visit_i64(v),\n                _ => Err(self.invalid_type(&visitor)),\n            }\n        }\n\n        fn deserialize_float<V>(self, visitor: V) -> Result<V::Value, E>\n        where\n            V: Visitor<'de>,\n        {\n            match self.content {\n                Content::F32(v) => visitor.visit_f32(v),\n                Content::F64(v) => visitor.visit_f64(v),\n                Content::U8(v) => visitor.visit_u8(v),\n                Content::U16(v) => visitor.visit_u16(v),\n                Content::U32(v) => visitor.visit_u32(v),\n                Content::U64(v) => visitor.visit_u64(v),\n                Content::I8(v) => visitor.visit_i8(v),\n                Content::I16(v) => visitor.visit_i16(v),\n                Content::I32(v) => visitor.visit_i32(v),\n                Content::I64(v) => visitor.visit_i64(v),\n                _ => Err(self.invalid_type(&visitor)),\n            }\n        }\n    }\n\n    fn visit_content_seq<'de, V, E>(content: Vec<Content<'de>>, visitor: V) -> Result<V::Value, E>\n    where\n        V: Visitor<'de>,\n        E: de::Error,\n    {\n        let mut seq_visitor = SeqDeserializer::new(content);\n        let value = tri!(visitor.visit_seq(&mut seq_visitor));\n        tri!(seq_visitor.end());\n        Ok(value)\n    }\n\n    fn visit_content_map<'de, V, E>(\n        content: Vec<(Content<'de>, Content<'de>)>,\n        visitor: V,\n    ) -> Result<V::Value, E>\n    where\n        V: Visitor<'de>,\n        E: de::Error,\n    {\n        let mut map_visitor = MapDeserializer::new(content);\n        let value = tri!(visitor.visit_map(&mut map_visitor));\n        tri!(map_visitor.end());\n        Ok(value)\n    }\n\n    /// Used when deserializing an internally tagged enum because the content\n    /// will be used exactly once.\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'de, E> Deserializer<'de> for ContentDeserializer<'de, E>\n    where\n        E: de::Error,\n    {\n        type Error = E;\n\n        fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            match self.content {\n                Content::Bool(v) => visitor.visit_bool(v),\n                Content::U8(v) => visitor.visit_u8(v),\n                Content::U16(v) => visitor.visit_u16(v),\n                Content::U32(v) => visitor.visit_u32(v),\n                Content::U64(v) => visitor.visit_u64(v),\n                Content::I8(v) => visitor.visit_i8(v),\n                Content::I16(v) => visitor.visit_i16(v),\n                Content::I32(v) => visitor.visit_i32(v),\n                Content::I64(v) => visitor.visit_i64(v),\n                Content::F32(v) => visitor.visit_f32(v),\n                Content::F64(v) => visitor.visit_f64(v),\n                Content::Char(v) => visitor.visit_char(v),\n                Content::String(v) => visitor.visit_string(v),\n                Content::Str(v) => visitor.visit_borrowed_str(v),\n                Content::ByteBuf(v) => visitor.visit_byte_buf(v),\n                Content::Bytes(v) => visitor.visit_borrowed_bytes(v),\n                Content::Unit => visitor.visit_unit(),\n                Content::None => visitor.visit_none(),\n                Content::Some(v) => visitor.visit_some(ContentDeserializer::new(*v)),\n                Content::Newtype(v) => visitor.visit_newtype_struct(ContentDeserializer::new(*v)),\n                Content::Seq(v) => visit_content_seq(v, visitor),\n                Content::Map(v) => visit_content_map(v, visitor),\n            }\n        }\n\n        fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            match self.content {\n                Content::Bool(v) => visitor.visit_bool(v),\n                _ => Err(self.invalid_type(&visitor)),\n            }\n        }\n\n        fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_integer(visitor)\n        }\n\n        fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_integer(visitor)\n        }\n\n        fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_integer(visitor)\n        }\n\n        fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_integer(visitor)\n        }\n\n        fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_integer(visitor)\n        }\n\n        fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_integer(visitor)\n        }\n\n        fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_integer(visitor)\n        }\n\n        fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_integer(visitor)\n        }\n\n        fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_float(visitor)\n        }\n\n        fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_float(visitor)\n        }\n\n        fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            match self.content {\n                Content::Char(v) => visitor.visit_char(v),\n                Content::String(v) => visitor.visit_string(v),\n                Content::Str(v) => visitor.visit_borrowed_str(v),\n                _ => Err(self.invalid_type(&visitor)),\n            }\n        }\n\n        fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_string(visitor)\n        }\n\n        fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            match self.content {\n                Content::String(v) => visitor.visit_string(v),\n                Content::Str(v) => visitor.visit_borrowed_str(v),\n                Content::ByteBuf(v) => visitor.visit_byte_buf(v),\n                Content::Bytes(v) => visitor.visit_borrowed_bytes(v),\n                _ => Err(self.invalid_type(&visitor)),\n            }\n        }\n\n        fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_byte_buf(visitor)\n        }\n\n        fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            match self.content {\n                Content::String(v) => visitor.visit_string(v),\n                Content::Str(v) => visitor.visit_borrowed_str(v),\n                Content::ByteBuf(v) => visitor.visit_byte_buf(v),\n                Content::Bytes(v) => visitor.visit_borrowed_bytes(v),\n                Content::Seq(v) => visit_content_seq(v, visitor),\n                _ => Err(self.invalid_type(&visitor)),\n            }\n        }\n\n        fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            match self.content {\n                Content::None => visitor.visit_none(),\n                Content::Some(v) => visitor.visit_some(ContentDeserializer::new(*v)),\n                Content::Unit => visitor.visit_unit(),\n                _ => visitor.visit_some(self),\n            }\n        }\n\n        fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            match self.content {\n                Content::Unit => visitor.visit_unit(),\n\n                // Allow deserializing newtype variant containing unit.\n                //\n                //     #[derive(Deserialize)]\n                //     #[serde(tag = \"result\")]\n                //     enum Response<T> {\n                //         Success(T),\n                //     }\n                //\n                // We want {\"result\":\"Success\"} to deserialize into Response<()>.\n                Content::Map(ref v) if v.is_empty() => visitor.visit_unit(),\n                _ => Err(self.invalid_type(&visitor)),\n            }\n        }\n\n        fn deserialize_unit_struct<V>(\n            self,\n            _name: &'static str,\n            visitor: V,\n        ) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            match self.content {\n                // As a special case, allow deserializing untagged newtype\n                // variant containing unit struct.\n                //\n                //     #[derive(Deserialize)]\n                //     struct Info;\n                //\n                //     #[derive(Deserialize)]\n                //     #[serde(tag = \"topic\")]\n                //     enum Message {\n                //         Info(Info),\n                //     }\n                //\n                // We want {\"topic\":\"Info\"} to deserialize even though\n                // ordinarily unit structs do not deserialize from empty map/seq.\n                Content::Map(ref v) if v.is_empty() => visitor.visit_unit(),\n                Content::Seq(ref v) if v.is_empty() => visitor.visit_unit(),\n                _ => self.deserialize_any(visitor),\n            }\n        }\n\n        fn deserialize_newtype_struct<V>(\n            self,\n            _name: &str,\n            visitor: V,\n        ) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            match self.content {\n                Content::Newtype(v) => visitor.visit_newtype_struct(ContentDeserializer::new(*v)),\n                _ => visitor.visit_newtype_struct(self),\n            }\n        }\n\n        fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            match self.content {\n                Content::Seq(v) => visit_content_seq(v, visitor),\n                _ => Err(self.invalid_type(&visitor)),\n            }\n        }\n\n        fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_seq(visitor)\n        }\n\n        fn deserialize_tuple_struct<V>(\n            self,\n            _name: &'static str,\n            _len: usize,\n            visitor: V,\n        ) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_seq(visitor)\n        }\n\n        fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            match self.content {\n                Content::Map(v) => visit_content_map(v, visitor),\n                _ => Err(self.invalid_type(&visitor)),\n            }\n        }\n\n        fn deserialize_struct<V>(\n            self,\n            _name: &'static str,\n            _fields: &'static [&'static str],\n            visitor: V,\n        ) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            match self.content {\n                Content::Seq(v) => visit_content_seq(v, visitor),\n                Content::Map(v) => visit_content_map(v, visitor),\n                _ => Err(self.invalid_type(&visitor)),\n            }\n        }\n\n        fn deserialize_enum<V>(\n            self,\n            _name: &str,\n            _variants: &'static [&'static str],\n            visitor: V,\n        ) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            let (variant, value) = match self.content {\n                Content::Map(value) => {\n                    let mut iter = value.into_iter();\n                    let (variant, value) = match iter.next() {\n                        Some(v) => v,\n                        None => {\n                            return Err(de::Error::invalid_value(\n                                de::Unexpected::Map,\n                                &\"map with a single key\",\n                            ));\n                        }\n                    };\n                    // enums are encoded in json as maps with a single key:value pair\n                    if iter.next().is_some() {\n                        return Err(de::Error::invalid_value(\n                            de::Unexpected::Map,\n                            &\"map with a single key\",\n                        ));\n                    }\n                    (variant, Some(value))\n                }\n                s @ Content::String(_) | s @ Content::Str(_) => (s, None),\n                other => {\n                    return Err(de::Error::invalid_type(\n                        content_unexpected(&other),\n                        &\"string or map\",\n                    ));\n                }\n            };\n\n            visitor.visit_enum(EnumDeserializer::new(variant, value))\n        }\n\n        fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            match self.content {\n                Content::String(v) => visitor.visit_string(v),\n                Content::Str(v) => visitor.visit_borrowed_str(v),\n                Content::ByteBuf(v) => visitor.visit_byte_buf(v),\n                Content::Bytes(v) => visitor.visit_borrowed_bytes(v),\n                Content::U8(v) => visitor.visit_u8(v),\n                Content::U64(v) => visitor.visit_u64(v),\n                _ => Err(self.invalid_type(&visitor)),\n            }\n        }\n\n        fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            drop(self);\n            visitor.visit_unit()\n        }\n\n        fn __deserialize_content_v1<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de, Value = Content<'de>>,\n        {\n            let _ = visitor;\n            Ok(self.content)\n        }\n    }\n\n    impl<'de, E> ContentDeserializer<'de, E> {\n        /// private API, don't use\n        pub fn new(content: Content<'de>) -> Self {\n            ContentDeserializer {\n                content,\n                err: PhantomData,\n            }\n        }\n    }\n\n    struct SeqDeserializer<'de, E> {\n        iter: <Vec<Content<'de>> as IntoIterator>::IntoIter,\n        count: usize,\n        marker: PhantomData<E>,\n    }\n\n    impl<'de, E> SeqDeserializer<'de, E> {\n        fn new(content: Vec<Content<'de>>) -> Self {\n            SeqDeserializer {\n                iter: content.into_iter(),\n                count: 0,\n                marker: PhantomData,\n            }\n        }\n    }\n\n    impl<'de, E> SeqDeserializer<'de, E>\n    where\n        E: de::Error,\n    {\n        fn end(self) -> Result<(), E> {\n            let remaining = self.iter.count();\n            if remaining == 0 {\n                Ok(())\n            } else {\n                // First argument is the number of elements in the data, second\n                // argument is the number of elements expected by the Deserialize.\n                Err(de::Error::invalid_length(\n                    self.count + remaining,\n                    &ExpectedInSeq(self.count),\n                ))\n            }\n        }\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'de, E> Deserializer<'de> for SeqDeserializer<'de, E>\n    where\n        E: de::Error,\n    {\n        type Error = E;\n\n        fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            let v = tri!(visitor.visit_seq(&mut self));\n            tri!(self.end());\n            Ok(v)\n        }\n\n        serde_core::forward_to_deserialize_any! {\n            bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string\n            bytes byte_buf option unit unit_struct newtype_struct seq tuple\n            tuple_struct map struct enum identifier ignored_any\n        }\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'de, E> SeqAccess<'de> for SeqDeserializer<'de, E>\n    where\n        E: de::Error,\n    {\n        type Error = E;\n\n        fn next_element_seed<V>(&mut self, seed: V) -> Result<Option<V::Value>, Self::Error>\n        where\n            V: DeserializeSeed<'de>,\n        {\n            match self.iter.next() {\n                Some(value) => {\n                    self.count += 1;\n                    seed.deserialize(ContentDeserializer::new(value)).map(Some)\n                }\n                None => Ok(None),\n            }\n        }\n\n        fn size_hint(&self) -> Option<usize> {\n            size_hint::from_bounds(&self.iter)\n        }\n    }\n\n    struct ExpectedInSeq(usize);\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl Expected for ExpectedInSeq {\n        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n            if self.0 == 1 {\n                formatter.write_str(\"1 element in sequence\")\n            } else {\n                write!(formatter, \"{} elements in sequence\", self.0)\n            }\n        }\n    }\n\n    struct MapDeserializer<'de, E> {\n        iter: <Vec<(Content<'de>, Content<'de>)> as IntoIterator>::IntoIter,\n        value: Option<Content<'de>>,\n        count: usize,\n        error: PhantomData<E>,\n    }\n\n    impl<'de, E> MapDeserializer<'de, E> {\n        fn new(content: Vec<(Content<'de>, Content<'de>)>) -> Self {\n            MapDeserializer {\n                iter: content.into_iter(),\n                value: None,\n                count: 0,\n                error: PhantomData,\n            }\n        }\n    }\n\n    impl<'de, E> MapDeserializer<'de, E>\n    where\n        E: de::Error,\n    {\n        fn end(self) -> Result<(), E> {\n            let remaining = self.iter.count();\n            if remaining == 0 {\n                Ok(())\n            } else {\n                // First argument is the number of elements in the data, second\n                // argument is the number of elements expected by the Deserialize.\n                Err(de::Error::invalid_length(\n                    self.count + remaining,\n                    &ExpectedInMap(self.count),\n                ))\n            }\n        }\n    }\n\n    impl<'de, E> MapDeserializer<'de, E> {\n        fn next_pair(&mut self) -> Option<(Content<'de>, Content<'de>)> {\n            match self.iter.next() {\n                Some((k, v)) => {\n                    self.count += 1;\n                    Some((k, v))\n                }\n                None => None,\n            }\n        }\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'de, E> Deserializer<'de> for MapDeserializer<'de, E>\n    where\n        E: de::Error,\n    {\n        type Error = E;\n\n        fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            let value = tri!(visitor.visit_map(&mut self));\n            tri!(self.end());\n            Ok(value)\n        }\n\n        fn deserialize_seq<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            let value = tri!(visitor.visit_seq(&mut self));\n            tri!(self.end());\n            Ok(value)\n        }\n\n        fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            let _ = len;\n            self.deserialize_seq(visitor)\n        }\n\n        serde_core::forward_to_deserialize_any! {\n            bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string\n            bytes byte_buf option unit unit_struct newtype_struct tuple_struct map\n            struct enum identifier ignored_any\n        }\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'de, E> MapAccess<'de> for MapDeserializer<'de, E>\n    where\n        E: de::Error,\n    {\n        type Error = E;\n\n        fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>\n        where\n            T: DeserializeSeed<'de>,\n        {\n            match self.next_pair() {\n                Some((key, value)) => {\n                    self.value = Some(value);\n                    seed.deserialize(ContentDeserializer::new(key)).map(Some)\n                }\n                None => Ok(None),\n            }\n        }\n\n        fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error>\n        where\n            T: DeserializeSeed<'de>,\n        {\n            let value = self.value.take();\n            // Panic because this indicates a bug in the program rather than an\n            // expected failure.\n            let value = value.expect(\"MapAccess::next_value called before next_key\");\n            seed.deserialize(ContentDeserializer::new(value))\n        }\n\n        fn next_entry_seed<TK, TV>(\n            &mut self,\n            kseed: TK,\n            vseed: TV,\n        ) -> Result<Option<(TK::Value, TV::Value)>, Self::Error>\n        where\n            TK: DeserializeSeed<'de>,\n            TV: DeserializeSeed<'de>,\n        {\n            match self.next_pair() {\n                Some((key, value)) => {\n                    let key = tri!(kseed.deserialize(ContentDeserializer::new(key)));\n                    let value = tri!(vseed.deserialize(ContentDeserializer::new(value)));\n                    Ok(Some((key, value)))\n                }\n                None => Ok(None),\n            }\n        }\n\n        fn size_hint(&self) -> Option<usize> {\n            size_hint::from_bounds(&self.iter)\n        }\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'de, E> SeqAccess<'de> for MapDeserializer<'de, E>\n    where\n        E: de::Error,\n    {\n        type Error = E;\n\n        fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>\n        where\n            T: de::DeserializeSeed<'de>,\n        {\n            match self.next_pair() {\n                Some((k, v)) => {\n                    let de = PairDeserializer(k, v, PhantomData);\n                    seed.deserialize(de).map(Some)\n                }\n                None => Ok(None),\n            }\n        }\n\n        fn size_hint(&self) -> Option<usize> {\n            size_hint::from_bounds(&self.iter)\n        }\n    }\n\n    struct PairDeserializer<'de, E>(Content<'de>, Content<'de>, PhantomData<E>);\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'de, E> Deserializer<'de> for PairDeserializer<'de, E>\n    where\n        E: de::Error,\n    {\n        type Error = E;\n\n        serde_core::forward_to_deserialize_any! {\n            bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string\n            bytes byte_buf option unit unit_struct newtype_struct tuple_struct map\n            struct enum identifier ignored_any\n        }\n\n        fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_seq(visitor)\n        }\n\n        fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            let mut pair_visitor = PairVisitor(Some(self.0), Some(self.1), PhantomData);\n            let pair = tri!(visitor.visit_seq(&mut pair_visitor));\n            if pair_visitor.1.is_none() {\n                Ok(pair)\n            } else {\n                let remaining = pair_visitor.size_hint().unwrap();\n                // First argument is the number of elements in the data, second\n                // argument is the number of elements expected by the Deserialize.\n                Err(de::Error::invalid_length(2, &ExpectedInSeq(2 - remaining)))\n            }\n        }\n\n        fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: de::Visitor<'de>,\n        {\n            if len == 2 {\n                self.deserialize_seq(visitor)\n            } else {\n                // First argument is the number of elements in the data, second\n                // argument is the number of elements expected by the Deserialize.\n                Err(de::Error::invalid_length(2, &ExpectedInSeq(len)))\n            }\n        }\n    }\n\n    struct PairVisitor<'de, E>(Option<Content<'de>>, Option<Content<'de>>, PhantomData<E>);\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'de, E> SeqAccess<'de> for PairVisitor<'de, E>\n    where\n        E: de::Error,\n    {\n        type Error = E;\n\n        fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>\n        where\n            T: DeserializeSeed<'de>,\n        {\n            if let Some(k) = self.0.take() {\n                seed.deserialize(ContentDeserializer::new(k)).map(Some)\n            } else if let Some(v) = self.1.take() {\n                seed.deserialize(ContentDeserializer::new(v)).map(Some)\n            } else {\n                Ok(None)\n            }\n        }\n\n        fn size_hint(&self) -> Option<usize> {\n            if self.0.is_some() {\n                Some(2)\n            } else if self.1.is_some() {\n                Some(1)\n            } else {\n                Some(0)\n            }\n        }\n    }\n\n    struct ExpectedInMap(usize);\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl Expected for ExpectedInMap {\n        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n            if self.0 == 1 {\n                formatter.write_str(\"1 element in map\")\n            } else {\n                write!(formatter, \"{} elements in map\", self.0)\n            }\n        }\n    }\n\n    pub struct EnumDeserializer<'de, E>\n    where\n        E: de::Error,\n    {\n        variant: Content<'de>,\n        value: Option<Content<'de>>,\n        err: PhantomData<E>,\n    }\n\n    impl<'de, E> EnumDeserializer<'de, E>\n    where\n        E: de::Error,\n    {\n        pub fn new(variant: Content<'de>, value: Option<Content<'de>>) -> EnumDeserializer<'de, E> {\n            EnumDeserializer {\n                variant,\n                value,\n                err: PhantomData,\n            }\n        }\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'de, E> de::EnumAccess<'de> for EnumDeserializer<'de, E>\n    where\n        E: de::Error,\n    {\n        type Error = E;\n        type Variant = VariantDeserializer<'de, Self::Error>;\n\n        fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), E>\n        where\n            V: de::DeserializeSeed<'de>,\n        {\n            let visitor = VariantDeserializer {\n                value: self.value,\n                err: PhantomData,\n            };\n            seed.deserialize(ContentDeserializer::new(self.variant))\n                .map(|v| (v, visitor))\n        }\n    }\n\n    pub struct VariantDeserializer<'de, E>\n    where\n        E: de::Error,\n    {\n        value: Option<Content<'de>>,\n        err: PhantomData<E>,\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'de, E> de::VariantAccess<'de> for VariantDeserializer<'de, E>\n    where\n        E: de::Error,\n    {\n        type Error = E;\n\n        fn unit_variant(self) -> Result<(), E> {\n            match self.value {\n                Some(value) => de::Deserialize::deserialize(ContentDeserializer::new(value)),\n                None => Ok(()),\n            }\n        }\n\n        fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, E>\n        where\n            T: de::DeserializeSeed<'de>,\n        {\n            match self.value {\n                Some(value) => seed.deserialize(ContentDeserializer::new(value)),\n                None => Err(de::Error::invalid_type(\n                    de::Unexpected::UnitVariant,\n                    &\"newtype variant\",\n                )),\n            }\n        }\n\n        fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: de::Visitor<'de>,\n        {\n            match self.value {\n                Some(Content::Seq(v)) => {\n                    de::Deserializer::deserialize_any(SeqDeserializer::new(v), visitor)\n                }\n                Some(other) => Err(de::Error::invalid_type(\n                    content_unexpected(&other),\n                    &\"tuple variant\",\n                )),\n                None => Err(de::Error::invalid_type(\n                    de::Unexpected::UnitVariant,\n                    &\"tuple variant\",\n                )),\n            }\n        }\n\n        fn struct_variant<V>(\n            self,\n            _fields: &'static [&'static str],\n            visitor: V,\n        ) -> Result<V::Value, Self::Error>\n        where\n            V: de::Visitor<'de>,\n        {\n            match self.value {\n                Some(Content::Map(v)) => {\n                    de::Deserializer::deserialize_any(MapDeserializer::new(v), visitor)\n                }\n                Some(Content::Seq(v)) => {\n                    de::Deserializer::deserialize_any(SeqDeserializer::new(v), visitor)\n                }\n                Some(other) => Err(de::Error::invalid_type(\n                    content_unexpected(&other),\n                    &\"struct variant\",\n                )),\n                None => Err(de::Error::invalid_type(\n                    de::Unexpected::UnitVariant,\n                    &\"struct variant\",\n                )),\n            }\n        }\n    }\n\n    /// Not public API.\n    pub struct ContentRefDeserializer<'a, 'de: 'a, E> {\n        content: &'a Content<'de>,\n        err: PhantomData<E>,\n    }\n\n    impl<'a, 'de, E> ContentRefDeserializer<'a, 'de, E>\n    where\n        E: de::Error,\n    {\n        #[cold]\n        fn invalid_type(self, exp: &dyn Expected) -> E {\n            de::Error::invalid_type(content_unexpected(self.content), exp)\n        }\n\n        fn deserialize_integer<V>(self, visitor: V) -> Result<V::Value, E>\n        where\n            V: Visitor<'de>,\n        {\n            match *self.content {\n                Content::U8(v) => visitor.visit_u8(v),\n                Content::U16(v) => visitor.visit_u16(v),\n                Content::U32(v) => visitor.visit_u32(v),\n                Content::U64(v) => visitor.visit_u64(v),\n                Content::I8(v) => visitor.visit_i8(v),\n                Content::I16(v) => visitor.visit_i16(v),\n                Content::I32(v) => visitor.visit_i32(v),\n                Content::I64(v) => visitor.visit_i64(v),\n                _ => Err(self.invalid_type(&visitor)),\n            }\n        }\n\n        fn deserialize_float<V>(self, visitor: V) -> Result<V::Value, E>\n        where\n            V: Visitor<'de>,\n        {\n            match *self.content {\n                Content::F32(v) => visitor.visit_f32(v),\n                Content::F64(v) => visitor.visit_f64(v),\n                Content::U8(v) => visitor.visit_u8(v),\n                Content::U16(v) => visitor.visit_u16(v),\n                Content::U32(v) => visitor.visit_u32(v),\n                Content::U64(v) => visitor.visit_u64(v),\n                Content::I8(v) => visitor.visit_i8(v),\n                Content::I16(v) => visitor.visit_i16(v),\n                Content::I32(v) => visitor.visit_i32(v),\n                Content::I64(v) => visitor.visit_i64(v),\n                _ => Err(self.invalid_type(&visitor)),\n            }\n        }\n    }\n\n    fn visit_content_seq_ref<'a, 'de, V, E>(\n        content: &'a [Content<'de>],\n        visitor: V,\n    ) -> Result<V::Value, E>\n    where\n        V: Visitor<'de>,\n        E: de::Error,\n    {\n        let mut seq_visitor = SeqRefDeserializer::new(content);\n        let value = tri!(visitor.visit_seq(&mut seq_visitor));\n        tri!(seq_visitor.end());\n        Ok(value)\n    }\n\n    fn visit_content_map_ref<'a, 'de, V, E>(\n        content: &'a [(Content<'de>, Content<'de>)],\n        visitor: V,\n    ) -> Result<V::Value, E>\n    where\n        V: Visitor<'de>,\n        E: de::Error,\n    {\n        let mut map_visitor = MapRefDeserializer::new(content);\n        let value = tri!(visitor.visit_map(&mut map_visitor));\n        tri!(map_visitor.end());\n        Ok(value)\n    }\n\n    /// Used when deserializing an untagged enum because the content may need\n    /// to be used more than once.\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'de, 'a, E> Deserializer<'de> for ContentRefDeserializer<'a, 'de, E>\n    where\n        E: de::Error,\n    {\n        type Error = E;\n\n        fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, E>\n        where\n            V: Visitor<'de>,\n        {\n            match *self.content {\n                Content::Bool(v) => visitor.visit_bool(v),\n                Content::U8(v) => visitor.visit_u8(v),\n                Content::U16(v) => visitor.visit_u16(v),\n                Content::U32(v) => visitor.visit_u32(v),\n                Content::U64(v) => visitor.visit_u64(v),\n                Content::I8(v) => visitor.visit_i8(v),\n                Content::I16(v) => visitor.visit_i16(v),\n                Content::I32(v) => visitor.visit_i32(v),\n                Content::I64(v) => visitor.visit_i64(v),\n                Content::F32(v) => visitor.visit_f32(v),\n                Content::F64(v) => visitor.visit_f64(v),\n                Content::Char(v) => visitor.visit_char(v),\n                Content::String(ref v) => visitor.visit_str(v),\n                Content::Str(v) => visitor.visit_borrowed_str(v),\n                Content::ByteBuf(ref v) => visitor.visit_bytes(v),\n                Content::Bytes(v) => visitor.visit_borrowed_bytes(v),\n                Content::Unit => visitor.visit_unit(),\n                Content::None => visitor.visit_none(),\n                Content::Some(ref v) => visitor.visit_some(ContentRefDeserializer::new(v)),\n                Content::Newtype(ref v) => {\n                    visitor.visit_newtype_struct(ContentRefDeserializer::new(v))\n                }\n                Content::Seq(ref v) => visit_content_seq_ref(v, visitor),\n                Content::Map(ref v) => visit_content_map_ref(v, visitor),\n            }\n        }\n\n        fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            match *self.content {\n                Content::Bool(v) => visitor.visit_bool(v),\n                _ => Err(self.invalid_type(&visitor)),\n            }\n        }\n\n        fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_integer(visitor)\n        }\n\n        fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_integer(visitor)\n        }\n\n        fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_integer(visitor)\n        }\n\n        fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_integer(visitor)\n        }\n\n        fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_integer(visitor)\n        }\n\n        fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_integer(visitor)\n        }\n\n        fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_integer(visitor)\n        }\n\n        fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_integer(visitor)\n        }\n\n        fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_float(visitor)\n        }\n\n        fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_float(visitor)\n        }\n\n        fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            match *self.content {\n                Content::Char(v) => visitor.visit_char(v),\n                Content::String(ref v) => visitor.visit_str(v),\n                Content::Str(v) => visitor.visit_borrowed_str(v),\n                _ => Err(self.invalid_type(&visitor)),\n            }\n        }\n\n        fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            match *self.content {\n                Content::String(ref v) => visitor.visit_str(v),\n                Content::Str(v) => visitor.visit_borrowed_str(v),\n                Content::ByteBuf(ref v) => visitor.visit_bytes(v),\n                Content::Bytes(v) => visitor.visit_borrowed_bytes(v),\n                _ => Err(self.invalid_type(&visitor)),\n            }\n        }\n\n        fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_str(visitor)\n        }\n\n        fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            match *self.content {\n                Content::String(ref v) => visitor.visit_str(v),\n                Content::Str(v) => visitor.visit_borrowed_str(v),\n                Content::ByteBuf(ref v) => visitor.visit_bytes(v),\n                Content::Bytes(v) => visitor.visit_borrowed_bytes(v),\n                Content::Seq(ref v) => visit_content_seq_ref(v, visitor),\n                _ => Err(self.invalid_type(&visitor)),\n            }\n        }\n\n        fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_bytes(visitor)\n        }\n\n        fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, E>\n        where\n            V: Visitor<'de>,\n        {\n            // Covered by tests/test_enum_untagged.rs\n            //      with_optional_field::*\n            match *self.content {\n                Content::None => visitor.visit_none(),\n                Content::Some(ref v) => visitor.visit_some(ContentRefDeserializer::new(v)),\n                Content::Unit => visitor.visit_unit(),\n                // This case is to support data formats which do not encode an\n                // indication whether a value is optional. An example of such a\n                // format is JSON, and a counterexample is RON. When requesting\n                // `deserialize_any` in JSON, the data format never performs\n                // `Visitor::visit_some` but we still must be able to\n                // deserialize the resulting Content into data structures with\n                // optional fields.\n                _ => visitor.visit_some(self),\n            }\n        }\n\n        fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            match *self.content {\n                Content::Unit => visitor.visit_unit(),\n                _ => Err(self.invalid_type(&visitor)),\n            }\n        }\n\n        fn deserialize_unit_struct<V>(\n            self,\n            _name: &'static str,\n            visitor: V,\n        ) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_unit(visitor)\n        }\n\n        fn deserialize_newtype_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value, E>\n        where\n            V: Visitor<'de>,\n        {\n            // Covered by tests/test_enum_untagged.rs\n            //      newtype_struct\n            match *self.content {\n                Content::Newtype(ref v) => {\n                    visitor.visit_newtype_struct(ContentRefDeserializer::new(v))\n                }\n                // This case is to support data formats that encode newtype\n                // structs and their underlying data the same, with no\n                // indication whether a newtype wrapper was present. For example\n                // JSON does this, while RON does not. In RON a newtype's name\n                // is included in the serialized representation and it knows to\n                // call `Visitor::visit_newtype_struct` from `deserialize_any`.\n                // JSON's `deserialize_any` never calls `visit_newtype_struct`\n                // but in this code we still must be able to deserialize the\n                // resulting Content into newtypes.\n                _ => visitor.visit_newtype_struct(self),\n            }\n        }\n\n        fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            match *self.content {\n                Content::Seq(ref v) => visit_content_seq_ref(v, visitor),\n                _ => Err(self.invalid_type(&visitor)),\n            }\n        }\n\n        fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_seq(visitor)\n        }\n\n        fn deserialize_tuple_struct<V>(\n            self,\n            _name: &'static str,\n            _len: usize,\n            visitor: V,\n        ) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_seq(visitor)\n        }\n\n        fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            match *self.content {\n                Content::Map(ref v) => visit_content_map_ref(v, visitor),\n                _ => Err(self.invalid_type(&visitor)),\n            }\n        }\n\n        fn deserialize_struct<V>(\n            self,\n            _name: &'static str,\n            _fields: &'static [&'static str],\n            visitor: V,\n        ) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            match *self.content {\n                Content::Seq(ref v) => visit_content_seq_ref(v, visitor),\n                Content::Map(ref v) => visit_content_map_ref(v, visitor),\n                _ => Err(self.invalid_type(&visitor)),\n            }\n        }\n\n        fn deserialize_enum<V>(\n            self,\n            _name: &str,\n            _variants: &'static [&'static str],\n            visitor: V,\n        ) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            let (variant, value) = match *self.content {\n                Content::Map(ref value) => {\n                    let mut iter = value.iter();\n                    let (variant, value) = match iter.next() {\n                        Some(v) => v,\n                        None => {\n                            return Err(de::Error::invalid_value(\n                                de::Unexpected::Map,\n                                &\"map with a single key\",\n                            ));\n                        }\n                    };\n                    // enums are encoded in json as maps with a single key:value pair\n                    if iter.next().is_some() {\n                        return Err(de::Error::invalid_value(\n                            de::Unexpected::Map,\n                            &\"map with a single key\",\n                        ));\n                    }\n                    (variant, Some(value))\n                }\n                ref s @ Content::String(_) | ref s @ Content::Str(_) => (s, None),\n                ref other => {\n                    return Err(de::Error::invalid_type(\n                        content_unexpected(other),\n                        &\"string or map\",\n                    ));\n                }\n            };\n\n            visitor.visit_enum(EnumRefDeserializer {\n                variant,\n                value,\n                err: PhantomData,\n            })\n        }\n\n        fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            match *self.content {\n                Content::String(ref v) => visitor.visit_str(v),\n                Content::Str(v) => visitor.visit_borrowed_str(v),\n                Content::ByteBuf(ref v) => visitor.visit_bytes(v),\n                Content::Bytes(v) => visitor.visit_borrowed_bytes(v),\n                Content::U8(v) => visitor.visit_u8(v),\n                Content::U64(v) => visitor.visit_u64(v),\n                _ => Err(self.invalid_type(&visitor)),\n            }\n        }\n\n        fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            visitor.visit_unit()\n        }\n\n        fn __deserialize_content_v1<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de, Value = Content<'de>>,\n        {\n            let _ = visitor;\n            Ok(content_clone(self.content))\n        }\n    }\n\n    impl<'a, 'de, E> ContentRefDeserializer<'a, 'de, E> {\n        /// private API, don't use\n        pub fn new(content: &'a Content<'de>) -> Self {\n            ContentRefDeserializer {\n                content,\n                err: PhantomData,\n            }\n        }\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'a, 'de: 'a, E> Copy for ContentRefDeserializer<'a, 'de, E> {}\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'a, 'de: 'a, E> Clone for ContentRefDeserializer<'a, 'de, E> {\n        fn clone(&self) -> Self {\n            *self\n        }\n    }\n\n    struct SeqRefDeserializer<'a, 'de, E> {\n        iter: <&'a [Content<'de>] as IntoIterator>::IntoIter,\n        count: usize,\n        marker: PhantomData<E>,\n    }\n\n    impl<'a, 'de, E> SeqRefDeserializer<'a, 'de, E> {\n        fn new(content: &'a [Content<'de>]) -> Self {\n            SeqRefDeserializer {\n                iter: content.iter(),\n                count: 0,\n                marker: PhantomData,\n            }\n        }\n    }\n\n    impl<'a, 'de, E> SeqRefDeserializer<'a, 'de, E>\n    where\n        E: de::Error,\n    {\n        fn end(self) -> Result<(), E> {\n            let remaining = self.iter.count();\n            if remaining == 0 {\n                Ok(())\n            } else {\n                // First argument is the number of elements in the data, second\n                // argument is the number of elements expected by the Deserialize.\n                Err(de::Error::invalid_length(\n                    self.count + remaining,\n                    &ExpectedInSeq(self.count),\n                ))\n            }\n        }\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'a, 'de, E> Deserializer<'de> for SeqRefDeserializer<'a, 'de, E>\n    where\n        E: de::Error,\n    {\n        type Error = E;\n\n        fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            let v = tri!(visitor.visit_seq(&mut self));\n            tri!(self.end());\n            Ok(v)\n        }\n\n        serde_core::forward_to_deserialize_any! {\n            bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string\n            bytes byte_buf option unit unit_struct newtype_struct seq tuple\n            tuple_struct map struct enum identifier ignored_any\n        }\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'a, 'de, E> SeqAccess<'de> for SeqRefDeserializer<'a, 'de, E>\n    where\n        E: de::Error,\n    {\n        type Error = E;\n\n        fn next_element_seed<V>(&mut self, seed: V) -> Result<Option<V::Value>, Self::Error>\n        where\n            V: DeserializeSeed<'de>,\n        {\n            match self.iter.next() {\n                Some(value) => {\n                    self.count += 1;\n                    seed.deserialize(ContentRefDeserializer::new(value))\n                        .map(Some)\n                }\n                None => Ok(None),\n            }\n        }\n\n        fn size_hint(&self) -> Option<usize> {\n            size_hint::from_bounds(&self.iter)\n        }\n    }\n\n    struct MapRefDeserializer<'a, 'de, E> {\n        iter: <&'a [(Content<'de>, Content<'de>)] as IntoIterator>::IntoIter,\n        value: Option<&'a Content<'de>>,\n        count: usize,\n        error: PhantomData<E>,\n    }\n\n    impl<'a, 'de, E> MapRefDeserializer<'a, 'de, E> {\n        fn new(content: &'a [(Content<'de>, Content<'de>)]) -> Self {\n            MapRefDeserializer {\n                iter: content.iter(),\n                value: None,\n                count: 0,\n                error: PhantomData,\n            }\n        }\n    }\n\n    impl<'a, 'de, E> MapRefDeserializer<'a, 'de, E>\n    where\n        E: de::Error,\n    {\n        fn end(self) -> Result<(), E> {\n            let remaining = self.iter.count();\n            if remaining == 0 {\n                Ok(())\n            } else {\n                // First argument is the number of elements in the data, second\n                // argument is the number of elements expected by the Deserialize.\n                Err(de::Error::invalid_length(\n                    self.count + remaining,\n                    &ExpectedInMap(self.count),\n                ))\n            }\n        }\n    }\n\n    impl<'a, 'de, E> MapRefDeserializer<'a, 'de, E> {\n        fn next_pair(&mut self) -> Option<(&'a Content<'de>, &'a Content<'de>)> {\n            match self.iter.next() {\n                Some((k, v)) => {\n                    self.count += 1;\n                    Some((k, v))\n                }\n                None => None,\n            }\n        }\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'a, 'de, E> Deserializer<'de> for MapRefDeserializer<'a, 'de, E>\n    where\n        E: de::Error,\n    {\n        type Error = E;\n\n        fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            let value = tri!(visitor.visit_map(&mut self));\n            tri!(self.end());\n            Ok(value)\n        }\n\n        fn deserialize_seq<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            let value = tri!(visitor.visit_seq(&mut self));\n            tri!(self.end());\n            Ok(value)\n        }\n\n        fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            let _ = len;\n            self.deserialize_seq(visitor)\n        }\n\n        serde_core::forward_to_deserialize_any! {\n            bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string\n            bytes byte_buf option unit unit_struct newtype_struct tuple_struct map\n            struct enum identifier ignored_any\n        }\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'a, 'de, E> MapAccess<'de> for MapRefDeserializer<'a, 'de, E>\n    where\n        E: de::Error,\n    {\n        type Error = E;\n\n        fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>\n        where\n            T: DeserializeSeed<'de>,\n        {\n            match self.next_pair() {\n                Some((key, value)) => {\n                    self.value = Some(value);\n                    seed.deserialize(ContentRefDeserializer::new(key)).map(Some)\n                }\n                None => Ok(None),\n            }\n        }\n\n        fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error>\n        where\n            T: DeserializeSeed<'de>,\n        {\n            let value = self.value.take();\n            // Panic because this indicates a bug in the program rather than an\n            // expected failure.\n            let value = value.expect(\"MapAccess::next_value called before next_key\");\n            seed.deserialize(ContentRefDeserializer::new(value))\n        }\n\n        fn next_entry_seed<TK, TV>(\n            &mut self,\n            kseed: TK,\n            vseed: TV,\n        ) -> Result<Option<(TK::Value, TV::Value)>, Self::Error>\n        where\n            TK: DeserializeSeed<'de>,\n            TV: DeserializeSeed<'de>,\n        {\n            match self.next_pair() {\n                Some((key, value)) => {\n                    let key = tri!(kseed.deserialize(ContentRefDeserializer::new(key)));\n                    let value = tri!(vseed.deserialize(ContentRefDeserializer::new(value)));\n                    Ok(Some((key, value)))\n                }\n                None => Ok(None),\n            }\n        }\n\n        fn size_hint(&self) -> Option<usize> {\n            size_hint::from_bounds(&self.iter)\n        }\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'a, 'de, E> SeqAccess<'de> for MapRefDeserializer<'a, 'de, E>\n    where\n        E: de::Error,\n    {\n        type Error = E;\n\n        fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>\n        where\n            T: de::DeserializeSeed<'de>,\n        {\n            match self.next_pair() {\n                Some((k, v)) => {\n                    let de = PairRefDeserializer(k, v, PhantomData);\n                    seed.deserialize(de).map(Some)\n                }\n                None => Ok(None),\n            }\n        }\n\n        fn size_hint(&self) -> Option<usize> {\n            size_hint::from_bounds(&self.iter)\n        }\n    }\n\n    struct PairRefDeserializer<'a, 'de, E>(&'a Content<'de>, &'a Content<'de>, PhantomData<E>);\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'a, 'de, E> Deserializer<'de> for PairRefDeserializer<'a, 'de, E>\n    where\n        E: de::Error,\n    {\n        type Error = E;\n\n        serde_core::forward_to_deserialize_any! {\n            bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string\n            bytes byte_buf option unit unit_struct newtype_struct tuple_struct map\n            struct enum identifier ignored_any\n        }\n\n        fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.deserialize_seq(visitor)\n        }\n\n        fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            let mut pair_visitor = PairRefVisitor(Some(self.0), Some(self.1), PhantomData);\n            let pair = tri!(visitor.visit_seq(&mut pair_visitor));\n            if pair_visitor.1.is_none() {\n                Ok(pair)\n            } else {\n                let remaining = pair_visitor.size_hint().unwrap();\n                // First argument is the number of elements in the data, second\n                // argument is the number of elements expected by the Deserialize.\n                Err(de::Error::invalid_length(2, &ExpectedInSeq(2 - remaining)))\n            }\n        }\n\n        fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: de::Visitor<'de>,\n        {\n            if len == 2 {\n                self.deserialize_seq(visitor)\n            } else {\n                // First argument is the number of elements in the data, second\n                // argument is the number of elements expected by the Deserialize.\n                Err(de::Error::invalid_length(2, &ExpectedInSeq(len)))\n            }\n        }\n    }\n\n    struct PairRefVisitor<'a, 'de, E>(\n        Option<&'a Content<'de>>,\n        Option<&'a Content<'de>>,\n        PhantomData<E>,\n    );\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'a, 'de, E> SeqAccess<'de> for PairRefVisitor<'a, 'de, E>\n    where\n        E: de::Error,\n    {\n        type Error = E;\n\n        fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>\n        where\n            T: DeserializeSeed<'de>,\n        {\n            if let Some(k) = self.0.take() {\n                seed.deserialize(ContentRefDeserializer::new(k)).map(Some)\n            } else if let Some(v) = self.1.take() {\n                seed.deserialize(ContentRefDeserializer::new(v)).map(Some)\n            } else {\n                Ok(None)\n            }\n        }\n\n        fn size_hint(&self) -> Option<usize> {\n            if self.0.is_some() {\n                Some(2)\n            } else if self.1.is_some() {\n                Some(1)\n            } else {\n                Some(0)\n            }\n        }\n    }\n\n    struct EnumRefDeserializer<'a, 'de: 'a, E>\n    where\n        E: de::Error,\n    {\n        variant: &'a Content<'de>,\n        value: Option<&'a Content<'de>>,\n        err: PhantomData<E>,\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'de, 'a, E> de::EnumAccess<'de> for EnumRefDeserializer<'a, 'de, E>\n    where\n        E: de::Error,\n    {\n        type Error = E;\n        type Variant = VariantRefDeserializer<'a, 'de, Self::Error>;\n\n        fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>\n        where\n            V: de::DeserializeSeed<'de>,\n        {\n            let visitor = VariantRefDeserializer {\n                value: self.value,\n                err: PhantomData,\n            };\n            seed.deserialize(ContentRefDeserializer::new(self.variant))\n                .map(|v| (v, visitor))\n        }\n    }\n\n    struct VariantRefDeserializer<'a, 'de: 'a, E>\n    where\n        E: de::Error,\n    {\n        value: Option<&'a Content<'de>>,\n        err: PhantomData<E>,\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'de, 'a, E> de::VariantAccess<'de> for VariantRefDeserializer<'a, 'de, E>\n    where\n        E: de::Error,\n    {\n        type Error = E;\n\n        fn unit_variant(self) -> Result<(), E> {\n            match self.value {\n                Some(value) => de::Deserialize::deserialize(ContentRefDeserializer::new(value)),\n                // Covered by tests/test_annotations.rs\n                //      test_partially_untagged_adjacently_tagged_enum\n                // Covered by tests/test_enum_untagged.rs\n                //      newtype_enum::unit\n                None => Ok(()),\n            }\n        }\n\n        fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, E>\n        where\n            T: de::DeserializeSeed<'de>,\n        {\n            match self.value {\n                // Covered by tests/test_annotations.rs\n                //      test_partially_untagged_enum_desugared\n                //      test_partially_untagged_enum_generic\n                // Covered by tests/test_enum_untagged.rs\n                //      newtype_enum::newtype\n                Some(value) => seed.deserialize(ContentRefDeserializer::new(value)),\n                None => Err(de::Error::invalid_type(\n                    de::Unexpected::UnitVariant,\n                    &\"newtype variant\",\n                )),\n            }\n        }\n\n        fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: de::Visitor<'de>,\n        {\n            match self.value {\n                // Covered by tests/test_annotations.rs\n                //      test_partially_untagged_enum\n                //      test_partially_untagged_enum_desugared\n                // Covered by tests/test_enum_untagged.rs\n                //      newtype_enum::tuple0\n                //      newtype_enum::tuple2\n                Some(Content::Seq(v)) => visit_content_seq_ref(v, visitor),\n                Some(other) => Err(de::Error::invalid_type(\n                    content_unexpected(other),\n                    &\"tuple variant\",\n                )),\n                None => Err(de::Error::invalid_type(\n                    de::Unexpected::UnitVariant,\n                    &\"tuple variant\",\n                )),\n            }\n        }\n\n        fn struct_variant<V>(\n            self,\n            _fields: &'static [&'static str],\n            visitor: V,\n        ) -> Result<V::Value, Self::Error>\n        where\n            V: de::Visitor<'de>,\n        {\n            match self.value {\n                // Covered by tests/test_enum_untagged.rs\n                //      newtype_enum::struct_from_map\n                Some(Content::Map(v)) => visit_content_map_ref(v, visitor),\n                // Covered by tests/test_enum_untagged.rs\n                //      newtype_enum::struct_from_seq\n                //      newtype_enum::empty_struct_from_seq\n                Some(Content::Seq(v)) => visit_content_seq_ref(v, visitor),\n                Some(other) => Err(de::Error::invalid_type(\n                    content_unexpected(other),\n                    &\"struct variant\",\n                )),\n                None => Err(de::Error::invalid_type(\n                    de::Unexpected::UnitVariant,\n                    &\"struct variant\",\n                )),\n            }\n        }\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'de, E> de::IntoDeserializer<'de, E> for ContentDeserializer<'de, E>\n    where\n        E: de::Error,\n    {\n        type Deserializer = Self;\n\n        fn into_deserializer(self) -> Self {\n            self\n        }\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'de, 'a, E> de::IntoDeserializer<'de, E> for ContentRefDeserializer<'a, 'de, E>\n    where\n        E: de::Error,\n    {\n        type Deserializer = Self;\n\n        fn into_deserializer(self) -> Self {\n            self\n        }\n    }\n\n    /// Visitor for deserializing an internally tagged unit variant.\n    ///\n    /// Not public API.\n    pub struct InternallyTaggedUnitVisitor<'a> {\n        type_name: &'a str,\n        variant_name: &'a str,\n    }\n\n    impl<'a> InternallyTaggedUnitVisitor<'a> {\n        /// Not public API.\n        pub fn new(type_name: &'a str, variant_name: &'a str) -> Self {\n            InternallyTaggedUnitVisitor {\n                type_name,\n                variant_name,\n            }\n        }\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'de, 'a> Visitor<'de> for InternallyTaggedUnitVisitor<'a> {\n        type Value = ();\n\n        fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n            write!(\n                formatter,\n                \"unit variant {}::{}\",\n                self.type_name, self.variant_name\n            )\n        }\n\n        fn visit_seq<S>(self, _: S) -> Result<(), S::Error>\n        where\n            S: SeqAccess<'de>,\n        {\n            Ok(())\n        }\n\n        fn visit_map<M>(self, mut access: M) -> Result<(), M::Error>\n        where\n            M: MapAccess<'de>,\n        {\n            while tri!(access.next_entry::<IgnoredAny, IgnoredAny>()).is_some() {}\n            Ok(())\n        }\n    }\n\n    /// Visitor for deserializing an untagged unit variant.\n    ///\n    /// Not public API.\n    pub struct UntaggedUnitVisitor<'a> {\n        type_name: &'a str,\n        variant_name: &'a str,\n    }\n\n    impl<'a> UntaggedUnitVisitor<'a> {\n        /// Not public API.\n        pub fn new(type_name: &'a str, variant_name: &'a str) -> Self {\n            UntaggedUnitVisitor {\n                type_name,\n                variant_name,\n            }\n        }\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<'de, 'a> Visitor<'de> for UntaggedUnitVisitor<'a> {\n        type Value = ();\n\n        fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n            write!(\n                formatter,\n                \"unit variant {}::{}\",\n                self.type_name, self.variant_name\n            )\n        }\n\n        fn visit_unit<E>(self) -> Result<(), E>\n        where\n            E: de::Error,\n        {\n            Ok(())\n        }\n\n        fn visit_none<E>(self) -> Result<(), E>\n        where\n            E: de::Error,\n        {\n            Ok(())\n        }\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n// Like `IntoDeserializer` but also implemented for `&[u8]`. This is used for\n// the newtype fallthrough case of `field_identifier`.\n//\n//    #[derive(Deserialize)]\n//    #[serde(field_identifier)]\n//    enum F {\n//        A,\n//        B,\n//        Other(String), // deserialized using IdentifierDeserializer\n//    }\npub trait IdentifierDeserializer<'de, E: Error> {\n    type Deserializer: Deserializer<'de, Error = E>;\n\n    fn from(self) -> Self::Deserializer;\n}\n\npub struct Borrowed<'de, T: 'de + ?Sized>(pub &'de T);\n\n#[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\nimpl<'de, E> IdentifierDeserializer<'de, E> for u64\nwhere\n    E: Error,\n{\n    type Deserializer = <u64 as IntoDeserializer<'de, E>>::Deserializer;\n\n    fn from(self) -> Self::Deserializer {\n        self.into_deserializer()\n    }\n}\n\npub struct StrDeserializer<'a, E> {\n    value: &'a str,\n    marker: PhantomData<E>,\n}\n\n#[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\nimpl<'de, 'a, E> Deserializer<'de> for StrDeserializer<'a, E>\nwhere\n    E: Error,\n{\n    type Error = E;\n\n    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>,\n    {\n        visitor.visit_str(self.value)\n    }\n\n    serde_core::forward_to_deserialize_any! {\n        bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string\n        bytes byte_buf option unit unit_struct newtype_struct seq tuple\n        tuple_struct map struct enum identifier ignored_any\n    }\n}\n\npub struct BorrowedStrDeserializer<'de, E> {\n    value: &'de str,\n    marker: PhantomData<E>,\n}\n\n#[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\nimpl<'de, E> Deserializer<'de> for BorrowedStrDeserializer<'de, E>\nwhere\n    E: Error,\n{\n    type Error = E;\n\n    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>,\n    {\n        visitor.visit_borrowed_str(self.value)\n    }\n\n    serde_core::forward_to_deserialize_any! {\n        bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string\n        bytes byte_buf option unit unit_struct newtype_struct seq tuple\n        tuple_struct map struct enum identifier ignored_any\n    }\n}\n\n#[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\nimpl<'a, E> IdentifierDeserializer<'a, E> for &'a str\nwhere\n    E: Error,\n{\n    type Deserializer = StrDeserializer<'a, E>;\n\n    fn from(self) -> Self::Deserializer {\n        StrDeserializer {\n            value: self,\n            marker: PhantomData,\n        }\n    }\n}\n\n#[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\nimpl<'de, E> IdentifierDeserializer<'de, E> for Borrowed<'de, str>\nwhere\n    E: Error,\n{\n    type Deserializer = BorrowedStrDeserializer<'de, E>;\n\n    fn from(self) -> Self::Deserializer {\n        BorrowedStrDeserializer {\n            value: self.0,\n            marker: PhantomData,\n        }\n    }\n}\n\n#[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\nimpl<'a, E> IdentifierDeserializer<'a, E> for &'a [u8]\nwhere\n    E: Error,\n{\n    type Deserializer = BytesDeserializer<'a, E>;\n\n    fn from(self) -> Self::Deserializer {\n        BytesDeserializer::new(self)\n    }\n}\n\n#[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\nimpl<'de, E> IdentifierDeserializer<'de, E> for Borrowed<'de, [u8]>\nwhere\n    E: Error,\n{\n    type Deserializer = BorrowedBytesDeserializer<'de, E>;\n\n    fn from(self) -> Self::Deserializer {\n        BorrowedBytesDeserializer::new(self.0)\n    }\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\npub struct FlatMapDeserializer<'a, 'de: 'a, E>(\n    pub &'a mut Vec<Option<(Content<'de>, Content<'de>)>>,\n    pub PhantomData<E>,\n);\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nimpl<'a, 'de, E> FlatMapDeserializer<'a, 'de, E>\nwhere\n    E: Error,\n{\n    fn deserialize_other<V>() -> Result<V, E> {\n        Err(Error::custom(\"can only flatten structs and maps\"))\n    }\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nmacro_rules! forward_to_deserialize_other {\n    ($($func:ident ($($arg:ty),*))*) => {\n        $(\n            fn $func<V>(self, $(_: $arg,)* _visitor: V) -> Result<V::Value, Self::Error>\n            where\n                V: Visitor<'de>,\n            {\n                Self::deserialize_other()\n            }\n        )*\n    }\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\n#[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\nimpl<'a, 'de, E> Deserializer<'de> for FlatMapDeserializer<'a, 'de, E>\nwhere\n    E: Error,\n{\n    type Error = E;\n\n    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>,\n    {\n        self.deserialize_map(visitor)\n    }\n\n    fn deserialize_enum<V>(\n        self,\n        name: &'static str,\n        variants: &'static [&'static str],\n        visitor: V,\n    ) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>,\n    {\n        for entry in self.0 {\n            if let Some((key, value)) = flat_map_take_entry(entry, variants) {\n                return visitor.visit_enum(EnumDeserializer::new(key, Some(value)));\n            }\n        }\n\n        Err(Error::custom(format_args!(\n            \"no variant of enum {} found in flattened data\",\n            name\n        )))\n    }\n\n    fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>,\n    {\n        visitor.visit_map(FlatMapAccess {\n            iter: self.0.iter(),\n            pending_content: None,\n            _marker: PhantomData,\n        })\n    }\n\n    fn deserialize_struct<V>(\n        self,\n        _: &'static str,\n        fields: &'static [&'static str],\n        visitor: V,\n    ) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>,\n    {\n        visitor.visit_map(FlatStructAccess {\n            iter: self.0.iter_mut(),\n            pending_content: None,\n            fields,\n            _marker: PhantomData,\n        })\n    }\n\n    fn deserialize_newtype_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>,\n    {\n        visitor.visit_newtype_struct(self)\n    }\n\n    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>,\n    {\n        match visitor.__private_visit_untagged_option(self) {\n            Ok(value) => Ok(value),\n            Err(()) => Self::deserialize_other(),\n        }\n    }\n\n    fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>,\n    {\n        visitor.visit_unit()\n    }\n\n    fn deserialize_unit_struct<V>(\n        self,\n        _name: &'static str,\n        visitor: V,\n    ) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>,\n    {\n        visitor.visit_unit()\n    }\n\n    fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>,\n    {\n        visitor.visit_unit()\n    }\n\n    forward_to_deserialize_other! {\n        deserialize_bool()\n        deserialize_i8()\n        deserialize_i16()\n        deserialize_i32()\n        deserialize_i64()\n        deserialize_u8()\n        deserialize_u16()\n        deserialize_u32()\n        deserialize_u64()\n        deserialize_f32()\n        deserialize_f64()\n        deserialize_char()\n        deserialize_str()\n        deserialize_string()\n        deserialize_bytes()\n        deserialize_byte_buf()\n        deserialize_seq()\n        deserialize_tuple(usize)\n        deserialize_tuple_struct(&'static str, usize)\n        deserialize_identifier()\n    }\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nstruct FlatMapAccess<'a, 'de: 'a, E> {\n    iter: slice::Iter<'a, Option<(Content<'de>, Content<'de>)>>,\n    pending_content: Option<&'a Content<'de>>,\n    _marker: PhantomData<E>,\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\n#[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\nimpl<'a, 'de, E> MapAccess<'de> for FlatMapAccess<'a, 'de, E>\nwhere\n    E: Error,\n{\n    type Error = E;\n\n    fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>\n    where\n        T: DeserializeSeed<'de>,\n    {\n        for item in &mut self.iter {\n            // Items in the vector are nulled out when used by a struct.\n            if let Some((ref key, ref content)) = *item {\n                // Do not take(), instead borrow this entry. The internally tagged\n                // enum does its own buffering so we can't tell whether this entry\n                // is going to be consumed. Borrowing here leaves the entry\n                // available for later flattened fields.\n                self.pending_content = Some(content);\n                return seed.deserialize(ContentRefDeserializer::new(key)).map(Some);\n            }\n        }\n        Ok(None)\n    }\n\n    fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error>\n    where\n        T: DeserializeSeed<'de>,\n    {\n        match self.pending_content.take() {\n            Some(value) => seed.deserialize(ContentRefDeserializer::new(value)),\n            None => Err(Error::custom(\"value is missing\")),\n        }\n    }\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nstruct FlatStructAccess<'a, 'de: 'a, E> {\n    iter: slice::IterMut<'a, Option<(Content<'de>, Content<'de>)>>,\n    pending_content: Option<Content<'de>>,\n    fields: &'static [&'static str],\n    _marker: PhantomData<E>,\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\n#[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\nimpl<'a, 'de, E> MapAccess<'de> for FlatStructAccess<'a, 'de, E>\nwhere\n    E: Error,\n{\n    type Error = E;\n\n    fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>\n    where\n        T: DeserializeSeed<'de>,\n    {\n        for entry in self.iter.by_ref() {\n            if let Some((key, content)) = flat_map_take_entry(entry, self.fields) {\n                self.pending_content = Some(content);\n                return seed.deserialize(ContentDeserializer::new(key)).map(Some);\n            }\n        }\n        Ok(None)\n    }\n\n    fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error>\n    where\n        T: DeserializeSeed<'de>,\n    {\n        match self.pending_content.take() {\n            Some(value) => seed.deserialize(ContentDeserializer::new(value)),\n            None => Err(Error::custom(\"value is missing\")),\n        }\n    }\n}\n\n/// Claims one key-value pair from a FlatMapDeserializer's field buffer if the\n/// field name matches any of the recognized ones.\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nfn flat_map_take_entry<'de>(\n    entry: &mut Option<(Content<'de>, Content<'de>)>,\n    recognized: &[&str],\n) -> Option<(Content<'de>, Content<'de>)> {\n    // Entries in the FlatMapDeserializer buffer are nulled out as they get\n    // claimed for deserialization. We only use an entry if it is still present\n    // and if the field is one recognized by the current data structure.\n    let is_recognized = match entry {\n        None => false,\n        Some((k, _v)) => content_as_str(k).map_or(false, |name| recognized.contains(&name)),\n    };\n\n    if is_recognized {\n        entry.take()\n    } else {\n        None\n    }\n}\n\npub struct AdjacentlyTaggedEnumVariantSeed<F> {\n    pub enum_name: &'static str,\n    pub variants: &'static [&'static str],\n    pub fields_enum: PhantomData<F>,\n}\n\npub struct AdjacentlyTaggedEnumVariantVisitor<F> {\n    enum_name: &'static str,\n    fields_enum: PhantomData<F>,\n}\n\n#[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\nimpl<'de, F> Visitor<'de> for AdjacentlyTaggedEnumVariantVisitor<F>\nwhere\n    F: Deserialize<'de>,\n{\n    type Value = F;\n\n    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        write!(formatter, \"variant of enum {}\", self.enum_name)\n    }\n\n    fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error>\n    where\n        A: EnumAccess<'de>,\n    {\n        let (variant, variant_access) = tri!(data.variant());\n        tri!(variant_access.unit_variant());\n        Ok(variant)\n    }\n}\n\n#[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\nimpl<'de, F> DeserializeSeed<'de> for AdjacentlyTaggedEnumVariantSeed<F>\nwhere\n    F: Deserialize<'de>,\n{\n    type Value = F;\n\n    fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        deserializer.deserialize_enum(\n            self.enum_name,\n            self.variants,\n            AdjacentlyTaggedEnumVariantVisitor {\n                enum_name: self.enum_name,\n                fields_enum: PhantomData,\n            },\n        )\n    }\n}\n"
  },
  {
    "path": "serde/src/private/mod.rs",
    "content": "#[cfg(not(no_serde_derive))]\npub mod de;\n#[cfg(not(no_serde_derive))]\npub mod ser;\n\npub use crate::lib::clone::Clone;\npub use crate::lib::convert::{From, Into, TryFrom};\npub use crate::lib::default::Default;\npub use crate::lib::fmt::{self, Formatter};\npub use crate::lib::marker::PhantomData;\npub use crate::lib::option::Option::{self, None, Some};\npub use crate::lib::ptr;\npub use crate::lib::result::Result::{self, Err, Ok};\n\npub use crate::serde_core_private::string::from_utf8_lossy;\n\n#[cfg(any(feature = \"alloc\", feature = \"std\"))]\npub use crate::lib::{ToString, Vec};\n"
  },
  {
    "path": "serde/src/private/ser.rs",
    "content": "use crate::lib::*;\n\nuse crate::ser::{self, Impossible, Serialize, SerializeMap, SerializeStruct, Serializer};\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nuse self::content::{\n    Content, ContentSerializer, SerializeStructVariantAsMapValue, SerializeTupleVariantAsMapValue,\n};\n\n/// Used to check that serde(getter) attributes return the expected type.\n/// Not public API.\npub fn constrain<T: ?Sized>(t: &T) -> &T {\n    t\n}\n\n/// Not public API.\npub fn serialize_tagged_newtype<S, T>(\n    serializer: S,\n    type_ident: &'static str,\n    variant_ident: &'static str,\n    tag: &'static str,\n    variant_name: &'static str,\n    value: &T,\n) -> Result<S::Ok, S::Error>\nwhere\n    S: Serializer,\n    T: Serialize,\n{\n    value.serialize(TaggedSerializer {\n        type_ident,\n        variant_ident,\n        tag,\n        variant_name,\n        delegate: serializer,\n    })\n}\n\nstruct TaggedSerializer<S> {\n    type_ident: &'static str,\n    variant_ident: &'static str,\n    tag: &'static str,\n    variant_name: &'static str,\n    delegate: S,\n}\n\nenum Unsupported {\n    Boolean,\n    Integer,\n    Float,\n    Char,\n    String,\n    ByteArray,\n    Optional,\n    Sequence,\n    Tuple,\n    TupleStruct,\n    #[cfg(not(any(feature = \"std\", feature = \"alloc\")))]\n    Enum,\n}\n\n#[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\nimpl Display for Unsupported {\n    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        match *self {\n            Unsupported::Boolean => formatter.write_str(\"a boolean\"),\n            Unsupported::Integer => formatter.write_str(\"an integer\"),\n            Unsupported::Float => formatter.write_str(\"a float\"),\n            Unsupported::Char => formatter.write_str(\"a char\"),\n            Unsupported::String => formatter.write_str(\"a string\"),\n            Unsupported::ByteArray => formatter.write_str(\"a byte array\"),\n            Unsupported::Optional => formatter.write_str(\"an optional\"),\n            Unsupported::Sequence => formatter.write_str(\"a sequence\"),\n            Unsupported::Tuple => formatter.write_str(\"a tuple\"),\n            Unsupported::TupleStruct => formatter.write_str(\"a tuple struct\"),\n            #[cfg(not(any(feature = \"std\", feature = \"alloc\")))]\n            Unsupported::Enum => formatter.write_str(\"an enum\"),\n        }\n    }\n}\n\nimpl<S> TaggedSerializer<S>\nwhere\n    S: Serializer,\n{\n    fn bad_type(self, what: Unsupported) -> S::Error {\n        ser::Error::custom(format_args!(\n            \"cannot serialize tagged newtype variant {}::{} containing {}\",\n            self.type_ident, self.variant_ident, what\n        ))\n    }\n}\n\n#[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\nimpl<S> Serializer for TaggedSerializer<S>\nwhere\n    S: Serializer,\n{\n    type Ok = S::Ok;\n    type Error = S::Error;\n\n    type SerializeSeq = Impossible<S::Ok, S::Error>;\n    type SerializeTuple = Impossible<S::Ok, S::Error>;\n    type SerializeTupleStruct = Impossible<S::Ok, S::Error>;\n    type SerializeMap = S::SerializeMap;\n    type SerializeStruct = S::SerializeStruct;\n\n    #[cfg(not(any(feature = \"std\", feature = \"alloc\")))]\n    type SerializeTupleVariant = Impossible<S::Ok, S::Error>;\n    #[cfg(any(feature = \"std\", feature = \"alloc\"))]\n    type SerializeTupleVariant = SerializeTupleVariantAsMapValue<S::SerializeMap>;\n\n    #[cfg(not(any(feature = \"std\", feature = \"alloc\")))]\n    type SerializeStructVariant = Impossible<S::Ok, S::Error>;\n    #[cfg(any(feature = \"std\", feature = \"alloc\"))]\n    type SerializeStructVariant = SerializeStructVariantAsMapValue<S::SerializeMap>;\n\n    fn serialize_bool(self, _: bool) -> Result<Self::Ok, Self::Error> {\n        Err(self.bad_type(Unsupported::Boolean))\n    }\n\n    fn serialize_i8(self, _: i8) -> Result<Self::Ok, Self::Error> {\n        Err(self.bad_type(Unsupported::Integer))\n    }\n\n    fn serialize_i16(self, _: i16) -> Result<Self::Ok, Self::Error> {\n        Err(self.bad_type(Unsupported::Integer))\n    }\n\n    fn serialize_i32(self, _: i32) -> Result<Self::Ok, Self::Error> {\n        Err(self.bad_type(Unsupported::Integer))\n    }\n\n    fn serialize_i64(self, _: i64) -> Result<Self::Ok, Self::Error> {\n        Err(self.bad_type(Unsupported::Integer))\n    }\n\n    fn serialize_u8(self, _: u8) -> Result<Self::Ok, Self::Error> {\n        Err(self.bad_type(Unsupported::Integer))\n    }\n\n    fn serialize_u16(self, _: u16) -> Result<Self::Ok, Self::Error> {\n        Err(self.bad_type(Unsupported::Integer))\n    }\n\n    fn serialize_u32(self, _: u32) -> Result<Self::Ok, Self::Error> {\n        Err(self.bad_type(Unsupported::Integer))\n    }\n\n    fn serialize_u64(self, _: u64) -> Result<Self::Ok, Self::Error> {\n        Err(self.bad_type(Unsupported::Integer))\n    }\n\n    fn serialize_f32(self, _: f32) -> Result<Self::Ok, Self::Error> {\n        Err(self.bad_type(Unsupported::Float))\n    }\n\n    fn serialize_f64(self, _: f64) -> Result<Self::Ok, Self::Error> {\n        Err(self.bad_type(Unsupported::Float))\n    }\n\n    fn serialize_char(self, _: char) -> Result<Self::Ok, Self::Error> {\n        Err(self.bad_type(Unsupported::Char))\n    }\n\n    fn serialize_str(self, _: &str) -> Result<Self::Ok, Self::Error> {\n        Err(self.bad_type(Unsupported::String))\n    }\n\n    fn serialize_bytes(self, _: &[u8]) -> Result<Self::Ok, Self::Error> {\n        Err(self.bad_type(Unsupported::ByteArray))\n    }\n\n    fn serialize_none(self) -> Result<Self::Ok, Self::Error> {\n        Err(self.bad_type(Unsupported::Optional))\n    }\n\n    fn serialize_some<T>(self, _: &T) -> Result<Self::Ok, Self::Error>\n    where\n        T: ?Sized + Serialize,\n    {\n        Err(self.bad_type(Unsupported::Optional))\n    }\n\n    fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {\n        let mut map = tri!(self.delegate.serialize_map(Some(1)));\n        tri!(map.serialize_entry(self.tag, self.variant_name));\n        map.end()\n    }\n\n    fn serialize_unit_struct(self, _: &'static str) -> Result<Self::Ok, Self::Error> {\n        let mut map = tri!(self.delegate.serialize_map(Some(1)));\n        tri!(map.serialize_entry(self.tag, self.variant_name));\n        map.end()\n    }\n\n    fn serialize_unit_variant(\n        self,\n        _: &'static str,\n        _: u32,\n        inner_variant: &'static str,\n    ) -> Result<Self::Ok, Self::Error> {\n        let mut map = tri!(self.delegate.serialize_map(Some(2)));\n        tri!(map.serialize_entry(self.tag, self.variant_name));\n        tri!(map.serialize_entry(inner_variant, &()));\n        map.end()\n    }\n\n    fn serialize_newtype_struct<T>(\n        self,\n        _: &'static str,\n        value: &T,\n    ) -> Result<Self::Ok, Self::Error>\n    where\n        T: ?Sized + Serialize,\n    {\n        value.serialize(self)\n    }\n\n    fn serialize_newtype_variant<T>(\n        self,\n        _: &'static str,\n        _: u32,\n        inner_variant: &'static str,\n        inner_value: &T,\n    ) -> Result<Self::Ok, Self::Error>\n    where\n        T: ?Sized + Serialize,\n    {\n        let mut map = tri!(self.delegate.serialize_map(Some(2)));\n        tri!(map.serialize_entry(self.tag, self.variant_name));\n        tri!(map.serialize_entry(inner_variant, inner_value));\n        map.end()\n    }\n\n    fn serialize_seq(self, _: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {\n        Err(self.bad_type(Unsupported::Sequence))\n    }\n\n    fn serialize_tuple(self, _: usize) -> Result<Self::SerializeTuple, Self::Error> {\n        Err(self.bad_type(Unsupported::Tuple))\n    }\n\n    fn serialize_tuple_struct(\n        self,\n        _: &'static str,\n        _: usize,\n    ) -> Result<Self::SerializeTupleStruct, Self::Error> {\n        Err(self.bad_type(Unsupported::TupleStruct))\n    }\n\n    #[cfg(not(any(feature = \"std\", feature = \"alloc\")))]\n    fn serialize_tuple_variant(\n        self,\n        _: &'static str,\n        _: u32,\n        _: &'static str,\n        _: usize,\n    ) -> Result<Self::SerializeTupleVariant, Self::Error> {\n        // Lack of push-based serialization means we need to buffer the content\n        // of the tuple variant, so it requires std.\n        Err(self.bad_type(Unsupported::Enum))\n    }\n\n    #[cfg(any(feature = \"std\", feature = \"alloc\"))]\n    fn serialize_tuple_variant(\n        self,\n        _: &'static str,\n        _: u32,\n        inner_variant: &'static str,\n        len: usize,\n    ) -> Result<Self::SerializeTupleVariant, Self::Error> {\n        let mut map = tri!(self.delegate.serialize_map(Some(2)));\n        tri!(map.serialize_entry(self.tag, self.variant_name));\n        tri!(map.serialize_key(inner_variant));\n        Ok(SerializeTupleVariantAsMapValue::new(\n            map,\n            inner_variant,\n            len,\n        ))\n    }\n\n    fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {\n        let mut map = tri!(self.delegate.serialize_map(len.map(|len| len + 1)));\n        tri!(map.serialize_entry(self.tag, self.variant_name));\n        Ok(map)\n    }\n\n    fn serialize_struct(\n        self,\n        name: &'static str,\n        len: usize,\n    ) -> Result<Self::SerializeStruct, Self::Error> {\n        let mut state = tri!(self.delegate.serialize_struct(name, len + 1));\n        tri!(state.serialize_field(self.tag, self.variant_name));\n        Ok(state)\n    }\n\n    #[cfg(not(any(feature = \"std\", feature = \"alloc\")))]\n    fn serialize_struct_variant(\n        self,\n        _: &'static str,\n        _: u32,\n        _: &'static str,\n        _: usize,\n    ) -> Result<Self::SerializeStructVariant, Self::Error> {\n        // Lack of push-based serialization means we need to buffer the content\n        // of the struct variant, so it requires std.\n        Err(self.bad_type(Unsupported::Enum))\n    }\n\n    #[cfg(any(feature = \"std\", feature = \"alloc\"))]\n    fn serialize_struct_variant(\n        self,\n        _: &'static str,\n        _: u32,\n        inner_variant: &'static str,\n        len: usize,\n    ) -> Result<Self::SerializeStructVariant, Self::Error> {\n        let mut map = tri!(self.delegate.serialize_map(Some(2)));\n        tri!(map.serialize_entry(self.tag, self.variant_name));\n        tri!(map.serialize_key(inner_variant));\n        Ok(SerializeStructVariantAsMapValue::new(\n            map,\n            inner_variant,\n            len,\n        ))\n    }\n\n    #[cfg(not(any(feature = \"std\", feature = \"alloc\")))]\n    fn collect_str<T>(self, _: &T) -> Result<Self::Ok, Self::Error>\n    where\n        T: ?Sized + Display,\n    {\n        Err(self.bad_type(Unsupported::String))\n    }\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nmod content {\n    use crate::lib::*;\n\n    use crate::ser::{self, Serialize, Serializer};\n\n    pub struct SerializeTupleVariantAsMapValue<M> {\n        map: M,\n        name: &'static str,\n        fields: Vec<Content>,\n    }\n\n    impl<M> SerializeTupleVariantAsMapValue<M> {\n        pub fn new(map: M, name: &'static str, len: usize) -> Self {\n            SerializeTupleVariantAsMapValue {\n                map,\n                name,\n                fields: Vec::with_capacity(len),\n            }\n        }\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<M> ser::SerializeTupleVariant for SerializeTupleVariantAsMapValue<M>\n    where\n        M: ser::SerializeMap,\n    {\n        type Ok = M::Ok;\n        type Error = M::Error;\n\n        fn serialize_field<T>(&mut self, value: &T) -> Result<(), M::Error>\n        where\n            T: ?Sized + Serialize,\n        {\n            let value = tri!(value.serialize(ContentSerializer::<M::Error>::new()));\n            self.fields.push(value);\n            Ok(())\n        }\n\n        fn end(mut self) -> Result<M::Ok, M::Error> {\n            tri!(self\n                .map\n                .serialize_value(&Content::TupleStruct(self.name, self.fields)));\n            self.map.end()\n        }\n    }\n\n    pub struct SerializeStructVariantAsMapValue<M> {\n        map: M,\n        name: &'static str,\n        fields: Vec<(&'static str, Content)>,\n    }\n\n    impl<M> SerializeStructVariantAsMapValue<M> {\n        pub fn new(map: M, name: &'static str, len: usize) -> Self {\n            SerializeStructVariantAsMapValue {\n                map,\n                name,\n                fields: Vec::with_capacity(len),\n            }\n        }\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<M> ser::SerializeStructVariant for SerializeStructVariantAsMapValue<M>\n    where\n        M: ser::SerializeMap,\n    {\n        type Ok = M::Ok;\n        type Error = M::Error;\n\n        fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), M::Error>\n        where\n            T: ?Sized + Serialize,\n        {\n            let value = tri!(value.serialize(ContentSerializer::<M::Error>::new()));\n            self.fields.push((key, value));\n            Ok(())\n        }\n\n        fn end(mut self) -> Result<M::Ok, M::Error> {\n            tri!(self\n                .map\n                .serialize_value(&Content::Struct(self.name, self.fields)));\n            self.map.end()\n        }\n    }\n\n    pub enum Content {\n        Bool(bool),\n\n        U8(u8),\n        U16(u16),\n        U32(u32),\n        U64(u64),\n\n        I8(i8),\n        I16(i16),\n        I32(i32),\n        I64(i64),\n\n        F32(f32),\n        F64(f64),\n\n        Char(char),\n        String(String),\n        Bytes(Vec<u8>),\n\n        None,\n        Some(Box<Content>),\n\n        Unit,\n        UnitStruct(&'static str),\n        UnitVariant(&'static str, u32, &'static str),\n        NewtypeStruct(&'static str, Box<Content>),\n        NewtypeVariant(&'static str, u32, &'static str, Box<Content>),\n\n        Seq(Vec<Content>),\n        Tuple(Vec<Content>),\n        TupleStruct(&'static str, Vec<Content>),\n        TupleVariant(&'static str, u32, &'static str, Vec<Content>),\n        Map(Vec<(Content, Content)>),\n        Struct(&'static str, Vec<(&'static str, Content)>),\n        StructVariant(\n            &'static str,\n            u32,\n            &'static str,\n            Vec<(&'static str, Content)>,\n        ),\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl Serialize for Content {\n        fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n        where\n            S: Serializer,\n        {\n            match *self {\n                Content::Bool(b) => serializer.serialize_bool(b),\n                Content::U8(u) => serializer.serialize_u8(u),\n                Content::U16(u) => serializer.serialize_u16(u),\n                Content::U32(u) => serializer.serialize_u32(u),\n                Content::U64(u) => serializer.serialize_u64(u),\n                Content::I8(i) => serializer.serialize_i8(i),\n                Content::I16(i) => serializer.serialize_i16(i),\n                Content::I32(i) => serializer.serialize_i32(i),\n                Content::I64(i) => serializer.serialize_i64(i),\n                Content::F32(f) => serializer.serialize_f32(f),\n                Content::F64(f) => serializer.serialize_f64(f),\n                Content::Char(c) => serializer.serialize_char(c),\n                Content::String(ref s) => serializer.serialize_str(s),\n                Content::Bytes(ref b) => serializer.serialize_bytes(b),\n                Content::None => serializer.serialize_none(),\n                Content::Some(ref c) => serializer.serialize_some(&**c),\n                Content::Unit => serializer.serialize_unit(),\n                Content::UnitStruct(n) => serializer.serialize_unit_struct(n),\n                Content::UnitVariant(n, i, v) => serializer.serialize_unit_variant(n, i, v),\n                Content::NewtypeStruct(n, ref c) => serializer.serialize_newtype_struct(n, &**c),\n                Content::NewtypeVariant(n, i, v, ref c) => {\n                    serializer.serialize_newtype_variant(n, i, v, &**c)\n                }\n                Content::Seq(ref elements) => elements.serialize(serializer),\n                Content::Tuple(ref elements) => {\n                    use crate::ser::SerializeTuple;\n                    let mut tuple = tri!(serializer.serialize_tuple(elements.len()));\n                    for e in elements {\n                        tri!(tuple.serialize_element(e));\n                    }\n                    tuple.end()\n                }\n                Content::TupleStruct(n, ref fields) => {\n                    use crate::ser::SerializeTupleStruct;\n                    let mut ts = tri!(serializer.serialize_tuple_struct(n, fields.len()));\n                    for f in fields {\n                        tri!(ts.serialize_field(f));\n                    }\n                    ts.end()\n                }\n                Content::TupleVariant(n, i, v, ref fields) => {\n                    use crate::ser::SerializeTupleVariant;\n                    let mut tv = tri!(serializer.serialize_tuple_variant(n, i, v, fields.len()));\n                    for f in fields {\n                        tri!(tv.serialize_field(f));\n                    }\n                    tv.end()\n                }\n                Content::Map(ref entries) => {\n                    use crate::ser::SerializeMap;\n                    let mut map = tri!(serializer.serialize_map(Some(entries.len())));\n                    for (k, v) in entries {\n                        tri!(map.serialize_entry(k, v));\n                    }\n                    map.end()\n                }\n                Content::Struct(n, ref fields) => {\n                    use crate::ser::SerializeStruct;\n                    let mut s = tri!(serializer.serialize_struct(n, fields.len()));\n                    for &(k, ref v) in fields {\n                        tri!(s.serialize_field(k, v));\n                    }\n                    s.end()\n                }\n                Content::StructVariant(n, i, v, ref fields) => {\n                    use crate::ser::SerializeStructVariant;\n                    let mut sv = tri!(serializer.serialize_struct_variant(n, i, v, fields.len()));\n                    for &(k, ref v) in fields {\n                        tri!(sv.serialize_field(k, v));\n                    }\n                    sv.end()\n                }\n            }\n        }\n    }\n\n    pub struct ContentSerializer<E> {\n        error: PhantomData<E>,\n    }\n\n    impl<E> ContentSerializer<E> {\n        pub fn new() -> Self {\n            ContentSerializer { error: PhantomData }\n        }\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<E> Serializer for ContentSerializer<E>\n    where\n        E: ser::Error,\n    {\n        type Ok = Content;\n        type Error = E;\n\n        type SerializeSeq = SerializeSeq<E>;\n        type SerializeTuple = SerializeTuple<E>;\n        type SerializeTupleStruct = SerializeTupleStruct<E>;\n        type SerializeTupleVariant = SerializeTupleVariant<E>;\n        type SerializeMap = SerializeMap<E>;\n        type SerializeStruct = SerializeStruct<E>;\n        type SerializeStructVariant = SerializeStructVariant<E>;\n\n        fn serialize_bool(self, v: bool) -> Result<Content, E> {\n            Ok(Content::Bool(v))\n        }\n\n        fn serialize_i8(self, v: i8) -> Result<Content, E> {\n            Ok(Content::I8(v))\n        }\n\n        fn serialize_i16(self, v: i16) -> Result<Content, E> {\n            Ok(Content::I16(v))\n        }\n\n        fn serialize_i32(self, v: i32) -> Result<Content, E> {\n            Ok(Content::I32(v))\n        }\n\n        fn serialize_i64(self, v: i64) -> Result<Content, E> {\n            Ok(Content::I64(v))\n        }\n\n        fn serialize_u8(self, v: u8) -> Result<Content, E> {\n            Ok(Content::U8(v))\n        }\n\n        fn serialize_u16(self, v: u16) -> Result<Content, E> {\n            Ok(Content::U16(v))\n        }\n\n        fn serialize_u32(self, v: u32) -> Result<Content, E> {\n            Ok(Content::U32(v))\n        }\n\n        fn serialize_u64(self, v: u64) -> Result<Content, E> {\n            Ok(Content::U64(v))\n        }\n\n        fn serialize_f32(self, v: f32) -> Result<Content, E> {\n            Ok(Content::F32(v))\n        }\n\n        fn serialize_f64(self, v: f64) -> Result<Content, E> {\n            Ok(Content::F64(v))\n        }\n\n        fn serialize_char(self, v: char) -> Result<Content, E> {\n            Ok(Content::Char(v))\n        }\n\n        fn serialize_str(self, value: &str) -> Result<Content, E> {\n            Ok(Content::String(value.to_owned()))\n        }\n\n        fn serialize_bytes(self, value: &[u8]) -> Result<Content, E> {\n            Ok(Content::Bytes(value.to_owned()))\n        }\n\n        fn serialize_none(self) -> Result<Content, E> {\n            Ok(Content::None)\n        }\n\n        fn serialize_some<T>(self, value: &T) -> Result<Content, E>\n        where\n            T: ?Sized + Serialize,\n        {\n            Ok(Content::Some(Box::new(tri!(value.serialize(self)))))\n        }\n\n        fn serialize_unit(self) -> Result<Content, E> {\n            Ok(Content::Unit)\n        }\n\n        fn serialize_unit_struct(self, name: &'static str) -> Result<Content, E> {\n            Ok(Content::UnitStruct(name))\n        }\n\n        fn serialize_unit_variant(\n            self,\n            name: &'static str,\n            variant_index: u32,\n            variant: &'static str,\n        ) -> Result<Content, E> {\n            Ok(Content::UnitVariant(name, variant_index, variant))\n        }\n\n        fn serialize_newtype_struct<T>(self, name: &'static str, value: &T) -> Result<Content, E>\n        where\n            T: ?Sized + Serialize,\n        {\n            Ok(Content::NewtypeStruct(\n                name,\n                Box::new(tri!(value.serialize(self))),\n            ))\n        }\n\n        fn serialize_newtype_variant<T>(\n            self,\n            name: &'static str,\n            variant_index: u32,\n            variant: &'static str,\n            value: &T,\n        ) -> Result<Content, E>\n        where\n            T: ?Sized + Serialize,\n        {\n            Ok(Content::NewtypeVariant(\n                name,\n                variant_index,\n                variant,\n                Box::new(tri!(value.serialize(self))),\n            ))\n        }\n\n        fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, E> {\n            Ok(SerializeSeq {\n                elements: Vec::with_capacity(len.unwrap_or(0)),\n                error: PhantomData,\n            })\n        }\n\n        fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, E> {\n            Ok(SerializeTuple {\n                elements: Vec::with_capacity(len),\n                error: PhantomData,\n            })\n        }\n\n        fn serialize_tuple_struct(\n            self,\n            name: &'static str,\n            len: usize,\n        ) -> Result<Self::SerializeTupleStruct, E> {\n            Ok(SerializeTupleStruct {\n                name,\n                fields: Vec::with_capacity(len),\n                error: PhantomData,\n            })\n        }\n\n        fn serialize_tuple_variant(\n            self,\n            name: &'static str,\n            variant_index: u32,\n            variant: &'static str,\n            len: usize,\n        ) -> Result<Self::SerializeTupleVariant, E> {\n            Ok(SerializeTupleVariant {\n                name,\n                variant_index,\n                variant,\n                fields: Vec::with_capacity(len),\n                error: PhantomData,\n            })\n        }\n\n        fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, E> {\n            Ok(SerializeMap {\n                entries: Vec::with_capacity(len.unwrap_or(0)),\n                key: None,\n                error: PhantomData,\n            })\n        }\n\n        fn serialize_struct(\n            self,\n            name: &'static str,\n            len: usize,\n        ) -> Result<Self::SerializeStruct, E> {\n            Ok(SerializeStruct {\n                name,\n                fields: Vec::with_capacity(len),\n                error: PhantomData,\n            })\n        }\n\n        fn serialize_struct_variant(\n            self,\n            name: &'static str,\n            variant_index: u32,\n            variant: &'static str,\n            len: usize,\n        ) -> Result<Self::SerializeStructVariant, E> {\n            Ok(SerializeStructVariant {\n                name,\n                variant_index,\n                variant,\n                fields: Vec::with_capacity(len),\n                error: PhantomData,\n            })\n        }\n    }\n\n    pub struct SerializeSeq<E> {\n        elements: Vec<Content>,\n        error: PhantomData<E>,\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<E> ser::SerializeSeq for SerializeSeq<E>\n    where\n        E: ser::Error,\n    {\n        type Ok = Content;\n        type Error = E;\n\n        fn serialize_element<T>(&mut self, value: &T) -> Result<(), E>\n        where\n            T: ?Sized + Serialize,\n        {\n            let value = tri!(value.serialize(ContentSerializer::<E>::new()));\n            self.elements.push(value);\n            Ok(())\n        }\n\n        fn end(self) -> Result<Content, E> {\n            Ok(Content::Seq(self.elements))\n        }\n    }\n\n    pub struct SerializeTuple<E> {\n        elements: Vec<Content>,\n        error: PhantomData<E>,\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<E> ser::SerializeTuple for SerializeTuple<E>\n    where\n        E: ser::Error,\n    {\n        type Ok = Content;\n        type Error = E;\n\n        fn serialize_element<T>(&mut self, value: &T) -> Result<(), E>\n        where\n            T: ?Sized + Serialize,\n        {\n            let value = tri!(value.serialize(ContentSerializer::<E>::new()));\n            self.elements.push(value);\n            Ok(())\n        }\n\n        fn end(self) -> Result<Content, E> {\n            Ok(Content::Tuple(self.elements))\n        }\n    }\n\n    pub struct SerializeTupleStruct<E> {\n        name: &'static str,\n        fields: Vec<Content>,\n        error: PhantomData<E>,\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<E> ser::SerializeTupleStruct for SerializeTupleStruct<E>\n    where\n        E: ser::Error,\n    {\n        type Ok = Content;\n        type Error = E;\n\n        fn serialize_field<T>(&mut self, value: &T) -> Result<(), E>\n        where\n            T: ?Sized + Serialize,\n        {\n            let value = tri!(value.serialize(ContentSerializer::<E>::new()));\n            self.fields.push(value);\n            Ok(())\n        }\n\n        fn end(self) -> Result<Content, E> {\n            Ok(Content::TupleStruct(self.name, self.fields))\n        }\n    }\n\n    pub struct SerializeTupleVariant<E> {\n        name: &'static str,\n        variant_index: u32,\n        variant: &'static str,\n        fields: Vec<Content>,\n        error: PhantomData<E>,\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<E> ser::SerializeTupleVariant for SerializeTupleVariant<E>\n    where\n        E: ser::Error,\n    {\n        type Ok = Content;\n        type Error = E;\n\n        fn serialize_field<T>(&mut self, value: &T) -> Result<(), E>\n        where\n            T: ?Sized + Serialize,\n        {\n            let value = tri!(value.serialize(ContentSerializer::<E>::new()));\n            self.fields.push(value);\n            Ok(())\n        }\n\n        fn end(self) -> Result<Content, E> {\n            Ok(Content::TupleVariant(\n                self.name,\n                self.variant_index,\n                self.variant,\n                self.fields,\n            ))\n        }\n    }\n\n    pub struct SerializeMap<E> {\n        entries: Vec<(Content, Content)>,\n        key: Option<Content>,\n        error: PhantomData<E>,\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<E> ser::SerializeMap for SerializeMap<E>\n    where\n        E: ser::Error,\n    {\n        type Ok = Content;\n        type Error = E;\n\n        fn serialize_key<T>(&mut self, key: &T) -> Result<(), E>\n        where\n            T: ?Sized + Serialize,\n        {\n            let key = tri!(key.serialize(ContentSerializer::<E>::new()));\n            self.key = Some(key);\n            Ok(())\n        }\n\n        fn serialize_value<T>(&mut self, value: &T) -> Result<(), E>\n        where\n            T: ?Sized + Serialize,\n        {\n            let key = self\n                .key\n                .take()\n                .expect(\"serialize_value called before serialize_key\");\n            let value = tri!(value.serialize(ContentSerializer::<E>::new()));\n            self.entries.push((key, value));\n            Ok(())\n        }\n\n        fn end(self) -> Result<Content, E> {\n            Ok(Content::Map(self.entries))\n        }\n\n        fn serialize_entry<K, V>(&mut self, key: &K, value: &V) -> Result<(), E>\n        where\n            K: ?Sized + Serialize,\n            V: ?Sized + Serialize,\n        {\n            let key = tri!(key.serialize(ContentSerializer::<E>::new()));\n            let value = tri!(value.serialize(ContentSerializer::<E>::new()));\n            self.entries.push((key, value));\n            Ok(())\n        }\n    }\n\n    pub struct SerializeStruct<E> {\n        name: &'static str,\n        fields: Vec<(&'static str, Content)>,\n        error: PhantomData<E>,\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<E> ser::SerializeStruct for SerializeStruct<E>\n    where\n        E: ser::Error,\n    {\n        type Ok = Content;\n        type Error = E;\n\n        fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), E>\n        where\n            T: ?Sized + Serialize,\n        {\n            let value = tri!(value.serialize(ContentSerializer::<E>::new()));\n            self.fields.push((key, value));\n            Ok(())\n        }\n\n        fn end(self) -> Result<Content, E> {\n            Ok(Content::Struct(self.name, self.fields))\n        }\n    }\n\n    pub struct SerializeStructVariant<E> {\n        name: &'static str,\n        variant_index: u32,\n        variant: &'static str,\n        fields: Vec<(&'static str, Content)>,\n        error: PhantomData<E>,\n    }\n\n    #[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\n    impl<E> ser::SerializeStructVariant for SerializeStructVariant<E>\n    where\n        E: ser::Error,\n    {\n        type Ok = Content;\n        type Error = E;\n\n        fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), E>\n        where\n            T: ?Sized + Serialize,\n        {\n            let value = tri!(value.serialize(ContentSerializer::<E>::new()));\n            self.fields.push((key, value));\n            Ok(())\n        }\n\n        fn end(self) -> Result<Content, E> {\n            Ok(Content::StructVariant(\n                self.name,\n                self.variant_index,\n                self.variant,\n                self.fields,\n            ))\n        }\n    }\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\npub struct FlatMapSerializer<'a, M: 'a>(pub &'a mut M);\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nimpl<'a, M> FlatMapSerializer<'a, M>\nwhere\n    M: SerializeMap + 'a,\n{\n    fn bad_type(what: Unsupported) -> M::Error {\n        ser::Error::custom(format_args!(\n            \"can only flatten structs and maps (got {})\",\n            what\n        ))\n    }\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\n#[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\nimpl<'a, M> Serializer for FlatMapSerializer<'a, M>\nwhere\n    M: SerializeMap + 'a,\n{\n    type Ok = ();\n    type Error = M::Error;\n\n    type SerializeSeq = Impossible<Self::Ok, M::Error>;\n    type SerializeTuple = Impossible<Self::Ok, M::Error>;\n    type SerializeTupleStruct = Impossible<Self::Ok, M::Error>;\n    type SerializeMap = FlatMapSerializeMap<'a, M>;\n    type SerializeStruct = FlatMapSerializeStruct<'a, M>;\n    type SerializeTupleVariant = FlatMapSerializeTupleVariantAsMapValue<'a, M>;\n    type SerializeStructVariant = FlatMapSerializeStructVariantAsMapValue<'a, M>;\n\n    fn serialize_bool(self, _: bool) -> Result<Self::Ok, Self::Error> {\n        Err(Self::bad_type(Unsupported::Boolean))\n    }\n\n    fn serialize_i8(self, _: i8) -> Result<Self::Ok, Self::Error> {\n        Err(Self::bad_type(Unsupported::Integer))\n    }\n\n    fn serialize_i16(self, _: i16) -> Result<Self::Ok, Self::Error> {\n        Err(Self::bad_type(Unsupported::Integer))\n    }\n\n    fn serialize_i32(self, _: i32) -> Result<Self::Ok, Self::Error> {\n        Err(Self::bad_type(Unsupported::Integer))\n    }\n\n    fn serialize_i64(self, _: i64) -> Result<Self::Ok, Self::Error> {\n        Err(Self::bad_type(Unsupported::Integer))\n    }\n\n    fn serialize_u8(self, _: u8) -> Result<Self::Ok, Self::Error> {\n        Err(Self::bad_type(Unsupported::Integer))\n    }\n\n    fn serialize_u16(self, _: u16) -> Result<Self::Ok, Self::Error> {\n        Err(Self::bad_type(Unsupported::Integer))\n    }\n\n    fn serialize_u32(self, _: u32) -> Result<Self::Ok, Self::Error> {\n        Err(Self::bad_type(Unsupported::Integer))\n    }\n\n    fn serialize_u64(self, _: u64) -> Result<Self::Ok, Self::Error> {\n        Err(Self::bad_type(Unsupported::Integer))\n    }\n\n    fn serialize_f32(self, _: f32) -> Result<Self::Ok, Self::Error> {\n        Err(Self::bad_type(Unsupported::Float))\n    }\n\n    fn serialize_f64(self, _: f64) -> Result<Self::Ok, Self::Error> {\n        Err(Self::bad_type(Unsupported::Float))\n    }\n\n    fn serialize_char(self, _: char) -> Result<Self::Ok, Self::Error> {\n        Err(Self::bad_type(Unsupported::Char))\n    }\n\n    fn serialize_str(self, _: &str) -> Result<Self::Ok, Self::Error> {\n        Err(Self::bad_type(Unsupported::String))\n    }\n\n    fn serialize_bytes(self, _: &[u8]) -> Result<Self::Ok, Self::Error> {\n        Err(Self::bad_type(Unsupported::ByteArray))\n    }\n\n    fn serialize_none(self) -> Result<Self::Ok, Self::Error> {\n        Ok(())\n    }\n\n    fn serialize_some<T>(self, value: &T) -> Result<Self::Ok, Self::Error>\n    where\n        T: ?Sized + Serialize,\n    {\n        value.serialize(self)\n    }\n\n    fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {\n        Ok(())\n    }\n\n    fn serialize_unit_struct(self, _: &'static str) -> Result<Self::Ok, Self::Error> {\n        Ok(())\n    }\n\n    fn serialize_unit_variant(\n        self,\n        _: &'static str,\n        _: u32,\n        variant: &'static str,\n    ) -> Result<Self::Ok, Self::Error> {\n        self.0.serialize_entry(variant, &())\n    }\n\n    fn serialize_newtype_struct<T>(\n        self,\n        _: &'static str,\n        value: &T,\n    ) -> Result<Self::Ok, Self::Error>\n    where\n        T: ?Sized + Serialize,\n    {\n        value.serialize(self)\n    }\n\n    fn serialize_newtype_variant<T>(\n        self,\n        _: &'static str,\n        _: u32,\n        variant: &'static str,\n        value: &T,\n    ) -> Result<Self::Ok, Self::Error>\n    where\n        T: ?Sized + Serialize,\n    {\n        self.0.serialize_entry(variant, value)\n    }\n\n    fn serialize_seq(self, _: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {\n        Err(Self::bad_type(Unsupported::Sequence))\n    }\n\n    fn serialize_tuple(self, _: usize) -> Result<Self::SerializeTuple, Self::Error> {\n        Err(Self::bad_type(Unsupported::Tuple))\n    }\n\n    fn serialize_tuple_struct(\n        self,\n        _: &'static str,\n        _: usize,\n    ) -> Result<Self::SerializeTupleStruct, Self::Error> {\n        Err(Self::bad_type(Unsupported::TupleStruct))\n    }\n\n    fn serialize_tuple_variant(\n        self,\n        _: &'static str,\n        _: u32,\n        variant: &'static str,\n        _: usize,\n    ) -> Result<Self::SerializeTupleVariant, Self::Error> {\n        tri!(self.0.serialize_key(variant));\n        Ok(FlatMapSerializeTupleVariantAsMapValue::new(self.0))\n    }\n\n    fn serialize_map(self, _: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {\n        Ok(FlatMapSerializeMap(self.0))\n    }\n\n    fn serialize_struct(\n        self,\n        _: &'static str,\n        _: usize,\n    ) -> Result<Self::SerializeStruct, Self::Error> {\n        Ok(FlatMapSerializeStruct(self.0))\n    }\n\n    fn serialize_struct_variant(\n        self,\n        _: &'static str,\n        _: u32,\n        inner_variant: &'static str,\n        _: usize,\n    ) -> Result<Self::SerializeStructVariant, Self::Error> {\n        tri!(self.0.serialize_key(inner_variant));\n        Ok(FlatMapSerializeStructVariantAsMapValue::new(\n            self.0,\n            inner_variant,\n        ))\n    }\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\npub struct FlatMapSerializeMap<'a, M: 'a>(&'a mut M);\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\n#[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\nimpl<'a, M> ser::SerializeMap for FlatMapSerializeMap<'a, M>\nwhere\n    M: SerializeMap + 'a,\n{\n    type Ok = ();\n    type Error = M::Error;\n\n    fn serialize_key<T>(&mut self, key: &T) -> Result<(), Self::Error>\n    where\n        T: ?Sized + Serialize,\n    {\n        self.0.serialize_key(key)\n    }\n\n    fn serialize_value<T>(&mut self, value: &T) -> Result<(), Self::Error>\n    where\n        T: ?Sized + Serialize,\n    {\n        self.0.serialize_value(value)\n    }\n\n    fn serialize_entry<K, V>(&mut self, key: &K, value: &V) -> Result<(), Self::Error>\n    where\n        K: ?Sized + Serialize,\n        V: ?Sized + Serialize,\n    {\n        self.0.serialize_entry(key, value)\n    }\n\n    fn end(self) -> Result<(), Self::Error> {\n        Ok(())\n    }\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\npub struct FlatMapSerializeStruct<'a, M: 'a>(&'a mut M);\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\n#[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\nimpl<'a, M> ser::SerializeStruct for FlatMapSerializeStruct<'a, M>\nwhere\n    M: SerializeMap + 'a,\n{\n    type Ok = ();\n    type Error = M::Error;\n\n    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>\n    where\n        T: ?Sized + Serialize,\n    {\n        self.0.serialize_entry(key, value)\n    }\n\n    fn end(self) -> Result<(), Self::Error> {\n        Ok(())\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\npub struct FlatMapSerializeTupleVariantAsMapValue<'a, M: 'a> {\n    map: &'a mut M,\n    fields: Vec<Content>,\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nimpl<'a, M> FlatMapSerializeTupleVariantAsMapValue<'a, M>\nwhere\n    M: SerializeMap + 'a,\n{\n    fn new(map: &'a mut M) -> Self {\n        FlatMapSerializeTupleVariantAsMapValue {\n            map,\n            fields: Vec::new(),\n        }\n    }\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\n#[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\nimpl<'a, M> ser::SerializeTupleVariant for FlatMapSerializeTupleVariantAsMapValue<'a, M>\nwhere\n    M: SerializeMap + 'a,\n{\n    type Ok = ();\n    type Error = M::Error;\n\n    fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>\n    where\n        T: ?Sized + Serialize,\n    {\n        let value = tri!(value.serialize(ContentSerializer::<M::Error>::new()));\n        self.fields.push(value);\n        Ok(())\n    }\n\n    fn end(self) -> Result<(), Self::Error> {\n        tri!(self.map.serialize_value(&Content::Seq(self.fields)));\n        Ok(())\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\npub struct FlatMapSerializeStructVariantAsMapValue<'a, M: 'a> {\n    map: &'a mut M,\n    name: &'static str,\n    fields: Vec<(&'static str, Content)>,\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nimpl<'a, M> FlatMapSerializeStructVariantAsMapValue<'a, M>\nwhere\n    M: SerializeMap + 'a,\n{\n    fn new(map: &'a mut M, name: &'static str) -> FlatMapSerializeStructVariantAsMapValue<'a, M> {\n        FlatMapSerializeStructVariantAsMapValue {\n            map,\n            name,\n            fields: Vec::new(),\n        }\n    }\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\n#[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\nimpl<'a, M> ser::SerializeStructVariant for FlatMapSerializeStructVariantAsMapValue<'a, M>\nwhere\n    M: SerializeMap + 'a,\n{\n    type Ok = ();\n    type Error = M::Error;\n\n    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>\n    where\n        T: ?Sized + Serialize,\n    {\n        let value = tri!(value.serialize(ContentSerializer::<M::Error>::new()));\n        self.fields.push((key, value));\n        Ok(())\n    }\n\n    fn end(self) -> Result<(), Self::Error> {\n        tri!(self\n            .map\n            .serialize_value(&Content::Struct(self.name, self.fields)));\n        Ok(())\n    }\n}\n\npub struct AdjacentlyTaggedEnumVariant {\n    pub enum_name: &'static str,\n    pub variant_index: u32,\n    pub variant_name: &'static str,\n}\n\n#[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\nimpl Serialize for AdjacentlyTaggedEnumVariant {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        serializer.serialize_unit_variant(self.enum_name, self.variant_index, self.variant_name)\n    }\n}\n\n// Error when Serialize for a non_exhaustive remote enum encounters a variant\n// that is not recognized.\npub struct CannotSerializeVariant<T>(pub T);\n\n#[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\nimpl<T> Display for CannotSerializeVariant<T>\nwhere\n    T: Debug,\n{\n    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        write!(formatter, \"enum variant cannot be serialized: {:?}\", self.0)\n    }\n}\n"
  },
  {
    "path": "serde_core/Cargo.toml",
    "content": "[package]\nname = \"serde_core\"\nversion = \"1.0.228\"\nauthors = [\"Erick Tryzelaar <erick.tryzelaar@gmail.com>\", \"David Tolnay <dtolnay@gmail.com>\"]\nbuild = \"build.rs\"\ncategories = [\"encoding\", \"no-std\", \"no-std::no-alloc\"]\ndescription = \"Serde traits only, with no support for derive -- use the `serde` crate instead\"\ndocumentation = \"https://docs.rs/serde_core\"\nedition = \"2021\"\nhomepage = \"https://serde.rs\"\nkeywords = [\"serde\", \"serialization\", \"no_std\"]\nlicense = \"MIT OR Apache-2.0\"\nrepository = \"https://github.com/serde-rs/serde\"\nrust-version = \"1.56\"\n\n[dev-dependencies]\nserde = { version = \"1\", path = \"../serde\" }\nserde_derive = { version = \"1\", path = \"../serde_derive\" }\n\n[package.metadata.playground]\nfeatures = [\"rc\", \"result\"]\n\n[package.metadata.docs.rs]\nfeatures = [\"rc\", \"result\", \"unstable\"]\ntargets = [\"x86_64-unknown-linux-gnu\"]\nrustdoc-args = [\n    \"--generate-link-to-definition\",\n    \"--generate-macro-expansion\",\n    \"--extern-html-root-url=core=https://doc.rust-lang.org\",\n    \"--extern-html-root-url=alloc=https://doc.rust-lang.org\",\n    \"--extern-html-root-url=std=https://doc.rust-lang.org\",\n]\n\n# This cfg cannot be enabled, but it still forces Cargo to keep serde_derive's\n# version in lockstep with serde's, even if someone depends on the two crates\n# separately with serde's \"derive\" feature disabled. Every serde_derive release\n# is compatible with exactly one serde release because the generated code\n# involves nonpublic APIs which are not bound by semver.\n[target.'cfg(any())'.dependencies]\nserde_derive = { version = \"=1.0.228\", path = \"../serde_derive\" }\n\n\n### FEATURES #################################################################\n\n[features]\ndefault = [\"std\", \"result\"]\n\n# Provide impls for common standard library types like Vec<T> and HashMap<K, V>.\n# Requires a dependency on the Rust standard library.\nstd = []\n\n# Provide impls for types that require unstable functionality. For tracking and\n# discussion of unstable functionality please refer to this issue:\n#\n#    https://github.com/serde-rs/serde/issues/812\nunstable = []\n\n# Provide impls for types in the Rust core allocation and collections library\n# including String, Box<T>, Vec<T>, and Cow<T>. This is a subset of std but may\n# be enabled without depending on all of std.\nalloc = []\n\n# Opt into impls for Rc<T> and Arc<T>. Serializing and deserializing these types\n# does not preserve identity and may result in multiple copies of the same data.\n# Be sure that this is what you want before enabling this feature.\nrc = []\n\n# Provide impls for Result<T, E>. Convenient in some contexts but can lead to\n# confusion if ? or unwrap are used incautiously.\nresult = []\n"
  },
  {
    "path": "serde_core/README.md",
    "content": "The `serde_core` crate contains Serde's trait definitions with **no support for\n#\\[derive()\\]**.\n\nIn crates that derive an implementation of `Serialize` or `Deserialize`, you\nmust depend on the [`serde`] crate, not `serde_core`.\n\n[`serde`]: https://crates.io/crates/serde\n\nIn crates that handwrite implementations of Serde traits, or only use them as\ntrait bounds, depending on `serde_core` is permitted. But `serde` re-exports all\nof these traits and can be used for this use case too. If in doubt, disregard\n`serde_core` and always use `serde`.\n\nCrates that depend on `serde_core` instead of `serde` are able to compile in\nparallel with `serde_derive` even when `serde`'s \"derive\" feature is turned on,\nas shown in the following build timings.\n\n<br>\n\n| When `serde_json` depends on `serde` |\n|---|\n| <img src=\"https://github.com/user-attachments/assets/78dc179c-6ab1-4059-928c-1474b0d9d0bb\"> |\n\n<br>\n\n| When `serde_json` depends on `serde_core` |\n|---|\n| <img src=\"https://github.com/user-attachments/assets/6b6cff5e-3e45-4ac7-9db1-d99ee8b9f5f7\"> |\n"
  },
  {
    "path": "serde_core/build.rs",
    "content": "use std::env;\nuse std::fs;\nuse std::path::PathBuf;\nuse std::process::Command;\nuse std::str;\n\nconst PRIVATE: &str = \"\\\n#[doc(hidden)]\npub mod __private$$ {\n    #[doc(hidden)]\n    pub use crate::private::*;\n}\n\";\n\n// The rustc-cfg strings below are *not* public API. Please let us know by\n// opening a GitHub issue if your build environment requires some way to enable\n// these cfgs other than by executing our build script.\nfn main() {\n    println!(\"cargo:rerun-if-changed=build.rs\");\n\n    let out_dir = PathBuf::from(env::var_os(\"OUT_DIR\").unwrap());\n    let patch_version = env::var(\"CARGO_PKG_VERSION_PATCH\").unwrap();\n    let module = PRIVATE.replace(\"$$\", &patch_version);\n    fs::write(out_dir.join(\"private.rs\"), module).unwrap();\n\n    let minor = match rustc_minor_version() {\n        Some(minor) => minor,\n        None => return,\n    };\n\n    if minor >= 77 {\n        println!(\"cargo:rustc-check-cfg=cfg(if_docsrs_then_no_serde_core)\");\n        println!(\"cargo:rustc-check-cfg=cfg(no_core_cstr)\");\n        println!(\"cargo:rustc-check-cfg=cfg(no_core_error)\");\n        println!(\"cargo:rustc-check-cfg=cfg(no_core_net)\");\n        println!(\"cargo:rustc-check-cfg=cfg(no_core_num_saturating)\");\n        println!(\"cargo:rustc-check-cfg=cfg(no_diagnostic_namespace)\");\n        println!(\"cargo:rustc-check-cfg=cfg(no_serde_derive)\");\n        println!(\"cargo:rustc-check-cfg=cfg(no_std_atomic)\");\n        println!(\"cargo:rustc-check-cfg=cfg(no_std_atomic64)\");\n        println!(\"cargo:rustc-check-cfg=cfg(no_target_has_atomic)\");\n    }\n\n    let target = env::var(\"TARGET\").unwrap();\n    let emscripten = target == \"asmjs-unknown-emscripten\" || target == \"wasm32-unknown-emscripten\";\n\n    // Support for #[cfg(target_has_atomic = \"...\")] stabilized in Rust 1.60.\n    if minor < 60 {\n        println!(\"cargo:rustc-cfg=no_target_has_atomic\");\n        // Allowlist of archs that support std::sync::atomic module. This is\n        // based on rustc's compiler/rustc_target/src/spec/*.rs.\n        let has_atomic64 = target.starts_with(\"x86_64\")\n            || target.starts_with(\"i686\")\n            || target.starts_with(\"aarch64\")\n            || target.starts_with(\"powerpc64\")\n            || target.starts_with(\"sparc64\")\n            || target.starts_with(\"mips64el\")\n            || target.starts_with(\"riscv64\");\n        let has_atomic32 = has_atomic64 || emscripten;\n        if minor < 34 || !has_atomic64 {\n            println!(\"cargo:rustc-cfg=no_std_atomic64\");\n        }\n        if minor < 34 || !has_atomic32 {\n            println!(\"cargo:rustc-cfg=no_std_atomic\");\n        }\n    }\n\n    // Support for core::ffi::CStr and alloc::ffi::CString stabilized in Rust 1.64.\n    // https://blog.rust-lang.org/2022/09/22/Rust-1.64.0.html#c-compatible-ffi-types-in-core-and-alloc\n    if minor < 64 {\n        println!(\"cargo:rustc-cfg=no_core_cstr\");\n    }\n\n    // Current minimum supported version of serde_derive crate is Rust 1.71.\n    if minor < 71 {\n        println!(\"cargo:rustc-cfg=no_serde_derive\");\n    }\n\n    // Support for core::num::Saturating and std::num::Saturating stabilized in Rust 1.74\n    // https://blog.rust-lang.org/2023/11/16/Rust-1.74.0.html#stabilized-apis\n    if minor < 74 {\n        println!(\"cargo:rustc-cfg=no_core_num_saturating\");\n    }\n\n    // Support for core::net stabilized in Rust 1.77.\n    // https://blog.rust-lang.org/2024/03/21/Rust-1.77.0.html\n    if minor < 77 {\n        println!(\"cargo:rustc-cfg=no_core_net\");\n    }\n\n    // Support for the `#[diagnostic]` tool attribute namespace\n    // https://blog.rust-lang.org/2024/05/02/Rust-1.78.0.html#diagnostic-attributes\n    if minor < 78 {\n        println!(\"cargo:rustc-cfg=no_diagnostic_namespace\");\n    }\n\n    // The Error trait became available in core in 1.81.\n    // https://blog.rust-lang.org/2024/09/05/Rust-1.81.0.html#coreerrorerror\n    if minor < 81 {\n        println!(\"cargo:rustc-cfg=no_core_error\");\n    }\n}\n\nfn rustc_minor_version() -> Option<u32> {\n    let rustc = env::var_os(\"RUSTC\")?;\n    let output = Command::new(rustc).arg(\"--version\").output().ok()?;\n    let version = str::from_utf8(&output.stdout).ok()?;\n    let mut pieces = version.split('.');\n    if pieces.next() != Some(\"rustc 1\") {\n        return None;\n    }\n    pieces.next()?.parse().ok()\n}\n"
  },
  {
    "path": "serde_core/src/crate_root.rs",
    "content": "macro_rules! crate_root {\n    () => {\n        /// A facade around all the types we need from the `std`, `core`, and `alloc`\n        /// crates. This avoids elaborate import wrangling having to happen in every\n        /// module.\n        mod lib {\n            mod core {\n                #[cfg(not(feature = \"std\"))]\n                pub use core::*;\n                #[cfg(feature = \"std\")]\n                pub use std::*;\n            }\n\n            pub use self::core::{f32, f64};\n            pub use self::core::{iter, num, str};\n\n            #[cfg(any(feature = \"std\", feature = \"alloc\"))]\n            pub use self::core::{cmp, mem};\n\n            pub use self::core::cell::{Cell, RefCell};\n            pub use self::core::cmp::Reverse;\n            pub use self::core::fmt::{self, Debug, Display, Write as FmtWrite};\n            pub use self::core::marker::PhantomData;\n            pub use self::core::num::Wrapping;\n            pub use self::core::ops::{Bound, Range, RangeFrom, RangeInclusive, RangeTo};\n            pub use self::core::result;\n            pub use self::core::time::Duration;\n\n            #[cfg(all(feature = \"alloc\", not(feature = \"std\")))]\n            pub use alloc::borrow::{Cow, ToOwned};\n            #[cfg(feature = \"std\")]\n            pub use std::borrow::{Cow, ToOwned};\n\n            #[cfg(all(feature = \"alloc\", not(feature = \"std\")))]\n            pub use alloc::string::{String, ToString};\n            #[cfg(feature = \"std\")]\n            pub use std::string::{String, ToString};\n\n            #[cfg(all(feature = \"alloc\", not(feature = \"std\")))]\n            pub use alloc::vec::Vec;\n            #[cfg(feature = \"std\")]\n            pub use std::vec::Vec;\n\n            #[cfg(all(feature = \"alloc\", not(feature = \"std\")))]\n            pub use alloc::boxed::Box;\n            #[cfg(feature = \"std\")]\n            pub use std::boxed::Box;\n\n            #[cfg(all(feature = \"rc\", feature = \"alloc\", not(feature = \"std\")))]\n            pub use alloc::rc::{Rc, Weak as RcWeak};\n            #[cfg(all(feature = \"rc\", feature = \"std\"))]\n            pub use std::rc::{Rc, Weak as RcWeak};\n\n            #[cfg(all(feature = \"rc\", feature = \"alloc\", not(feature = \"std\")))]\n            pub use alloc::sync::{Arc, Weak as ArcWeak};\n            #[cfg(all(feature = \"rc\", feature = \"std\"))]\n            pub use std::sync::{Arc, Weak as ArcWeak};\n\n            #[cfg(all(feature = \"alloc\", not(feature = \"std\")))]\n            pub use alloc::collections::{BTreeMap, BTreeSet, BinaryHeap, LinkedList, VecDeque};\n            #[cfg(feature = \"std\")]\n            pub use std::collections::{BTreeMap, BTreeSet, BinaryHeap, LinkedList, VecDeque};\n\n            #[cfg(all(not(no_core_cstr), not(feature = \"std\")))]\n            pub use self::core::ffi::CStr;\n            #[cfg(feature = \"std\")]\n            pub use std::ffi::CStr;\n\n            #[cfg(all(not(no_core_cstr), feature = \"alloc\", not(feature = \"std\")))]\n            pub use alloc::ffi::CString;\n            #[cfg(feature = \"std\")]\n            pub use std::ffi::CString;\n\n            #[cfg(all(not(no_core_net), not(feature = \"std\")))]\n            pub use self::core::net;\n            #[cfg(feature = \"std\")]\n            pub use std::net;\n\n            #[cfg(feature = \"std\")]\n            pub use std::error;\n\n            #[cfg(feature = \"std\")]\n            pub use std::collections::{HashMap, HashSet};\n            #[cfg(feature = \"std\")]\n            pub use std::ffi::{OsStr, OsString};\n            #[cfg(feature = \"std\")]\n            pub use std::hash::{BuildHasher, Hash};\n            #[cfg(feature = \"std\")]\n            pub use std::io::Write;\n            #[cfg(feature = \"std\")]\n            pub use std::path::{Path, PathBuf};\n            #[cfg(feature = \"std\")]\n            pub use std::sync::{Mutex, RwLock};\n            #[cfg(feature = \"std\")]\n            pub use std::time::{SystemTime, UNIX_EPOCH};\n\n            #[cfg(all(feature = \"std\", no_target_has_atomic, not(no_std_atomic)))]\n            pub use std::sync::atomic::{\n                AtomicBool, AtomicI16, AtomicI32, AtomicI8, AtomicIsize, AtomicU16, AtomicU32,\n                AtomicU8, AtomicUsize, Ordering,\n            };\n            #[cfg(all(feature = \"std\", no_target_has_atomic, not(no_std_atomic64)))]\n            pub use std::sync::atomic::{AtomicI64, AtomicU64};\n\n            #[cfg(all(feature = \"std\", not(no_target_has_atomic)))]\n            pub use std::sync::atomic::Ordering;\n            #[cfg(all(feature = \"std\", not(no_target_has_atomic), target_has_atomic = \"8\"))]\n            pub use std::sync::atomic::{AtomicBool, AtomicI8, AtomicU8};\n            #[cfg(all(feature = \"std\", not(no_target_has_atomic), target_has_atomic = \"16\"))]\n            pub use std::sync::atomic::{AtomicI16, AtomicU16};\n            #[cfg(all(feature = \"std\", not(no_target_has_atomic), target_has_atomic = \"32\"))]\n            pub use std::sync::atomic::{AtomicI32, AtomicU32};\n            #[cfg(all(feature = \"std\", not(no_target_has_atomic), target_has_atomic = \"64\"))]\n            pub use std::sync::atomic::{AtomicI64, AtomicU64};\n            #[cfg(all(feature = \"std\", not(no_target_has_atomic), target_has_atomic = \"ptr\"))]\n            pub use std::sync::atomic::{AtomicIsize, AtomicUsize};\n\n            #[cfg(not(no_core_num_saturating))]\n            pub use self::core::num::Saturating;\n        }\n\n        // None of this crate's error handling needs the `From::from` error conversion\n        // performed implicitly by the `?` operator or the standard library's `try!`\n        // macro. This simplified macro gives a 5.5% improvement in compile time\n        // compared to standard `try!`, and 9% improvement compared to `?`.\n        macro_rules! tri {\n            ($expr:expr) => {\n                match $expr {\n                    Ok(val) => val,\n                    Err(err) => return Err(err),\n                }\n            };\n        }\n\n        #[cfg_attr(all(docsrs, if_docsrs_then_no_serde_core), path = \"core/de/mod.rs\")]\n        pub mod de;\n        #[cfg_attr(all(docsrs, if_docsrs_then_no_serde_core), path = \"core/ser/mod.rs\")]\n        pub mod ser;\n\n        #[cfg_attr(all(docsrs, if_docsrs_then_no_serde_core), path = \"core/format.rs\")]\n        mod format;\n\n        #[doc(inline)]\n        pub use crate::de::{Deserialize, Deserializer};\n        #[doc(inline)]\n        pub use crate::ser::{Serialize, Serializer};\n\n        // Used by generated code. Not public API.\n        #[doc(hidden)]\n        #[cfg_attr(\n            all(docsrs, if_docsrs_then_no_serde_core),\n            path = \"core/private/mod.rs\"\n        )]\n        mod private;\n\n        // Used by declarative macro generated code. Not public API.\n        #[doc(hidden)]\n        pub mod __private {\n            #[doc(hidden)]\n            pub use crate::private::doc;\n            #[doc(hidden)]\n            pub use core::result::Result;\n        }\n\n        include!(concat!(env!(\"OUT_DIR\"), \"/private.rs\"));\n\n        #[cfg(all(not(feature = \"std\"), no_core_error))]\n        #[cfg_attr(all(docsrs, if_docsrs_then_no_serde_core), path = \"core/std_error.rs\")]\n        mod std_error;\n    };\n}\n"
  },
  {
    "path": "serde_core/src/de/ignored_any.rs",
    "content": "use crate::lib::*;\n\nuse crate::de::{\n    Deserialize, Deserializer, EnumAccess, Error, MapAccess, SeqAccess, VariantAccess, Visitor,\n};\n\n/// An efficient way of discarding data from a deserializer.\n///\n/// Think of this like `serde_json::Value` in that it can be deserialized from\n/// any type, except that it does not store any information about the data that\n/// gets deserialized.\n///\n/// ```edition2021\n/// use serde::de::{\n///     self, Deserialize, DeserializeSeed, Deserializer, IgnoredAny, SeqAccess, Visitor,\n/// };\n/// use std::fmt;\n/// use std::marker::PhantomData;\n///\n/// /// A seed that can be used to deserialize only the `n`th element of a sequence\n/// /// while efficiently discarding elements of any type before or after index `n`.\n/// ///\n/// /// For example to deserialize only the element at index 3:\n/// ///\n/// /// ```\n/// /// NthElement::new(3).deserialize(deserializer)\n/// /// ```\n/// pub struct NthElement<T> {\n///     n: usize,\n///     marker: PhantomData<T>,\n/// }\n///\n/// impl<T> NthElement<T> {\n///     pub fn new(n: usize) -> Self {\n///         NthElement {\n///             n: n,\n///             marker: PhantomData,\n///         }\n///     }\n/// }\n///\n/// impl<'de, T> Visitor<'de> for NthElement<T>\n/// where\n///     T: Deserialize<'de>,\n/// {\n///     type Value = T;\n///\n///     fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n///         write!(\n///             formatter,\n///             \"a sequence in which we care about element {}\",\n///             self.n\n///         )\n///     }\n///\n///     fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>\n///     where\n///         A: SeqAccess<'de>,\n///     {\n///         // Skip over the first `n` elements.\n///         for i in 0..self.n {\n///             // It is an error if the sequence ends before we get to element `n`.\n///             if seq.next_element::<IgnoredAny>()?.is_none() {\n///                 return Err(de::Error::invalid_length(i, &self));\n///             }\n///         }\n///\n///         // Deserialize the one we care about.\n///         let nth = match seq.next_element()? {\n///             Some(nth) => nth,\n///             None => {\n///                 return Err(de::Error::invalid_length(self.n, &self));\n///             }\n///         };\n///\n///         // Skip over any remaining elements in the sequence after `n`.\n///         while let Some(IgnoredAny) = seq.next_element()? {\n///             // ignore\n///         }\n///\n///         Ok(nth)\n///     }\n/// }\n///\n/// impl<'de, T> DeserializeSeed<'de> for NthElement<T>\n/// where\n///     T: Deserialize<'de>,\n/// {\n///     type Value = T;\n///\n///     fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>\n///     where\n///         D: Deserializer<'de>,\n///     {\n///         deserializer.deserialize_seq(self)\n///     }\n/// }\n///\n/// # fn example<'de, D>(deserializer: D) -> Result<(), D::Error>\n/// # where\n/// #     D: Deserializer<'de>,\n/// # {\n/// // Deserialize only the sequence element at index 3 from this deserializer.\n/// // The element at index 3 is required to be a string. Elements before and\n/// // after index 3 are allowed to be of any type.\n/// let s: String = NthElement::new(3).deserialize(deserializer)?;\n/// #     Ok(())\n/// # }\n/// ```\n#[derive(Copy, Clone, Debug, Default, PartialEq)]\npub struct IgnoredAny;\n\nimpl<'de> Visitor<'de> for IgnoredAny {\n    type Value = IgnoredAny;\n\n    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter.write_str(\"anything at all\")\n    }\n\n    #[inline]\n    fn visit_bool<E>(self, x: bool) -> Result<Self::Value, E> {\n        let _ = x;\n        Ok(IgnoredAny)\n    }\n\n    #[inline]\n    fn visit_i64<E>(self, x: i64) -> Result<Self::Value, E> {\n        let _ = x;\n        Ok(IgnoredAny)\n    }\n\n    #[inline]\n    fn visit_i128<E>(self, x: i128) -> Result<Self::Value, E> {\n        let _ = x;\n        Ok(IgnoredAny)\n    }\n\n    #[inline]\n    fn visit_u64<E>(self, x: u64) -> Result<Self::Value, E> {\n        let _ = x;\n        Ok(IgnoredAny)\n    }\n\n    #[inline]\n    fn visit_u128<E>(self, x: u128) -> Result<Self::Value, E> {\n        let _ = x;\n        Ok(IgnoredAny)\n    }\n\n    #[inline]\n    fn visit_f64<E>(self, x: f64) -> Result<Self::Value, E> {\n        let _ = x;\n        Ok(IgnoredAny)\n    }\n\n    #[inline]\n    fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        let _ = s;\n        Ok(IgnoredAny)\n    }\n\n    #[inline]\n    fn visit_none<E>(self) -> Result<Self::Value, E> {\n        Ok(IgnoredAny)\n    }\n\n    #[inline]\n    fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        IgnoredAny::deserialize(deserializer)\n    }\n\n    #[inline]\n    fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        IgnoredAny::deserialize(deserializer)\n    }\n\n    #[inline]\n    fn visit_unit<E>(self) -> Result<Self::Value, E> {\n        Ok(IgnoredAny)\n    }\n\n    #[inline]\n    fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>\n    where\n        A: SeqAccess<'de>,\n    {\n        while let Some(IgnoredAny) = tri!(seq.next_element()) {\n            // Gobble\n        }\n        Ok(IgnoredAny)\n    }\n\n    #[inline]\n    fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>\n    where\n        A: MapAccess<'de>,\n    {\n        while let Some((IgnoredAny, IgnoredAny)) = tri!(map.next_entry()) {\n            // Gobble\n        }\n        Ok(IgnoredAny)\n    }\n\n    #[inline]\n    fn visit_bytes<E>(self, bytes: &[u8]) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        let _ = bytes;\n        Ok(IgnoredAny)\n    }\n\n    fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error>\n    where\n        A: EnumAccess<'de>,\n    {\n        tri!(data.variant::<IgnoredAny>()).1.newtype_variant()\n    }\n}\n\nimpl<'de> Deserialize<'de> for IgnoredAny {\n    #[inline]\n    fn deserialize<D>(deserializer: D) -> Result<IgnoredAny, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        deserializer.deserialize_ignored_any(IgnoredAny)\n    }\n}\n"
  },
  {
    "path": "serde_core/src/de/impls.rs",
    "content": "use crate::lib::*;\n\nuse crate::de::{\n    Deserialize, Deserializer, EnumAccess, Error, MapAccess, SeqAccess, Unexpected, VariantAccess,\n    Visitor,\n};\nuse crate::private::{self, InPlaceSeed};\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nuse crate::private::size_hint;\n\n////////////////////////////////////////////////////////////////////////////////\n\nstruct UnitVisitor;\n\nimpl<'de> Visitor<'de> for UnitVisitor {\n    type Value = ();\n\n    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter.write_str(\"unit\")\n    }\n\n    fn visit_unit<E>(self) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        Ok(())\n    }\n}\n\nimpl<'de> Deserialize<'de> for () {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        deserializer.deserialize_unit(UnitVisitor)\n    }\n}\n\n#[cfg(feature = \"unstable\")]\n#[cfg_attr(docsrs, doc(cfg(feature = \"unstable\")))]\nimpl<'de> Deserialize<'de> for ! {\n    fn deserialize<D>(_deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        Err(Error::custom(\"cannot deserialize `!`\"))\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nstruct BoolVisitor;\n\nimpl<'de> Visitor<'de> for BoolVisitor {\n    type Value = bool;\n\n    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter.write_str(\"a boolean\")\n    }\n\n    fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        Ok(v)\n    }\n}\n\nimpl<'de> Deserialize<'de> for bool {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        deserializer.deserialize_bool(BoolVisitor)\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nmacro_rules! impl_deserialize_num {\n    ($primitive:ident, $nonzero:ident, $deserialize:ident $($method:ident!($($val:ident : $visit:ident)*);)*) => {\n        impl_deserialize_num!($primitive, $deserialize $($method!($($val : $visit)*);)*);\n\n        impl<'de> Deserialize<'de> for num::$nonzero {\n            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n            where\n                D: Deserializer<'de>,\n            {\n                struct NonZeroVisitor;\n\n                impl<'de> Visitor<'de> for NonZeroVisitor {\n                    type Value = num::$nonzero;\n\n                    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n                        formatter.write_str(concat!(\"a nonzero \", stringify!($primitive)))\n                    }\n\n                    $($($method!(nonzero $primitive $val : $visit);)*)*\n                }\n\n                deserializer.$deserialize(NonZeroVisitor)\n            }\n        }\n\n        #[cfg(not(no_core_num_saturating))]\n        impl<'de> Deserialize<'de> for Saturating<$primitive> {\n            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n            where\n                D: Deserializer<'de>,\n            {\n                struct SaturatingVisitor;\n\n                impl<'de> Visitor<'de> for SaturatingVisitor {\n                    type Value = Saturating<$primitive>;\n\n                    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n                        formatter.write_str(\"integer with support for saturating semantics\")\n                    }\n\n                    $($($method!(saturating $primitive $val : $visit);)*)*\n                }\n\n                deserializer.$deserialize(SaturatingVisitor)\n            }\n        }\n    };\n\n    ($primitive:ident, $deserialize:ident $($method:ident!($($val:ident : $visit:ident)*);)*) => {\n        impl<'de> Deserialize<'de> for $primitive {\n            #[inline]\n            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n            where\n                D: Deserializer<'de>,\n            {\n                struct PrimitiveVisitor;\n\n                impl<'de> Visitor<'de> for PrimitiveVisitor {\n                    type Value = $primitive;\n\n                    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n                        formatter.write_str(stringify!($primitive))\n                    }\n\n                    $($($method!($val : $visit);)*)*\n                }\n\n                deserializer.$deserialize(PrimitiveVisitor)\n            }\n        }\n    };\n}\n\nmacro_rules! num_self {\n    ($ty:ident : $visit:ident) => {\n        #[inline]\n        fn $visit<E>(self, v: $ty) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            Ok(v)\n        }\n    };\n\n    (nonzero $primitive:ident $ty:ident : $visit:ident) => {\n        fn $visit<E>(self, v: $ty) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            if let Some(nonzero) = Self::Value::new(v) {\n                Ok(nonzero)\n            } else {\n                Err(Error::invalid_value(Unexpected::Unsigned(0), &self))\n            }\n        }\n    };\n\n    (saturating $primitive:ident $ty:ident : $visit:ident) => {\n        fn $visit<E>(self, v: $ty) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            Ok(Saturating(v))\n        }\n    };\n}\n\nmacro_rules! num_as_self {\n    ($ty:ident : $visit:ident) => {\n        #[inline]\n        fn $visit<E>(self, v: $ty) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            Ok(v as Self::Value)\n        }\n    };\n\n    (nonzero $primitive:ident $ty:ident : $visit:ident) => {\n        fn $visit<E>(self, v: $ty) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            if let Some(nonzero) = Self::Value::new(v as $primitive) {\n                Ok(nonzero)\n            } else {\n                Err(Error::invalid_value(Unexpected::Unsigned(0), &self))\n            }\n        }\n    };\n\n    (saturating $primitive:ident $ty:ident : $visit:ident) => {\n        fn $visit<E>(self, v: $ty) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            Ok(Saturating(v as $primitive))\n        }\n    };\n}\n\nmacro_rules! num_as_copysign_self {\n    ($ty:ident : $visit:ident) => {\n        #[inline]\n        fn $visit<E>(self, v: $ty) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            #[cfg(not(feature = \"std\"))]\n            {\n                Ok(v as Self::Value)\n            }\n\n            #[cfg(feature = \"std\")]\n            {\n                // Preserve sign of NaN. The `as` produces a nondeterministic sign.\n                let sign = if v.is_sign_positive() { 1.0 } else { -1.0 };\n                Ok((v as Self::Value).copysign(sign))\n            }\n        }\n    };\n}\n\nmacro_rules! int_to_int {\n    ($ty:ident : $visit:ident) => {\n        #[inline]\n        fn $visit<E>(self, v: $ty) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            Self::Value::try_from(v as i64)\n                .map_err(|_| Error::invalid_value(Unexpected::Signed(v as i64), &self))\n        }\n    };\n\n    (nonzero $primitive:ident $ty:ident : $visit:ident) => {\n        fn $visit<E>(self, v: $ty) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            if let Ok(v) = $primitive::try_from(v as i64) {\n                if let Some(nonzero) = Self::Value::new(v) {\n                    return Ok(nonzero);\n                }\n            }\n            Err(Error::invalid_value(Unexpected::Signed(v as i64), &self))\n        }\n    };\n\n    (saturating $primitive:ident $ty:ident : $visit:ident) => {\n        fn $visit<E>(self, v: $ty) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            if (v as i64) < $primitive::MIN as i64 {\n                Ok(Saturating($primitive::MIN))\n            } else if ($primitive::MAX as i64) < v as i64 {\n                Ok(Saturating($primitive::MAX))\n            } else {\n                Ok(Saturating(v as $primitive))\n            }\n        }\n    };\n}\n\nmacro_rules! int_to_uint {\n    ($ty:ident : $visit:ident) => {\n        #[inline]\n        fn $visit<E>(self, v: $ty) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            if 0 <= v {\n                #[allow(irrefutable_let_patterns)]\n                if let Ok(v) = Self::Value::try_from(v as u64) {\n                    return Ok(v as Self::Value);\n                }\n            }\n            Err(Error::invalid_value(Unexpected::Signed(v as i64), &self))\n        }\n    };\n\n    (nonzero $primitive:ident $ty:ident : $visit:ident) => {\n        fn $visit<E>(self, v: $ty) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            if 0 < v {\n                #[allow(irrefutable_let_patterns)]\n                if let Ok(v) = $primitive::try_from(v as u64) {\n                    if let Some(nonzero) = Self::Value::new(v) {\n                        return Ok(nonzero);\n                    }\n                }\n            }\n            Err(Error::invalid_value(Unexpected::Signed(v as i64), &self))\n        }\n    };\n\n    (saturating $primitive:ident $ty:ident : $visit:ident) => {\n        fn $visit<E>(self, v: $ty) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            if v < 0 {\n                Ok(Saturating(0))\n            } else if ($primitive::MAX as u64) < v as u64 {\n                Ok(Saturating($primitive::MAX))\n            } else {\n                Ok(Saturating(v as $primitive))\n            }\n        }\n    };\n}\n\nmacro_rules! uint_to_self {\n    ($ty:ident : $visit:ident) => {\n        #[inline]\n        fn $visit<E>(self, v: $ty) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            Self::Value::try_from(v as u64)\n                .map_err(|_| Error::invalid_value(Unexpected::Unsigned(v as u64), &self))\n        }\n    };\n\n    (nonzero $primitive:ident $ty:ident : $visit:ident) => {\n        fn $visit<E>(self, v: $ty) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            if let Ok(v) = $primitive::try_from(v as u64) {\n                if let Some(nonzero) = Self::Value::new(v) {\n                    return Ok(nonzero);\n                }\n            }\n            Err(Error::invalid_value(Unexpected::Unsigned(v as u64), &self))\n        }\n    };\n\n    (saturating $primitive:ident $ty:ident : $visit:ident) => {\n        fn $visit<E>(self, v: $ty) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            if let Ok(v) = $primitive::try_from(v as u64) {\n                Ok(Saturating(v as $primitive))\n            } else {\n                Ok(Saturating($primitive::MAX))\n            }\n        }\n    };\n}\n\nimpl_deserialize_num! {\n    i8, NonZeroI8, deserialize_i8\n    num_self!(i8:visit_i8);\n    int_to_int!(i16:visit_i16 i32:visit_i32 i64:visit_i64);\n    uint_to_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32 u64:visit_u64);\n}\n\nimpl_deserialize_num! {\n    i16, NonZeroI16, deserialize_i16\n    num_self!(i16:visit_i16);\n    num_as_self!(i8:visit_i8);\n    int_to_int!(i32:visit_i32 i64:visit_i64);\n    uint_to_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32 u64:visit_u64);\n}\n\nimpl_deserialize_num! {\n    i32, NonZeroI32, deserialize_i32\n    num_self!(i32:visit_i32);\n    num_as_self!(i8:visit_i8 i16:visit_i16);\n    int_to_int!(i64:visit_i64);\n    uint_to_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32 u64:visit_u64);\n}\n\nimpl_deserialize_num! {\n    i64, NonZeroI64, deserialize_i64\n    num_self!(i64:visit_i64);\n    num_as_self!(i8:visit_i8 i16:visit_i16 i32:visit_i32);\n    uint_to_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32 u64:visit_u64);\n}\n\nimpl_deserialize_num! {\n    isize, NonZeroIsize, deserialize_i64\n    num_as_self!(i8:visit_i8 i16:visit_i16);\n    int_to_int!(i32:visit_i32 i64:visit_i64);\n    uint_to_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32 u64:visit_u64);\n}\n\nimpl_deserialize_num! {\n    u8, NonZeroU8, deserialize_u8\n    num_self!(u8:visit_u8);\n    int_to_uint!(i8:visit_i8 i16:visit_i16 i32:visit_i32 i64:visit_i64);\n    uint_to_self!(u16:visit_u16 u32:visit_u32 u64:visit_u64);\n}\n\nimpl_deserialize_num! {\n    u16, NonZeroU16, deserialize_u16\n    num_self!(u16:visit_u16);\n    num_as_self!(u8:visit_u8);\n    int_to_uint!(i8:visit_i8 i16:visit_i16 i32:visit_i32 i64:visit_i64);\n    uint_to_self!(u32:visit_u32 u64:visit_u64);\n}\n\nimpl_deserialize_num! {\n    u32, NonZeroU32, deserialize_u32\n    num_self!(u32:visit_u32);\n    num_as_self!(u8:visit_u8 u16:visit_u16);\n    int_to_uint!(i8:visit_i8 i16:visit_i16 i32:visit_i32 i64:visit_i64);\n    uint_to_self!(u64:visit_u64);\n}\n\nimpl_deserialize_num! {\n    u64, NonZeroU64, deserialize_u64\n    num_self!(u64:visit_u64);\n    num_as_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32);\n    int_to_uint!(i8:visit_i8 i16:visit_i16 i32:visit_i32 i64:visit_i64);\n}\n\nimpl_deserialize_num! {\n    usize, NonZeroUsize, deserialize_u64\n    num_as_self!(u8:visit_u8 u16:visit_u16);\n    int_to_uint!(i8:visit_i8 i16:visit_i16 i32:visit_i32 i64:visit_i64);\n    uint_to_self!(u32:visit_u32 u64:visit_u64);\n}\n\nimpl_deserialize_num! {\n    f32, deserialize_f32\n    num_self!(f32:visit_f32);\n    num_as_copysign_self!(f64:visit_f64);\n    num_as_self!(i8:visit_i8 i16:visit_i16 i32:visit_i32 i64:visit_i64);\n    num_as_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32 u64:visit_u64);\n}\n\nimpl_deserialize_num! {\n    f64, deserialize_f64\n    num_self!(f64:visit_f64);\n    num_as_copysign_self!(f32:visit_f32);\n    num_as_self!(i8:visit_i8 i16:visit_i16 i32:visit_i32 i64:visit_i64);\n    num_as_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32 u64:visit_u64);\n}\n\nmacro_rules! num_128 {\n    ($ty:ident : $visit:ident) => {\n        fn $visit<E>(self, v: $ty) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            if v as i128 >= Self::Value::MIN as i128 && v as u128 <= Self::Value::MAX as u128 {\n                Ok(v as Self::Value)\n            } else {\n                Err(Error::invalid_value(\n                    Unexpected::Other(stringify!($ty)),\n                    &self,\n                ))\n            }\n        }\n    };\n\n    (nonzero $primitive:ident $ty:ident : $visit:ident) => {\n        fn $visit<E>(self, v: $ty) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            if v as i128 >= $primitive::MIN as i128 && v as u128 <= $primitive::MAX as u128 {\n                if let Some(nonzero) = Self::Value::new(v as $primitive) {\n                    Ok(nonzero)\n                } else {\n                    Err(Error::invalid_value(Unexpected::Unsigned(0), &self))\n                }\n            } else {\n                Err(Error::invalid_value(\n                    Unexpected::Other(stringify!($ty)),\n                    &self,\n                ))\n            }\n        }\n    };\n\n    (saturating $primitive:ident $ty:ident : $visit:ident) => {\n        fn $visit<E>(self, v: $ty) -> Result<Self::Value, E>\n        where\n            E: Error,\n        {\n            if (v as i128) < $primitive::MIN as i128 {\n                Ok(Saturating($primitive::MIN))\n            } else if ($primitive::MAX as u128) < v as u128 {\n                Ok(Saturating($primitive::MAX))\n            } else {\n                Ok(Saturating(v as $primitive))\n            }\n        }\n    };\n}\n\nimpl_deserialize_num! {\n    i128, NonZeroI128, deserialize_i128\n    num_self!(i128:visit_i128);\n    num_as_self!(i8:visit_i8 i16:visit_i16 i32:visit_i32 i64:visit_i64);\n    num_as_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32 u64:visit_u64);\n    num_128!(u128:visit_u128);\n}\n\nimpl_deserialize_num! {\n    u128, NonZeroU128, deserialize_u128\n    num_self!(u128:visit_u128);\n    num_as_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32 u64:visit_u64);\n    int_to_uint!(i8:visit_i8 i16:visit_i16 i32:visit_i32 i64:visit_i64);\n    num_128!(i128:visit_i128);\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nstruct CharVisitor;\n\nimpl<'de> Visitor<'de> for CharVisitor {\n    type Value = char;\n\n    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter.write_str(\"a character\")\n    }\n\n    #[inline]\n    fn visit_char<E>(self, v: char) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        Ok(v)\n    }\n\n    #[inline]\n    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        let mut iter = v.chars();\n        match (iter.next(), iter.next()) {\n            (Some(c), None) => Ok(c),\n            _ => Err(Error::invalid_value(Unexpected::Str(v), &self)),\n        }\n    }\n}\n\nimpl<'de> Deserialize<'de> for char {\n    #[inline]\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        deserializer.deserialize_char(CharVisitor)\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nstruct StringVisitor;\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nstruct StringInPlaceVisitor<'a>(&'a mut String);\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nimpl<'de> Visitor<'de> for StringVisitor {\n    type Value = String;\n\n    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter.write_str(\"a string\")\n    }\n\n    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        Ok(v.to_owned())\n    }\n\n    fn visit_string<E>(self, v: String) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        Ok(v)\n    }\n\n    fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        match str::from_utf8(v) {\n            Ok(s) => Ok(s.to_owned()),\n            Err(_) => Err(Error::invalid_value(Unexpected::Bytes(v), &self)),\n        }\n    }\n\n    fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        match String::from_utf8(v) {\n            Ok(s) => Ok(s),\n            Err(e) => Err(Error::invalid_value(\n                Unexpected::Bytes(&e.into_bytes()),\n                &self,\n            )),\n        }\n    }\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nimpl<'a, 'de> Visitor<'de> for StringInPlaceVisitor<'a> {\n    type Value = ();\n\n    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter.write_str(\"a string\")\n    }\n\n    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        self.0.clear();\n        self.0.push_str(v);\n        Ok(())\n    }\n\n    fn visit_string<E>(self, v: String) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        *self.0 = v;\n        Ok(())\n    }\n\n    fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        match str::from_utf8(v) {\n            Ok(s) => {\n                self.0.clear();\n                self.0.push_str(s);\n                Ok(())\n            }\n            Err(_) => Err(Error::invalid_value(Unexpected::Bytes(v), &self)),\n        }\n    }\n\n    fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        match String::from_utf8(v) {\n            Ok(s) => {\n                *self.0 = s;\n                Ok(())\n            }\n            Err(e) => Err(Error::invalid_value(\n                Unexpected::Bytes(&e.into_bytes()),\n                &self,\n            )),\n        }\n    }\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\n#[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\nimpl<'de> Deserialize<'de> for String {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        deserializer.deserialize_string(StringVisitor)\n    }\n\n    fn deserialize_in_place<D>(deserializer: D, place: &mut Self) -> Result<(), D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        deserializer.deserialize_string(StringInPlaceVisitor(place))\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nstruct StrVisitor;\n\nimpl<'a> Visitor<'a> for StrVisitor {\n    type Value = &'a str;\n\n    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter.write_str(\"a borrowed string\")\n    }\n\n    fn visit_borrowed_str<E>(self, v: &'a str) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        Ok(v) // so easy\n    }\n\n    fn visit_borrowed_bytes<E>(self, v: &'a [u8]) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        str::from_utf8(v).map_err(|_| Error::invalid_value(Unexpected::Bytes(v), &self))\n    }\n}\n\nimpl<'de: 'a, 'a> Deserialize<'de> for &'a str {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        deserializer.deserialize_str(StrVisitor)\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nstruct BytesVisitor;\n\nimpl<'a> Visitor<'a> for BytesVisitor {\n    type Value = &'a [u8];\n\n    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter.write_str(\"a borrowed byte array\")\n    }\n\n    fn visit_borrowed_bytes<E>(self, v: &'a [u8]) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        Ok(v)\n    }\n\n    fn visit_borrowed_str<E>(self, v: &'a str) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        Ok(v.as_bytes())\n    }\n}\n\nimpl<'de: 'a, 'a> Deserialize<'de> for &'a [u8] {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        deserializer.deserialize_bytes(BytesVisitor)\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n#[cfg(any(feature = \"std\", all(not(no_core_cstr), feature = \"alloc\")))]\nstruct CStringVisitor;\n\n#[cfg(any(feature = \"std\", all(not(no_core_cstr), feature = \"alloc\")))]\nimpl<'de> Visitor<'de> for CStringVisitor {\n    type Value = CString;\n\n    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter.write_str(\"byte array\")\n    }\n\n    fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>\n    where\n        A: SeqAccess<'de>,\n    {\n        let capacity = size_hint::cautious::<u8>(seq.size_hint());\n        let mut values = Vec::<u8>::with_capacity(capacity);\n\n        while let Some(value) = tri!(seq.next_element()) {\n            values.push(value);\n        }\n\n        CString::new(values).map_err(Error::custom)\n    }\n\n    fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        CString::new(v).map_err(Error::custom)\n    }\n\n    fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        CString::new(v).map_err(Error::custom)\n    }\n\n    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        CString::new(v).map_err(Error::custom)\n    }\n\n    fn visit_string<E>(self, v: String) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        CString::new(v).map_err(Error::custom)\n    }\n}\n\n#[cfg(any(feature = \"std\", all(not(no_core_cstr), feature = \"alloc\")))]\n#[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\nimpl<'de> Deserialize<'de> for CString {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        deserializer.deserialize_byte_buf(CStringVisitor)\n    }\n}\n\nmacro_rules! forwarded_impl {\n    (\n        $(#[$attr:meta])*\n        ($($id:ident),*), $ty:ty, $func:expr\n    ) => {\n        $(#[$attr])*\n        impl<'de $(, $id : Deserialize<'de>,)*> Deserialize<'de> for $ty {\n            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n            where\n                D: Deserializer<'de>,\n            {\n                Deserialize::deserialize(deserializer).map($func)\n            }\n        }\n    }\n}\n\nforwarded_impl! {\n    #[cfg(any(feature = \"std\", all(not(no_core_cstr), feature = \"alloc\")))]\n    #[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\n    (), Box<CStr>, CString::into_boxed_c_str\n}\n\nforwarded_impl! {\n    (T), Reverse<T>, Reverse\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nstruct OptionVisitor<T> {\n    marker: PhantomData<T>,\n}\n\nimpl<'de, T> Visitor<'de> for OptionVisitor<T>\nwhere\n    T: Deserialize<'de>,\n{\n    type Value = Option<T>;\n\n    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter.write_str(\"option\")\n    }\n\n    #[inline]\n    fn visit_unit<E>(self) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        Ok(None)\n    }\n\n    #[inline]\n    fn visit_none<E>(self) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        Ok(None)\n    }\n\n    #[inline]\n    fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        T::deserialize(deserializer).map(Some)\n    }\n\n    fn __private_visit_untagged_option<D>(self, deserializer: D) -> Result<Self::Value, ()>\n    where\n        D: Deserializer<'de>,\n    {\n        Ok(T::deserialize(deserializer).ok())\n    }\n}\n\nimpl<'de, T> Deserialize<'de> for Option<T>\nwhere\n    T: Deserialize<'de>,\n{\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        deserializer.deserialize_option(OptionVisitor {\n            marker: PhantomData,\n        })\n    }\n\n    // The Some variant's repr is opaque, so we can't play cute tricks with its\n    // tag to have deserialize_in_place build the content in place unconditionally.\n    //\n    // FIXME: investigate whether branching on the old value being Some to\n    // deserialize_in_place the value is profitable (probably data-dependent?)\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nstruct PhantomDataVisitor<T: ?Sized> {\n    marker: PhantomData<T>,\n}\n\nimpl<'de, T> Visitor<'de> for PhantomDataVisitor<T>\nwhere\n    T: ?Sized,\n{\n    type Value = PhantomData<T>;\n\n    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter.write_str(\"unit\")\n    }\n\n    #[inline]\n    fn visit_unit<E>(self) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        Ok(PhantomData)\n    }\n}\n\nimpl<'de, T> Deserialize<'de> for PhantomData<T>\nwhere\n    T: ?Sized,\n{\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        let visitor = PhantomDataVisitor {\n            marker: PhantomData,\n        };\n        deserializer.deserialize_unit_struct(\"PhantomData\", visitor)\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nmacro_rules! seq_impl {\n    (\n        $(#[$attr:meta])*\n        $ty:ident <T $(: $tbound1:ident $(+ $tbound2:ident)*)* $(, $typaram:ident : $bound1:ident $(+ $bound2:ident)*)*>,\n        $access:ident,\n        $clear:expr,\n        $with_capacity:expr,\n        $reserve:expr,\n        $insert:expr\n    ) => {\n        $(#[$attr])*\n        impl<'de, T $(, $typaram)*> Deserialize<'de> for $ty<T $(, $typaram)*>\n        where\n            T: Deserialize<'de> $(+ $tbound1 $(+ $tbound2)*)*,\n            $($typaram: $bound1 $(+ $bound2)*,)*\n        {\n            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n            where\n                D: Deserializer<'de>,\n            {\n                struct SeqVisitor<T $(, $typaram)*> {\n                    marker: PhantomData<$ty<T $(, $typaram)*>>,\n                }\n\n                impl<'de, T $(, $typaram)*> Visitor<'de> for SeqVisitor<T $(, $typaram)*>\n                where\n                    T: Deserialize<'de> $(+ $tbound1 $(+ $tbound2)*)*,\n                    $($typaram: $bound1 $(+ $bound2)*,)*\n                {\n                    type Value = $ty<T $(, $typaram)*>;\n\n                    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n                        formatter.write_str(\"a sequence\")\n                    }\n\n                    #[inline]\n                    fn visit_seq<A>(self, mut $access: A) -> Result<Self::Value, A::Error>\n                    where\n                        A: SeqAccess<'de>,\n                    {\n                        let mut values = $with_capacity;\n\n                        while let Some(value) = tri!($access.next_element()) {\n                            $insert(&mut values, value);\n                        }\n\n                        Ok(values)\n                    }\n                }\n\n                let visitor = SeqVisitor { marker: PhantomData };\n                deserializer.deserialize_seq(visitor)\n            }\n\n            fn deserialize_in_place<D>(deserializer: D, place: &mut Self) -> Result<(), D::Error>\n            where\n                D: Deserializer<'de>,\n            {\n                struct SeqInPlaceVisitor<'a, T: 'a $(, $typaram: 'a)*>(&'a mut $ty<T $(, $typaram)*>);\n\n                impl<'a, 'de, T $(, $typaram)*> Visitor<'de> for SeqInPlaceVisitor<'a, T $(, $typaram)*>\n                where\n                    T: Deserialize<'de> $(+ $tbound1 $(+ $tbound2)*)*,\n                    $($typaram: $bound1 $(+ $bound2)*,)*\n                {\n                    type Value = ();\n\n                    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n                        formatter.write_str(\"a sequence\")\n                    }\n\n                    #[inline]\n                    fn visit_seq<A>(mut self, mut $access: A) -> Result<Self::Value, A::Error>\n                    where\n                        A: SeqAccess<'de>,\n                    {\n                        $clear(&mut self.0);\n                        $reserve(&mut self.0, size_hint::cautious::<T>($access.size_hint()));\n\n                        // FIXME: try to overwrite old values here? (Vec, VecDeque, LinkedList)\n                        while let Some(value) = tri!($access.next_element()) {\n                            $insert(&mut self.0, value);\n                        }\n\n                        Ok(())\n                    }\n                }\n\n                deserializer.deserialize_seq(SeqInPlaceVisitor(place))\n            }\n        }\n    }\n}\n\n// Dummy impl of reserve\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nfn nop_reserve<T>(_seq: T, _n: usize) {}\n\nseq_impl!(\n    #[cfg(any(feature = \"std\", feature = \"alloc\"))]\n    #[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\n    BinaryHeap<T: Ord>,\n    seq,\n    BinaryHeap::clear,\n    BinaryHeap::with_capacity(size_hint::cautious::<T>(seq.size_hint())),\n    BinaryHeap::reserve,\n    BinaryHeap::push\n);\n\nseq_impl!(\n    #[cfg(any(feature = \"std\", feature = \"alloc\"))]\n    #[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\n    BTreeSet<T: Eq + Ord>,\n    seq,\n    BTreeSet::clear,\n    BTreeSet::new(),\n    nop_reserve,\n    BTreeSet::insert\n);\n\nseq_impl!(\n    #[cfg(any(feature = \"std\", feature = \"alloc\"))]\n    #[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\n    LinkedList<T>,\n    seq,\n    LinkedList::clear,\n    LinkedList::new(),\n    nop_reserve,\n    LinkedList::push_back\n);\n\nseq_impl!(\n    #[cfg(feature = \"std\")]\n    #[cfg_attr(docsrs, doc(cfg(feature = \"std\")))]\n    HashSet<T: Eq + Hash, S: BuildHasher + Default>,\n    seq,\n    HashSet::clear,\n    HashSet::with_capacity_and_hasher(size_hint::cautious::<T>(seq.size_hint()), S::default()),\n    HashSet::reserve,\n    HashSet::insert\n);\n\nseq_impl!(\n    #[cfg(any(feature = \"std\", feature = \"alloc\"))]\n    #[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\n    VecDeque<T>,\n    seq,\n    VecDeque::clear,\n    VecDeque::with_capacity(size_hint::cautious::<T>(seq.size_hint())),\n    VecDeque::reserve,\n    VecDeque::push_back\n);\n\n////////////////////////////////////////////////////////////////////////////////\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\n#[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\nimpl<'de, T> Deserialize<'de> for Vec<T>\nwhere\n    T: Deserialize<'de>,\n{\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        struct VecVisitor<T> {\n            marker: PhantomData<T>,\n        }\n\n        impl<'de, T> Visitor<'de> for VecVisitor<T>\n        where\n            T: Deserialize<'de>,\n        {\n            type Value = Vec<T>;\n\n            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n                formatter.write_str(\"a sequence\")\n            }\n\n            fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>\n            where\n                A: SeqAccess<'de>,\n            {\n                let capacity = size_hint::cautious::<T>(seq.size_hint());\n                let mut values = Vec::<T>::with_capacity(capacity);\n\n                while let Some(value) = tri!(seq.next_element()) {\n                    values.push(value);\n                }\n\n                Ok(values)\n            }\n        }\n\n        let visitor = VecVisitor {\n            marker: PhantomData,\n        };\n        deserializer.deserialize_seq(visitor)\n    }\n\n    fn deserialize_in_place<D>(deserializer: D, place: &mut Self) -> Result<(), D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        struct VecInPlaceVisitor<'a, T: 'a>(&'a mut Vec<T>);\n\n        impl<'a, 'de, T> Visitor<'de> for VecInPlaceVisitor<'a, T>\n        where\n            T: Deserialize<'de>,\n        {\n            type Value = ();\n\n            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n                formatter.write_str(\"a sequence\")\n            }\n\n            fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>\n            where\n                A: SeqAccess<'de>,\n            {\n                let hint = size_hint::cautious::<T>(seq.size_hint());\n                if let Some(additional) = hint.checked_sub(self.0.len()) {\n                    self.0.reserve(additional);\n                }\n\n                for i in 0..self.0.len() {\n                    let next = {\n                        let next_place = InPlaceSeed(&mut self.0[i]);\n                        tri!(seq.next_element_seed(next_place))\n                    };\n                    if next.is_none() {\n                        self.0.truncate(i);\n                        return Ok(());\n                    }\n                }\n\n                while let Some(value) = tri!(seq.next_element()) {\n                    self.0.push(value);\n                }\n\n                Ok(())\n            }\n        }\n\n        deserializer.deserialize_seq(VecInPlaceVisitor(place))\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nstruct ArrayVisitor<A> {\n    marker: PhantomData<A>,\n}\nstruct ArrayInPlaceVisitor<'a, A: 'a>(&'a mut A);\n\nimpl<A> ArrayVisitor<A> {\n    fn new() -> Self {\n        ArrayVisitor {\n            marker: PhantomData,\n        }\n    }\n}\n\nimpl<'de, T> Visitor<'de> for ArrayVisitor<[T; 0]> {\n    type Value = [T; 0];\n\n    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter.write_str(\"an empty array\")\n    }\n\n    #[inline]\n    fn visit_seq<A>(self, _: A) -> Result<Self::Value, A::Error>\n    where\n        A: SeqAccess<'de>,\n    {\n        Ok([])\n    }\n}\n\n// Does not require T: Deserialize<'de>.\nimpl<'de, T> Deserialize<'de> for [T; 0] {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        deserializer.deserialize_tuple(0, ArrayVisitor::<[T; 0]>::new())\n    }\n}\n\nmacro_rules! array_impls {\n    ($($len:expr => ($($n:tt)+))+) => {\n        $(\n            impl<'de, T> Visitor<'de> for ArrayVisitor<[T; $len]>\n            where\n                T: Deserialize<'de>,\n            {\n                type Value = [T; $len];\n\n                fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n                    formatter.write_str(concat!(\"an array of length \", $len))\n                }\n\n                #[inline]\n                fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>\n                where\n                    A: SeqAccess<'de>,\n                {\n                    Ok([$(\n                        match tri!(seq.next_element()) {\n                            Some(val) => val,\n                            None => return Err(Error::invalid_length($n, &self)),\n                        }\n                    ),+])\n                }\n            }\n\n            impl<'a, 'de, T> Visitor<'de> for ArrayInPlaceVisitor<'a, [T; $len]>\n            where\n                T: Deserialize<'de>,\n            {\n                type Value = ();\n\n                fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n                    formatter.write_str(concat!(\"an array of length \", $len))\n                }\n\n                #[inline]\n                fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>\n                where\n                    A: SeqAccess<'de>,\n                {\n                    let mut fail_idx = None;\n                    for (idx, dest) in self.0[..].iter_mut().enumerate() {\n                        if tri!(seq.next_element_seed(InPlaceSeed(dest))).is_none() {\n                            fail_idx = Some(idx);\n                            break;\n                        }\n                    }\n                    if let Some(idx) = fail_idx {\n                        return Err(Error::invalid_length(idx, &self));\n                    }\n                    Ok(())\n                }\n            }\n\n            impl<'de, T> Deserialize<'de> for [T; $len]\n            where\n                T: Deserialize<'de>,\n            {\n                fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n                where\n                    D: Deserializer<'de>,\n                {\n                    deserializer.deserialize_tuple($len, ArrayVisitor::<[T; $len]>::new())\n                }\n\n                fn deserialize_in_place<D>(deserializer: D, place: &mut Self) -> Result<(), D::Error>\n                where\n                    D: Deserializer<'de>,\n                {\n                    deserializer.deserialize_tuple($len, ArrayInPlaceVisitor(place))\n                }\n            }\n        )+\n    }\n}\n\narray_impls! {\n    1 => (0)\n    2 => (0 1)\n    3 => (0 1 2)\n    4 => (0 1 2 3)\n    5 => (0 1 2 3 4)\n    6 => (0 1 2 3 4 5)\n    7 => (0 1 2 3 4 5 6)\n    8 => (0 1 2 3 4 5 6 7)\n    9 => (0 1 2 3 4 5 6 7 8)\n    10 => (0 1 2 3 4 5 6 7 8 9)\n    11 => (0 1 2 3 4 5 6 7 8 9 10)\n    12 => (0 1 2 3 4 5 6 7 8 9 10 11)\n    13 => (0 1 2 3 4 5 6 7 8 9 10 11 12)\n    14 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13)\n    15 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14)\n    16 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15)\n    17 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16)\n    18 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17)\n    19 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18)\n    20 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19)\n    21 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20)\n    22 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21)\n    23 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22)\n    24 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23)\n    25 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24)\n    26 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25)\n    27 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26)\n    28 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27)\n    29 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28)\n    30 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29)\n    31 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30)\n    32 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31)\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nmacro_rules! tuple_impls {\n    ($($len:tt => ($($n:tt $name:ident)+))+) => {\n        $(\n            #[cfg_attr(docsrs, doc(hidden))]\n            impl<'de, $($name),+> Deserialize<'de> for ($($name,)+)\n            where\n                $($name: Deserialize<'de>,)+\n            {\n                tuple_impl_body!($len => ($($n $name)+));\n            }\n        )+\n    };\n}\n\nmacro_rules! tuple_impl_body {\n    ($len:tt => ($($n:tt $name:ident)+)) => {\n        #[inline]\n        fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n        where\n            D: Deserializer<'de>,\n        {\n            struct TupleVisitor<$($name,)+> {\n                marker: PhantomData<($($name,)+)>,\n            }\n\n            impl<'de, $($name: Deserialize<'de>),+> Visitor<'de> for TupleVisitor<$($name,)+> {\n                type Value = ($($name,)+);\n\n                fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n                    formatter.write_str(concat!(\"a tuple of size \", $len))\n                }\n\n                #[inline]\n                #[allow(non_snake_case)]\n                fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>\n                where\n                    A: SeqAccess<'de>,\n                {\n                    $(\n                        let $name = match tri!(seq.next_element()) {\n                            Some(value) => value,\n                            None => return Err(Error::invalid_length($n, &self)),\n                        };\n                    )+\n\n                    Ok(($($name,)+))\n                }\n            }\n\n            deserializer.deserialize_tuple($len, TupleVisitor { marker: PhantomData })\n        }\n\n        #[inline]\n        fn deserialize_in_place<D>(deserializer: D, place: &mut Self) -> Result<(), D::Error>\n        where\n            D: Deserializer<'de>,\n        {\n            struct TupleInPlaceVisitor<'a, $($name: 'a,)+>(&'a mut ($($name,)+));\n\n            impl<'a, 'de, $($name: Deserialize<'de>),+> Visitor<'de> for TupleInPlaceVisitor<'a, $($name,)+> {\n                type Value = ();\n\n                fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n                    formatter.write_str(concat!(\"a tuple of size \", $len))\n                }\n\n                #[inline]\n                #[allow(non_snake_case)]\n                fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>\n                where\n                    A: SeqAccess<'de>,\n                {\n                    $(\n                        if tri!(seq.next_element_seed(InPlaceSeed(&mut (self.0).$n))).is_none() {\n                            return Err(Error::invalid_length($n, &self));\n                        }\n                    )+\n\n                    Ok(())\n                }\n            }\n\n            deserializer.deserialize_tuple($len, TupleInPlaceVisitor(place))\n        }\n    };\n}\n\n#[cfg_attr(docsrs, doc(fake_variadic))]\n#[cfg_attr(\n    docsrs,\n    doc = \"This trait is implemented for tuples up to 16 items long.\"\n)]\nimpl<'de, T> Deserialize<'de> for (T,)\nwhere\n    T: Deserialize<'de>,\n{\n    tuple_impl_body!(1 => (0 T));\n}\n\ntuple_impls! {\n    2  => (0 T0 1 T1)\n    3  => (0 T0 1 T1 2 T2)\n    4  => (0 T0 1 T1 2 T2 3 T3)\n    5  => (0 T0 1 T1 2 T2 3 T3 4 T4)\n    6  => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5)\n    7  => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6)\n    8  => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7)\n    9  => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8)\n    10 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9)\n    11 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10)\n    12 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11)\n    13 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12)\n    14 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13)\n    15 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14)\n    16 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15)\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nmacro_rules! map_impl {\n    (\n        $(#[$attr:meta])*\n        $ty:ident <K $(: $kbound1:ident $(+ $kbound2:ident)*)*, V $(, $typaram:ident : $bound1:ident $(+ $bound2:ident)*)*>,\n        $access:ident,\n        $with_capacity:expr,\n    ) => {\n        $(#[$attr])*\n        impl<'de, K, V $(, $typaram)*> Deserialize<'de> for $ty<K, V $(, $typaram)*>\n        where\n            K: Deserialize<'de> $(+ $kbound1 $(+ $kbound2)*)*,\n            V: Deserialize<'de>,\n            $($typaram: $bound1 $(+ $bound2)*),*\n        {\n            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n            where\n                D: Deserializer<'de>,\n            {\n                struct MapVisitor<K, V $(, $typaram)*> {\n                    marker: PhantomData<$ty<K, V $(, $typaram)*>>,\n                }\n\n                impl<'de, K, V $(, $typaram)*> Visitor<'de> for MapVisitor<K, V $(, $typaram)*>\n                where\n                    K: Deserialize<'de> $(+ $kbound1 $(+ $kbound2)*)*,\n                    V: Deserialize<'de>,\n                    $($typaram: $bound1 $(+ $bound2)*),*\n                {\n                    type Value = $ty<K, V $(, $typaram)*>;\n\n                    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n                        formatter.write_str(\"a map\")\n                    }\n\n                    #[inline]\n                    fn visit_map<A>(self, mut $access: A) -> Result<Self::Value, A::Error>\n                    where\n                        A: MapAccess<'de>,\n                    {\n                        let mut values = $with_capacity;\n\n                        while let Some((key, value)) = tri!($access.next_entry()) {\n                            values.insert(key, value);\n                        }\n\n                        Ok(values)\n                    }\n                }\n\n                let visitor = MapVisitor { marker: PhantomData };\n                deserializer.deserialize_map(visitor)\n            }\n        }\n    }\n}\n\nmap_impl! {\n    #[cfg(any(feature = \"std\", feature = \"alloc\"))]\n    #[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\n    BTreeMap<K: Ord, V>,\n    map,\n    BTreeMap::new(),\n}\n\nmap_impl! {\n    #[cfg(feature = \"std\")]\n    #[cfg_attr(docsrs, doc(cfg(feature = \"std\")))]\n    HashMap<K: Eq + Hash, V, S: BuildHasher + Default>,\n    map,\n    HashMap::with_capacity_and_hasher(size_hint::cautious::<(K, V)>(map.size_hint()), S::default()),\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n#[cfg(any(feature = \"std\", not(no_core_net)))]\nmacro_rules! parse_ip_impl {\n    ($ty:ty, $expecting:expr, $size:tt) => {\n        impl<'de> Deserialize<'de> for $ty {\n            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n            where\n                D: Deserializer<'de>,\n            {\n                if deserializer.is_human_readable() {\n                    deserializer.deserialize_str(FromStrVisitor::new($expecting))\n                } else {\n                    <[u8; $size]>::deserialize(deserializer).map(<$ty>::from)\n                }\n            }\n        }\n    };\n}\n\n#[cfg(any(feature = \"std\", not(no_core_net)))]\nmacro_rules! variant_identifier {\n    (\n        $name_kind:ident ($($variant:ident; $bytes:expr; $index:expr),*)\n        $expecting_message:expr,\n        $variants_name:ident\n    ) => {\n        enum $name_kind {\n            $($variant),*\n        }\n\n        static $variants_name: &[&str] = &[$(stringify!($variant)),*];\n\n        impl<'de> Deserialize<'de> for $name_kind {\n            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n            where\n                D: Deserializer<'de>,\n            {\n                struct KindVisitor;\n\n                impl<'de> Visitor<'de> for KindVisitor {\n                    type Value = $name_kind;\n\n                    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n                        formatter.write_str($expecting_message)\n                    }\n\n                    fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E>\n                    where\n                        E: Error,\n                    {\n                        match value {\n                            $(\n                                $index => Ok($name_kind :: $variant),\n                            )*\n                            _ => Err(Error::invalid_value(Unexpected::Unsigned(value), &self),),\n                        }\n                    }\n\n                    fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>\n                    where\n                        E: Error,\n                    {\n                        match value {\n                            $(\n                                stringify!($variant) => Ok($name_kind :: $variant),\n                            )*\n                            _ => Err(Error::unknown_variant(value, $variants_name)),\n                        }\n                    }\n\n                    fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E>\n                    where\n                        E: Error,\n                    {\n                        match value {\n                            $(\n                                $bytes => Ok($name_kind :: $variant),\n                            )*\n                            _ => {\n                                match str::from_utf8(value) {\n                                    Ok(value) => Err(Error::unknown_variant(value, $variants_name)),\n                                    Err(_) => Err(Error::invalid_value(Unexpected::Bytes(value), &self)),\n                                }\n                            }\n                        }\n                    }\n                }\n\n                deserializer.deserialize_identifier(KindVisitor)\n            }\n        }\n    }\n}\n\n#[cfg(any(feature = \"std\", not(no_core_net)))]\nmacro_rules! deserialize_enum {\n    (\n        $name:ident $name_kind:ident ($($variant:ident; $bytes:expr; $index:expr),*)\n        $expecting_message:expr,\n        $deserializer:expr\n    ) => {\n        variant_identifier! {\n            $name_kind ($($variant; $bytes; $index),*)\n            $expecting_message,\n            VARIANTS\n        }\n\n        struct EnumVisitor;\n        impl<'de> Visitor<'de> for EnumVisitor {\n            type Value = $name;\n\n            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n                formatter.write_str(concat!(\"a \", stringify!($name)))\n            }\n\n\n            fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error>\n            where\n                A: EnumAccess<'de>,\n            {\n                match tri!(data.variant()) {\n                    $(\n                        ($name_kind :: $variant, v) => v.newtype_variant().map($name :: $variant),\n                    )*\n                }\n            }\n        }\n        $deserializer.deserialize_enum(stringify!($name), VARIANTS, EnumVisitor)\n    }\n}\n\n#[cfg(any(feature = \"std\", not(no_core_net)))]\nimpl<'de> Deserialize<'de> for net::IpAddr {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        if deserializer.is_human_readable() {\n            deserializer.deserialize_str(FromStrVisitor::new(\"IP address\"))\n        } else {\n            use crate::lib::net::IpAddr;\n            deserialize_enum! {\n                IpAddr IpAddrKind (V4; b\"V4\"; 0, V6; b\"V6\"; 1)\n                \"`V4` or `V6`\",\n                deserializer\n            }\n        }\n    }\n}\n\n#[cfg(any(feature = \"std\", not(no_core_net)))]\nparse_ip_impl!(net::Ipv4Addr, \"IPv4 address\", 4);\n\n#[cfg(any(feature = \"std\", not(no_core_net)))]\nparse_ip_impl!(net::Ipv6Addr, \"IPv6 address\", 16);\n\n#[cfg(any(feature = \"std\", not(no_core_net)))]\nmacro_rules! parse_socket_impl {\n    (\n        $ty:ty, $expecting:tt,\n        $new:expr,\n    ) => {\n        impl<'de> Deserialize<'de> for $ty {\n            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n            where\n                D: Deserializer<'de>,\n            {\n                if deserializer.is_human_readable() {\n                    deserializer.deserialize_str(FromStrVisitor::new($expecting))\n                } else {\n                    <(_, u16)>::deserialize(deserializer).map($new)\n                }\n            }\n        }\n    };\n}\n\n#[cfg(any(feature = \"std\", not(no_core_net)))]\nimpl<'de> Deserialize<'de> for net::SocketAddr {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        if deserializer.is_human_readable() {\n            deserializer.deserialize_str(FromStrVisitor::new(\"socket address\"))\n        } else {\n            use crate::lib::net::SocketAddr;\n            deserialize_enum! {\n                SocketAddr SocketAddrKind (V4; b\"V4\"; 0, V6; b\"V6\"; 1)\n                \"`V4` or `V6`\",\n                deserializer\n            }\n        }\n    }\n}\n\n#[cfg(any(feature = \"std\", not(no_core_net)))]\nparse_socket_impl! {\n    net::SocketAddrV4, \"IPv4 socket address\",\n    |(ip, port)| net::SocketAddrV4::new(ip, port),\n}\n\n#[cfg(any(feature = \"std\", not(no_core_net)))]\nparse_socket_impl! {\n    net::SocketAddrV6, \"IPv6 socket address\",\n    |(ip, port)| net::SocketAddrV6::new(ip, port, 0, 0),\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n#[cfg(feature = \"std\")]\nstruct PathVisitor;\n\n#[cfg(feature = \"std\")]\nimpl<'a> Visitor<'a> for PathVisitor {\n    type Value = &'a Path;\n\n    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter.write_str(\"a borrowed path\")\n    }\n\n    fn visit_borrowed_str<E>(self, v: &'a str) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        Ok(v.as_ref())\n    }\n\n    fn visit_borrowed_bytes<E>(self, v: &'a [u8]) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        str::from_utf8(v)\n            .map(AsRef::as_ref)\n            .map_err(|_| Error::invalid_value(Unexpected::Bytes(v), &self))\n    }\n}\n\n#[cfg(feature = \"std\")]\n#[cfg_attr(docsrs, doc(cfg(feature = \"std\")))]\nimpl<'de: 'a, 'a> Deserialize<'de> for &'a Path {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        deserializer.deserialize_str(PathVisitor)\n    }\n}\n\n#[cfg(feature = \"std\")]\nstruct PathBufVisitor;\n\n#[cfg(feature = \"std\")]\nimpl<'de> Visitor<'de> for PathBufVisitor {\n    type Value = PathBuf;\n\n    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter.write_str(\"path string\")\n    }\n\n    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        Ok(From::from(v))\n    }\n\n    fn visit_string<E>(self, v: String) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        Ok(From::from(v))\n    }\n\n    fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        str::from_utf8(v)\n            .map(From::from)\n            .map_err(|_| Error::invalid_value(Unexpected::Bytes(v), &self))\n    }\n\n    fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        String::from_utf8(v)\n            .map(From::from)\n            .map_err(|e| Error::invalid_value(Unexpected::Bytes(&e.into_bytes()), &self))\n    }\n}\n\n#[cfg(feature = \"std\")]\n#[cfg_attr(docsrs, doc(cfg(feature = \"std\")))]\nimpl<'de> Deserialize<'de> for PathBuf {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        deserializer.deserialize_string(PathBufVisitor)\n    }\n}\n\nforwarded_impl! {\n    #[cfg(feature = \"std\")]\n    #[cfg_attr(docsrs, doc(cfg(feature = \"std\")))]\n    (), Box<Path>, PathBuf::into_boxed_path\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n// If this were outside of the serde crate, it would just use:\n//\n//    #[derive(Deserialize)]\n//    #[serde(variant_identifier)]\n#[cfg(all(feature = \"std\", any(unix, windows)))]\nvariant_identifier! {\n    OsStringKind (Unix; b\"Unix\"; 0, Windows; b\"Windows\"; 1)\n    \"`Unix` or `Windows`\",\n    OSSTR_VARIANTS\n}\n\n#[cfg(all(feature = \"std\", any(unix, windows)))]\nstruct OsStringVisitor;\n\n#[cfg(all(feature = \"std\", any(unix, windows)))]\nimpl<'de> Visitor<'de> for OsStringVisitor {\n    type Value = OsString;\n\n    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter.write_str(\"os string\")\n    }\n\n    #[cfg(unix)]\n    fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error>\n    where\n        A: EnumAccess<'de>,\n    {\n        use std::os::unix::ffi::OsStringExt;\n\n        match tri!(data.variant()) {\n            (OsStringKind::Unix, v) => v.newtype_variant().map(OsString::from_vec),\n            (OsStringKind::Windows, _) => Err(Error::custom(\n                \"cannot deserialize Windows OS string on Unix\",\n            )),\n        }\n    }\n\n    #[cfg(windows)]\n    fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error>\n    where\n        A: EnumAccess<'de>,\n    {\n        use std::os::windows::ffi::OsStringExt;\n\n        match tri!(data.variant()) {\n            (OsStringKind::Windows, v) => v\n                .newtype_variant::<Vec<u16>>()\n                .map(|vec| OsString::from_wide(&vec)),\n            (OsStringKind::Unix, _) => Err(Error::custom(\n                \"cannot deserialize Unix OS string on Windows\",\n            )),\n        }\n    }\n}\n\n#[cfg(all(feature = \"std\", any(unix, windows)))]\n#[cfg_attr(docsrs, doc(cfg(all(feature = \"std\", any(unix, windows)))))]\nimpl<'de> Deserialize<'de> for OsString {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        deserializer.deserialize_enum(\"OsString\", OSSTR_VARIANTS, OsStringVisitor)\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nforwarded_impl! {\n    #[cfg(any(feature = \"std\", feature = \"alloc\"))]\n    #[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\n    (T), Box<T>, Box::new\n}\n\nforwarded_impl! {\n    #[cfg(any(feature = \"std\", feature = \"alloc\"))]\n    #[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\n    (T), Box<[T]>, Vec::into_boxed_slice\n}\n\nforwarded_impl! {\n    #[cfg(any(feature = \"std\", feature = \"alloc\"))]\n    #[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\n    (), Box<str>, String::into_boxed_str\n}\n\nforwarded_impl! {\n    #[cfg(all(feature = \"std\", any(unix, windows)))]\n    #[cfg_attr(docsrs, doc(cfg(all(feature = \"std\", any(unix, windows)))))]\n    (), Box<OsStr>, OsString::into_boxed_os_str\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\n#[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\nimpl<'de, 'a, T> Deserialize<'de> for Cow<'a, T>\nwhere\n    T: ?Sized + ToOwned,\n    T::Owned: Deserialize<'de>,\n{\n    #[inline]\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        T::Owned::deserialize(deserializer).map(Cow::Owned)\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/// This impl requires the [`\"rc\"`] Cargo feature of Serde. The resulting\n/// `Weak<T>` has a reference count of 0 and cannot be upgraded.\n///\n/// [`\"rc\"`]: https://serde.rs/feature-flags.html#-features-rc\n#[cfg(all(feature = \"rc\", any(feature = \"std\", feature = \"alloc\")))]\n#[cfg_attr(\n    docsrs,\n    doc(cfg(all(feature = \"rc\", any(feature = \"std\", feature = \"alloc\"))))\n)]\nimpl<'de, T> Deserialize<'de> for RcWeak<T>\nwhere\n    T: Deserialize<'de>,\n{\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        tri!(Option::<T>::deserialize(deserializer));\n        Ok(RcWeak::new())\n    }\n}\n\n/// This impl requires the [`\"rc\"`] Cargo feature of Serde. The resulting\n/// `Weak<T>` has a reference count of 0 and cannot be upgraded.\n///\n/// [`\"rc\"`]: https://serde.rs/feature-flags.html#-features-rc\n#[cfg(all(feature = \"rc\", any(feature = \"std\", feature = \"alloc\")))]\n#[cfg_attr(\n    docsrs,\n    doc(cfg(all(feature = \"rc\", any(feature = \"std\", feature = \"alloc\"))))\n)]\nimpl<'de, T> Deserialize<'de> for ArcWeak<T>\nwhere\n    T: Deserialize<'de>,\n{\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        tri!(Option::<T>::deserialize(deserializer));\n        Ok(ArcWeak::new())\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nmacro_rules! box_forwarded_impl {\n    (\n        $(#[$attr:meta])*\n        $t:ident\n    ) => {\n        $(#[$attr])*\n        impl<'de, T> Deserialize<'de> for $t<T>\n        where\n            T: ?Sized,\n            Box<T>: Deserialize<'de>,\n        {\n            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n            where\n                D: Deserializer<'de>,\n            {\n                Box::deserialize(deserializer).map(Into::into)\n            }\n        }\n    };\n}\n\nbox_forwarded_impl! {\n    /// This impl requires the [`\"rc\"`] Cargo feature of Serde.\n    ///\n    /// Deserializing a data structure containing `Rc` will not attempt to\n    /// deduplicate `Rc` references to the same data. Every deserialized `Rc`\n    /// will end up with a strong count of 1.\n    ///\n    /// [`\"rc\"`]: https://serde.rs/feature-flags.html#-features-rc\n    #[cfg(all(feature = \"rc\", any(feature = \"std\", feature = \"alloc\")))]\n    #[cfg_attr(docsrs, doc(cfg(all(feature = \"rc\", any(feature = \"std\", feature = \"alloc\")))))]\n    Rc\n}\n\nbox_forwarded_impl! {\n    /// This impl requires the [`\"rc\"`] Cargo feature of Serde.\n    ///\n    /// Deserializing a data structure containing `Arc` will not attempt to\n    /// deduplicate `Arc` references to the same data. Every deserialized `Arc`\n    /// will end up with a strong count of 1.\n    ///\n    /// [`\"rc\"`]: https://serde.rs/feature-flags.html#-features-rc\n    #[cfg(all(feature = \"rc\", any(feature = \"std\", feature = \"alloc\")))]\n    #[cfg_attr(docsrs, doc(cfg(all(feature = \"rc\", any(feature = \"std\", feature = \"alloc\")))))]\n    Arc\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nimpl<'de, T> Deserialize<'de> for Cell<T>\nwhere\n    T: Deserialize<'de> + Copy,\n{\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        T::deserialize(deserializer).map(Cell::new)\n    }\n}\n\nforwarded_impl! {\n    (T), RefCell<T>, RefCell::new\n}\n\nforwarded_impl! {\n    #[cfg(feature = \"std\")]\n    #[cfg_attr(docsrs, doc(cfg(feature = \"std\")))]\n    (T), Mutex<T>, Mutex::new\n}\n\nforwarded_impl! {\n    #[cfg(feature = \"std\")]\n    #[cfg_attr(docsrs, doc(cfg(feature = \"std\")))]\n    (T), RwLock<T>, RwLock::new\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n// This is a cleaned-up version of the impl generated by:\n//\n//     #[derive(Deserialize)]\n//     #[serde(deny_unknown_fields)]\n//     struct Duration {\n//         secs: u64,\n//         nanos: u32,\n//     }\nimpl<'de> Deserialize<'de> for Duration {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        // If this were outside of the serde crate, it would just use:\n        //\n        //    #[derive(Deserialize)]\n        //    #[serde(field_identifier, rename_all = \"lowercase\")]\n        enum Field {\n            Secs,\n            Nanos,\n        }\n\n        impl<'de> Deserialize<'de> for Field {\n            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n            where\n                D: Deserializer<'de>,\n            {\n                struct FieldVisitor;\n\n                impl<'de> Visitor<'de> for FieldVisitor {\n                    type Value = Field;\n\n                    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n                        formatter.write_str(\"`secs` or `nanos`\")\n                    }\n\n                    fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>\n                    where\n                        E: Error,\n                    {\n                        match value {\n                            \"secs\" => Ok(Field::Secs),\n                            \"nanos\" => Ok(Field::Nanos),\n                            _ => Err(Error::unknown_field(value, FIELDS)),\n                        }\n                    }\n\n                    fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E>\n                    where\n                        E: Error,\n                    {\n                        match value {\n                            b\"secs\" => Ok(Field::Secs),\n                            b\"nanos\" => Ok(Field::Nanos),\n                            _ => {\n                                let value = private::string::from_utf8_lossy(value);\n                                Err(Error::unknown_field(&*value, FIELDS))\n                            }\n                        }\n                    }\n                }\n\n                deserializer.deserialize_identifier(FieldVisitor)\n            }\n        }\n\n        fn check_overflow<E>(secs: u64, nanos: u32) -> Result<(), E>\n        where\n            E: Error,\n        {\n            static NANOS_PER_SEC: u32 = 1_000_000_000;\n            match secs.checked_add((nanos / NANOS_PER_SEC) as u64) {\n                Some(_) => Ok(()),\n                None => Err(E::custom(\"overflow deserializing Duration\")),\n            }\n        }\n\n        struct DurationVisitor;\n\n        impl<'de> Visitor<'de> for DurationVisitor {\n            type Value = Duration;\n\n            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n                formatter.write_str(\"struct Duration\")\n            }\n\n            fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>\n            where\n                A: SeqAccess<'de>,\n            {\n                let secs: u64 = match tri!(seq.next_element()) {\n                    Some(value) => value,\n                    None => {\n                        return Err(Error::invalid_length(0, &self));\n                    }\n                };\n                let nanos: u32 = match tri!(seq.next_element()) {\n                    Some(value) => value,\n                    None => {\n                        return Err(Error::invalid_length(1, &self));\n                    }\n                };\n                tri!(check_overflow(secs, nanos));\n                Ok(Duration::new(secs, nanos))\n            }\n\n            fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>\n            where\n                A: MapAccess<'de>,\n            {\n                let mut secs: Option<u64> = None;\n                let mut nanos: Option<u32> = None;\n                while let Some(key) = tri!(map.next_key()) {\n                    match key {\n                        Field::Secs => {\n                            if secs.is_some() {\n                                return Err(<A::Error as Error>::duplicate_field(\"secs\"));\n                            }\n                            secs = Some(tri!(map.next_value()));\n                        }\n                        Field::Nanos => {\n                            if nanos.is_some() {\n                                return Err(<A::Error as Error>::duplicate_field(\"nanos\"));\n                            }\n                            nanos = Some(tri!(map.next_value()));\n                        }\n                    }\n                }\n                let secs = match secs {\n                    Some(secs) => secs,\n                    None => return Err(<A::Error as Error>::missing_field(\"secs\")),\n                };\n                let nanos = match nanos {\n                    Some(nanos) => nanos,\n                    None => return Err(<A::Error as Error>::missing_field(\"nanos\")),\n                };\n                tri!(check_overflow(secs, nanos));\n                Ok(Duration::new(secs, nanos))\n            }\n        }\n\n        const FIELDS: &[&str] = &[\"secs\", \"nanos\"];\n        deserializer.deserialize_struct(\"Duration\", FIELDS, DurationVisitor)\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n#[cfg(feature = \"std\")]\n#[cfg_attr(docsrs, doc(cfg(feature = \"std\")))]\nimpl<'de> Deserialize<'de> for SystemTime {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        // Reuse duration\n        enum Field {\n            Secs,\n            Nanos,\n        }\n\n        impl<'de> Deserialize<'de> for Field {\n            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n            where\n                D: Deserializer<'de>,\n            {\n                struct FieldVisitor;\n\n                impl<'de> Visitor<'de> for FieldVisitor {\n                    type Value = Field;\n\n                    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n                        formatter.write_str(\"`secs_since_epoch` or `nanos_since_epoch`\")\n                    }\n\n                    fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>\n                    where\n                        E: Error,\n                    {\n                        match value {\n                            \"secs_since_epoch\" => Ok(Field::Secs),\n                            \"nanos_since_epoch\" => Ok(Field::Nanos),\n                            _ => Err(Error::unknown_field(value, FIELDS)),\n                        }\n                    }\n\n                    fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E>\n                    where\n                        E: Error,\n                    {\n                        match value {\n                            b\"secs_since_epoch\" => Ok(Field::Secs),\n                            b\"nanos_since_epoch\" => Ok(Field::Nanos),\n                            _ => {\n                                let value = String::from_utf8_lossy(value);\n                                Err(Error::unknown_field(&value, FIELDS))\n                            }\n                        }\n                    }\n                }\n\n                deserializer.deserialize_identifier(FieldVisitor)\n            }\n        }\n\n        fn check_overflow<E>(secs: u64, nanos: u32) -> Result<(), E>\n        where\n            E: Error,\n        {\n            static NANOS_PER_SEC: u32 = 1_000_000_000;\n            match secs.checked_add((nanos / NANOS_PER_SEC) as u64) {\n                Some(_) => Ok(()),\n                None => Err(E::custom(\"overflow deserializing SystemTime epoch offset\")),\n            }\n        }\n\n        struct DurationVisitor;\n\n        impl<'de> Visitor<'de> for DurationVisitor {\n            type Value = Duration;\n\n            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n                formatter.write_str(\"struct SystemTime\")\n            }\n\n            fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>\n            where\n                A: SeqAccess<'de>,\n            {\n                let secs: u64 = match tri!(seq.next_element()) {\n                    Some(value) => value,\n                    None => {\n                        return Err(Error::invalid_length(0, &self));\n                    }\n                };\n                let nanos: u32 = match tri!(seq.next_element()) {\n                    Some(value) => value,\n                    None => {\n                        return Err(Error::invalid_length(1, &self));\n                    }\n                };\n                tri!(check_overflow(secs, nanos));\n                Ok(Duration::new(secs, nanos))\n            }\n\n            fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>\n            where\n                A: MapAccess<'de>,\n            {\n                let mut secs: Option<u64> = None;\n                let mut nanos: Option<u32> = None;\n                while let Some(key) = tri!(map.next_key()) {\n                    match key {\n                        Field::Secs => {\n                            if secs.is_some() {\n                                return Err(<A::Error as Error>::duplicate_field(\n                                    \"secs_since_epoch\",\n                                ));\n                            }\n                            secs = Some(tri!(map.next_value()));\n                        }\n                        Field::Nanos => {\n                            if nanos.is_some() {\n                                return Err(<A::Error as Error>::duplicate_field(\n                                    \"nanos_since_epoch\",\n                                ));\n                            }\n                            nanos = Some(tri!(map.next_value()));\n                        }\n                    }\n                }\n                let secs = match secs {\n                    Some(secs) => secs,\n                    None => return Err(<A::Error as Error>::missing_field(\"secs_since_epoch\")),\n                };\n                let nanos = match nanos {\n                    Some(nanos) => nanos,\n                    None => return Err(<A::Error as Error>::missing_field(\"nanos_since_epoch\")),\n                };\n                tri!(check_overflow(secs, nanos));\n                Ok(Duration::new(secs, nanos))\n            }\n        }\n\n        const FIELDS: &[&str] = &[\"secs_since_epoch\", \"nanos_since_epoch\"];\n        let duration = tri!(deserializer.deserialize_struct(\"SystemTime\", FIELDS, DurationVisitor));\n        UNIX_EPOCH\n            .checked_add(duration)\n            .ok_or_else(|| D::Error::custom(\"overflow deserializing SystemTime\"))\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n// Similar to:\n//\n//     #[derive(Deserialize)]\n//     #[serde(deny_unknown_fields)]\n//     struct Range<Idx> {\n//         start: Idx,\n//         end: Idx,\n//     }\nimpl<'de, Idx> Deserialize<'de> for Range<Idx>\nwhere\n    Idx: Deserialize<'de>,\n{\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        let (start, end) = tri!(deserializer.deserialize_struct(\n            \"Range\",\n            range::FIELDS,\n            range::RangeVisitor {\n                expecting: \"struct Range\",\n                phantom: PhantomData,\n            },\n        ));\n        Ok(start..end)\n    }\n}\n\nimpl<'de, Idx> Deserialize<'de> for RangeInclusive<Idx>\nwhere\n    Idx: Deserialize<'de>,\n{\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        let (start, end) = tri!(deserializer.deserialize_struct(\n            \"RangeInclusive\",\n            range::FIELDS,\n            range::RangeVisitor {\n                expecting: \"struct RangeInclusive\",\n                phantom: PhantomData,\n            },\n        ));\n        Ok(RangeInclusive::new(start, end))\n    }\n}\n\nmod range {\n    use crate::lib::*;\n\n    use crate::de::{Deserialize, Deserializer, Error, MapAccess, SeqAccess, Visitor};\n    use crate::private;\n\n    pub const FIELDS: &[&str] = &[\"start\", \"end\"];\n\n    // If this were outside of the serde crate, it would just use:\n    //\n    //    #[derive(Deserialize)]\n    //    #[serde(field_identifier, rename_all = \"lowercase\")]\n    enum Field {\n        Start,\n        End,\n    }\n\n    impl<'de> Deserialize<'de> for Field {\n        fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n        where\n            D: Deserializer<'de>,\n        {\n            struct FieldVisitor;\n\n            impl<'de> Visitor<'de> for FieldVisitor {\n                type Value = Field;\n\n                fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n                    formatter.write_str(\"`start` or `end`\")\n                }\n\n                fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>\n                where\n                    E: Error,\n                {\n                    match value {\n                        \"start\" => Ok(Field::Start),\n                        \"end\" => Ok(Field::End),\n                        _ => Err(Error::unknown_field(value, FIELDS)),\n                    }\n                }\n\n                fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E>\n                where\n                    E: Error,\n                {\n                    match value {\n                        b\"start\" => Ok(Field::Start),\n                        b\"end\" => Ok(Field::End),\n                        _ => {\n                            let value = private::string::from_utf8_lossy(value);\n                            Err(Error::unknown_field(&*value, FIELDS))\n                        }\n                    }\n                }\n            }\n\n            deserializer.deserialize_identifier(FieldVisitor)\n        }\n    }\n\n    pub struct RangeVisitor<Idx> {\n        pub expecting: &'static str,\n        pub phantom: PhantomData<Idx>,\n    }\n\n    impl<'de, Idx> Visitor<'de> for RangeVisitor<Idx>\n    where\n        Idx: Deserialize<'de>,\n    {\n        type Value = (Idx, Idx);\n\n        fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n            formatter.write_str(self.expecting)\n        }\n\n        fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>\n        where\n            A: SeqAccess<'de>,\n        {\n            let start: Idx = match tri!(seq.next_element()) {\n                Some(value) => value,\n                None => {\n                    return Err(Error::invalid_length(0, &self));\n                }\n            };\n            let end: Idx = match tri!(seq.next_element()) {\n                Some(value) => value,\n                None => {\n                    return Err(Error::invalid_length(1, &self));\n                }\n            };\n            Ok((start, end))\n        }\n\n        fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>\n        where\n            A: MapAccess<'de>,\n        {\n            let mut start: Option<Idx> = None;\n            let mut end: Option<Idx> = None;\n            while let Some(key) = tri!(map.next_key()) {\n                match key {\n                    Field::Start => {\n                        if start.is_some() {\n                            return Err(<A::Error as Error>::duplicate_field(\"start\"));\n                        }\n                        start = Some(tri!(map.next_value()));\n                    }\n                    Field::End => {\n                        if end.is_some() {\n                            return Err(<A::Error as Error>::duplicate_field(\"end\"));\n                        }\n                        end = Some(tri!(map.next_value()));\n                    }\n                }\n            }\n            let start = match start {\n                Some(start) => start,\n                None => return Err(<A::Error as Error>::missing_field(\"start\")),\n            };\n            let end = match end {\n                Some(end) => end,\n                None => return Err(<A::Error as Error>::missing_field(\"end\")),\n            };\n            Ok((start, end))\n        }\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n// Similar to:\n//\n//     #[derive(Deserialize)]\n//     #[serde(deny_unknown_fields)]\n//     struct RangeFrom<Idx> {\n//         start: Idx,\n//     }\nimpl<'de, Idx> Deserialize<'de> for RangeFrom<Idx>\nwhere\n    Idx: Deserialize<'de>,\n{\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        let start = tri!(deserializer.deserialize_struct(\n            \"RangeFrom\",\n            range_from::FIELDS,\n            range_from::RangeFromVisitor {\n                expecting: \"struct RangeFrom\",\n                phantom: PhantomData,\n            },\n        ));\n        Ok(start..)\n    }\n}\n\nmod range_from {\n    use crate::lib::*;\n\n    use crate::de::{Deserialize, Deserializer, Error, MapAccess, SeqAccess, Visitor};\n    use crate::private;\n\n    pub const FIELDS: &[&str] = &[\"start\"];\n\n    // If this were outside of the serde crate, it would just use:\n    //\n    //    #[derive(Deserialize)]\n    //    #[serde(field_identifier, rename_all = \"lowercase\")]\n    enum Field {\n        Start,\n    }\n\n    impl<'de> Deserialize<'de> for Field {\n        fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n        where\n            D: Deserializer<'de>,\n        {\n            struct FieldVisitor;\n\n            impl<'de> Visitor<'de> for FieldVisitor {\n                type Value = Field;\n\n                fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n                    formatter.write_str(\"`start`\")\n                }\n\n                fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>\n                where\n                    E: Error,\n                {\n                    match value {\n                        \"start\" => Ok(Field::Start),\n                        _ => Err(Error::unknown_field(value, FIELDS)),\n                    }\n                }\n\n                fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E>\n                where\n                    E: Error,\n                {\n                    match value {\n                        b\"start\" => Ok(Field::Start),\n                        _ => {\n                            let value = private::string::from_utf8_lossy(value);\n                            Err(Error::unknown_field(&*value, FIELDS))\n                        }\n                    }\n                }\n            }\n\n            deserializer.deserialize_identifier(FieldVisitor)\n        }\n    }\n\n    pub struct RangeFromVisitor<Idx> {\n        pub expecting: &'static str,\n        pub phantom: PhantomData<Idx>,\n    }\n\n    impl<'de, Idx> Visitor<'de> for RangeFromVisitor<Idx>\n    where\n        Idx: Deserialize<'de>,\n    {\n        type Value = Idx;\n\n        fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n            formatter.write_str(self.expecting)\n        }\n\n        fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>\n        where\n            A: SeqAccess<'de>,\n        {\n            let start: Idx = match tri!(seq.next_element()) {\n                Some(value) => value,\n                None => {\n                    return Err(Error::invalid_length(0, &self));\n                }\n            };\n            Ok(start)\n        }\n\n        fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>\n        where\n            A: MapAccess<'de>,\n        {\n            let mut start: Option<Idx> = None;\n            while let Some(key) = tri!(map.next_key()) {\n                match key {\n                    Field::Start => {\n                        if start.is_some() {\n                            return Err(<A::Error as Error>::duplicate_field(\"start\"));\n                        }\n                        start = Some(tri!(map.next_value()));\n                    }\n                }\n            }\n            let start = match start {\n                Some(start) => start,\n                None => return Err(<A::Error as Error>::missing_field(\"start\")),\n            };\n            Ok(start)\n        }\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n// Similar to:\n//\n//     #[derive(Deserialize)]\n//     #[serde(deny_unknown_fields)]\n//     struct RangeTo<Idx> {\n//         end: Idx,\n//     }\nimpl<'de, Idx> Deserialize<'de> for RangeTo<Idx>\nwhere\n    Idx: Deserialize<'de>,\n{\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        let end = tri!(deserializer.deserialize_struct(\n            \"RangeTo\",\n            range_to::FIELDS,\n            range_to::RangeToVisitor {\n                expecting: \"struct RangeTo\",\n                phantom: PhantomData,\n            },\n        ));\n        Ok(..end)\n    }\n}\n\nmod range_to {\n    use crate::lib::*;\n\n    use crate::de::{Deserialize, Deserializer, Error, MapAccess, SeqAccess, Visitor};\n    use crate::private;\n\n    pub const FIELDS: &[&str] = &[\"end\"];\n\n    // If this were outside of the serde crate, it would just use:\n    //\n    //    #[derive(Deserialize)]\n    //    #[serde(field_identifier, rename_all = \"lowercase\")]\n    enum Field {\n        End,\n    }\n\n    impl<'de> Deserialize<'de> for Field {\n        fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n        where\n            D: Deserializer<'de>,\n        {\n            struct FieldVisitor;\n\n            impl<'de> Visitor<'de> for FieldVisitor {\n                type Value = Field;\n\n                fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n                    formatter.write_str(\"`end`\")\n                }\n\n                fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>\n                where\n                    E: Error,\n                {\n                    match value {\n                        \"end\" => Ok(Field::End),\n                        _ => Err(Error::unknown_field(value, FIELDS)),\n                    }\n                }\n\n                fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E>\n                where\n                    E: Error,\n                {\n                    match value {\n                        b\"end\" => Ok(Field::End),\n                        _ => {\n                            let value = private::string::from_utf8_lossy(value);\n                            Err(Error::unknown_field(&*value, FIELDS))\n                        }\n                    }\n                }\n            }\n\n            deserializer.deserialize_identifier(FieldVisitor)\n        }\n    }\n\n    pub struct RangeToVisitor<Idx> {\n        pub expecting: &'static str,\n        pub phantom: PhantomData<Idx>,\n    }\n\n    impl<'de, Idx> Visitor<'de> for RangeToVisitor<Idx>\n    where\n        Idx: Deserialize<'de>,\n    {\n        type Value = Idx;\n\n        fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n            formatter.write_str(self.expecting)\n        }\n\n        fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>\n        where\n            A: SeqAccess<'de>,\n        {\n            let end: Idx = match tri!(seq.next_element()) {\n                Some(value) => value,\n                None => {\n                    return Err(Error::invalid_length(0, &self));\n                }\n            };\n            Ok(end)\n        }\n\n        fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>\n        where\n            A: MapAccess<'de>,\n        {\n            let mut end: Option<Idx> = None;\n            while let Some(key) = tri!(map.next_key()) {\n                match key {\n                    Field::End => {\n                        if end.is_some() {\n                            return Err(<A::Error as Error>::duplicate_field(\"end\"));\n                        }\n                        end = Some(tri!(map.next_value()));\n                    }\n                }\n            }\n            let end = match end {\n                Some(end) => end,\n                None => return Err(<A::Error as Error>::missing_field(\"end\")),\n            };\n            Ok(end)\n        }\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nimpl<'de, T> Deserialize<'de> for Bound<T>\nwhere\n    T: Deserialize<'de>,\n{\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        enum Field {\n            Unbounded,\n            Included,\n            Excluded,\n        }\n\n        impl<'de> Deserialize<'de> for Field {\n            #[inline]\n            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n            where\n                D: Deserializer<'de>,\n            {\n                struct FieldVisitor;\n\n                impl<'de> Visitor<'de> for FieldVisitor {\n                    type Value = Field;\n\n                    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n                        formatter.write_str(\"`Unbounded`, `Included` or `Excluded`\")\n                    }\n\n                    fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E>\n                    where\n                        E: Error,\n                    {\n                        match value {\n                            0 => Ok(Field::Unbounded),\n                            1 => Ok(Field::Included),\n                            2 => Ok(Field::Excluded),\n                            _ => Err(Error::invalid_value(Unexpected::Unsigned(value), &self)),\n                        }\n                    }\n\n                    fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>\n                    where\n                        E: Error,\n                    {\n                        match value {\n                            \"Unbounded\" => Ok(Field::Unbounded),\n                            \"Included\" => Ok(Field::Included),\n                            \"Excluded\" => Ok(Field::Excluded),\n                            _ => Err(Error::unknown_variant(value, VARIANTS)),\n                        }\n                    }\n\n                    fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E>\n                    where\n                        E: Error,\n                    {\n                        match value {\n                            b\"Unbounded\" => Ok(Field::Unbounded),\n                            b\"Included\" => Ok(Field::Included),\n                            b\"Excluded\" => Ok(Field::Excluded),\n                            _ => match str::from_utf8(value) {\n                                Ok(value) => Err(Error::unknown_variant(value, VARIANTS)),\n                                Err(_) => {\n                                    Err(Error::invalid_value(Unexpected::Bytes(value), &self))\n                                }\n                            },\n                        }\n                    }\n                }\n\n                deserializer.deserialize_identifier(FieldVisitor)\n            }\n        }\n\n        struct BoundVisitor<T>(PhantomData<Bound<T>>);\n\n        impl<'de, T> Visitor<'de> for BoundVisitor<T>\n        where\n            T: Deserialize<'de>,\n        {\n            type Value = Bound<T>;\n\n            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n                formatter.write_str(\"enum Bound\")\n            }\n\n            fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error>\n            where\n                A: EnumAccess<'de>,\n            {\n                match tri!(data.variant()) {\n                    (Field::Unbounded, v) => v.unit_variant().map(|()| Bound::Unbounded),\n                    (Field::Included, v) => v.newtype_variant().map(Bound::Included),\n                    (Field::Excluded, v) => v.newtype_variant().map(Bound::Excluded),\n                }\n            }\n        }\n\n        const VARIANTS: &[&str] = &[\"Unbounded\", \"Included\", \"Excluded\"];\n\n        deserializer.deserialize_enum(\"Bound\", VARIANTS, BoundVisitor(PhantomData))\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n#[cfg(feature = \"result\")]\n#[cfg_attr(docsrs, doc(cfg(feature = \"result\")))]\nimpl<'de, T, E> Deserialize<'de> for Result<T, E>\nwhere\n    T: Deserialize<'de>,\n    E: Deserialize<'de>,\n{\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        // If this were outside of the serde crate, it would just use:\n        //\n        //    #[derive(Deserialize)]\n        //    #[serde(variant_identifier)]\n        enum Field {\n            Ok,\n            Err,\n        }\n\n        impl<'de> Deserialize<'de> for Field {\n            #[inline]\n            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n            where\n                D: Deserializer<'de>,\n            {\n                struct FieldVisitor;\n\n                impl<'de> Visitor<'de> for FieldVisitor {\n                    type Value = Field;\n\n                    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n                        formatter.write_str(\"`Ok` or `Err`\")\n                    }\n\n                    fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E>\n                    where\n                        E: Error,\n                    {\n                        match value {\n                            0 => Ok(Field::Ok),\n                            1 => Ok(Field::Err),\n                            _ => Err(Error::invalid_value(Unexpected::Unsigned(value), &self)),\n                        }\n                    }\n\n                    fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>\n                    where\n                        E: Error,\n                    {\n                        match value {\n                            \"Ok\" => Ok(Field::Ok),\n                            \"Err\" => Ok(Field::Err),\n                            _ => Err(Error::unknown_variant(value, VARIANTS)),\n                        }\n                    }\n\n                    fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E>\n                    where\n                        E: Error,\n                    {\n                        match value {\n                            b\"Ok\" => Ok(Field::Ok),\n                            b\"Err\" => Ok(Field::Err),\n                            _ => match str::from_utf8(value) {\n                                Ok(value) => Err(Error::unknown_variant(value, VARIANTS)),\n                                Err(_) => {\n                                    Err(Error::invalid_value(Unexpected::Bytes(value), &self))\n                                }\n                            },\n                        }\n                    }\n                }\n\n                deserializer.deserialize_identifier(FieldVisitor)\n            }\n        }\n\n        struct ResultVisitor<T, E>(PhantomData<Result<T, E>>);\n\n        impl<'de, T, E> Visitor<'de> for ResultVisitor<T, E>\n        where\n            T: Deserialize<'de>,\n            E: Deserialize<'de>,\n        {\n            type Value = Result<T, E>;\n\n            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n                formatter.write_str(\"enum Result\")\n            }\n\n            fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error>\n            where\n                A: EnumAccess<'de>,\n            {\n                match tri!(data.variant()) {\n                    (Field::Ok, v) => v.newtype_variant().map(Ok),\n                    (Field::Err, v) => v.newtype_variant().map(Err),\n                }\n            }\n        }\n\n        const VARIANTS: &[&str] = &[\"Ok\", \"Err\"];\n\n        deserializer.deserialize_enum(\"Result\", VARIANTS, ResultVisitor(PhantomData))\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nimpl<'de, T> Deserialize<'de> for Wrapping<T>\nwhere\n    T: Deserialize<'de>,\n{\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        Deserialize::deserialize(deserializer).map(Wrapping)\n    }\n}\n\n#[cfg(all(feature = \"std\", not(no_std_atomic)))]\nmacro_rules! atomic_impl {\n    ($($ty:ident $size:expr)*) => {\n        $(\n            #[cfg(any(no_target_has_atomic, target_has_atomic = $size))]\n            #[cfg_attr(docsrs, doc(cfg(all(feature = \"std\", target_has_atomic = $size))))]\n            impl<'de> Deserialize<'de> for $ty {\n                fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n                where\n                    D: Deserializer<'de>,\n                {\n                    Deserialize::deserialize(deserializer).map(Self::new)\n                }\n            }\n        )*\n    };\n}\n\n#[cfg(all(feature = \"std\", not(no_std_atomic)))]\natomic_impl! {\n    AtomicBool \"8\"\n    AtomicI8 \"8\"\n    AtomicI16 \"16\"\n    AtomicI32 \"32\"\n    AtomicIsize \"ptr\"\n    AtomicU8 \"8\"\n    AtomicU16 \"16\"\n    AtomicU32 \"32\"\n    AtomicUsize \"ptr\"\n}\n\n#[cfg(all(feature = \"std\", not(no_std_atomic64)))]\natomic_impl! {\n    AtomicI64 \"64\"\n    AtomicU64 \"64\"\n}\n\n#[cfg(any(feature = \"std\", not(no_core_net)))]\nstruct FromStrVisitor<T> {\n    expecting: &'static str,\n    ty: PhantomData<T>,\n}\n\n#[cfg(any(feature = \"std\", not(no_core_net)))]\nimpl<T> FromStrVisitor<T> {\n    fn new(expecting: &'static str) -> Self {\n        FromStrVisitor {\n            expecting,\n            ty: PhantomData,\n        }\n    }\n}\n\n#[cfg(any(feature = \"std\", not(no_core_net)))]\nimpl<'de, T> Visitor<'de> for FromStrVisitor<T>\nwhere\n    T: str::FromStr,\n    T::Err: fmt::Display,\n{\n    type Value = T;\n\n    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter.write_str(self.expecting)\n    }\n\n    fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        s.parse().map_err(Error::custom)\n    }\n}\n"
  },
  {
    "path": "serde_core/src/de/mod.rs",
    "content": "//! Generic data structure deserialization framework.\n//!\n//! The two most important traits in this module are [`Deserialize`] and\n//! [`Deserializer`].\n//!\n//!  - **A type that implements `Deserialize` is a data structure** that can be\n//!    deserialized from any data format supported by Serde, and conversely\n//!  - **A type that implements `Deserializer` is a data format** that can\n//!    deserialize any data structure supported by Serde.\n//!\n//! # The Deserialize trait\n//!\n//! Serde provides [`Deserialize`] implementations for many Rust primitive and\n//! standard library types. The complete list is below. All of these can be\n//! deserialized using Serde out of the box.\n//!\n//! Additionally, Serde provides a procedural macro called [`serde_derive`] to\n//! automatically generate [`Deserialize`] implementations for structs and enums\n//! in your program. See the [derive section of the manual] for how to use this.\n//!\n//! In rare cases it may be necessary to implement [`Deserialize`] manually for\n//! some type in your program. See the [Implementing `Deserialize`] section of\n//! the manual for more about this.\n//!\n//! Third-party crates may provide [`Deserialize`] implementations for types\n//! that they expose. For example the [`linked-hash-map`] crate provides a\n//! [`LinkedHashMap<K, V>`] type that is deserializable by Serde because the\n//! crate provides an implementation of [`Deserialize`] for it.\n//!\n//! # The Deserializer trait\n//!\n//! [`Deserializer`] implementations are provided by third-party crates, for\n//! example [`serde_json`], [`serde_yaml`] and [`postcard`].\n//!\n//! A partial list of well-maintained formats is given on the [Serde\n//! website][data formats].\n//!\n//! # Implementations of Deserialize provided by Serde\n//!\n//! This is a slightly different set of types than what is supported for\n//! serialization. Some types can be serialized by Serde but not deserialized.\n//! One example is `OsStr`.\n//!\n//!  - **Primitive types**:\n//!    - bool\n//!    - i8, i16, i32, i64, i128, isize\n//!    - u8, u16, u32, u64, u128, usize\n//!    - f32, f64\n//!    - char\n//!  - **Compound types**:\n//!    - \\[T; 0\\] through \\[T; 32\\]\n//!    - tuples up to size 16\n//!  - **Common standard library types**:\n//!    - String\n//!    - Option\\<T\\>\n//!    - Result\\<T, E\\>\n//!    - PhantomData\\<T\\>\n//!  - **Wrapper types**:\n//!    - Box\\<T\\>\n//!    - Box\\<\\[T\\]\\>\n//!    - Box\\<str\\>\n//!    - Cow\\<'a, T\\>\n//!    - Cell\\<T\\>\n//!    - RefCell\\<T\\>\n//!    - Mutex\\<T\\>\n//!    - RwLock\\<T\\>\n//!    - Rc\\<T\\>&emsp;*(if* features = \\[\"rc\"\\] *is enabled)*\n//!    - Arc\\<T\\>&emsp;*(if* features = \\[\"rc\"\\] *is enabled)*\n//!  - **Collection types**:\n//!    - BTreeMap\\<K, V\\>\n//!    - BTreeSet\\<T\\>\n//!    - BinaryHeap\\<T\\>\n//!    - HashMap\\<K, V, H\\>\n//!    - HashSet\\<T, H\\>\n//!    - LinkedList\\<T\\>\n//!    - VecDeque\\<T\\>\n//!    - Vec\\<T\\>\n//!  - **Zero-copy types**:\n//!    - &str\n//!    - &\\[u8\\]\n//!  - **FFI types**:\n//!    - CString\n//!    - Box\\<CStr\\>\n//!    - OsString\n//!  - **Miscellaneous standard library types**:\n//!    - Duration\n//!    - SystemTime\n//!    - Path\n//!    - PathBuf\n//!    - Range\\<T\\>\n//!    - RangeInclusive\\<T\\>\n//!    - Bound\\<T\\>\n//!    - num::NonZero*\n//!    - `!` *(unstable)*\n//!  - **Net types**:\n//!    - IpAddr\n//!    - Ipv4Addr\n//!    - Ipv6Addr\n//!    - SocketAddr\n//!    - SocketAddrV4\n//!    - SocketAddrV6\n//!\n//! [Implementing `Deserialize`]: https://serde.rs/impl-deserialize.html\n//! [`Deserialize`]: crate::Deserialize\n//! [`Deserializer`]: crate::Deserializer\n//! [`LinkedHashMap<K, V>`]: https://docs.rs/linked-hash-map/*/linked_hash_map/struct.LinkedHashMap.html\n//! [`postcard`]: https://github.com/jamesmunns/postcard\n//! [`linked-hash-map`]: https://crates.io/crates/linked-hash-map\n//! [`serde_derive`]: https://crates.io/crates/serde_derive\n//! [`serde_json`]: https://github.com/serde-rs/json\n//! [`serde_yaml`]: https://github.com/dtolnay/serde-yaml\n//! [derive section of the manual]: https://serde.rs/derive.html\n//! [data formats]: https://serde.rs/#data-formats\n\nuse crate::lib::*;\n\n////////////////////////////////////////////////////////////////////////////////\n\npub mod value;\n\nmod ignored_any;\nmod impls;\n\npub use self::ignored_any::IgnoredAny;\n#[cfg(all(not(feature = \"std\"), no_core_error))]\n#[doc(no_inline)]\npub use crate::std_error::Error as StdError;\n#[cfg(not(any(feature = \"std\", no_core_error)))]\n#[doc(no_inline)]\npub use core::error::Error as StdError;\n#[cfg(feature = \"std\")]\n#[doc(no_inline)]\npub use std::error::Error as StdError;\n\n////////////////////////////////////////////////////////////////////////////////\n\nmacro_rules! declare_error_trait {\n    (Error: Sized $(+ $($supertrait:ident)::+)*) => {\n        /// The `Error` trait allows `Deserialize` implementations to create descriptive\n        /// error messages belonging to the `Deserializer` against which they are\n        /// currently running.\n        ///\n        /// Every `Deserializer` declares an `Error` type that encompasses both\n        /// general-purpose deserialization errors as well as errors specific to the\n        /// particular deserialization format. For example the `Error` type of\n        /// `serde_json` can represent errors like an invalid JSON escape sequence or an\n        /// unterminated string literal, in addition to the error cases that are part of\n        /// this trait.\n        ///\n        /// Most deserializers should only need to provide the `Error::custom` method\n        /// and inherit the default behavior for the other methods.\n        ///\n        /// # Example implementation\n        ///\n        /// The [example data format] presented on the website shows an error\n        /// type appropriate for a basic JSON data format.\n        ///\n        /// [example data format]: https://serde.rs/data-format.html\n        #[cfg_attr(\n            not(no_diagnostic_namespace),\n            diagnostic::on_unimplemented(\n                message = \"the trait bound `{Self}: serde::de::Error` is not satisfied\",\n            )\n        )]\n        pub trait Error: Sized $(+ $($supertrait)::+)* {\n            /// Raised when there is general error when deserializing a type.\n            ///\n            /// The message should not be capitalized and should not end with a period.\n            ///\n            /// ```edition2021\n            /// # use std::str::FromStr;\n            /// #\n            /// # struct IpAddr;\n            /// #\n            /// # impl FromStr for IpAddr {\n            /// #     type Err = String;\n            /// #\n            /// #     fn from_str(_: &str) -> Result<Self, String> {\n            /// #         unimplemented!()\n            /// #     }\n            /// # }\n            /// #\n            /// use serde::de::{self, Deserialize, Deserializer};\n            ///\n            /// impl<'de> Deserialize<'de> for IpAddr {\n            ///     fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n            ///     where\n            ///         D: Deserializer<'de>,\n            ///     {\n            ///         let s = String::deserialize(deserializer)?;\n            ///         s.parse().map_err(de::Error::custom)\n            ///     }\n            /// }\n            /// ```\n            fn custom<T>(msg: T) -> Self\n            where\n                T: Display;\n\n            /// Raised when a `Deserialize` receives a type different from what it was\n            /// expecting.\n            ///\n            /// The `unexp` argument provides information about what type was received.\n            /// This is the type that was present in the input file or other source data\n            /// of the Deserializer.\n            ///\n            /// The `exp` argument provides information about what type was being\n            /// expected. This is the type that is written in the program.\n            ///\n            /// For example if we try to deserialize a String out of a JSON file\n            /// containing an integer, the unexpected type is the integer and the\n            /// expected type is the string.\n            #[cold]\n            fn invalid_type(unexp: Unexpected, exp: &dyn Expected) -> Self {\n                Error::custom(format_args!(\"invalid type: {}, expected {}\", unexp, exp))\n            }\n\n            /// Raised when a `Deserialize` receives a value of the right type but that\n            /// is wrong for some other reason.\n            ///\n            /// The `unexp` argument provides information about what value was received.\n            /// This is the value that was present in the input file or other source\n            /// data of the Deserializer.\n            ///\n            /// The `exp` argument provides information about what value was being\n            /// expected. This is the type that is written in the program.\n            ///\n            /// For example if we try to deserialize a String out of some binary data\n            /// that is not valid UTF-8, the unexpected value is the bytes and the\n            /// expected value is a string.\n            #[cold]\n            fn invalid_value(unexp: Unexpected, exp: &dyn Expected) -> Self {\n                Error::custom(format_args!(\"invalid value: {}, expected {}\", unexp, exp))\n            }\n\n            /// Raised when deserializing a sequence or map and the input data contains\n            /// too many or too few elements.\n            ///\n            /// The `len` argument is the number of elements encountered. The sequence\n            /// or map may have expected more arguments or fewer arguments.\n            ///\n            /// The `exp` argument provides information about what data was being\n            /// expected. For example `exp` might say that a tuple of size 6 was\n            /// expected.\n            #[cold]\n            fn invalid_length(len: usize, exp: &dyn Expected) -> Self {\n                Error::custom(format_args!(\"invalid length {}, expected {}\", len, exp))\n            }\n\n            /// Raised when a `Deserialize` enum type received a variant with an\n            /// unrecognized name.\n            #[cold]\n            fn unknown_variant(variant: &str, expected: &'static [&'static str]) -> Self {\n                if expected.is_empty() {\n                    Error::custom(format_args!(\n                        \"unknown variant `{}`, there are no variants\",\n                        variant\n                    ))\n                } else {\n                    Error::custom(format_args!(\n                        \"unknown variant `{}`, expected {}\",\n                        variant,\n                        OneOf { names: expected }\n                    ))\n                }\n            }\n\n            /// Raised when a `Deserialize` struct type received a field with an\n            /// unrecognized name.\n            #[cold]\n            fn unknown_field(field: &str, expected: &'static [&'static str]) -> Self {\n                if expected.is_empty() {\n                    Error::custom(format_args!(\n                        \"unknown field `{}`, there are no fields\",\n                        field\n                    ))\n                } else {\n                    Error::custom(format_args!(\n                        \"unknown field `{}`, expected {}\",\n                        field,\n                        OneOf { names: expected }\n                    ))\n                }\n            }\n\n            /// Raised when a `Deserialize` struct type expected to receive a required\n            /// field with a particular name but that field was not present in the\n            /// input.\n            #[cold]\n            fn missing_field(field: &'static str) -> Self {\n                Error::custom(format_args!(\"missing field `{}`\", field))\n            }\n\n            /// Raised when a `Deserialize` struct type received more than one of the\n            /// same field.\n            #[cold]\n            fn duplicate_field(field: &'static str) -> Self {\n                Error::custom(format_args!(\"duplicate field `{}`\", field))\n            }\n        }\n    }\n}\n\n#[cfg(feature = \"std\")]\ndeclare_error_trait!(Error: Sized + StdError);\n\n#[cfg(not(feature = \"std\"))]\ndeclare_error_trait!(Error: Sized + Debug + Display);\n\n/// `Unexpected` represents an unexpected invocation of any one of the `Visitor`\n/// trait methods.\n///\n/// This is used as an argument to the `invalid_type`, `invalid_value`, and\n/// `invalid_length` methods of the `Error` trait to build error messages.\n///\n/// ```edition2021\n/// # use std::fmt;\n/// #\n/// # use serde::de::{self, Unexpected, Visitor};\n/// #\n/// # struct Example;\n/// #\n/// # impl<'de> Visitor<'de> for Example {\n/// #     type Value = ();\n/// #\n/// #     fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n/// #         write!(formatter, \"definitely not a boolean\")\n/// #     }\n/// #\n/// fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>\n/// where\n///     E: de::Error,\n/// {\n///     Err(de::Error::invalid_type(Unexpected::Bool(v), &self))\n/// }\n/// # }\n/// ```\n#[derive(Copy, Clone, PartialEq, Debug)]\npub enum Unexpected<'a> {\n    /// The input contained a boolean value that was not expected.\n    Bool(bool),\n\n    /// The input contained an unsigned integer `u8`, `u16`, `u32` or `u64` that\n    /// was not expected.\n    Unsigned(u64),\n\n    /// The input contained a signed integer `i8`, `i16`, `i32` or `i64` that\n    /// was not expected.\n    Signed(i64),\n\n    /// The input contained a floating point `f32` or `f64` that was not\n    /// expected.\n    Float(f64),\n\n    /// The input contained a `char` that was not expected.\n    Char(char),\n\n    /// The input contained a `&str` or `String` that was not expected.\n    Str(&'a str),\n\n    /// The input contained a `&[u8]` or `Vec<u8>` that was not expected.\n    Bytes(&'a [u8]),\n\n    /// The input contained a unit `()` that was not expected.\n    Unit,\n\n    /// The input contained an `Option<T>` that was not expected.\n    Option,\n\n    /// The input contained a newtype struct that was not expected.\n    NewtypeStruct,\n\n    /// The input contained a sequence that was not expected.\n    Seq,\n\n    /// The input contained a map that was not expected.\n    Map,\n\n    /// The input contained an enum that was not expected.\n    Enum,\n\n    /// The input contained a unit variant that was not expected.\n    UnitVariant,\n\n    /// The input contained a newtype variant that was not expected.\n    NewtypeVariant,\n\n    /// The input contained a tuple variant that was not expected.\n    TupleVariant,\n\n    /// The input contained a struct variant that was not expected.\n    StructVariant,\n\n    /// A message stating what uncategorized thing the input contained that was\n    /// not expected.\n    ///\n    /// The message should be a noun or noun phrase, not capitalized and without\n    /// a period. An example message is \"unoriginal superhero\".\n    Other(&'a str),\n}\n\nimpl<'a> fmt::Display for Unexpected<'a> {\n    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        use self::Unexpected::*;\n        match *self {\n            Bool(b) => write!(formatter, \"boolean `{}`\", b),\n            Unsigned(i) => write!(formatter, \"integer `{}`\", i),\n            Signed(i) => write!(formatter, \"integer `{}`\", i),\n            Float(f) => write!(formatter, \"floating point `{}`\", WithDecimalPoint(f)),\n            Char(c) => write!(formatter, \"character `{}`\", c),\n            Str(s) => write!(formatter, \"string {:?}\", s),\n            Bytes(_) => formatter.write_str(\"byte array\"),\n            Unit => formatter.write_str(\"unit value\"),\n            Option => formatter.write_str(\"Option value\"),\n            NewtypeStruct => formatter.write_str(\"newtype struct\"),\n            Seq => formatter.write_str(\"sequence\"),\n            Map => formatter.write_str(\"map\"),\n            Enum => formatter.write_str(\"enum\"),\n            UnitVariant => formatter.write_str(\"unit variant\"),\n            NewtypeVariant => formatter.write_str(\"newtype variant\"),\n            TupleVariant => formatter.write_str(\"tuple variant\"),\n            StructVariant => formatter.write_str(\"struct variant\"),\n            Other(other) => formatter.write_str(other),\n        }\n    }\n}\n\n/// `Expected` represents an explanation of what data a `Visitor` was expecting\n/// to receive.\n///\n/// This is used as an argument to the `invalid_type`, `invalid_value`, and\n/// `invalid_length` methods of the `Error` trait to build error messages. The\n/// message should be a noun or noun phrase that completes the sentence \"This\n/// Visitor expects to receive ...\", for example the message could be \"an\n/// integer between 0 and 64\". The message should not be capitalized and should\n/// not end with a period.\n///\n/// Within the context of a `Visitor` implementation, the `Visitor` itself\n/// (`&self`) is an implementation of this trait.\n///\n/// ```edition2021\n/// # use serde::de::{self, Unexpected, Visitor};\n/// # use std::fmt;\n/// #\n/// # struct Example;\n/// #\n/// # impl<'de> Visitor<'de> for Example {\n/// #     type Value = ();\n/// #\n/// #     fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n/// #         write!(formatter, \"definitely not a boolean\")\n/// #     }\n/// #\n/// fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>\n/// where\n///     E: de::Error,\n/// {\n///     Err(de::Error::invalid_type(Unexpected::Bool(v), &self))\n/// }\n/// # }\n/// ```\n///\n/// Outside of a `Visitor`, `&\"...\"` can be used.\n///\n/// ```edition2021\n/// # use serde::de::{self, Unexpected};\n/// #\n/// # fn example<E>() -> Result<(), E>\n/// # where\n/// #     E: de::Error,\n/// # {\n/// #     let v = true;\n/// return Err(de::Error::invalid_type(\n///     Unexpected::Bool(v),\n///     &\"a negative integer\",\n/// ));\n/// # }\n/// ```\n#[cfg_attr(\n    not(no_diagnostic_namespace),\n    diagnostic::on_unimplemented(\n        message = \"the trait bound `{Self}: serde::de::Expected` is not satisfied\",\n    )\n)]\npub trait Expected {\n    /// Format an explanation of what data was being expected. Same signature as\n    /// the `Display` and `Debug` traits.\n    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result;\n}\n\nimpl<'de, T> Expected for T\nwhere\n    T: Visitor<'de>,\n{\n    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        self.expecting(formatter)\n    }\n}\n\nimpl Expected for &str {\n    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter.write_str(self)\n    }\n}\n\nimpl Display for dyn Expected + '_ {\n    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        Expected::fmt(self, formatter)\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/// A **data structure** that can be deserialized from any data format supported\n/// by Serde.\n///\n/// Serde provides `Deserialize` implementations for many Rust primitive and\n/// standard library types. The complete list is [here][crate::de]. All of these\n/// can be deserialized using Serde out of the box.\n///\n/// Additionally, Serde provides a procedural macro called `serde_derive` to\n/// automatically generate `Deserialize` implementations for structs and enums\n/// in your program. See the [derive section of the manual][derive] for how to\n/// use this.\n///\n/// In rare cases it may be necessary to implement `Deserialize` manually for\n/// some type in your program. See the [Implementing\n/// `Deserialize`][impl-deserialize] section of the manual for more about this.\n///\n/// Third-party crates may provide `Deserialize` implementations for types that\n/// they expose. For example the `linked-hash-map` crate provides a\n/// `LinkedHashMap<K, V>` type that is deserializable by Serde because the crate\n/// provides an implementation of `Deserialize` for it.\n///\n/// [derive]: https://serde.rs/derive.html\n/// [impl-deserialize]: https://serde.rs/impl-deserialize.html\n///\n/// # Lifetime\n///\n/// The `'de` lifetime of this trait is the lifetime of data that may be\n/// borrowed by `Self` when deserialized. See the page [Understanding\n/// deserializer lifetimes] for a more detailed explanation of these lifetimes.\n///\n/// [Understanding deserializer lifetimes]: https://serde.rs/lifetimes.html\n#[cfg_attr(\n    not(no_diagnostic_namespace),\n    diagnostic::on_unimplemented(\n        // Prevents `serde_core::de::Deserialize` appearing in the error message\n        // in projects with no direct dependency on serde_core.\n        message = \"the trait bound `{Self}: serde::Deserialize<'de>` is not satisfied\",\n        note = \"for local types consider adding `#[derive(serde::Deserialize)]` to your `{Self}` type\",\n        note = \"for types from other crates check whether the crate offers a `serde` feature flag\",\n    )\n)]\npub trait Deserialize<'de>: Sized {\n    /// Deserialize this value from the given Serde deserializer.\n    ///\n    /// See the [Implementing `Deserialize`][impl-deserialize] section of the\n    /// manual for more information about how to implement this method.\n    ///\n    /// [impl-deserialize]: https://serde.rs/impl-deserialize.html\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>;\n\n    /// Deserializes a value into `self` from the given Deserializer.\n    ///\n    /// The purpose of this method is to allow the deserializer to reuse\n    /// resources and avoid copies. As such, if this method returns an error,\n    /// `self` will be in an indeterminate state where some parts of the struct\n    /// have been overwritten. Although whatever state that is will be\n    /// memory-safe.\n    ///\n    /// This is generally useful when repeatedly deserializing values that\n    /// are processed one at a time, where the value of `self` doesn't matter\n    /// when the next deserialization occurs.\n    ///\n    /// If you manually implement this, your recursive deserializations should\n    /// use `deserialize_in_place`.\n    ///\n    /// This method is stable and an official public API, but hidden from the\n    /// documentation because it is almost never what newbies are looking for.\n    /// Showing it in rustdoc would cause it to be featured more prominently\n    /// than it deserves.\n    #[doc(hidden)]\n    fn deserialize_in_place<D>(deserializer: D, place: &mut Self) -> Result<(), D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        // Default implementation just delegates to `deserialize` impl.\n        *place = tri!(Deserialize::deserialize(deserializer));\n        Ok(())\n    }\n}\n\n/// A data structure that can be deserialized without borrowing any data from\n/// the deserializer.\n///\n/// This is primarily useful for trait bounds on functions. For example a\n/// `from_str` function may be able to deserialize a data structure that borrows\n/// from the input string, but a `from_reader` function may only deserialize\n/// owned data.\n///\n/// ```edition2021\n/// # use serde::de::{Deserialize, DeserializeOwned};\n/// # use std::io::{Read, Result};\n/// #\n/// # trait Ignore {\n/// fn from_str<'a, T>(s: &'a str) -> Result<T>\n/// where\n///     T: Deserialize<'a>;\n///\n/// fn from_reader<R, T>(rdr: R) -> Result<T>\n/// where\n///     R: Read,\n///     T: DeserializeOwned;\n/// # }\n/// ```\n///\n/// # Lifetime\n///\n/// The relationship between `Deserialize` and `DeserializeOwned` in trait\n/// bounds is explained in more detail on the page [Understanding deserializer\n/// lifetimes].\n///\n/// [Understanding deserializer lifetimes]: https://serde.rs/lifetimes.html\n#[cfg_attr(\n    not(no_diagnostic_namespace),\n    diagnostic::on_unimplemented(\n        message = \"the trait bound `{Self}: serde::de::DeserializeOwned` is not satisfied\",\n    )\n)]\npub trait DeserializeOwned: for<'de> Deserialize<'de> {}\nimpl<T> DeserializeOwned for T where T: for<'de> Deserialize<'de> {}\n\n/// `DeserializeSeed` is the stateful form of the `Deserialize` trait. If you\n/// ever find yourself looking for a way to pass data into a `Deserialize` impl,\n/// this trait is the way to do it.\n///\n/// As one example of stateful deserialization consider deserializing a JSON\n/// array into an existing buffer. Using the `Deserialize` trait we could\n/// deserialize a JSON array into a `Vec<T>` but it would be a freshly allocated\n/// `Vec<T>`; there is no way for `Deserialize` to reuse a previously allocated\n/// buffer. Using `DeserializeSeed` instead makes this possible as in the\n/// example code below.\n///\n/// The canonical API for stateless deserialization looks like this:\n///\n/// ```edition2021\n/// # use serde::Deserialize;\n/// #\n/// # enum Error {}\n/// #\n/// fn func<'de, T: Deserialize<'de>>() -> Result<T, Error>\n/// # {\n/// #     unimplemented!()\n/// # }\n/// ```\n///\n/// Adjusting an API like this to support stateful deserialization is a matter\n/// of accepting a seed as input:\n///\n/// ```edition2021\n/// # use serde::de::DeserializeSeed;\n/// #\n/// # enum Error {}\n/// #\n/// fn func_seed<'de, T: DeserializeSeed<'de>>(seed: T) -> Result<T::Value, Error>\n/// # {\n/// #     let _ = seed;\n/// #     unimplemented!()\n/// # }\n/// ```\n///\n/// In practice the majority of deserialization is stateless. An API expecting a\n/// seed can be appeased by passing `std::marker::PhantomData` as a seed in the\n/// case of stateless deserialization.\n///\n/// # Lifetime\n///\n/// The `'de` lifetime of this trait is the lifetime of data that may be\n/// borrowed by `Self::Value` when deserialized. See the page [Understanding\n/// deserializer lifetimes] for a more detailed explanation of these lifetimes.\n///\n/// [Understanding deserializer lifetimes]: https://serde.rs/lifetimes.html\n///\n/// # Example\n///\n/// Suppose we have JSON that looks like `[[1, 2], [3, 4, 5], [6]]` and we need\n/// to deserialize it into a flat representation like `vec![1, 2, 3, 4, 5, 6]`.\n/// Allocating a brand new `Vec<T>` for each subarray would be slow. Instead we\n/// would like to allocate a single `Vec<T>` and then deserialize each subarray\n/// into it. This requires stateful deserialization using the `DeserializeSeed`\n/// trait.\n///\n/// ```edition2021\n/// use serde::de::{Deserialize, DeserializeSeed, Deserializer, SeqAccess, Visitor};\n/// use std::fmt;\n/// use std::marker::PhantomData;\n///\n/// // A DeserializeSeed implementation that uses stateful deserialization to\n/// // append array elements onto the end of an existing vector. The preexisting\n/// // state (\"seed\") in this case is the Vec<T>. The `deserialize` method of\n/// // `ExtendVec` will be traversing the inner arrays of the JSON input and\n/// // appending each integer into the existing Vec.\n/// struct ExtendVec<'a, T: 'a>(&'a mut Vec<T>);\n///\n/// impl<'de, 'a, T> DeserializeSeed<'de> for ExtendVec<'a, T>\n/// where\n///     T: Deserialize<'de>,\n/// {\n///     // The return type of the `deserialize` method. This implementation\n///     // appends onto an existing vector but does not create any new data\n///     // structure, so the return type is ().\n///     type Value = ();\n///\n///     fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>\n///     where\n///         D: Deserializer<'de>,\n///     {\n///         // Visitor implementation that will walk an inner array of the JSON\n///         // input.\n///         struct ExtendVecVisitor<'a, T: 'a>(&'a mut Vec<T>);\n///\n///         impl<'de, 'a, T> Visitor<'de> for ExtendVecVisitor<'a, T>\n///         where\n///             T: Deserialize<'de>,\n///         {\n///             type Value = ();\n///\n///             fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n///                 write!(formatter, \"an array of integers\")\n///             }\n///\n///             fn visit_seq<A>(self, mut seq: A) -> Result<(), A::Error>\n///             where\n///                 A: SeqAccess<'de>,\n///             {\n///                 // Decrease the number of reallocations if there are many elements\n///                 if let Some(size_hint) = seq.size_hint() {\n///                     self.0.reserve(size_hint);\n///                 }\n///\n///                 // Visit each element in the inner array and push it onto\n///                 // the existing vector.\n///                 while let Some(elem) = seq.next_element()? {\n///                     self.0.push(elem);\n///                 }\n///                 Ok(())\n///             }\n///         }\n///\n///         deserializer.deserialize_seq(ExtendVecVisitor(self.0))\n///     }\n/// }\n///\n/// // Visitor implementation that will walk the outer array of the JSON input.\n/// struct FlattenedVecVisitor<T>(PhantomData<T>);\n///\n/// impl<'de, T> Visitor<'de> for FlattenedVecVisitor<T>\n/// where\n///     T: Deserialize<'de>,\n/// {\n///     // This Visitor constructs a single Vec<T> to hold the flattened\n///     // contents of the inner arrays.\n///     type Value = Vec<T>;\n///\n///     fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n///         write!(formatter, \"an array of arrays\")\n///     }\n///\n///     fn visit_seq<A>(self, mut seq: A) -> Result<Vec<T>, A::Error>\n///     where\n///         A: SeqAccess<'de>,\n///     {\n///         // Create a single Vec to hold the flattened contents.\n///         let mut vec = Vec::new();\n///\n///         // Each iteration through this loop is one inner array.\n///         while let Some(()) = seq.next_element_seed(ExtendVec(&mut vec))? {\n///             // Nothing to do; inner array has been appended into `vec`.\n///         }\n///\n///         // Return the finished vec.\n///         Ok(vec)\n///     }\n/// }\n///\n/// # fn example<'de, D>(deserializer: D) -> Result<(), D::Error>\n/// # where\n/// #     D: Deserializer<'de>,\n/// # {\n/// let visitor = FlattenedVecVisitor(PhantomData);\n/// let flattened: Vec<u64> = deserializer.deserialize_seq(visitor)?;\n/// #     Ok(())\n/// # }\n/// ```\n#[cfg_attr(\n    not(no_diagnostic_namespace),\n    diagnostic::on_unimplemented(\n        message = \"the trait bound `{Self}: serde::de::DeserializeSeed<'de>` is not satisfied\",\n    )\n)]\npub trait DeserializeSeed<'de>: Sized {\n    /// The type produced by using this seed.\n    type Value;\n\n    /// Equivalent to the more common `Deserialize::deserialize` method, except\n    /// with some initial piece of data (the seed) passed in.\n    fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>\n    where\n        D: Deserializer<'de>;\n}\n\nimpl<'de, T> DeserializeSeed<'de> for PhantomData<T>\nwhere\n    T: Deserialize<'de>,\n{\n    type Value = T;\n\n    #[inline]\n    fn deserialize<D>(self, deserializer: D) -> Result<T, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        T::deserialize(deserializer)\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/// A **data format** that can deserialize any data structure supported by\n/// Serde.\n///\n/// The role of this trait is to define the deserialization half of the [Serde\n/// data model], which is a way to categorize every Rust data type into one of\n/// 29 possible types. Each method of the `Deserializer` trait corresponds to one\n/// of the types of the data model.\n///\n/// Implementations of `Deserialize` map themselves into this data model by\n/// passing to the `Deserializer` a `Visitor` implementation that can receive\n/// these various types.\n///\n/// The types that make up the Serde data model are:\n///\n///  - **14 primitive types**\n///    - bool\n///    - i8, i16, i32, i64, i128\n///    - u8, u16, u32, u64, u128\n///    - f32, f64\n///    - char\n///  - **string**\n///    - UTF-8 bytes with a length and no null terminator.\n///    - When serializing, all strings are handled equally. When deserializing,\n///      there are three flavors of strings: transient, owned, and borrowed.\n///  - **byte array** - \\[u8\\]\n///    - Similar to strings, during deserialization byte arrays can be\n///      transient, owned, or borrowed.\n///  - **option**\n///    - Either none or some value.\n///  - **unit**\n///    - The type of `()` in Rust. It represents an anonymous value containing\n///      no data.\n///  - **unit_struct**\n///    - For example `struct Unit` or `PhantomData<T>`. It represents a named\n///      value containing no data.\n///  - **unit_variant**\n///    - For example the `E::A` and `E::B` in `enum E { A, B }`.\n///  - **newtype_struct**\n///    - For example `struct Millimeters(u8)`.\n///  - **newtype_variant**\n///    - For example the `E::N` in `enum E { N(u8) }`.\n///  - **seq**\n///    - A variably sized heterogeneous sequence of values, for example `Vec<T>`\n///      or `HashSet<T>`. When serializing, the length may or may not be known\n///      before iterating through all the data. When deserializing, the length\n///      is determined by looking at the serialized data.\n///  - **tuple**\n///    - A statically sized heterogeneous sequence of values for which the\n///      length will be known at deserialization time without looking at the\n///      serialized data, for example `(u8,)` or `(String, u64, Vec<T>)` or\n///      `[u64; 10]`.\n///  - **tuple_struct**\n///    - A named tuple, for example `struct Rgb(u8, u8, u8)`.\n///  - **tuple_variant**\n///    - For example the `E::T` in `enum E { T(u8, u8) }`.\n///  - **map**\n///    - A heterogeneous key-value pairing, for example `BTreeMap<K, V>`.\n///  - **struct**\n///    - A heterogeneous key-value pairing in which the keys are strings and\n///      will be known at deserialization time without looking at the serialized\n///      data, for example `struct S { r: u8, g: u8, b: u8 }`.\n///  - **struct_variant**\n///    - For example the `E::S` in `enum E { S { r: u8, g: u8, b: u8 } }`.\n///\n/// The `Deserializer` trait supports two entry point styles which enables\n/// different kinds of deserialization.\n///\n/// 1. The `deserialize_any` method. Self-describing data formats like JSON are\n///    able to look at the serialized data and tell what it represents. For\n///    example the JSON deserializer may see an opening curly brace (`{`) and\n///    know that it is seeing a map. If the data format supports\n///    `Deserializer::deserialize_any`, it will drive the Visitor using whatever\n///    type it sees in the input. JSON uses this approach when deserializing\n///    `serde_json::Value` which is an enum that can represent any JSON\n///    document. Without knowing what is in a JSON document, we can deserialize\n///    it to `serde_json::Value` by going through\n///    `Deserializer::deserialize_any`.\n///\n/// 2. The various `deserialize_*` methods. Non-self-describing formats like\n///    Postcard need to be told what is in the input in order to deserialize it.\n///    The `deserialize_*` methods are hints to the deserializer for how to\n///    interpret the next piece of input. Non-self-describing formats are not\n///    able to deserialize something like `serde_json::Value` which relies on\n///    `Deserializer::deserialize_any`.\n///\n/// When implementing `Deserialize`, you should avoid relying on\n/// `Deserializer::deserialize_any` unless you need to be told by the\n/// Deserializer what type is in the input. Know that relying on\n/// `Deserializer::deserialize_any` means your data type will be able to\n/// deserialize from self-describing formats only, ruling out Postcard and many\n/// others.\n///\n/// [Serde data model]: https://serde.rs/data-model.html\n///\n/// # Lifetime\n///\n/// The `'de` lifetime of this trait is the lifetime of data that may be\n/// borrowed from the input when deserializing. See the page [Understanding\n/// deserializer lifetimes] for a more detailed explanation of these lifetimes.\n///\n/// [Understanding deserializer lifetimes]: https://serde.rs/lifetimes.html\n///\n/// # Example implementation\n///\n/// The [example data format] presented on the website contains example code for\n/// a basic JSON `Deserializer`.\n///\n/// [example data format]: https://serde.rs/data-format.html\n#[cfg_attr(\n    not(no_diagnostic_namespace),\n    diagnostic::on_unimplemented(\n        message = \"the trait bound `{Self}: serde::de::Deserializer<'de>` is not satisfied\",\n    )\n)]\npub trait Deserializer<'de>: Sized {\n    /// The error type that can be returned if some error occurs during\n    /// deserialization.\n    type Error: Error;\n\n    /// Require the `Deserializer` to figure out how to drive the visitor based\n    /// on what data type is in the input.\n    ///\n    /// When implementing `Deserialize`, you should avoid relying on\n    /// `Deserializer::deserialize_any` unless you need to be told by the\n    /// Deserializer what type is in the input. Know that relying on\n    /// `Deserializer::deserialize_any` means your data type will be able to\n    /// deserialize from self-describing formats only, ruling out Postcard and\n    /// many others.\n    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Hint that the `Deserialize` type is expecting a `bool` value.\n    fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Hint that the `Deserialize` type is expecting an `i8` value.\n    fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Hint that the `Deserialize` type is expecting an `i16` value.\n    fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Hint that the `Deserialize` type is expecting an `i32` value.\n    fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Hint that the `Deserialize` type is expecting an `i64` value.\n    fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Hint that the `Deserialize` type is expecting an `i128` value.\n    ///\n    /// The default behavior unconditionally returns an error.\n    fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>,\n    {\n        let _ = visitor;\n        Err(Error::custom(\"i128 is not supported\"))\n    }\n\n    /// Hint that the `Deserialize` type is expecting a `u8` value.\n    fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Hint that the `Deserialize` type is expecting a `u16` value.\n    fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Hint that the `Deserialize` type is expecting a `u32` value.\n    fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Hint that the `Deserialize` type is expecting a `u64` value.\n    fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Hint that the `Deserialize` type is expecting an `u128` value.\n    ///\n    /// The default behavior unconditionally returns an error.\n    fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>,\n    {\n        let _ = visitor;\n        Err(Error::custom(\"u128 is not supported\"))\n    }\n\n    /// Hint that the `Deserialize` type is expecting a `f32` value.\n    fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Hint that the `Deserialize` type is expecting a `f64` value.\n    fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Hint that the `Deserialize` type is expecting a `char` value.\n    fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Hint that the `Deserialize` type is expecting a string value and does\n    /// not benefit from taking ownership of buffered data owned by the\n    /// `Deserializer`.\n    ///\n    /// If the `Visitor` would benefit from taking ownership of `String` data,\n    /// indicate this to the `Deserializer` by using `deserialize_string`\n    /// instead.\n    fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Hint that the `Deserialize` type is expecting a string value and would\n    /// benefit from taking ownership of buffered data owned by the\n    /// `Deserializer`.\n    ///\n    /// If the `Visitor` would not benefit from taking ownership of `String`\n    /// data, indicate that to the `Deserializer` by using `deserialize_str`\n    /// instead.\n    fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Hint that the `Deserialize` type is expecting a byte array and does not\n    /// benefit from taking ownership of buffered data owned by the\n    /// `Deserializer`.\n    ///\n    /// If the `Visitor` would benefit from taking ownership of `Vec<u8>` data,\n    /// indicate this to the `Deserializer` by using `deserialize_byte_buf`\n    /// instead.\n    fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Hint that the `Deserialize` type is expecting a byte array and would\n    /// benefit from taking ownership of buffered data owned by the\n    /// `Deserializer`.\n    ///\n    /// If the `Visitor` would not benefit from taking ownership of `Vec<u8>`\n    /// data, indicate that to the `Deserializer` by using `deserialize_bytes`\n    /// instead.\n    fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Hint that the `Deserialize` type is expecting an optional value.\n    ///\n    /// This allows deserializers that encode an optional value as a nullable\n    /// value to convert the null value into `None` and a regular value into\n    /// `Some(value)`.\n    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Hint that the `Deserialize` type is expecting a unit value.\n    fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Hint that the `Deserialize` type is expecting a unit struct with a\n    /// particular name.\n    fn deserialize_unit_struct<V>(\n        self,\n        name: &'static str,\n        visitor: V,\n    ) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Hint that the `Deserialize` type is expecting a newtype struct with a\n    /// particular name.\n    fn deserialize_newtype_struct<V>(\n        self,\n        name: &'static str,\n        visitor: V,\n    ) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Hint that the `Deserialize` type is expecting a sequence of values.\n    fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Hint that the `Deserialize` type is expecting a sequence of values and\n    /// knows how many values there are without looking at the serialized data.\n    fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Hint that the `Deserialize` type is expecting a tuple struct with a\n    /// particular name and number of fields.\n    fn deserialize_tuple_struct<V>(\n        self,\n        name: &'static str,\n        len: usize,\n        visitor: V,\n    ) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Hint that the `Deserialize` type is expecting a map of key-value pairs.\n    fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Hint that the `Deserialize` type is expecting a struct with a particular\n    /// name and fields.\n    fn deserialize_struct<V>(\n        self,\n        name: &'static str,\n        fields: &'static [&'static str],\n        visitor: V,\n    ) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Hint that the `Deserialize` type is expecting an enum value with a\n    /// particular name and possible variants.\n    fn deserialize_enum<V>(\n        self,\n        name: &'static str,\n        variants: &'static [&'static str],\n        visitor: V,\n    ) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Hint that the `Deserialize` type is expecting the name of a struct\n    /// field or the discriminant of an enum variant.\n    fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Hint that the `Deserialize` type needs to deserialize a value whose type\n    /// doesn't matter because it is ignored.\n    ///\n    /// Deserializers for non-self-describing formats may not support this mode.\n    fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Determine whether `Deserialize` implementations should expect to\n    /// deserialize their human-readable form.\n    ///\n    /// Some types have a human-readable form that may be somewhat expensive to\n    /// construct, as well as a binary form that is compact and efficient.\n    /// Generally text-based formats like JSON and YAML will prefer to use the\n    /// human-readable one and binary formats like Postcard will prefer the\n    /// compact one.\n    ///\n    /// ```edition2021\n    /// # use std::ops::Add;\n    /// # use std::str::FromStr;\n    /// #\n    /// # struct Timestamp;\n    /// #\n    /// # impl Timestamp {\n    /// #     const EPOCH: Timestamp = Timestamp;\n    /// # }\n    /// #\n    /// # impl FromStr for Timestamp {\n    /// #     type Err = String;\n    /// #     fn from_str(_: &str) -> Result<Self, Self::Err> {\n    /// #         unimplemented!()\n    /// #     }\n    /// # }\n    /// #\n    /// # struct Duration;\n    /// #\n    /// # impl Duration {\n    /// #     fn seconds(_: u64) -> Self { unimplemented!() }\n    /// # }\n    /// #\n    /// # impl Add<Duration> for Timestamp {\n    /// #     type Output = Timestamp;\n    /// #     fn add(self, _: Duration) -> Self::Output {\n    /// #         unimplemented!()\n    /// #     }\n    /// # }\n    /// #\n    /// use serde::de::{self, Deserialize, Deserializer};\n    ///\n    /// impl<'de> Deserialize<'de> for Timestamp {\n    ///     fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    ///     where\n    ///         D: Deserializer<'de>,\n    ///     {\n    ///         if deserializer.is_human_readable() {\n    ///             // Deserialize from a human-readable string like \"2015-05-15T17:01:00Z\".\n    ///             let s = String::deserialize(deserializer)?;\n    ///             Timestamp::from_str(&s).map_err(de::Error::custom)\n    ///         } else {\n    ///             // Deserialize from a compact binary representation, seconds since\n    ///             // the Unix epoch.\n    ///             let n = u64::deserialize(deserializer)?;\n    ///             Ok(Timestamp::EPOCH + Duration::seconds(n))\n    ///         }\n    ///     }\n    /// }\n    /// ```\n    ///\n    /// The default implementation of this method returns `true`. Data formats\n    /// may override this to `false` to request a compact form for types that\n    /// support one. Note that modifying this method to change a format from\n    /// human-readable to compact or vice versa should be regarded as a breaking\n    /// change, as a value serialized in human-readable mode is not required to\n    /// deserialize from the same data in compact mode.\n    #[inline]\n    fn is_human_readable(&self) -> bool {\n        true\n    }\n\n    // Not public API.\n    #[cfg(all(not(no_serde_derive), any(feature = \"std\", feature = \"alloc\")))]\n    #[doc(hidden)]\n    fn __deserialize_content_v1<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de, Value = crate::private::Content<'de>>,\n    {\n        self.deserialize_any(visitor)\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/// This trait represents a visitor that walks through a deserializer.\n///\n/// # Lifetime\n///\n/// The `'de` lifetime of this trait is the requirement for lifetime of data\n/// that may be borrowed by `Self::Value`. See the page [Understanding\n/// deserializer lifetimes] for a more detailed explanation of these lifetimes.\n///\n/// [Understanding deserializer lifetimes]: https://serde.rs/lifetimes.html\n///\n/// # Example\n///\n/// ```edition2021\n/// # use serde::de::{self, Unexpected, Visitor};\n/// # use std::fmt;\n/// #\n/// /// A visitor that deserializes a long string - a string containing at least\n/// /// some minimum number of bytes.\n/// struct LongString {\n///     min: usize,\n/// }\n///\n/// impl<'de> Visitor<'de> for LongString {\n///     type Value = String;\n///\n///     fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n///         write!(formatter, \"a string containing at least {} bytes\", self.min)\n///     }\n///\n///     fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>\n///     where\n///         E: de::Error,\n///     {\n///         if s.len() >= self.min {\n///             Ok(s.to_owned())\n///         } else {\n///             Err(de::Error::invalid_value(Unexpected::Str(s), &self))\n///         }\n///     }\n/// }\n/// ```\n#[cfg_attr(\n    not(no_diagnostic_namespace),\n    diagnostic::on_unimplemented(\n        message = \"the trait bound `{Self}: serde::de::Visitor<'de>` is not satisfied\",\n    )\n)]\npub trait Visitor<'de>: Sized {\n    /// The value produced by this visitor.\n    type Value;\n\n    /// Format a message stating what data this Visitor expects to receive.\n    ///\n    /// This is used in error messages. The message should complete the sentence\n    /// \"This Visitor expects to receive ...\", for example the message could be\n    /// \"an integer between 0 and 64\". The message should not be capitalized and\n    /// should not end with a period.\n    ///\n    /// ```edition2021\n    /// # use std::fmt;\n    /// #\n    /// # struct S {\n    /// #     max: usize,\n    /// # }\n    /// #\n    /// # impl<'de> serde::de::Visitor<'de> for S {\n    /// #     type Value = ();\n    /// #\n    /// fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n    ///     write!(formatter, \"an integer between 0 and {}\", self.max)\n    /// }\n    /// # }\n    /// ```\n    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result;\n\n    /// The input contains a boolean.\n    ///\n    /// The default implementation fails with a type error.\n    fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        Err(Error::invalid_type(Unexpected::Bool(v), &self))\n    }\n\n    /// The input contains an `i8`.\n    ///\n    /// The default implementation forwards to [`visit_i64`].\n    ///\n    /// [`visit_i64`]: #method.visit_i64\n    fn visit_i8<E>(self, v: i8) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        self.visit_i64(v as i64)\n    }\n\n    /// The input contains an `i16`.\n    ///\n    /// The default implementation forwards to [`visit_i64`].\n    ///\n    /// [`visit_i64`]: #method.visit_i64\n    fn visit_i16<E>(self, v: i16) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        self.visit_i64(v as i64)\n    }\n\n    /// The input contains an `i32`.\n    ///\n    /// The default implementation forwards to [`visit_i64`].\n    ///\n    /// [`visit_i64`]: #method.visit_i64\n    fn visit_i32<E>(self, v: i32) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        self.visit_i64(v as i64)\n    }\n\n    /// The input contains an `i64`.\n    ///\n    /// The default implementation fails with a type error.\n    fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        Err(Error::invalid_type(Unexpected::Signed(v), &self))\n    }\n\n    /// The input contains a `i128`.\n    ///\n    /// The default implementation fails with a type error.\n    fn visit_i128<E>(self, v: i128) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        let mut buf = [0u8; 58];\n        let mut writer = crate::format::Buf::new(&mut buf);\n        fmt::Write::write_fmt(&mut writer, format_args!(\"integer `{}` as i128\", v)).unwrap();\n        Err(Error::invalid_type(\n            Unexpected::Other(writer.as_str()),\n            &self,\n        ))\n    }\n\n    /// The input contains a `u8`.\n    ///\n    /// The default implementation forwards to [`visit_u64`].\n    ///\n    /// [`visit_u64`]: #method.visit_u64\n    fn visit_u8<E>(self, v: u8) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        self.visit_u64(v as u64)\n    }\n\n    /// The input contains a `u16`.\n    ///\n    /// The default implementation forwards to [`visit_u64`].\n    ///\n    /// [`visit_u64`]: #method.visit_u64\n    fn visit_u16<E>(self, v: u16) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        self.visit_u64(v as u64)\n    }\n\n    /// The input contains a `u32`.\n    ///\n    /// The default implementation forwards to [`visit_u64`].\n    ///\n    /// [`visit_u64`]: #method.visit_u64\n    fn visit_u32<E>(self, v: u32) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        self.visit_u64(v as u64)\n    }\n\n    /// The input contains a `u64`.\n    ///\n    /// The default implementation fails with a type error.\n    fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        Err(Error::invalid_type(Unexpected::Unsigned(v), &self))\n    }\n\n    /// The input contains a `u128`.\n    ///\n    /// The default implementation fails with a type error.\n    fn visit_u128<E>(self, v: u128) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        let mut buf = [0u8; 57];\n        let mut writer = crate::format::Buf::new(&mut buf);\n        fmt::Write::write_fmt(&mut writer, format_args!(\"integer `{}` as u128\", v)).unwrap();\n        Err(Error::invalid_type(\n            Unexpected::Other(writer.as_str()),\n            &self,\n        ))\n    }\n\n    /// The input contains an `f32`.\n    ///\n    /// The default implementation forwards to [`visit_f64`].\n    ///\n    /// [`visit_f64`]: #method.visit_f64\n    fn visit_f32<E>(self, v: f32) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        self.visit_f64(v as f64)\n    }\n\n    /// The input contains an `f64`.\n    ///\n    /// The default implementation fails with a type error.\n    fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        Err(Error::invalid_type(Unexpected::Float(v), &self))\n    }\n\n    /// The input contains a `char`.\n    ///\n    /// The default implementation forwards to [`visit_str`] as a one-character\n    /// string.\n    ///\n    /// [`visit_str`]: #method.visit_str\n    #[inline]\n    fn visit_char<E>(self, v: char) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        self.visit_str(v.encode_utf8(&mut [0u8; 4]))\n    }\n\n    /// The input contains a string. The lifetime of the string is ephemeral and\n    /// it may be destroyed after this method returns.\n    ///\n    /// This method allows the `Deserializer` to avoid a copy by retaining\n    /// ownership of any buffered data. `Deserialize` implementations that do\n    /// not benefit from taking ownership of `String` data should indicate that\n    /// to the deserializer by using `Deserializer::deserialize_str` rather than\n    /// `Deserializer::deserialize_string`.\n    ///\n    /// It is never correct to implement `visit_string` without implementing\n    /// `visit_str`. Implement neither, both, or just `visit_str`.\n    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        Err(Error::invalid_type(Unexpected::Str(v), &self))\n    }\n\n    /// The input contains a string that lives at least as long as the\n    /// `Deserializer`.\n    ///\n    /// This enables zero-copy deserialization of strings in some formats. For\n    /// example JSON input containing the JSON string `\"borrowed\"` can be\n    /// deserialized with zero copying into a `&'a str` as long as the input\n    /// data outlives `'a`.\n    ///\n    /// The default implementation forwards to `visit_str`.\n    #[inline]\n    fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        self.visit_str(v)\n    }\n\n    /// The input contains a string and ownership of the string is being given\n    /// to the `Visitor`.\n    ///\n    /// This method allows the `Visitor` to avoid a copy by taking ownership of\n    /// a string created by the `Deserializer`. `Deserialize` implementations\n    /// that benefit from taking ownership of `String` data should indicate that\n    /// to the deserializer by using `Deserializer::deserialize_string` rather\n    /// than `Deserializer::deserialize_str`, although not every deserializer\n    /// will honor such a request.\n    ///\n    /// It is never correct to implement `visit_string` without implementing\n    /// `visit_str`. Implement neither, both, or just `visit_str`.\n    ///\n    /// The default implementation forwards to `visit_str` and then drops the\n    /// `String`.\n    #[inline]\n    #[cfg(any(feature = \"std\", feature = \"alloc\"))]\n    #[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\n    fn visit_string<E>(self, v: String) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        self.visit_str(&v)\n    }\n\n    /// The input contains a byte array. The lifetime of the byte array is\n    /// ephemeral and it may be destroyed after this method returns.\n    ///\n    /// This method allows the `Deserializer` to avoid a copy by retaining\n    /// ownership of any buffered data. `Deserialize` implementations that do\n    /// not benefit from taking ownership of `Vec<u8>` data should indicate that\n    /// to the deserializer by using `Deserializer::deserialize_bytes` rather\n    /// than `Deserializer::deserialize_byte_buf`.\n    ///\n    /// It is never correct to implement `visit_byte_buf` without implementing\n    /// `visit_bytes`. Implement neither, both, or just `visit_bytes`.\n    fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        Err(Error::invalid_type(Unexpected::Bytes(v), &self))\n    }\n\n    /// The input contains a byte array that lives at least as long as the\n    /// `Deserializer`.\n    ///\n    /// This enables zero-copy deserialization of bytes in some formats. For\n    /// example Postcard data containing bytes can be deserialized with zero\n    /// copying into a `&'a [u8]` as long as the input data outlives `'a`.\n    ///\n    /// The default implementation forwards to `visit_bytes`.\n    #[inline]\n    fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        self.visit_bytes(v)\n    }\n\n    /// The input contains a byte array and ownership of the byte array is being\n    /// given to the `Visitor`.\n    ///\n    /// This method allows the `Visitor` to avoid a copy by taking ownership of\n    /// a byte buffer created by the `Deserializer`. `Deserialize`\n    /// implementations that benefit from taking ownership of `Vec<u8>` data\n    /// should indicate that to the deserializer by using\n    /// `Deserializer::deserialize_byte_buf` rather than\n    /// `Deserializer::deserialize_bytes`, although not every deserializer will\n    /// honor such a request.\n    ///\n    /// It is never correct to implement `visit_byte_buf` without implementing\n    /// `visit_bytes`. Implement neither, both, or just `visit_bytes`.\n    ///\n    /// The default implementation forwards to `visit_bytes` and then drops the\n    /// `Vec<u8>`.\n    #[cfg(any(feature = \"std\", feature = \"alloc\"))]\n    #[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\n    fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        self.visit_bytes(&v)\n    }\n\n    /// The input contains an optional that is absent.\n    ///\n    /// The default implementation fails with a type error.\n    fn visit_none<E>(self) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        Err(Error::invalid_type(Unexpected::Option, &self))\n    }\n\n    /// The input contains an optional that is present.\n    ///\n    /// The default implementation fails with a type error.\n    fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        let _ = deserializer;\n        Err(Error::invalid_type(Unexpected::Option, &self))\n    }\n\n    /// The input contains a unit `()`.\n    ///\n    /// The default implementation fails with a type error.\n    fn visit_unit<E>(self) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        Err(Error::invalid_type(Unexpected::Unit, &self))\n    }\n\n    /// The input contains a newtype struct.\n    ///\n    /// The content of the newtype struct may be read from the given\n    /// `Deserializer`.\n    ///\n    /// The default implementation fails with a type error.\n    fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        let _ = deserializer;\n        Err(Error::invalid_type(Unexpected::NewtypeStruct, &self))\n    }\n\n    /// The input contains a sequence of elements.\n    ///\n    /// The default implementation fails with a type error.\n    fn visit_seq<A>(self, seq: A) -> Result<Self::Value, A::Error>\n    where\n        A: SeqAccess<'de>,\n    {\n        let _ = seq;\n        Err(Error::invalid_type(Unexpected::Seq, &self))\n    }\n\n    /// The input contains a key-value map.\n    ///\n    /// The default implementation fails with a type error.\n    fn visit_map<A>(self, map: A) -> Result<Self::Value, A::Error>\n    where\n        A: MapAccess<'de>,\n    {\n        let _ = map;\n        Err(Error::invalid_type(Unexpected::Map, &self))\n    }\n\n    /// The input contains an enum.\n    ///\n    /// The default implementation fails with a type error.\n    fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error>\n    where\n        A: EnumAccess<'de>,\n    {\n        let _ = data;\n        Err(Error::invalid_type(Unexpected::Enum, &self))\n    }\n\n    // Used when deserializing a flattened Option field. Not public API.\n    #[doc(hidden)]\n    fn __private_visit_untagged_option<D>(self, _: D) -> Result<Self::Value, ()>\n    where\n        D: Deserializer<'de>,\n    {\n        Err(())\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/// Provides a `Visitor` access to each element of a sequence in the input.\n///\n/// This is a trait that a `Deserializer` passes to a `Visitor` implementation,\n/// which deserializes each item in a sequence.\n///\n/// # Lifetime\n///\n/// The `'de` lifetime of this trait is the lifetime of data that may be\n/// borrowed by deserialized sequence elements. See the page [Understanding\n/// deserializer lifetimes] for a more detailed explanation of these lifetimes.\n///\n/// [Understanding deserializer lifetimes]: https://serde.rs/lifetimes.html\n///\n/// # Example implementation\n///\n/// The [example data format] presented on the website demonstrates an\n/// implementation of `SeqAccess` for a basic JSON data format.\n///\n/// [example data format]: https://serde.rs/data-format.html\n#[cfg_attr(\n    not(no_diagnostic_namespace),\n    diagnostic::on_unimplemented(\n        message = \"the trait bound `{Self}: serde::de::SeqAccess<'de>` is not satisfied\",\n    )\n)]\npub trait SeqAccess<'de> {\n    /// The error type that can be returned if some error occurs during\n    /// deserialization.\n    type Error: Error;\n\n    /// This returns `Ok(Some(value))` for the next value in the sequence, or\n    /// `Ok(None)` if there are no more remaining items.\n    ///\n    /// `Deserialize` implementations should typically use\n    /// `SeqAccess::next_element` instead.\n    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>\n    where\n        T: DeserializeSeed<'de>;\n\n    /// This returns `Ok(Some(value))` for the next value in the sequence, or\n    /// `Ok(None)` if there are no more remaining items.\n    ///\n    /// This method exists as a convenience for `Deserialize` implementations.\n    /// `SeqAccess` implementations should not override the default behavior.\n    #[inline]\n    fn next_element<T>(&mut self) -> Result<Option<T>, Self::Error>\n    where\n        T: Deserialize<'de>,\n    {\n        self.next_element_seed(PhantomData)\n    }\n\n    /// Returns the number of elements remaining in the sequence, if known.\n    #[inline]\n    fn size_hint(&self) -> Option<usize> {\n        None\n    }\n}\n\nimpl<'de, A> SeqAccess<'de> for &mut A\nwhere\n    A: ?Sized + SeqAccess<'de>,\n{\n    type Error = A::Error;\n\n    #[inline]\n    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>\n    where\n        T: DeserializeSeed<'de>,\n    {\n        (**self).next_element_seed(seed)\n    }\n\n    #[inline]\n    fn next_element<T>(&mut self) -> Result<Option<T>, Self::Error>\n    where\n        T: Deserialize<'de>,\n    {\n        (**self).next_element()\n    }\n\n    #[inline]\n    fn size_hint(&self) -> Option<usize> {\n        (**self).size_hint()\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/// Provides a `Visitor` access to each entry of a map in the input.\n///\n/// This is a trait that a `Deserializer` passes to a `Visitor` implementation.\n///\n/// # Lifetime\n///\n/// The `'de` lifetime of this trait is the lifetime of data that may be\n/// borrowed by deserialized map entries. See the page [Understanding\n/// deserializer lifetimes] for a more detailed explanation of these lifetimes.\n///\n/// [Understanding deserializer lifetimes]: https://serde.rs/lifetimes.html\n///\n/// # Example implementation\n///\n/// The [example data format] presented on the website demonstrates an\n/// implementation of `MapAccess` for a basic JSON data format.\n///\n/// [example data format]: https://serde.rs/data-format.html\n#[cfg_attr(\n    not(no_diagnostic_namespace),\n    diagnostic::on_unimplemented(\n        message = \"the trait bound `{Self}: serde::de::MapAccess<'de>` is not satisfied\",\n    )\n)]\npub trait MapAccess<'de> {\n    /// The error type that can be returned if some error occurs during\n    /// deserialization.\n    type Error: Error;\n\n    /// This returns `Ok(Some(key))` for the next key in the map, or `Ok(None)`\n    /// if there are no more remaining entries.\n    ///\n    /// `Deserialize` implementations should typically use\n    /// `MapAccess::next_key` or `MapAccess::next_entry` instead.\n    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>\n    where\n        K: DeserializeSeed<'de>;\n\n    /// This returns a `Ok(value)` for the next value in the map.\n    ///\n    /// `Deserialize` implementations should typically use\n    /// `MapAccess::next_value` instead.\n    ///\n    /// # Panics\n    ///\n    /// Calling `next_value_seed` before `next_key_seed` is incorrect and is\n    /// allowed to panic or return bogus results.\n    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>\n    where\n        V: DeserializeSeed<'de>;\n\n    /// This returns `Ok(Some((key, value)))` for the next (key-value) pair in\n    /// the map, or `Ok(None)` if there are no more remaining items.\n    ///\n    /// `MapAccess` implementations should override the default behavior if a\n    /// more efficient implementation is possible.\n    ///\n    /// `Deserialize` implementations should typically use\n    /// `MapAccess::next_entry` instead.\n    #[inline]\n    fn next_entry_seed<K, V>(\n        &mut self,\n        kseed: K,\n        vseed: V,\n    ) -> Result<Option<(K::Value, V::Value)>, Self::Error>\n    where\n        K: DeserializeSeed<'de>,\n        V: DeserializeSeed<'de>,\n    {\n        match tri!(self.next_key_seed(kseed)) {\n            Some(key) => {\n                let value = tri!(self.next_value_seed(vseed));\n                Ok(Some((key, value)))\n            }\n            None => Ok(None),\n        }\n    }\n\n    /// This returns `Ok(Some(key))` for the next key in the map, or `Ok(None)`\n    /// if there are no more remaining entries.\n    ///\n    /// This method exists as a convenience for `Deserialize` implementations.\n    /// `MapAccess` implementations should not override the default behavior.\n    #[inline]\n    fn next_key<K>(&mut self) -> Result<Option<K>, Self::Error>\n    where\n        K: Deserialize<'de>,\n    {\n        self.next_key_seed(PhantomData)\n    }\n\n    /// This returns a `Ok(value)` for the next value in the map.\n    ///\n    /// This method exists as a convenience for `Deserialize` implementations.\n    /// `MapAccess` implementations should not override the default behavior.\n    ///\n    /// # Panics\n    ///\n    /// Calling `next_value` before `next_key` is incorrect and is allowed to\n    /// panic or return bogus results.\n    #[inline]\n    fn next_value<V>(&mut self) -> Result<V, Self::Error>\n    where\n        V: Deserialize<'de>,\n    {\n        self.next_value_seed(PhantomData)\n    }\n\n    /// This returns `Ok(Some((key, value)))` for the next (key-value) pair in\n    /// the map, or `Ok(None)` if there are no more remaining items.\n    ///\n    /// This method exists as a convenience for `Deserialize` implementations.\n    /// `MapAccess` implementations should not override the default behavior.\n    #[inline]\n    fn next_entry<K, V>(&mut self) -> Result<Option<(K, V)>, Self::Error>\n    where\n        K: Deserialize<'de>,\n        V: Deserialize<'de>,\n    {\n        self.next_entry_seed(PhantomData, PhantomData)\n    }\n\n    /// Returns the number of entries remaining in the map, if known.\n    #[inline]\n    fn size_hint(&self) -> Option<usize> {\n        None\n    }\n}\n\nimpl<'de, A> MapAccess<'de> for &mut A\nwhere\n    A: ?Sized + MapAccess<'de>,\n{\n    type Error = A::Error;\n\n    #[inline]\n    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>\n    where\n        K: DeserializeSeed<'de>,\n    {\n        (**self).next_key_seed(seed)\n    }\n\n    #[inline]\n    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>\n    where\n        V: DeserializeSeed<'de>,\n    {\n        (**self).next_value_seed(seed)\n    }\n\n    #[inline]\n    fn next_entry_seed<K, V>(\n        &mut self,\n        kseed: K,\n        vseed: V,\n    ) -> Result<Option<(K::Value, V::Value)>, Self::Error>\n    where\n        K: DeserializeSeed<'de>,\n        V: DeserializeSeed<'de>,\n    {\n        (**self).next_entry_seed(kseed, vseed)\n    }\n\n    #[inline]\n    fn next_entry<K, V>(&mut self) -> Result<Option<(K, V)>, Self::Error>\n    where\n        K: Deserialize<'de>,\n        V: Deserialize<'de>,\n    {\n        (**self).next_entry()\n    }\n\n    #[inline]\n    fn next_key<K>(&mut self) -> Result<Option<K>, Self::Error>\n    where\n        K: Deserialize<'de>,\n    {\n        (**self).next_key()\n    }\n\n    #[inline]\n    fn next_value<V>(&mut self) -> Result<V, Self::Error>\n    where\n        V: Deserialize<'de>,\n    {\n        (**self).next_value()\n    }\n\n    #[inline]\n    fn size_hint(&self) -> Option<usize> {\n        (**self).size_hint()\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/// Provides a `Visitor` access to the data of an enum in the input.\n///\n/// `EnumAccess` is created by the `Deserializer` and passed to the\n/// `Visitor` in order to identify which variant of an enum to deserialize.\n///\n/// # Lifetime\n///\n/// The `'de` lifetime of this trait is the lifetime of data that may be\n/// borrowed by the deserialized enum variant. See the page [Understanding\n/// deserializer lifetimes] for a more detailed explanation of these lifetimes.\n///\n/// [Understanding deserializer lifetimes]: https://serde.rs/lifetimes.html\n///\n/// # Example implementation\n///\n/// The [example data format] presented on the website demonstrates an\n/// implementation of `EnumAccess` for a basic JSON data format.\n///\n/// [example data format]: https://serde.rs/data-format.html\n#[cfg_attr(\n    not(no_diagnostic_namespace),\n    diagnostic::on_unimplemented(\n        message = \"the trait bound `{Self}: serde::de::EnumAccess<'de>` is not satisfied\",\n    )\n)]\npub trait EnumAccess<'de>: Sized {\n    /// The error type that can be returned if some error occurs during\n    /// deserialization.\n    type Error: Error;\n    /// The `Visitor` that will be used to deserialize the content of the enum\n    /// variant.\n    type Variant: VariantAccess<'de, Error = Self::Error>;\n\n    /// `variant` is called to identify which variant to deserialize.\n    ///\n    /// `Deserialize` implementations should typically use `EnumAccess::variant`\n    /// instead.\n    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>\n    where\n        V: DeserializeSeed<'de>;\n\n    /// `variant` is called to identify which variant to deserialize.\n    ///\n    /// This method exists as a convenience for `Deserialize` implementations.\n    /// `EnumAccess` implementations should not override the default behavior.\n    #[inline]\n    fn variant<V>(self) -> Result<(V, Self::Variant), Self::Error>\n    where\n        V: Deserialize<'de>,\n    {\n        self.variant_seed(PhantomData)\n    }\n}\n\n/// `VariantAccess` is a visitor that is created by the `Deserializer` and\n/// passed to the `Deserialize` to deserialize the content of a particular enum\n/// variant.\n///\n/// # Lifetime\n///\n/// The `'de` lifetime of this trait is the lifetime of data that may be\n/// borrowed by the deserialized enum variant. See the page [Understanding\n/// deserializer lifetimes] for a more detailed explanation of these lifetimes.\n///\n/// [Understanding deserializer lifetimes]: https://serde.rs/lifetimes.html\n///\n/// # Example implementation\n///\n/// The [example data format] presented on the website demonstrates an\n/// implementation of `VariantAccess` for a basic JSON data format.\n///\n/// [example data format]: https://serde.rs/data-format.html\n#[cfg_attr(\n    not(no_diagnostic_namespace),\n    diagnostic::on_unimplemented(\n        message = \"the trait bound `{Self}: serde::de::VariantAccess<'de>` is not satisfied\",\n    )\n)]\npub trait VariantAccess<'de>: Sized {\n    /// The error type that can be returned if some error occurs during\n    /// deserialization. Must match the error type of our `EnumAccess`.\n    type Error: Error;\n\n    /// Called when deserializing a variant with no values.\n    ///\n    /// If the data contains a different type of variant, the following\n    /// `invalid_type` error should be constructed:\n    ///\n    /// ```edition2021\n    /// # use serde::de::{self, value, DeserializeSeed, Visitor, VariantAccess, Unexpected};\n    /// #\n    /// # struct X;\n    /// #\n    /// # impl<'de> VariantAccess<'de> for X {\n    /// #     type Error = value::Error;\n    /// #\n    /// fn unit_variant(self) -> Result<(), Self::Error> {\n    ///     // What the data actually contained; suppose it is a tuple variant.\n    ///     let unexp = Unexpected::TupleVariant;\n    ///     Err(de::Error::invalid_type(unexp, &\"unit variant\"))\n    /// }\n    /// #\n    /// #     fn newtype_variant_seed<T>(self, _: T) -> Result<T::Value, Self::Error>\n    /// #     where\n    /// #         T: DeserializeSeed<'de>,\n    /// #     { unimplemented!() }\n    /// #\n    /// #     fn tuple_variant<V>(self, _: usize, _: V) -> Result<V::Value, Self::Error>\n    /// #     where\n    /// #         V: Visitor<'de>,\n    /// #     { unimplemented!() }\n    /// #\n    /// #     fn struct_variant<V>(self, _: &[&str], _: V) -> Result<V::Value, Self::Error>\n    /// #     where\n    /// #         V: Visitor<'de>,\n    /// #     { unimplemented!() }\n    /// # }\n    /// ```\n    fn unit_variant(self) -> Result<(), Self::Error>;\n\n    /// Called when deserializing a variant with a single value.\n    ///\n    /// `Deserialize` implementations should typically use\n    /// `VariantAccess::newtype_variant` instead.\n    ///\n    /// If the data contains a different type of variant, the following\n    /// `invalid_type` error should be constructed:\n    ///\n    /// ```edition2021\n    /// # use serde::de::{self, value, DeserializeSeed, Visitor, VariantAccess, Unexpected};\n    /// #\n    /// # struct X;\n    /// #\n    /// # impl<'de> VariantAccess<'de> for X {\n    /// #     type Error = value::Error;\n    /// #\n    /// #     fn unit_variant(self) -> Result<(), Self::Error> {\n    /// #         unimplemented!()\n    /// #     }\n    /// #\n    /// fn newtype_variant_seed<T>(self, _seed: T) -> Result<T::Value, Self::Error>\n    /// where\n    ///     T: DeserializeSeed<'de>,\n    /// {\n    ///     // What the data actually contained; suppose it is a unit variant.\n    ///     let unexp = Unexpected::UnitVariant;\n    ///     Err(de::Error::invalid_type(unexp, &\"newtype variant\"))\n    /// }\n    /// #\n    /// #     fn tuple_variant<V>(self, _: usize, _: V) -> Result<V::Value, Self::Error>\n    /// #     where\n    /// #         V: Visitor<'de>,\n    /// #     { unimplemented!() }\n    /// #\n    /// #     fn struct_variant<V>(self, _: &[&str], _: V) -> Result<V::Value, Self::Error>\n    /// #     where\n    /// #         V: Visitor<'de>,\n    /// #     { unimplemented!() }\n    /// # }\n    /// ```\n    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>\n    where\n        T: DeserializeSeed<'de>;\n\n    /// Called when deserializing a variant with a single value.\n    ///\n    /// This method exists as a convenience for `Deserialize` implementations.\n    /// `VariantAccess` implementations should not override the default\n    /// behavior.\n    #[inline]\n    fn newtype_variant<T>(self) -> Result<T, Self::Error>\n    where\n        T: Deserialize<'de>,\n    {\n        self.newtype_variant_seed(PhantomData)\n    }\n\n    /// Called when deserializing a tuple-like variant.\n    ///\n    /// The `len` is the number of fields expected in the tuple variant.\n    ///\n    /// If the data contains a different type of variant, the following\n    /// `invalid_type` error should be constructed:\n    ///\n    /// ```edition2021\n    /// # use serde::de::{self, value, DeserializeSeed, Visitor, VariantAccess, Unexpected};\n    /// #\n    /// # struct X;\n    /// #\n    /// # impl<'de> VariantAccess<'de> for X {\n    /// #     type Error = value::Error;\n    /// #\n    /// #     fn unit_variant(self) -> Result<(), Self::Error> {\n    /// #         unimplemented!()\n    /// #     }\n    /// #\n    /// #     fn newtype_variant_seed<T>(self, _: T) -> Result<T::Value, Self::Error>\n    /// #     where\n    /// #         T: DeserializeSeed<'de>,\n    /// #     { unimplemented!() }\n    /// #\n    /// fn tuple_variant<V>(self, _len: usize, _visitor: V) -> Result<V::Value, Self::Error>\n    /// where\n    ///     V: Visitor<'de>,\n    /// {\n    ///     // What the data actually contained; suppose it is a unit variant.\n    ///     let unexp = Unexpected::UnitVariant;\n    ///     Err(de::Error::invalid_type(unexp, &\"tuple variant\"))\n    /// }\n    /// #\n    /// #     fn struct_variant<V>(self, _: &[&str], _: V) -> Result<V::Value, Self::Error>\n    /// #     where\n    /// #         V: Visitor<'de>,\n    /// #     { unimplemented!() }\n    /// # }\n    /// ```\n    fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n\n    /// Called when deserializing a struct-like variant.\n    ///\n    /// The `fields` are the names of the fields of the struct variant.\n    ///\n    /// If the data contains a different type of variant, the following\n    /// `invalid_type` error should be constructed:\n    ///\n    /// ```edition2021\n    /// # use serde::de::{self, value, DeserializeSeed, Visitor, VariantAccess, Unexpected};\n    /// #\n    /// # struct X;\n    /// #\n    /// # impl<'de> VariantAccess<'de> for X {\n    /// #     type Error = value::Error;\n    /// #\n    /// #     fn unit_variant(self) -> Result<(), Self::Error> {\n    /// #         unimplemented!()\n    /// #     }\n    /// #\n    /// #     fn newtype_variant_seed<T>(self, _: T) -> Result<T::Value, Self::Error>\n    /// #     where\n    /// #         T: DeserializeSeed<'de>,\n    /// #     { unimplemented!() }\n    /// #\n    /// #     fn tuple_variant<V>(self, _: usize, _: V) -> Result<V::Value, Self::Error>\n    /// #     where\n    /// #         V: Visitor<'de>,\n    /// #     { unimplemented!() }\n    /// #\n    /// fn struct_variant<V>(\n    ///     self,\n    ///     _fields: &'static [&'static str],\n    ///     _visitor: V,\n    /// ) -> Result<V::Value, Self::Error>\n    /// where\n    ///     V: Visitor<'de>,\n    /// {\n    ///     // What the data actually contained; suppose it is a unit variant.\n    ///     let unexp = Unexpected::UnitVariant;\n    ///     Err(de::Error::invalid_type(unexp, &\"struct variant\"))\n    /// }\n    /// # }\n    /// ```\n    fn struct_variant<V>(\n        self,\n        fields: &'static [&'static str],\n        visitor: V,\n    ) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/// Converts an existing value into a `Deserializer` from which other values can\n/// be deserialized.\n///\n/// # Lifetime\n///\n/// The `'de` lifetime of this trait is the lifetime of data that may be\n/// borrowed from the resulting `Deserializer`. See the page [Understanding\n/// deserializer lifetimes] for a more detailed explanation of these lifetimes.\n///\n/// [Understanding deserializer lifetimes]: https://serde.rs/lifetimes.html\n///\n/// # Example\n///\n/// ```edition2021\n/// use serde::de::{value, Deserialize, IntoDeserializer};\n/// use serde_derive::Deserialize;\n/// use std::str::FromStr;\n///\n/// #[derive(Deserialize)]\n/// enum Setting {\n///     On,\n///     Off,\n/// }\n///\n/// impl FromStr for Setting {\n///     type Err = value::Error;\n///\n///     fn from_str(s: &str) -> Result<Self, Self::Err> {\n///         Self::deserialize(s.into_deserializer())\n///     }\n/// }\n/// ```\npub trait IntoDeserializer<'de, E: Error = value::Error> {\n    /// The type of the deserializer being converted into.\n    type Deserializer: Deserializer<'de, Error = E>;\n\n    /// Convert this value into a deserializer.\n    fn into_deserializer(self) -> Self::Deserializer;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/// Used in error messages.\n///\n/// - expected `a`\n/// - expected `a` or `b`\n/// - expected one of `a`, `b`, `c`\n///\n/// The slice of names must not be empty.\nstruct OneOf {\n    names: &'static [&'static str],\n}\n\nimpl Display for OneOf {\n    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        match self.names.len() {\n            0 => panic!(), // special case elsewhere\n            1 => write!(formatter, \"`{}`\", self.names[0]),\n            2 => write!(formatter, \"`{}` or `{}`\", self.names[0], self.names[1]),\n            _ => {\n                tri!(formatter.write_str(\"one of \"));\n                for (i, alt) in self.names.iter().enumerate() {\n                    if i > 0 {\n                        tri!(formatter.write_str(\", \"));\n                    }\n                    tri!(write!(formatter, \"`{}`\", alt));\n                }\n                Ok(())\n            }\n        }\n    }\n}\n\nstruct WithDecimalPoint(f64);\n\nimpl Display for WithDecimalPoint {\n    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        struct LookForDecimalPoint<'f, 'a> {\n            formatter: &'f mut fmt::Formatter<'a>,\n            has_decimal_point: bool,\n        }\n\n        impl<'f, 'a> fmt::Write for LookForDecimalPoint<'f, 'a> {\n            fn write_str(&mut self, fragment: &str) -> fmt::Result {\n                self.has_decimal_point |= fragment.contains('.');\n                self.formatter.write_str(fragment)\n            }\n\n            fn write_char(&mut self, ch: char) -> fmt::Result {\n                self.has_decimal_point |= ch == '.';\n                self.formatter.write_char(ch)\n            }\n        }\n\n        if self.0.is_finite() {\n            let mut writer = LookForDecimalPoint {\n                formatter,\n                has_decimal_point: false,\n            };\n            tri!(write!(writer, \"{}\", self.0));\n            if !writer.has_decimal_point {\n                tri!(formatter.write_str(\".0\"));\n            }\n        } else {\n            tri!(write!(formatter, \"{}\", self.0));\n        }\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "serde_core/src/de/value.rs",
    "content": "//! Building blocks for deserializing basic values using the `IntoDeserializer`\n//! trait.\n//!\n//! ```edition2021\n//! use serde::de::{value, Deserialize, IntoDeserializer};\n//! use serde_derive::Deserialize;\n//! use std::str::FromStr;\n//!\n//! #[derive(Deserialize)]\n//! enum Setting {\n//!     On,\n//!     Off,\n//! }\n//!\n//! impl FromStr for Setting {\n//!     type Err = value::Error;\n//!\n//!     fn from_str(s: &str) -> Result<Self, Self::Err> {\n//!         Self::deserialize(s.into_deserializer())\n//!     }\n//! }\n//! ```\n\nuse crate::lib::*;\n\nuse self::private::{First, Second};\nuse crate::de::{self, Deserializer, Expected, IntoDeserializer, SeqAccess, Visitor};\nuse crate::private::size_hint;\nuse crate::ser;\n\n////////////////////////////////////////////////////////////////////////////////\n\n// For structs that contain a PhantomData. We do not want the trait\n// bound `E: Clone` inferred by derive(Clone).\nmacro_rules! impl_copy_clone {\n    ($ty:ident $(<$lifetime:tt>)*) => {\n        impl<$($lifetime,)* E> Copy for $ty<$($lifetime,)* E> {}\n\n        impl<$($lifetime,)* E> Clone for $ty<$($lifetime,)* E> {\n            fn clone(&self) -> Self {\n                *self\n            }\n        }\n    };\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/// A minimal representation of all possible errors that can occur using the\n/// `IntoDeserializer` trait.\n#[derive(Clone, PartialEq)]\npub struct Error {\n    err: ErrorImpl,\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\ntype ErrorImpl = Box<str>;\n#[cfg(not(any(feature = \"std\", feature = \"alloc\")))]\ntype ErrorImpl = ();\n\nimpl de::Error for Error {\n    #[cfg(any(feature = \"std\", feature = \"alloc\"))]\n    #[cold]\n    fn custom<T>(msg: T) -> Self\n    where\n        T: Display,\n    {\n        Error {\n            err: msg.to_string().into_boxed_str(),\n        }\n    }\n\n    #[cfg(not(any(feature = \"std\", feature = \"alloc\")))]\n    #[cold]\n    fn custom<T>(msg: T) -> Self\n    where\n        T: Display,\n    {\n        let _ = msg;\n        Error { err: () }\n    }\n}\n\nimpl ser::Error for Error {\n    #[cold]\n    fn custom<T>(msg: T) -> Self\n    where\n        T: Display,\n    {\n        de::Error::custom(msg)\n    }\n}\n\nimpl Display for Error {\n    #[cfg(any(feature = \"std\", feature = \"alloc\"))]\n    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter.write_str(&self.err)\n    }\n\n    #[cfg(not(any(feature = \"std\", feature = \"alloc\")))]\n    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter.write_str(\"Serde deserialization error\")\n    }\n}\n\nimpl Debug for Error {\n    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        let mut debug = formatter.debug_tuple(\"Error\");\n        #[cfg(any(feature = \"std\", feature = \"alloc\"))]\n        debug.field(&self.err);\n        debug.finish()\n    }\n}\n\n#[cfg(feature = \"std\")]\n#[cfg_attr(docsrs, doc(cfg(feature = \"std\")))]\nimpl error::Error for Error {\n    fn description(&self) -> &str {\n        &self.err\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nimpl<'de, E> IntoDeserializer<'de, E> for ()\nwhere\n    E: de::Error,\n{\n    type Deserializer = UnitDeserializer<E>;\n\n    fn into_deserializer(self) -> UnitDeserializer<E> {\n        UnitDeserializer::new()\n    }\n}\n\n/// A deserializer holding a `()`.\npub struct UnitDeserializer<E> {\n    marker: PhantomData<E>,\n}\n\nimpl_copy_clone!(UnitDeserializer);\n\nimpl<E> UnitDeserializer<E> {\n    #[allow(missing_docs)]\n    pub fn new() -> Self {\n        UnitDeserializer {\n            marker: PhantomData,\n        }\n    }\n}\n\nimpl<'de, E> de::Deserializer<'de> for UnitDeserializer<E>\nwhere\n    E: de::Error,\n{\n    type Error = E;\n\n    forward_to_deserialize_any! {\n        bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string\n        bytes byte_buf unit unit_struct newtype_struct seq tuple tuple_struct\n        map struct enum identifier ignored_any\n    }\n\n    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: de::Visitor<'de>,\n    {\n        visitor.visit_unit()\n    }\n\n    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: de::Visitor<'de>,\n    {\n        visitor.visit_none()\n    }\n}\n\nimpl<'de, E> IntoDeserializer<'de, E> for UnitDeserializer<E>\nwhere\n    E: de::Error,\n{\n    type Deserializer = Self;\n\n    fn into_deserializer(self) -> Self {\n        self\n    }\n}\n\nimpl<E> Debug for UnitDeserializer<E> {\n    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter.debug_struct(\"UnitDeserializer\").finish()\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/// A deserializer that cannot be instantiated.\n#[cfg(feature = \"unstable\")]\n#[cfg_attr(docsrs, doc(cfg(feature = \"unstable\")))]\npub struct NeverDeserializer<E> {\n    never: !,\n    marker: PhantomData<E>,\n}\n\n#[cfg(feature = \"unstable\")]\n#[cfg_attr(docsrs, doc(cfg(feature = \"unstable\")))]\nimpl<'de, E> IntoDeserializer<'de, E> for !\nwhere\n    E: de::Error,\n{\n    type Deserializer = NeverDeserializer<E>;\n\n    fn into_deserializer(self) -> Self::Deserializer {\n        self\n    }\n}\n\n#[cfg(feature = \"unstable\")]\nimpl<'de, E> de::Deserializer<'de> for NeverDeserializer<E>\nwhere\n    E: de::Error,\n{\n    type Error = E;\n\n    fn deserialize_any<V>(self, _visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: de::Visitor<'de>,\n    {\n        self.never\n    }\n\n    forward_to_deserialize_any! {\n        bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string\n        bytes byte_buf option unit unit_struct newtype_struct seq tuple\n        tuple_struct map struct enum identifier ignored_any\n    }\n}\n\n#[cfg(feature = \"unstable\")]\nimpl<'de, E> IntoDeserializer<'de, E> for NeverDeserializer<E>\nwhere\n    E: de::Error,\n{\n    type Deserializer = Self;\n\n    fn into_deserializer(self) -> Self {\n        self\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nmacro_rules! primitive_deserializer {\n    ($ty:ty, $doc:tt, $name:ident, $method:ident $($cast:tt)*) => {\n        #[doc = \"A deserializer holding\"]\n        #[doc = $doc]\n        pub struct $name<E> {\n            value: $ty,\n            marker: PhantomData<E>\n        }\n\n        impl_copy_clone!($name);\n\n        impl<'de, E> IntoDeserializer<'de, E> for $ty\n        where\n            E: de::Error,\n        {\n            type Deserializer = $name<E>;\n\n            fn into_deserializer(self) -> $name<E> {\n                $name::new(self)\n            }\n        }\n\n        impl<E> $name<E> {\n            #[allow(missing_docs)]\n            pub fn new(value: $ty) -> Self {\n                $name {\n                    value,\n                    marker: PhantomData,\n                }\n            }\n        }\n\n        impl<'de, E> de::Deserializer<'de> for $name<E>\n        where\n            E: de::Error,\n        {\n            type Error = E;\n\n            forward_to_deserialize_any! {\n                bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str\n                string bytes byte_buf option unit unit_struct newtype_struct seq\n                tuple tuple_struct map struct enum identifier ignored_any\n            }\n\n            fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n            where\n                V: de::Visitor<'de>,\n            {\n                visitor.$method(self.value $($cast)*)\n            }\n        }\n\n        impl<'de, E> IntoDeserializer<'de, E> for $name<E>\n        where\n            E: de::Error,\n        {\n            type Deserializer = Self;\n\n            fn into_deserializer(self) -> Self {\n                self\n            }\n        }\n\n        impl<E> Debug for $name<E> {\n            fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n                formatter\n                    .debug_struct(stringify!($name))\n                    .field(\"value\", &self.value)\n                    .finish()\n            }\n        }\n    }\n}\n\nprimitive_deserializer!(bool, \"a `bool`.\", BoolDeserializer, visit_bool);\nprimitive_deserializer!(i8, \"an `i8`.\", I8Deserializer, visit_i8);\nprimitive_deserializer!(i16, \"an `i16`.\", I16Deserializer, visit_i16);\nprimitive_deserializer!(i32, \"an `i32`.\", I32Deserializer, visit_i32);\nprimitive_deserializer!(i64, \"an `i64`.\", I64Deserializer, visit_i64);\nprimitive_deserializer!(i128, \"an `i128`.\", I128Deserializer, visit_i128);\nprimitive_deserializer!(isize, \"an `isize`.\", IsizeDeserializer, visit_i64 as i64);\nprimitive_deserializer!(u8, \"a `u8`.\", U8Deserializer, visit_u8);\nprimitive_deserializer!(u16, \"a `u16`.\", U16Deserializer, visit_u16);\nprimitive_deserializer!(u64, \"a `u64`.\", U64Deserializer, visit_u64);\nprimitive_deserializer!(u128, \"a `u128`.\", U128Deserializer, visit_u128);\nprimitive_deserializer!(usize, \"a `usize`.\", UsizeDeserializer, visit_u64 as u64);\nprimitive_deserializer!(f32, \"an `f32`.\", F32Deserializer, visit_f32);\nprimitive_deserializer!(f64, \"an `f64`.\", F64Deserializer, visit_f64);\nprimitive_deserializer!(char, \"a `char`.\", CharDeserializer, visit_char);\n\n/// A deserializer holding a `u32`.\npub struct U32Deserializer<E> {\n    value: u32,\n    marker: PhantomData<E>,\n}\n\nimpl_copy_clone!(U32Deserializer);\n\nimpl<'de, E> IntoDeserializer<'de, E> for u32\nwhere\n    E: de::Error,\n{\n    type Deserializer = U32Deserializer<E>;\n\n    fn into_deserializer(self) -> U32Deserializer<E> {\n        U32Deserializer::new(self)\n    }\n}\n\nimpl<E> U32Deserializer<E> {\n    #[allow(missing_docs)]\n    pub fn new(value: u32) -> Self {\n        U32Deserializer {\n            value,\n            marker: PhantomData,\n        }\n    }\n}\n\nimpl<'de, E> de::Deserializer<'de> for U32Deserializer<E>\nwhere\n    E: de::Error,\n{\n    type Error = E;\n\n    forward_to_deserialize_any! {\n        bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string\n        bytes byte_buf option unit unit_struct newtype_struct seq tuple\n        tuple_struct map struct identifier ignored_any\n    }\n\n    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: de::Visitor<'de>,\n    {\n        visitor.visit_u32(self.value)\n    }\n\n    fn deserialize_enum<V>(\n        self,\n        name: &str,\n        variants: &'static [&'static str],\n        visitor: V,\n    ) -> Result<V::Value, Self::Error>\n    where\n        V: de::Visitor<'de>,\n    {\n        let _ = name;\n        let _ = variants;\n        visitor.visit_enum(self)\n    }\n}\n\nimpl<'de, E> IntoDeserializer<'de, E> for U32Deserializer<E>\nwhere\n    E: de::Error,\n{\n    type Deserializer = Self;\n\n    fn into_deserializer(self) -> Self {\n        self\n    }\n}\n\nimpl<'de, E> de::EnumAccess<'de> for U32Deserializer<E>\nwhere\n    E: de::Error,\n{\n    type Error = E;\n    type Variant = private::UnitOnly<E>;\n\n    fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error>\n    where\n        T: de::DeserializeSeed<'de>,\n    {\n        seed.deserialize(self).map(private::unit_only)\n    }\n}\n\nimpl<E> Debug for U32Deserializer<E> {\n    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter\n            .debug_struct(\"U32Deserializer\")\n            .field(\"value\", &self.value)\n            .finish()\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/// A deserializer holding a `&str`.\npub struct StrDeserializer<'a, E> {\n    value: &'a str,\n    marker: PhantomData<E>,\n}\n\nimpl_copy_clone!(StrDeserializer<'de>);\n\nimpl<'de, 'a, E> IntoDeserializer<'de, E> for &'a str\nwhere\n    E: de::Error,\n{\n    type Deserializer = StrDeserializer<'a, E>;\n\n    fn into_deserializer(self) -> StrDeserializer<'a, E> {\n        StrDeserializer::new(self)\n    }\n}\n\nimpl<'a, E> StrDeserializer<'a, E> {\n    #[allow(missing_docs)]\n    pub fn new(value: &'a str) -> Self {\n        StrDeserializer {\n            value,\n            marker: PhantomData,\n        }\n    }\n}\n\nimpl<'de, 'a, E> de::Deserializer<'de> for StrDeserializer<'a, E>\nwhere\n    E: de::Error,\n{\n    type Error = E;\n\n    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: de::Visitor<'de>,\n    {\n        visitor.visit_str(self.value)\n    }\n\n    fn deserialize_enum<V>(\n        self,\n        name: &str,\n        variants: &'static [&'static str],\n        visitor: V,\n    ) -> Result<V::Value, Self::Error>\n    where\n        V: de::Visitor<'de>,\n    {\n        let _ = name;\n        let _ = variants;\n        visitor.visit_enum(self)\n    }\n\n    forward_to_deserialize_any! {\n        bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string\n        bytes byte_buf option unit unit_struct newtype_struct seq tuple\n        tuple_struct map struct identifier ignored_any\n    }\n}\n\nimpl<'de, 'a, E> IntoDeserializer<'de, E> for StrDeserializer<'a, E>\nwhere\n    E: de::Error,\n{\n    type Deserializer = Self;\n\n    fn into_deserializer(self) -> Self {\n        self\n    }\n}\n\nimpl<'de, 'a, E> de::EnumAccess<'de> for StrDeserializer<'a, E>\nwhere\n    E: de::Error,\n{\n    type Error = E;\n    type Variant = private::UnitOnly<E>;\n\n    fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error>\n    where\n        T: de::DeserializeSeed<'de>,\n    {\n        seed.deserialize(self).map(private::unit_only)\n    }\n}\n\nimpl<'a, E> Debug for StrDeserializer<'a, E> {\n    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter\n            .debug_struct(\"StrDeserializer\")\n            .field(\"value\", &self.value)\n            .finish()\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/// A deserializer holding a `&str` with a lifetime tied to another\n/// deserializer.\npub struct BorrowedStrDeserializer<'de, E> {\n    value: &'de str,\n    marker: PhantomData<E>,\n}\n\nimpl_copy_clone!(BorrowedStrDeserializer<'de>);\n\nimpl<'de, E> BorrowedStrDeserializer<'de, E> {\n    /// Create a new borrowed deserializer from the given string.\n    pub fn new(value: &'de str) -> BorrowedStrDeserializer<'de, E> {\n        BorrowedStrDeserializer {\n            value,\n            marker: PhantomData,\n        }\n    }\n}\n\nimpl<'de, E> de::Deserializer<'de> for BorrowedStrDeserializer<'de, E>\nwhere\n    E: de::Error,\n{\n    type Error = E;\n\n    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: de::Visitor<'de>,\n    {\n        visitor.visit_borrowed_str(self.value)\n    }\n\n    fn deserialize_enum<V>(\n        self,\n        name: &str,\n        variants: &'static [&'static str],\n        visitor: V,\n    ) -> Result<V::Value, Self::Error>\n    where\n        V: de::Visitor<'de>,\n    {\n        let _ = name;\n        let _ = variants;\n        visitor.visit_enum(self)\n    }\n\n    forward_to_deserialize_any! {\n        bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string\n        bytes byte_buf option unit unit_struct newtype_struct seq tuple\n        tuple_struct map struct identifier ignored_any\n    }\n}\n\nimpl<'de, E> IntoDeserializer<'de, E> for BorrowedStrDeserializer<'de, E>\nwhere\n    E: de::Error,\n{\n    type Deserializer = Self;\n\n    fn into_deserializer(self) -> Self {\n        self\n    }\n}\n\nimpl<'de, E> de::EnumAccess<'de> for BorrowedStrDeserializer<'de, E>\nwhere\n    E: de::Error,\n{\n    type Error = E;\n    type Variant = private::UnitOnly<E>;\n\n    fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error>\n    where\n        T: de::DeserializeSeed<'de>,\n    {\n        seed.deserialize(self).map(private::unit_only)\n    }\n}\n\nimpl<'de, E> Debug for BorrowedStrDeserializer<'de, E> {\n    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter\n            .debug_struct(\"BorrowedStrDeserializer\")\n            .field(\"value\", &self.value)\n            .finish()\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/// A deserializer holding a `String`.\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\n#[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\npub struct StringDeserializer<E> {\n    value: String,\n    marker: PhantomData<E>,\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nimpl<E> Clone for StringDeserializer<E> {\n    fn clone(&self) -> Self {\n        StringDeserializer {\n            value: self.value.clone(),\n            marker: PhantomData,\n        }\n    }\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\n#[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\nimpl<'de, E> IntoDeserializer<'de, E> for String\nwhere\n    E: de::Error,\n{\n    type Deserializer = StringDeserializer<E>;\n\n    fn into_deserializer(self) -> StringDeserializer<E> {\n        StringDeserializer::new(self)\n    }\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nimpl<E> StringDeserializer<E> {\n    #[allow(missing_docs)]\n    pub fn new(value: String) -> Self {\n        StringDeserializer {\n            value,\n            marker: PhantomData,\n        }\n    }\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nimpl<'de, E> de::Deserializer<'de> for StringDeserializer<E>\nwhere\n    E: de::Error,\n{\n    type Error = E;\n\n    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: de::Visitor<'de>,\n    {\n        visitor.visit_string(self.value)\n    }\n\n    fn deserialize_enum<V>(\n        self,\n        name: &str,\n        variants: &'static [&'static str],\n        visitor: V,\n    ) -> Result<V::Value, Self::Error>\n    where\n        V: de::Visitor<'de>,\n    {\n        let _ = name;\n        let _ = variants;\n        visitor.visit_enum(self)\n    }\n\n    forward_to_deserialize_any! {\n        bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string\n        bytes byte_buf option unit unit_struct newtype_struct seq tuple\n        tuple_struct map struct identifier ignored_any\n    }\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nimpl<'de, E> IntoDeserializer<'de, E> for StringDeserializer<E>\nwhere\n    E: de::Error,\n{\n    type Deserializer = Self;\n\n    fn into_deserializer(self) -> Self {\n        self\n    }\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nimpl<'de, E> de::EnumAccess<'de> for StringDeserializer<E>\nwhere\n    E: de::Error,\n{\n    type Error = E;\n    type Variant = private::UnitOnly<E>;\n\n    fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error>\n    where\n        T: de::DeserializeSeed<'de>,\n    {\n        seed.deserialize(self).map(private::unit_only)\n    }\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nimpl<E> Debug for StringDeserializer<E> {\n    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter\n            .debug_struct(\"StringDeserializer\")\n            .field(\"value\", &self.value)\n            .finish()\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/// A deserializer holding a `Cow<str>`.\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\n#[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\npub struct CowStrDeserializer<'a, E> {\n    value: Cow<'a, str>,\n    marker: PhantomData<E>,\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nimpl<'a, E> Clone for CowStrDeserializer<'a, E> {\n    fn clone(&self) -> Self {\n        CowStrDeserializer {\n            value: self.value.clone(),\n            marker: PhantomData,\n        }\n    }\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\n#[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\nimpl<'de, 'a, E> IntoDeserializer<'de, E> for Cow<'a, str>\nwhere\n    E: de::Error,\n{\n    type Deserializer = CowStrDeserializer<'a, E>;\n\n    fn into_deserializer(self) -> CowStrDeserializer<'a, E> {\n        CowStrDeserializer::new(self)\n    }\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nimpl<'a, E> CowStrDeserializer<'a, E> {\n    #[allow(missing_docs)]\n    pub fn new(value: Cow<'a, str>) -> Self {\n        CowStrDeserializer {\n            value,\n            marker: PhantomData,\n        }\n    }\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nimpl<'de, 'a, E> de::Deserializer<'de> for CowStrDeserializer<'a, E>\nwhere\n    E: de::Error,\n{\n    type Error = E;\n\n    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: de::Visitor<'de>,\n    {\n        match self.value {\n            Cow::Borrowed(string) => visitor.visit_str(string),\n            Cow::Owned(string) => visitor.visit_string(string),\n        }\n    }\n\n    fn deserialize_enum<V>(\n        self,\n        name: &str,\n        variants: &'static [&'static str],\n        visitor: V,\n    ) -> Result<V::Value, Self::Error>\n    where\n        V: de::Visitor<'de>,\n    {\n        let _ = name;\n        let _ = variants;\n        visitor.visit_enum(self)\n    }\n\n    forward_to_deserialize_any! {\n        bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string\n        bytes byte_buf option unit unit_struct newtype_struct seq tuple\n        tuple_struct map struct identifier ignored_any\n    }\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nimpl<'de, 'a, E> IntoDeserializer<'de, E> for CowStrDeserializer<'a, E>\nwhere\n    E: de::Error,\n{\n    type Deserializer = Self;\n\n    fn into_deserializer(self) -> Self {\n        self\n    }\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nimpl<'de, 'a, E> de::EnumAccess<'de> for CowStrDeserializer<'a, E>\nwhere\n    E: de::Error,\n{\n    type Error = E;\n    type Variant = private::UnitOnly<E>;\n\n    fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error>\n    where\n        T: de::DeserializeSeed<'de>,\n    {\n        seed.deserialize(self).map(private::unit_only)\n    }\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nimpl<'a, E> Debug for CowStrDeserializer<'a, E> {\n    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter\n            .debug_struct(\"CowStrDeserializer\")\n            .field(\"value\", &self.value)\n            .finish()\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/// A deserializer holding a `&[u8]`. Always calls [`Visitor::visit_bytes`].\npub struct BytesDeserializer<'a, E> {\n    value: &'a [u8],\n    marker: PhantomData<E>,\n}\n\nimpl<'a, E> BytesDeserializer<'a, E> {\n    /// Create a new deserializer from the given bytes.\n    pub fn new(value: &'a [u8]) -> Self {\n        BytesDeserializer {\n            value,\n            marker: PhantomData,\n        }\n    }\n}\n\nimpl_copy_clone!(BytesDeserializer<'a>);\n\nimpl<'de, 'a, E> IntoDeserializer<'de, E> for &'a [u8]\nwhere\n    E: de::Error,\n{\n    type Deserializer = BytesDeserializer<'a, E>;\n\n    fn into_deserializer(self) -> BytesDeserializer<'a, E> {\n        BytesDeserializer::new(self)\n    }\n}\n\nimpl<'de, 'a, E> Deserializer<'de> for BytesDeserializer<'a, E>\nwhere\n    E: de::Error,\n{\n    type Error = E;\n\n    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>,\n    {\n        visitor.visit_bytes(self.value)\n    }\n\n    forward_to_deserialize_any! {\n        bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string\n        bytes byte_buf option unit unit_struct newtype_struct seq tuple\n        tuple_struct map struct enum identifier ignored_any\n    }\n}\n\nimpl<'de, 'a, E> IntoDeserializer<'de, E> for BytesDeserializer<'a, E>\nwhere\n    E: de::Error,\n{\n    type Deserializer = Self;\n\n    fn into_deserializer(self) -> Self {\n        self\n    }\n}\n\nimpl<'a, E> Debug for BytesDeserializer<'a, E> {\n    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter\n            .debug_struct(\"BytesDeserializer\")\n            .field(\"value\", &self.value)\n            .finish()\n    }\n}\n\n/// A deserializer holding a `&[u8]` with a lifetime tied to another\n/// deserializer. Always calls [`Visitor::visit_borrowed_bytes`].\npub struct BorrowedBytesDeserializer<'de, E> {\n    value: &'de [u8],\n    marker: PhantomData<E>,\n}\n\nimpl<'de, E> BorrowedBytesDeserializer<'de, E> {\n    /// Create a new borrowed deserializer from the given borrowed bytes.\n    pub fn new(value: &'de [u8]) -> Self {\n        BorrowedBytesDeserializer {\n            value,\n            marker: PhantomData,\n        }\n    }\n}\n\nimpl_copy_clone!(BorrowedBytesDeserializer<'de>);\n\nimpl<'de, E> Deserializer<'de> for BorrowedBytesDeserializer<'de, E>\nwhere\n    E: de::Error,\n{\n    type Error = E;\n\n    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>,\n    {\n        visitor.visit_borrowed_bytes(self.value)\n    }\n\n    forward_to_deserialize_any! {\n        bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string\n        bytes byte_buf option unit unit_struct newtype_struct seq tuple\n        tuple_struct map struct enum identifier ignored_any\n    }\n}\n\nimpl<'de, E> IntoDeserializer<'de, E> for BorrowedBytesDeserializer<'de, E>\nwhere\n    E: de::Error,\n{\n    type Deserializer = Self;\n\n    fn into_deserializer(self) -> Self {\n        self\n    }\n}\n\nimpl<'de, E> Debug for BorrowedBytesDeserializer<'de, E> {\n    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter\n            .debug_struct(\"BorrowedBytesDeserializer\")\n            .field(\"value\", &self.value)\n            .finish()\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/// A deserializer that iterates over a sequence.\n#[derive(Clone)]\npub struct SeqDeserializer<I, E> {\n    iter: iter::Fuse<I>,\n    count: usize,\n    marker: PhantomData<E>,\n}\n\nimpl<I, E> SeqDeserializer<I, E>\nwhere\n    I: Iterator,\n{\n    /// Construct a new `SeqDeserializer<I, E>`.\n    pub fn new(iter: I) -> Self {\n        SeqDeserializer {\n            iter: iter.fuse(),\n            count: 0,\n            marker: PhantomData,\n        }\n    }\n}\n\nimpl<I, E> SeqDeserializer<I, E>\nwhere\n    I: Iterator,\n    E: de::Error,\n{\n    /// Check for remaining elements after passing a `SeqDeserializer` to\n    /// `Visitor::visit_seq`.\n    pub fn end(self) -> Result<(), E> {\n        let remaining = self.iter.count();\n        if remaining == 0 {\n            Ok(())\n        } else {\n            // First argument is the number of elements in the data, second\n            // argument is the number of elements expected by the Deserialize.\n            Err(de::Error::invalid_length(\n                self.count + remaining,\n                &ExpectedInSeq(self.count),\n            ))\n        }\n    }\n}\n\nimpl<'de, I, T, E> de::Deserializer<'de> for SeqDeserializer<I, E>\nwhere\n    I: Iterator<Item = T>,\n    T: IntoDeserializer<'de, E>,\n    E: de::Error,\n{\n    type Error = E;\n\n    fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: de::Visitor<'de>,\n    {\n        let v = tri!(visitor.visit_seq(&mut self));\n        tri!(self.end());\n        Ok(v)\n    }\n\n    forward_to_deserialize_any! {\n        bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string\n        bytes byte_buf option unit unit_struct newtype_struct seq tuple\n        tuple_struct map struct enum identifier ignored_any\n    }\n}\n\nimpl<'de, I, T, E> IntoDeserializer<'de, E> for SeqDeserializer<I, E>\nwhere\n    I: Iterator<Item = T>,\n    T: IntoDeserializer<'de, E>,\n    E: de::Error,\n{\n    type Deserializer = Self;\n\n    fn into_deserializer(self) -> Self {\n        self\n    }\n}\n\nimpl<'de, I, T, E> de::SeqAccess<'de> for SeqDeserializer<I, E>\nwhere\n    I: Iterator<Item = T>,\n    T: IntoDeserializer<'de, E>,\n    E: de::Error,\n{\n    type Error = E;\n\n    fn next_element_seed<V>(&mut self, seed: V) -> Result<Option<V::Value>, Self::Error>\n    where\n        V: de::DeserializeSeed<'de>,\n    {\n        match self.iter.next() {\n            Some(value) => {\n                self.count += 1;\n                seed.deserialize(value.into_deserializer()).map(Some)\n            }\n            None => Ok(None),\n        }\n    }\n\n    fn size_hint(&self) -> Option<usize> {\n        size_hint::from_bounds(&self.iter)\n    }\n}\n\nstruct ExpectedInSeq(usize);\n\nimpl Expected for ExpectedInSeq {\n    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        if self.0 == 1 {\n            formatter.write_str(\"1 element in sequence\")\n        } else {\n            write!(formatter, \"{} elements in sequence\", self.0)\n        }\n    }\n}\n\nimpl<I, E> Debug for SeqDeserializer<I, E>\nwhere\n    I: Debug,\n{\n    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter\n            .debug_struct(\"SeqDeserializer\")\n            .field(\"iter\", &self.iter)\n            .field(\"count\", &self.count)\n            .finish()\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\n#[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\nimpl<'de, T, E> IntoDeserializer<'de, E> for Vec<T>\nwhere\n    T: IntoDeserializer<'de, E>,\n    E: de::Error,\n{\n    type Deserializer = SeqDeserializer<<Self as IntoIterator>::IntoIter, E>;\n\n    fn into_deserializer(self) -> Self::Deserializer {\n        SeqDeserializer::new(self.into_iter())\n    }\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\n#[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\nimpl<'de, T, E> IntoDeserializer<'de, E> for BTreeSet<T>\nwhere\n    T: IntoDeserializer<'de, E> + Eq + Ord,\n    E: de::Error,\n{\n    type Deserializer = SeqDeserializer<<Self as IntoIterator>::IntoIter, E>;\n\n    fn into_deserializer(self) -> Self::Deserializer {\n        SeqDeserializer::new(self.into_iter())\n    }\n}\n\n#[cfg(feature = \"std\")]\n#[cfg_attr(docsrs, doc(cfg(feature = \"std\")))]\nimpl<'de, T, S, E> IntoDeserializer<'de, E> for HashSet<T, S>\nwhere\n    T: IntoDeserializer<'de, E> + Eq + Hash,\n    S: BuildHasher,\n    E: de::Error,\n{\n    type Deserializer = SeqDeserializer<<Self as IntoIterator>::IntoIter, E>;\n\n    fn into_deserializer(self) -> Self::Deserializer {\n        SeqDeserializer::new(self.into_iter())\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/// A deserializer holding a `SeqAccess`.\n#[derive(Clone, Debug)]\npub struct SeqAccessDeserializer<A> {\n    seq: A,\n}\n\nimpl<A> SeqAccessDeserializer<A> {\n    /// Construct a new `SeqAccessDeserializer<A>`.\n    pub fn new(seq: A) -> Self {\n        SeqAccessDeserializer { seq }\n    }\n}\n\nimpl<'de, A> de::Deserializer<'de> for SeqAccessDeserializer<A>\nwhere\n    A: de::SeqAccess<'de>,\n{\n    type Error = A::Error;\n\n    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: de::Visitor<'de>,\n    {\n        visitor.visit_seq(self.seq)\n    }\n\n    forward_to_deserialize_any! {\n        bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string\n        bytes byte_buf option unit unit_struct newtype_struct seq tuple\n        tuple_struct map struct enum identifier ignored_any\n    }\n}\n\nimpl<'de, A> IntoDeserializer<'de, A::Error> for SeqAccessDeserializer<A>\nwhere\n    A: de::SeqAccess<'de>,\n{\n    type Deserializer = Self;\n\n    fn into_deserializer(self) -> Self {\n        self\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/// A deserializer that iterates over a map.\npub struct MapDeserializer<'de, I, E>\nwhere\n    I: Iterator,\n    I::Item: private::Pair,\n{\n    iter: iter::Fuse<I>,\n    value: Option<Second<I::Item>>,\n    count: usize,\n    lifetime: PhantomData<&'de ()>,\n    error: PhantomData<E>,\n}\n\nimpl<'de, I, E> MapDeserializer<'de, I, E>\nwhere\n    I: Iterator,\n    I::Item: private::Pair,\n{\n    /// Construct a new `MapDeserializer<I, E>`.\n    pub fn new(iter: I) -> Self {\n        MapDeserializer {\n            iter: iter.fuse(),\n            value: None,\n            count: 0,\n            lifetime: PhantomData,\n            error: PhantomData,\n        }\n    }\n}\n\nimpl<'de, I, E> MapDeserializer<'de, I, E>\nwhere\n    I: Iterator,\n    I::Item: private::Pair,\n    E: de::Error,\n{\n    /// Check for remaining elements after passing a `MapDeserializer` to\n    /// `Visitor::visit_map`.\n    pub fn end(self) -> Result<(), E> {\n        let remaining = self.iter.count();\n        if remaining == 0 {\n            Ok(())\n        } else {\n            // First argument is the number of elements in the data, second\n            // argument is the number of elements expected by the Deserialize.\n            Err(de::Error::invalid_length(\n                self.count + remaining,\n                &ExpectedInMap(self.count),\n            ))\n        }\n    }\n}\n\nimpl<'de, I, E> MapDeserializer<'de, I, E>\nwhere\n    I: Iterator,\n    I::Item: private::Pair,\n{\n    fn next_pair(&mut self) -> Option<(First<I::Item>, Second<I::Item>)> {\n        match self.iter.next() {\n            Some(kv) => {\n                self.count += 1;\n                Some(private::Pair::split(kv))\n            }\n            None => None,\n        }\n    }\n}\n\nimpl<'de, I, E> de::Deserializer<'de> for MapDeserializer<'de, I, E>\nwhere\n    I: Iterator,\n    I::Item: private::Pair,\n    First<I::Item>: IntoDeserializer<'de, E>,\n    Second<I::Item>: IntoDeserializer<'de, E>,\n    E: de::Error,\n{\n    type Error = E;\n\n    fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: de::Visitor<'de>,\n    {\n        let value = tri!(visitor.visit_map(&mut self));\n        tri!(self.end());\n        Ok(value)\n    }\n\n    fn deserialize_seq<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: de::Visitor<'de>,\n    {\n        let value = tri!(visitor.visit_seq(&mut self));\n        tri!(self.end());\n        Ok(value)\n    }\n\n    fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: de::Visitor<'de>,\n    {\n        let _ = len;\n        self.deserialize_seq(visitor)\n    }\n\n    forward_to_deserialize_any! {\n        bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string\n        bytes byte_buf option unit unit_struct newtype_struct tuple_struct map\n        struct enum identifier ignored_any\n    }\n}\n\nimpl<'de, I, E> IntoDeserializer<'de, E> for MapDeserializer<'de, I, E>\nwhere\n    I: Iterator,\n    I::Item: private::Pair,\n    First<I::Item>: IntoDeserializer<'de, E>,\n    Second<I::Item>: IntoDeserializer<'de, E>,\n    E: de::Error,\n{\n    type Deserializer = Self;\n\n    fn into_deserializer(self) -> Self {\n        self\n    }\n}\n\nimpl<'de, I, E> de::MapAccess<'de> for MapDeserializer<'de, I, E>\nwhere\n    I: Iterator,\n    I::Item: private::Pair,\n    First<I::Item>: IntoDeserializer<'de, E>,\n    Second<I::Item>: IntoDeserializer<'de, E>,\n    E: de::Error,\n{\n    type Error = E;\n\n    fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>\n    where\n        T: de::DeserializeSeed<'de>,\n    {\n        match self.next_pair() {\n            Some((key, value)) => {\n                self.value = Some(value);\n                seed.deserialize(key.into_deserializer()).map(Some)\n            }\n            None => Ok(None),\n        }\n    }\n\n    fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error>\n    where\n        T: de::DeserializeSeed<'de>,\n    {\n        let value = self.value.take();\n        // Panic because this indicates a bug in the program rather than an\n        // expected failure.\n        let value = value.expect(\"MapAccess::next_value called before next_key\");\n        seed.deserialize(value.into_deserializer())\n    }\n\n    fn next_entry_seed<TK, TV>(\n        &mut self,\n        kseed: TK,\n        vseed: TV,\n    ) -> Result<Option<(TK::Value, TV::Value)>, Self::Error>\n    where\n        TK: de::DeserializeSeed<'de>,\n        TV: de::DeserializeSeed<'de>,\n    {\n        match self.next_pair() {\n            Some((key, value)) => {\n                let key = tri!(kseed.deserialize(key.into_deserializer()));\n                let value = tri!(vseed.deserialize(value.into_deserializer()));\n                Ok(Some((key, value)))\n            }\n            None => Ok(None),\n        }\n    }\n\n    fn size_hint(&self) -> Option<usize> {\n        size_hint::from_bounds(&self.iter)\n    }\n}\n\nimpl<'de, I, E> de::SeqAccess<'de> for MapDeserializer<'de, I, E>\nwhere\n    I: Iterator,\n    I::Item: private::Pair,\n    First<I::Item>: IntoDeserializer<'de, E>,\n    Second<I::Item>: IntoDeserializer<'de, E>,\n    E: de::Error,\n{\n    type Error = E;\n\n    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>\n    where\n        T: de::DeserializeSeed<'de>,\n    {\n        match self.next_pair() {\n            Some((k, v)) => {\n                let de = PairDeserializer(k, v, PhantomData);\n                seed.deserialize(de).map(Some)\n            }\n            None => Ok(None),\n        }\n    }\n\n    fn size_hint(&self) -> Option<usize> {\n        size_hint::from_bounds(&self.iter)\n    }\n}\n\n// Cannot #[derive(Clone)] because of the bound `Second<I::Item>: Clone`.\nimpl<'de, I, E> Clone for MapDeserializer<'de, I, E>\nwhere\n    I: Iterator + Clone,\n    I::Item: private::Pair,\n    Second<I::Item>: Clone,\n{\n    fn clone(&self) -> Self {\n        MapDeserializer {\n            iter: self.iter.clone(),\n            value: self.value.clone(),\n            count: self.count,\n            lifetime: self.lifetime,\n            error: self.error,\n        }\n    }\n}\n\nimpl<'de, I, E> Debug for MapDeserializer<'de, I, E>\nwhere\n    I: Iterator + Debug,\n    I::Item: private::Pair,\n    Second<I::Item>: Debug,\n{\n    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter\n            .debug_struct(\"MapDeserializer\")\n            .field(\"iter\", &self.iter)\n            .field(\"value\", &self.value)\n            .field(\"count\", &self.count)\n            .finish()\n    }\n}\n\n// Used in the `impl SeqAccess for MapDeserializer` to visit the map as a\n// sequence of pairs.\nstruct PairDeserializer<A, B, E>(A, B, PhantomData<E>);\n\nimpl<'de, A, B, E> de::Deserializer<'de> for PairDeserializer<A, B, E>\nwhere\n    A: IntoDeserializer<'de, E>,\n    B: IntoDeserializer<'de, E>,\n    E: de::Error,\n{\n    type Error = E;\n\n    forward_to_deserialize_any! {\n        bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string\n        bytes byte_buf option unit unit_struct newtype_struct tuple_struct map\n        struct enum identifier ignored_any\n    }\n\n    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: de::Visitor<'de>,\n    {\n        self.deserialize_seq(visitor)\n    }\n\n    fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: de::Visitor<'de>,\n    {\n        let mut pair_visitor = PairVisitor(Some(self.0), Some(self.1), PhantomData);\n        let pair = tri!(visitor.visit_seq(&mut pair_visitor));\n        if pair_visitor.1.is_none() {\n            Ok(pair)\n        } else {\n            let remaining = pair_visitor.size_hint().unwrap();\n            // First argument is the number of elements in the data, second\n            // argument is the number of elements expected by the Deserialize.\n            Err(de::Error::invalid_length(2, &ExpectedInSeq(2 - remaining)))\n        }\n    }\n\n    fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: de::Visitor<'de>,\n    {\n        if len == 2 {\n            self.deserialize_seq(visitor)\n        } else {\n            // First argument is the number of elements in the data, second\n            // argument is the number of elements expected by the Deserialize.\n            Err(de::Error::invalid_length(2, &ExpectedInSeq(len)))\n        }\n    }\n}\n\nstruct PairVisitor<A, B, E>(Option<A>, Option<B>, PhantomData<E>);\n\nimpl<'de, A, B, E> de::SeqAccess<'de> for PairVisitor<A, B, E>\nwhere\n    A: IntoDeserializer<'de, E>,\n    B: IntoDeserializer<'de, E>,\n    E: de::Error,\n{\n    type Error = E;\n\n    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>\n    where\n        T: de::DeserializeSeed<'de>,\n    {\n        if let Some(k) = self.0.take() {\n            seed.deserialize(k.into_deserializer()).map(Some)\n        } else if let Some(v) = self.1.take() {\n            seed.deserialize(v.into_deserializer()).map(Some)\n        } else {\n            Ok(None)\n        }\n    }\n\n    fn size_hint(&self) -> Option<usize> {\n        if self.0.is_some() {\n            Some(2)\n        } else if self.1.is_some() {\n            Some(1)\n        } else {\n            Some(0)\n        }\n    }\n}\n\nstruct ExpectedInMap(usize);\n\nimpl Expected for ExpectedInMap {\n    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        if self.0 == 1 {\n            formatter.write_str(\"1 element in map\")\n        } else {\n            write!(formatter, \"{} elements in map\", self.0)\n        }\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\n#[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\nimpl<'de, K, V, E> IntoDeserializer<'de, E> for BTreeMap<K, V>\nwhere\n    K: IntoDeserializer<'de, E> + Eq + Ord,\n    V: IntoDeserializer<'de, E>,\n    E: de::Error,\n{\n    type Deserializer = MapDeserializer<'de, <Self as IntoIterator>::IntoIter, E>;\n\n    fn into_deserializer(self) -> Self::Deserializer {\n        MapDeserializer::new(self.into_iter())\n    }\n}\n\n#[cfg(feature = \"std\")]\n#[cfg_attr(docsrs, doc(cfg(feature = \"std\")))]\nimpl<'de, K, V, S, E> IntoDeserializer<'de, E> for HashMap<K, V, S>\nwhere\n    K: IntoDeserializer<'de, E> + Eq + Hash,\n    V: IntoDeserializer<'de, E>,\n    S: BuildHasher,\n    E: de::Error,\n{\n    type Deserializer = MapDeserializer<'de, <Self as IntoIterator>::IntoIter, E>;\n\n    fn into_deserializer(self) -> Self::Deserializer {\n        MapDeserializer::new(self.into_iter())\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/// A deserializer holding a `MapAccess`.\n#[derive(Clone, Debug)]\npub struct MapAccessDeserializer<A> {\n    map: A,\n}\n\nimpl<A> MapAccessDeserializer<A> {\n    /// Construct a new `MapAccessDeserializer<A>`.\n    pub fn new(map: A) -> Self {\n        MapAccessDeserializer { map }\n    }\n}\n\nimpl<'de, A> de::Deserializer<'de> for MapAccessDeserializer<A>\nwhere\n    A: de::MapAccess<'de>,\n{\n    type Error = A::Error;\n\n    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: de::Visitor<'de>,\n    {\n        visitor.visit_map(self.map)\n    }\n\n    fn deserialize_enum<V>(\n        self,\n        _name: &str,\n        _variants: &'static [&'static str],\n        visitor: V,\n    ) -> Result<V::Value, Self::Error>\n    where\n        V: de::Visitor<'de>,\n    {\n        visitor.visit_enum(self)\n    }\n\n    forward_to_deserialize_any! {\n        bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string\n        bytes byte_buf option unit unit_struct newtype_struct seq tuple\n        tuple_struct map struct identifier ignored_any\n    }\n}\n\nimpl<'de, A> IntoDeserializer<'de, A::Error> for MapAccessDeserializer<A>\nwhere\n    A: de::MapAccess<'de>,\n{\n    type Deserializer = Self;\n\n    fn into_deserializer(self) -> Self {\n        self\n    }\n}\n\nimpl<'de, A> de::EnumAccess<'de> for MapAccessDeserializer<A>\nwhere\n    A: de::MapAccess<'de>,\n{\n    type Error = A::Error;\n    type Variant = private::MapAsEnum<A>;\n\n    fn variant_seed<T>(mut self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error>\n    where\n        T: de::DeserializeSeed<'de>,\n    {\n        match tri!(self.map.next_key_seed(seed)) {\n            Some(key) => Ok((key, private::map_as_enum(self.map))),\n            None => Err(de::Error::invalid_type(de::Unexpected::Map, &\"enum\")),\n        }\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/// A deserializer holding an `EnumAccess`.\n#[derive(Clone, Debug)]\npub struct EnumAccessDeserializer<A> {\n    access: A,\n}\n\nimpl<A> EnumAccessDeserializer<A> {\n    /// Construct a new `EnumAccessDeserializer<A>`.\n    pub fn new(access: A) -> Self {\n        EnumAccessDeserializer { access }\n    }\n}\n\nimpl<'de, A> de::Deserializer<'de> for EnumAccessDeserializer<A>\nwhere\n    A: de::EnumAccess<'de>,\n{\n    type Error = A::Error;\n\n    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: de::Visitor<'de>,\n    {\n        visitor.visit_enum(self.access)\n    }\n\n    forward_to_deserialize_any! {\n        bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string\n        bytes byte_buf option unit unit_struct newtype_struct seq tuple\n        tuple_struct map struct enum identifier ignored_any\n    }\n}\n\nimpl<'de, A> IntoDeserializer<'de, A::Error> for EnumAccessDeserializer<A>\nwhere\n    A: de::EnumAccess<'de>,\n{\n    type Deserializer = Self;\n\n    fn into_deserializer(self) -> Self {\n        self\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nmod private {\n    use crate::lib::*;\n\n    use crate::de::{\n        self, DeserializeSeed, Deserializer, MapAccess, Unexpected, VariantAccess, Visitor,\n    };\n\n    pub struct UnitOnly<E> {\n        marker: PhantomData<E>,\n    }\n\n    pub fn unit_only<T, E>(t: T) -> (T, UnitOnly<E>) {\n        (\n            t,\n            UnitOnly {\n                marker: PhantomData,\n            },\n        )\n    }\n\n    impl<'de, E> de::VariantAccess<'de> for UnitOnly<E>\n    where\n        E: de::Error,\n    {\n        type Error = E;\n\n        fn unit_variant(self) -> Result<(), Self::Error> {\n            Ok(())\n        }\n\n        fn newtype_variant_seed<T>(self, _seed: T) -> Result<T::Value, Self::Error>\n        where\n            T: de::DeserializeSeed<'de>,\n        {\n            Err(de::Error::invalid_type(\n                Unexpected::UnitVariant,\n                &\"newtype variant\",\n            ))\n        }\n\n        fn tuple_variant<V>(self, _len: usize, _visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: de::Visitor<'de>,\n        {\n            Err(de::Error::invalid_type(\n                Unexpected::UnitVariant,\n                &\"tuple variant\",\n            ))\n        }\n\n        fn struct_variant<V>(\n            self,\n            _fields: &'static [&'static str],\n            _visitor: V,\n        ) -> Result<V::Value, Self::Error>\n        where\n            V: de::Visitor<'de>,\n        {\n            Err(de::Error::invalid_type(\n                Unexpected::UnitVariant,\n                &\"struct variant\",\n            ))\n        }\n    }\n\n    pub struct MapAsEnum<A> {\n        map: A,\n    }\n\n    pub fn map_as_enum<A>(map: A) -> MapAsEnum<A> {\n        MapAsEnum { map }\n    }\n\n    impl<'de, A> VariantAccess<'de> for MapAsEnum<A>\n    where\n        A: MapAccess<'de>,\n    {\n        type Error = A::Error;\n\n        fn unit_variant(mut self) -> Result<(), Self::Error> {\n            self.map.next_value()\n        }\n\n        fn newtype_variant_seed<T>(mut self, seed: T) -> Result<T::Value, Self::Error>\n        where\n            T: DeserializeSeed<'de>,\n        {\n            self.map.next_value_seed(seed)\n        }\n\n        fn tuple_variant<V>(mut self, len: usize, visitor: V) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.map.next_value_seed(SeedTupleVariant { len, visitor })\n        }\n\n        fn struct_variant<V>(\n            mut self,\n            _fields: &'static [&'static str],\n            visitor: V,\n        ) -> Result<V::Value, Self::Error>\n        where\n            V: Visitor<'de>,\n        {\n            self.map.next_value_seed(SeedStructVariant { visitor })\n        }\n    }\n\n    struct SeedTupleVariant<V> {\n        len: usize,\n        visitor: V,\n    }\n\n    impl<'de, V> DeserializeSeed<'de> for SeedTupleVariant<V>\n    where\n        V: Visitor<'de>,\n    {\n        type Value = V::Value;\n\n        fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>\n        where\n            D: Deserializer<'de>,\n        {\n            deserializer.deserialize_tuple(self.len, self.visitor)\n        }\n    }\n\n    struct SeedStructVariant<V> {\n        visitor: V,\n    }\n\n    impl<'de, V> DeserializeSeed<'de> for SeedStructVariant<V>\n    where\n        V: Visitor<'de>,\n    {\n        type Value = V::Value;\n\n        fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>\n        where\n            D: Deserializer<'de>,\n        {\n            deserializer.deserialize_map(self.visitor)\n        }\n    }\n\n    /// Avoid having to restate the generic types on `MapDeserializer`. The\n    /// `Iterator::Item` contains enough information to figure out K and V.\n    pub trait Pair {\n        type First;\n        type Second;\n        fn split(self) -> (Self::First, Self::Second);\n    }\n\n    impl<A, B> Pair for (A, B) {\n        type First = A;\n        type Second = B;\n        fn split(self) -> (A, B) {\n            self\n        }\n    }\n\n    pub type First<T> = <T as Pair>::First;\n    pub type Second<T> = <T as Pair>::Second;\n}\n"
  },
  {
    "path": "serde_core/src/format.rs",
    "content": "use crate::lib::fmt::{self, Write};\nuse crate::lib::str;\n\npub(super) struct Buf<'a> {\n    bytes: &'a mut [u8],\n    offset: usize,\n}\n\nimpl<'a> Buf<'a> {\n    pub fn new(bytes: &'a mut [u8]) -> Self {\n        Buf { bytes, offset: 0 }\n    }\n\n    pub fn as_str(&self) -> &str {\n        let slice = &self.bytes[..self.offset];\n        unsafe { str::from_utf8_unchecked(slice) }\n    }\n}\n\nimpl<'a> Write for Buf<'a> {\n    fn write_str(&mut self, s: &str) -> fmt::Result {\n        if self.offset + s.len() > self.bytes.len() {\n            Err(fmt::Error)\n        } else {\n            self.bytes[self.offset..self.offset + s.len()].copy_from_slice(s.as_bytes());\n            self.offset += s.len();\n            Ok(())\n        }\n    }\n}\n"
  },
  {
    "path": "serde_core/src/lib.rs",
    "content": "//! Serde is a framework for ***ser***ializing and ***de***serializing Rust data\n//! structures efficiently and generically.\n//!\n//! The `serde_core` crate contains Serde's trait definitions with **no support\n//! for #\\[derive()\\]**.\n//!\n//! In crates that derive an implementation of `Serialize` or `Deserialize`, you\n//! must depend on the [`serde`] crate, not `serde_core`.\n//!\n//! [`serde`]: https://crates.io/crates/serde\n//!\n//! In crates that handwrite implementations of Serde traits, or only use them\n//! as trait bounds, depending on `serde_core` is permitted. But `serde`\n//! re-exports all of these traits and can be used for this use case too. If in\n//! doubt, disregard `serde_core` and always use `serde`.\n//!\n//! Crates that depend on `serde_core` instead of `serde` are able to compile in\n//! parallel with `serde_derive` even when `serde`'s \"derive\" feature is turned on,\n//! as shown in the following build timings.\n//!\n//! <br>\n//!\n//! <table>\n//! <tr><td align=\"center\">When <code>serde_json</code> depends on <code>serde</code></td></tr>\n//! <tr><td><img src=\"https://github.com/user-attachments/assets/78dc179c-6ab1-4059-928c-1474b0d9d0bb\"></td></tr>\n//! </table>\n//!\n//! <br>\n//!\n//! <table>\n//! <tr><td align=\"center\">When <code>serde_json</code> depends on <code>serde_core</code></td></tr>\n//! <tr><td><img src=\"https://github.com/user-attachments/assets/6b6cff5e-3e45-4ac7-9db1-d99ee8b9f5f7\"></td></tr>\n//! </table>\n\n////////////////////////////////////////////////////////////////////////////////\n\n// Serde types in rustdoc of other crates get linked to here.\n#![doc(html_root_url = \"https://docs.rs/serde_core/1.0.228\")]\n// Support using Serde without the standard library!\n#![cfg_attr(not(feature = \"std\"), no_std)]\n// Show which crate feature enables conditionally compiled APIs in documentation.\n#![cfg_attr(docsrs, feature(doc_cfg, rustdoc_internals))]\n#![cfg_attr(docsrs, allow(internal_features))]\n// Unstable functionality only if the user asks for it. For tracking and\n// discussion of these features please refer to this issue:\n//\n//    https://github.com/serde-rs/serde/issues/812\n#![cfg_attr(feature = \"unstable\", feature(never_type))]\n#![allow(unknown_lints, bare_trait_objects, deprecated)]\n// Ignored clippy and clippy_pedantic lints\n#![allow(\n    // clippy bug: https://github.com/rust-lang/rust-clippy/issues/5704\n    clippy::unnested_or_patterns,\n    // clippy bug: https://github.com/rust-lang/rust-clippy/issues/7768\n    clippy::semicolon_if_nothing_returned,\n    // not available in our oldest supported compiler\n    clippy::empty_enums,\n    clippy::type_repetition_in_bounds, // https://github.com/rust-lang/rust-clippy/issues/8772\n    // integer and float ser/de requires these sorts of casts\n    clippy::cast_possible_truncation,\n    clippy::cast_possible_wrap,\n    clippy::cast_precision_loss,\n    clippy::cast_sign_loss,\n    // things are often more readable this way\n    clippy::cast_lossless,\n    clippy::module_name_repetitions,\n    clippy::single_match_else,\n    clippy::type_complexity,\n    clippy::use_self,\n    clippy::zero_prefixed_literal,\n    // correctly used\n    clippy::derive_partial_eq_without_eq,\n    clippy::enum_glob_use,\n    clippy::explicit_auto_deref,\n    clippy::incompatible_msrv,\n    clippy::let_underscore_untyped,\n    clippy::map_err_ignore,\n    clippy::new_without_default,\n    clippy::result_unit_err,\n    clippy::wildcard_imports,\n    // not practical\n    clippy::needless_pass_by_value,\n    clippy::similar_names,\n    clippy::too_many_lines,\n    // preference\n    clippy::doc_markdown,\n    clippy::elidable_lifetime_names,\n    clippy::needless_lifetimes,\n    clippy::unseparated_literal_suffix,\n    // false positive\n    clippy::needless_doctest_main,\n    // noisy\n    clippy::missing_errors_doc,\n    clippy::must_use_candidate,\n)]\n// Restrictions\n#![deny(clippy::question_mark_used)]\n// Rustc lints.\n#![deny(missing_docs, unused_imports)]\n\n////////////////////////////////////////////////////////////////////////////////\n\n#[cfg(feature = \"alloc\")]\nextern crate alloc;\n\n#[macro_use]\nmod crate_root;\n#[macro_use]\nmod macros;\n\ncrate_root!();\n\n#[macro_export]\n#[doc(hidden)]\nmacro_rules! __require_serde_not_serde_core {\n    () => {\n        ::core::compile_error!(\n            \"Serde derive requires a dependency on the serde crate, not serde_core\"\n        );\n    };\n}\n"
  },
  {
    "path": "serde_core/src/macros.rs",
    "content": "// Super explicit first paragraph because this shows up at the top level and\n// trips up people who are just looking for basic Serialize / Deserialize\n// documentation.\n/// Helper macro when implementing the `Deserializer` part of a new data format\n/// for Serde.\n///\n/// Some [`Deserializer`] implementations for self-describing formats do not\n/// care what hint the [`Visitor`] gives them, they just want to blindly call\n/// the [`Visitor`] method corresponding to the data they can tell is in the\n/// input. This requires repetitive implementations of all the [`Deserializer`]\n/// trait methods.\n///\n/// ```edition2021\n/// # use serde::forward_to_deserialize_any;\n/// # use serde::de::{value, Deserializer, Visitor};\n/// #\n/// # struct MyDeserializer;\n/// #\n/// # impl<'de> Deserializer<'de> for MyDeserializer {\n/// #     type Error = value::Error;\n/// #\n/// #     fn deserialize_any<V>(self, _: V) -> Result<V::Value, Self::Error>\n/// #     where\n/// #         V: Visitor<'de>,\n/// #     {\n/// #         unimplemented!()\n/// #     }\n/// #\n/// #[inline]\n/// fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n/// where\n///     V: Visitor<'de>,\n/// {\n///     self.deserialize_any(visitor)\n/// }\n/// #\n/// #     forward_to_deserialize_any! {\n/// #         i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string\n/// #         bytes byte_buf option unit unit_struct newtype_struct seq tuple\n/// #         tuple_struct map struct enum identifier ignored_any\n/// #     }\n/// # }\n/// ```\n///\n/// The `forward_to_deserialize_any!` macro implements these simple forwarding\n/// methods so that they forward directly to [`Deserializer::deserialize_any`].\n/// You can choose which methods to forward.\n///\n/// ```edition2021\n/// # use serde::forward_to_deserialize_any;\n/// # use serde::de::{value, Deserializer, Visitor};\n/// #\n/// # struct MyDeserializer;\n/// #\n/// impl<'de> Deserializer<'de> for MyDeserializer {\n/// #   type Error = value::Error;\n/// #\n///     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n///     where\n///         V: Visitor<'de>,\n///     {\n///         /* ... */\n/// #       let _ = visitor;\n/// #       unimplemented!()\n///     }\n///\n///     forward_to_deserialize_any! {\n///         bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string\n///         bytes byte_buf option unit unit_struct newtype_struct seq tuple\n///         tuple_struct map struct enum identifier ignored_any\n///     }\n/// }\n/// ```\n///\n/// The macro assumes the convention that your `Deserializer` lifetime parameter\n/// is called `'de` and that the `Visitor` type parameters on each method are\n/// called `V`. A different type parameter and a different lifetime can be\n/// specified explicitly if necessary.\n///\n/// ```edition2021\n/// # use serde::forward_to_deserialize_any;\n/// # use serde::de::{value, Deserializer, Visitor};\n/// # use std::marker::PhantomData;\n/// #\n/// # struct MyDeserializer<V>(PhantomData<V>);\n/// #\n/// # impl<'q, V> Deserializer<'q> for MyDeserializer<V> {\n/// #     type Error = value::Error;\n/// #\n/// #     fn deserialize_any<W>(self, visitor: W) -> Result<W::Value, Self::Error>\n/// #     where\n/// #         W: Visitor<'q>,\n/// #     {\n/// #         unimplemented!()\n/// #     }\n/// #\n/// forward_to_deserialize_any! {\n///     <W: Visitor<'q>>\n///     bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string\n///     bytes byte_buf option unit unit_struct newtype_struct seq tuple\n///     tuple_struct map struct enum identifier ignored_any\n/// }\n/// # }\n/// ```\n///\n/// [`Deserializer`]: crate::Deserializer\n/// [`Visitor`]: crate::de::Visitor\n/// [`Deserializer::deserialize_any`]: crate::Deserializer::deserialize_any\n#[macro_export(local_inner_macros)]\nmacro_rules! forward_to_deserialize_any {\n    (<$visitor:ident: Visitor<$lifetime:tt>> $($func:ident)*) => {\n        $(forward_to_deserialize_any_helper!{$func<$lifetime, $visitor>})*\n    };\n    // This case must be after the previous one.\n    ($($func:ident)*) => {\n        $(forward_to_deserialize_any_helper!{$func<'de, V>})*\n    };\n}\n\n#[doc(hidden)]\n#[macro_export]\nmacro_rules! forward_to_deserialize_any_method {\n    ($func:ident<$l:tt, $v:ident>($($arg:ident : $ty:ty),*)) => {\n        #[inline]\n        fn $func<$v>(self, $($arg: $ty,)* visitor: $v) -> $crate::__private::Result<$v::Value, <Self as $crate::de::Deserializer<$l>>::Error>\n        where\n            $v: $crate::de::Visitor<$l>,\n        {\n            $(\n                let _ = $arg;\n            )*\n            self.deserialize_any(visitor)\n        }\n    };\n}\n\n#[doc(hidden)]\n#[macro_export(local_inner_macros)]\nmacro_rules! forward_to_deserialize_any_helper {\n    (bool<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_bool<$l, $v>()}\n    };\n    (i8<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_i8<$l, $v>()}\n    };\n    (i16<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_i16<$l, $v>()}\n    };\n    (i32<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_i32<$l, $v>()}\n    };\n    (i64<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_i64<$l, $v>()}\n    };\n    (i128<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_i128<$l, $v>()}\n    };\n    (u8<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_u8<$l, $v>()}\n    };\n    (u16<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_u16<$l, $v>()}\n    };\n    (u32<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_u32<$l, $v>()}\n    };\n    (u64<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_u64<$l, $v>()}\n    };\n    (u128<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_u128<$l, $v>()}\n    };\n    (f32<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_f32<$l, $v>()}\n    };\n    (f64<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_f64<$l, $v>()}\n    };\n    (char<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_char<$l, $v>()}\n    };\n    (str<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_str<$l, $v>()}\n    };\n    (string<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_string<$l, $v>()}\n    };\n    (bytes<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_bytes<$l, $v>()}\n    };\n    (byte_buf<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_byte_buf<$l, $v>()}\n    };\n    (option<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_option<$l, $v>()}\n    };\n    (unit<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_unit<$l, $v>()}\n    };\n    (unit_struct<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_unit_struct<$l, $v>(name: &'static str)}\n    };\n    (newtype_struct<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_newtype_struct<$l, $v>(name: &'static str)}\n    };\n    (seq<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_seq<$l, $v>()}\n    };\n    (tuple<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_tuple<$l, $v>(len: usize)}\n    };\n    (tuple_struct<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_tuple_struct<$l, $v>(name: &'static str, len: usize)}\n    };\n    (map<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_map<$l, $v>()}\n    };\n    (struct<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_struct<$l, $v>(name: &'static str, fields: &'static [&'static str])}\n    };\n    (enum<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_enum<$l, $v>(name: &'static str, variants: &'static [&'static str])}\n    };\n    (identifier<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_identifier<$l, $v>()}\n    };\n    (ignored_any<$l:tt, $v:ident>) => {\n        forward_to_deserialize_any_method!{deserialize_ignored_any<$l, $v>()}\n    };\n}\n"
  },
  {
    "path": "serde_core/src/private/content.rs",
    "content": "use crate::lib::*;\n\n// Used from generated code to buffer the contents of the Deserializer when\n// deserializing untagged enums and internally tagged enums.\n//\n// Not public API. Use serde-value instead.\n//\n// Obsoleted by format-specific buffer types (https://github.com/serde-rs/serde/pull/2912).\n#[doc(hidden)]\npub enum Content<'de> {\n    Bool(bool),\n\n    U8(u8),\n    U16(u16),\n    U32(u32),\n    U64(u64),\n\n    I8(i8),\n    I16(i16),\n    I32(i32),\n    I64(i64),\n\n    F32(f32),\n    F64(f64),\n\n    Char(char),\n    String(String),\n    Str(&'de str),\n    ByteBuf(Vec<u8>),\n    Bytes(&'de [u8]),\n\n    None,\n    Some(Box<Content<'de>>),\n\n    Unit,\n    Newtype(Box<Content<'de>>),\n    Seq(Vec<Content<'de>>),\n    Map(Vec<(Content<'de>, Content<'de>)>),\n}\n"
  },
  {
    "path": "serde_core/src/private/doc.rs",
    "content": "// Used only by Serde doc tests. Not public API.\n\nuse crate::lib::*;\n\nuse crate::ser;\n\n#[doc(hidden)]\n#[derive(Debug)]\npub struct Error;\n\n#[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\nimpl ser::Error for Error {\n    fn custom<T>(_: T) -> Self\n    where\n        T: Display,\n    {\n        unimplemented!()\n    }\n}\n\n#[cfg(feature = \"std\")]\n#[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\nimpl error::Error for Error {\n    fn description(&self) -> &str {\n        unimplemented!()\n    }\n}\n\n#[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\nimpl Display for Error {\n    fn fmt(&self, _: &mut fmt::Formatter) -> fmt::Result {\n        unimplemented!()\n    }\n}\n\n#[doc(hidden)]\n#[macro_export]\nmacro_rules! __private_serialize {\n    () => {\n        trait Serialize {\n            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n            where\n                S: $crate::Serializer;\n        }\n    };\n}\n\n#[doc(hidden)]\n#[macro_export(local_inner_macros)]\nmacro_rules! __serialize_unimplemented {\n    ($($func:ident)*) => {\n        $(\n            __serialize_unimplemented_helper!($func);\n        )*\n    };\n}\n\n#[doc(hidden)]\n#[macro_export]\nmacro_rules! __serialize_unimplemented_method {\n    ($func:ident $(<$t:ident>)* ($($arg:ty),*) -> $ret:ident) => {\n        fn $func $(<$t>)* (self $(, _: $arg)*) -> $crate::__private::Result<Self::$ret, Self::Error>\n        where\n            $($t: ?Sized + $crate::Serialize,)*\n        {\n            unimplemented!()\n        }\n    };\n}\n\n#[doc(hidden)]\n#[macro_export(local_inner_macros)]\nmacro_rules! __serialize_unimplemented_helper {\n    (bool) => {\n        __serialize_unimplemented_method!(serialize_bool(bool) -> Ok);\n    };\n    (i8) => {\n        __serialize_unimplemented_method!(serialize_i8(i8) -> Ok);\n    };\n    (i16) => {\n        __serialize_unimplemented_method!(serialize_i16(i16) -> Ok);\n    };\n    (i32) => {\n        __serialize_unimplemented_method!(serialize_i32(i32) -> Ok);\n    };\n    (i64) => {\n        __serialize_unimplemented_method!(serialize_i64(i64) -> Ok);\n    };\n    (u8) => {\n        __serialize_unimplemented_method!(serialize_u8(u8) -> Ok);\n    };\n    (u16) => {\n        __serialize_unimplemented_method!(serialize_u16(u16) -> Ok);\n    };\n    (u32) => {\n        __serialize_unimplemented_method!(serialize_u32(u32) -> Ok);\n    };\n    (u64) => {\n        __serialize_unimplemented_method!(serialize_u64(u64) -> Ok);\n    };\n    (f32) => {\n        __serialize_unimplemented_method!(serialize_f32(f32) -> Ok);\n    };\n    (f64) => {\n        __serialize_unimplemented_method!(serialize_f64(f64) -> Ok);\n    };\n    (char) => {\n        __serialize_unimplemented_method!(serialize_char(char) -> Ok);\n    };\n    (str) => {\n        __serialize_unimplemented_method!(serialize_str(&str) -> Ok);\n    };\n    (bytes) => {\n        __serialize_unimplemented_method!(serialize_bytes(&[u8]) -> Ok);\n    };\n    (none) => {\n        __serialize_unimplemented_method!(serialize_none() -> Ok);\n    };\n    (some) => {\n        __serialize_unimplemented_method!(serialize_some<T>(&T) -> Ok);\n    };\n    (unit) => {\n        __serialize_unimplemented_method!(serialize_unit() -> Ok);\n    };\n    (unit_struct) => {\n        __serialize_unimplemented_method!(serialize_unit_struct(&str) -> Ok);\n    };\n    (unit_variant) => {\n        __serialize_unimplemented_method!(serialize_unit_variant(&str, u32, &str) -> Ok);\n    };\n    (newtype_struct) => {\n        __serialize_unimplemented_method!(serialize_newtype_struct<T>(&str, &T) -> Ok);\n    };\n    (newtype_variant) => {\n        __serialize_unimplemented_method!(serialize_newtype_variant<T>(&str, u32, &str, &T) -> Ok);\n    };\n    (seq) => {\n        type SerializeSeq = $crate::ser::Impossible<Self::Ok, Self::Error>;\n        __serialize_unimplemented_method!(serialize_seq(Option<usize>) -> SerializeSeq);\n    };\n    (tuple) => {\n        type SerializeTuple = $crate::ser::Impossible<Self::Ok, Self::Error>;\n        __serialize_unimplemented_method!(serialize_tuple(usize) -> SerializeTuple);\n    };\n    (tuple_struct) => {\n        type SerializeTupleStruct = $crate::ser::Impossible<Self::Ok, Self::Error>;\n        __serialize_unimplemented_method!(serialize_tuple_struct(&str, usize) -> SerializeTupleStruct);\n    };\n    (tuple_variant) => {\n        type SerializeTupleVariant = $crate::ser::Impossible<Self::Ok, Self::Error>;\n        __serialize_unimplemented_method!(serialize_tuple_variant(&str, u32, &str, usize) -> SerializeTupleVariant);\n    };\n    (map) => {\n        type SerializeMap = $crate::ser::Impossible<Self::Ok, Self::Error>;\n        __serialize_unimplemented_method!(serialize_map(Option<usize>) -> SerializeMap);\n    };\n    (struct) => {\n        type SerializeStruct = $crate::ser::Impossible<Self::Ok, Self::Error>;\n        __serialize_unimplemented_method!(serialize_struct(&str, usize) -> SerializeStruct);\n    };\n    (struct_variant) => {\n        type SerializeStructVariant = $crate::ser::Impossible<Self::Ok, Self::Error>;\n        __serialize_unimplemented_method!(serialize_struct_variant(&str, u32, &str, usize) -> SerializeStructVariant);\n    };\n}\n"
  },
  {
    "path": "serde_core/src/private/mod.rs",
    "content": "#[cfg(all(not(no_serde_derive), any(feature = \"std\", feature = \"alloc\")))]\nmod content;\nmod seed;\n\n// FIXME: #[cfg(doctest)] once https://github.com/rust-lang/rust/issues/67295 is fixed.\n#[doc(hidden)]\npub mod doc;\n\n#[doc(hidden)]\npub mod size_hint;\n\n#[doc(hidden)]\npub mod string;\n\n#[cfg(all(not(no_serde_derive), any(feature = \"std\", feature = \"alloc\")))]\n#[doc(hidden)]\npub use self::content::Content;\n#[doc(hidden)]\npub use self::seed::InPlaceSeed;\n#[doc(hidden)]\npub use crate::lib::result::Result;\n"
  },
  {
    "path": "serde_core/src/private/seed.rs",
    "content": "use crate::de::{Deserialize, DeserializeSeed, Deserializer};\n\n/// A DeserializeSeed helper for implementing deserialize_in_place Visitors.\n///\n/// Wraps a mutable reference and calls deserialize_in_place on it.\npub struct InPlaceSeed<'a, T: 'a>(pub &'a mut T);\n\n#[cfg_attr(not(no_diagnostic_namespace), diagnostic::do_not_recommend)]\nimpl<'a, 'de, T> DeserializeSeed<'de> for InPlaceSeed<'a, T>\nwhere\n    T: Deserialize<'de>,\n{\n    type Value = ();\n    fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        T::deserialize_in_place(deserializer, self.0)\n    }\n}\n"
  },
  {
    "path": "serde_core/src/private/size_hint.rs",
    "content": "#[cfg(any(feature = \"std\", feature = \"alloc\"))]\nuse crate::lib::*;\n\npub fn from_bounds<I>(iter: &I) -> Option<usize>\nwhere\n    I: Iterator,\n{\n    helper(iter.size_hint())\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\npub fn cautious<Element>(hint: Option<usize>) -> usize {\n    const MAX_PREALLOC_BYTES: usize = 1024 * 1024;\n\n    if mem::size_of::<Element>() == 0 {\n        0\n    } else {\n        cmp::min(\n            hint.unwrap_or(0),\n            MAX_PREALLOC_BYTES / mem::size_of::<Element>(),\n        )\n    }\n}\n\nfn helper(bounds: (usize, Option<usize>)) -> Option<usize> {\n    match bounds {\n        (lower, Some(upper)) if lower == upper => Some(upper),\n        _ => None,\n    }\n}\n"
  },
  {
    "path": "serde_core/src/private/string.rs",
    "content": "use crate::lib::*;\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\n#[doc(hidden)]\npub fn from_utf8_lossy(bytes: &[u8]) -> Cow<'_, str> {\n    String::from_utf8_lossy(bytes)\n}\n\n// The generated code calls this like:\n//\n//     let value = &_serde::__private::from_utf8_lossy(bytes);\n//     Err(_serde::de::Error::unknown_variant(value, VARIANTS))\n//\n// so it is okay for the return type to be different from the std case as long\n// as the above works.\n#[cfg(not(any(feature = \"std\", feature = \"alloc\")))]\n#[doc(hidden)]\npub fn from_utf8_lossy(bytes: &[u8]) -> &str {\n    // Three unicode replacement characters if it fails. They look like a\n    // white-on-black question mark. The user will recognize it as invalid\n    // UTF-8.\n    str::from_utf8(bytes).unwrap_or(\"\\u{fffd}\\u{fffd}\\u{fffd}\")\n}\n"
  },
  {
    "path": "serde_core/src/ser/fmt.rs",
    "content": "use crate::lib::*;\nuse crate::ser::{Error, Impossible, Serialize, Serializer};\n\nimpl Error for fmt::Error {\n    fn custom<T: Display>(_msg: T) -> Self {\n        fmt::Error\n    }\n}\n\nmacro_rules! fmt_primitives {\n    ($($f:ident: $t:ty,)*) => {\n        $(\n            fn $f(self, v: $t) -> fmt::Result {\n                Display::fmt(&v, self)\n            }\n        )*\n    };\n}\n\n/// ```edition2021\n/// use serde::ser::Serialize;\n/// use serde_derive::Serialize;\n/// use std::fmt::{self, Display};\n///\n/// #[derive(Serialize)]\n/// #[serde(rename_all = \"kebab-case\")]\n/// pub enum MessageType {\n///     StartRequest,\n///     EndRequest,\n/// }\n///\n/// impl Display for MessageType {\n///     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n///         self.serialize(f)\n///     }\n/// }\n/// ```\nimpl<'a> Serializer for &mut fmt::Formatter<'a> {\n    type Ok = ();\n    type Error = fmt::Error;\n    type SerializeSeq = Impossible<(), fmt::Error>;\n    type SerializeTuple = Impossible<(), fmt::Error>;\n    type SerializeTupleStruct = Impossible<(), fmt::Error>;\n    type SerializeTupleVariant = Impossible<(), fmt::Error>;\n    type SerializeMap = Impossible<(), fmt::Error>;\n    type SerializeStruct = Impossible<(), fmt::Error>;\n    type SerializeStructVariant = Impossible<(), fmt::Error>;\n\n    fmt_primitives! {\n        serialize_bool: bool,\n        serialize_i8: i8,\n        serialize_i16: i16,\n        serialize_i32: i32,\n        serialize_i64: i64,\n        serialize_i128: i128,\n        serialize_u8: u8,\n        serialize_u16: u16,\n        serialize_u32: u32,\n        serialize_u64: u64,\n        serialize_u128: u128,\n        serialize_f32: f32,\n        serialize_f64: f64,\n        serialize_char: char,\n        serialize_str: &str,\n        serialize_unit_struct: &'static str,\n    }\n\n    fn serialize_unit_variant(\n        self,\n        _name: &'static str,\n        _variant_index: u32,\n        variant: &'static str,\n    ) -> fmt::Result {\n        Display::fmt(variant, self)\n    }\n\n    fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> fmt::Result\n    where\n        T: ?Sized + Serialize,\n    {\n        Serialize::serialize(value, self)\n    }\n\n    fn serialize_bytes(self, _v: &[u8]) -> fmt::Result {\n        Err(fmt::Error)\n    }\n\n    fn serialize_none(self) -> fmt::Result {\n        Err(fmt::Error)\n    }\n\n    fn serialize_some<T>(self, _value: &T) -> fmt::Result\n    where\n        T: ?Sized + Serialize,\n    {\n        Err(fmt::Error)\n    }\n\n    fn serialize_unit(self) -> fmt::Result {\n        Err(fmt::Error)\n    }\n\n    fn serialize_newtype_variant<T>(\n        self,\n        _name: &'static str,\n        _variant_index: u32,\n        _variant: &'static str,\n        _value: &T,\n    ) -> fmt::Result\n    where\n        T: ?Sized + Serialize,\n    {\n        Err(fmt::Error)\n    }\n\n    fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, fmt::Error> {\n        Err(fmt::Error)\n    }\n\n    fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, fmt::Error> {\n        Err(fmt::Error)\n    }\n\n    fn serialize_tuple_struct(\n        self,\n        _name: &'static str,\n        _len: usize,\n    ) -> Result<Self::SerializeTupleStruct, fmt::Error> {\n        Err(fmt::Error)\n    }\n\n    fn serialize_tuple_variant(\n        self,\n        _name: &'static str,\n        _variant_index: u32,\n        _variant: &'static str,\n        _len: usize,\n    ) -> Result<Self::SerializeTupleVariant, fmt::Error> {\n        Err(fmt::Error)\n    }\n\n    fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, fmt::Error> {\n        Err(fmt::Error)\n    }\n\n    fn serialize_struct(\n        self,\n        _name: &'static str,\n        _len: usize,\n    ) -> Result<Self::SerializeStruct, fmt::Error> {\n        Err(fmt::Error)\n    }\n\n    fn serialize_struct_variant(\n        self,\n        _name: &'static str,\n        _variant_index: u32,\n        _variant: &'static str,\n        _len: usize,\n    ) -> Result<Self::SerializeStructVariant, fmt::Error> {\n        Err(fmt::Error)\n    }\n\n    fn collect_str<T>(self, value: &T) -> fmt::Result\n    where\n        T: ?Sized + Display,\n    {\n        Display::fmt(value, self)\n    }\n}\n"
  },
  {
    "path": "serde_core/src/ser/impls.rs",
    "content": "use crate::lib::*;\n\nuse crate::ser::{Error, Serialize, SerializeTuple, Serializer};\n\n////////////////////////////////////////////////////////////////////////////////\n\nmacro_rules! primitive_impl {\n    ($ty:ident, $method:ident $($cast:tt)*) => {\n        impl Serialize for $ty {\n            #[inline]\n            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n            where\n                S: Serializer,\n            {\n                serializer.$method(*self $($cast)*)\n            }\n        }\n    }\n}\n\nprimitive_impl!(bool, serialize_bool);\nprimitive_impl!(isize, serialize_i64 as i64);\nprimitive_impl!(i8, serialize_i8);\nprimitive_impl!(i16, serialize_i16);\nprimitive_impl!(i32, serialize_i32);\nprimitive_impl!(i64, serialize_i64);\nprimitive_impl!(i128, serialize_i128);\nprimitive_impl!(usize, serialize_u64 as u64);\nprimitive_impl!(u8, serialize_u8);\nprimitive_impl!(u16, serialize_u16);\nprimitive_impl!(u32, serialize_u32);\nprimitive_impl!(u64, serialize_u64);\nprimitive_impl!(u128, serialize_u128);\nprimitive_impl!(f32, serialize_f32);\nprimitive_impl!(f64, serialize_f64);\nprimitive_impl!(char, serialize_char);\n\n////////////////////////////////////////////////////////////////////////////////\n\nimpl Serialize for str {\n    #[inline]\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        serializer.serialize_str(self)\n    }\n}\n\n#[cfg(any(feature = \"std\", feature = \"alloc\"))]\n#[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\nimpl Serialize for String {\n    #[inline]\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        serializer.serialize_str(self)\n    }\n}\n\nimpl<'a> Serialize for fmt::Arguments<'a> {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        serializer.collect_str(self)\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n#[cfg(any(feature = \"std\", not(no_core_cstr)))]\n#[cfg_attr(docsrs, doc(cfg(feature = \"std\")))]\nimpl Serialize for CStr {\n    #[inline]\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        serializer.serialize_bytes(self.to_bytes())\n    }\n}\n\n#[cfg(any(feature = \"std\", all(not(no_core_cstr), feature = \"alloc\")))]\n#[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\nimpl Serialize for CString {\n    #[inline]\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        serializer.serialize_bytes(self.to_bytes())\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nimpl<T> Serialize for Option<T>\nwhere\n    T: Serialize,\n{\n    #[inline]\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        match *self {\n            Some(ref value) => serializer.serialize_some(value),\n            None => serializer.serialize_none(),\n        }\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nimpl<T> Serialize for PhantomData<T>\nwhere\n    T: ?Sized,\n{\n    #[inline]\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        serializer.serialize_unit_struct(\"PhantomData\")\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n// Does not require T: Serialize.\nimpl<T> Serialize for [T; 0] {\n    #[inline]\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        tri!(serializer.serialize_tuple(0)).end()\n    }\n}\n\nmacro_rules! array_impls {\n    ($($len:tt)+) => {\n        $(\n            impl<T> Serialize for [T; $len]\n            where\n                T: Serialize,\n            {\n                #[inline]\n                fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n                where\n                    S: Serializer,\n                {\n                    let mut seq = tri!(serializer.serialize_tuple($len));\n                    for e in self {\n                        tri!(seq.serialize_element(e));\n                    }\n                    seq.end()\n                }\n            }\n        )+\n    }\n}\n\narray_impls! {\n    01 02 03 04 05 06 07 08 09 10\n    11 12 13 14 15 16 17 18 19 20\n    21 22 23 24 25 26 27 28 29 30\n    31 32\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nimpl<T> Serialize for [T]\nwhere\n    T: Serialize,\n{\n    #[inline]\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        serializer.collect_seq(self)\n    }\n}\n\nmacro_rules! seq_impl {\n    (\n        $(#[$attr:meta])*\n        $ty:ident <T $(, $typaram:ident : $bound:ident)*>\n    ) => {\n        $(#[$attr])*\n        impl<T $(, $typaram)*> Serialize for $ty<T $(, $typaram)*>\n        where\n            T: Serialize,\n        {\n            #[inline]\n            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n            where\n                S: Serializer,\n            {\n                serializer.collect_seq(self)\n            }\n        }\n    }\n}\n\nseq_impl! {\n    #[cfg(any(feature = \"std\", feature = \"alloc\"))]\n    #[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\n    BinaryHeap<T>\n}\n\nseq_impl! {\n    #[cfg(any(feature = \"std\", feature = \"alloc\"))]\n    #[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\n    BTreeSet<T>\n}\n\nseq_impl! {\n    #[cfg(feature = \"std\")]\n    #[cfg_attr(docsrs, doc(cfg(feature = \"std\")))]\n    HashSet<T, H: BuildHasher>\n}\n\nseq_impl! {\n    #[cfg(any(feature = \"std\", feature = \"alloc\"))]\n    #[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\n    LinkedList<T>\n}\n\nseq_impl! {\n    #[cfg(any(feature = \"std\", feature = \"alloc\"))]\n    #[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\n    Vec<T>\n}\n\nseq_impl! {\n    #[cfg(any(feature = \"std\", feature = \"alloc\"))]\n    #[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\n    VecDeque<T>\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nimpl<Idx> Serialize for Range<Idx>\nwhere\n    Idx: Serialize,\n{\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        use super::SerializeStruct;\n        let mut state = tri!(serializer.serialize_struct(\"Range\", 2));\n        tri!(state.serialize_field(\"start\", &self.start));\n        tri!(state.serialize_field(\"end\", &self.end));\n        state.end()\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nimpl<Idx> Serialize for RangeFrom<Idx>\nwhere\n    Idx: Serialize,\n{\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        use super::SerializeStruct;\n        let mut state = tri!(serializer.serialize_struct(\"RangeFrom\", 1));\n        tri!(state.serialize_field(\"start\", &self.start));\n        state.end()\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nimpl<Idx> Serialize for RangeInclusive<Idx>\nwhere\n    Idx: Serialize,\n{\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        use super::SerializeStruct;\n        let mut state = tri!(serializer.serialize_struct(\"RangeInclusive\", 2));\n        tri!(state.serialize_field(\"start\", &self.start()));\n        tri!(state.serialize_field(\"end\", &self.end()));\n        state.end()\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nimpl<Idx> Serialize for RangeTo<Idx>\nwhere\n    Idx: Serialize,\n{\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        use super::SerializeStruct;\n        let mut state = tri!(serializer.serialize_struct(\"RangeTo\", 1));\n        tri!(state.serialize_field(\"end\", &self.end));\n        state.end()\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nimpl<T> Serialize for Bound<T>\nwhere\n    T: Serialize,\n{\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        match *self {\n            Bound::Unbounded => serializer.serialize_unit_variant(\"Bound\", 0, \"Unbounded\"),\n            Bound::Included(ref value) => {\n                serializer.serialize_newtype_variant(\"Bound\", 1, \"Included\", value)\n            }\n            Bound::Excluded(ref value) => {\n                serializer.serialize_newtype_variant(\"Bound\", 2, \"Excluded\", value)\n            }\n        }\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nimpl Serialize for () {\n    #[inline]\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        serializer.serialize_unit()\n    }\n}\n\n#[cfg(feature = \"unstable\")]\n#[cfg_attr(docsrs, doc(cfg(feature = \"unstable\")))]\nimpl Serialize for ! {\n    fn serialize<S>(&self, _serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        *self\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nmacro_rules! tuple_impls {\n    ($($len:expr => ($($n:tt $name:ident)+))+) => {\n        $(\n            #[cfg_attr(docsrs, doc(hidden))]\n            impl<$($name),+> Serialize for ($($name,)+)\n            where\n                $($name: Serialize,)+\n            {\n                tuple_impl_body!($len => ($($n)+));\n            }\n        )+\n    };\n}\n\nmacro_rules! tuple_impl_body {\n    ($len:expr => ($($n:tt)+)) => {\n        #[inline]\n        fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n        where\n            S: Serializer,\n        {\n            let mut tuple = tri!(serializer.serialize_tuple($len));\n            $(\n                tri!(tuple.serialize_element(&self.$n));\n            )+\n            tuple.end()\n        }\n    };\n}\n\n#[cfg_attr(docsrs, doc(fake_variadic))]\n#[cfg_attr(\n    docsrs,\n    doc = \"This trait is implemented for tuples up to 16 items long.\"\n)]\nimpl<T> Serialize for (T,)\nwhere\n    T: Serialize,\n{\n    tuple_impl_body!(1 => (0));\n}\n\ntuple_impls! {\n    2 => (0 T0 1 T1)\n    3 => (0 T0 1 T1 2 T2)\n    4 => (0 T0 1 T1 2 T2 3 T3)\n    5 => (0 T0 1 T1 2 T2 3 T3 4 T4)\n    6 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5)\n    7 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6)\n    8 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7)\n    9 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8)\n    10 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9)\n    11 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10)\n    12 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11)\n    13 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12)\n    14 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13)\n    15 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14)\n    16 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15)\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nmacro_rules! map_impl {\n    (\n        $(#[$attr:meta])*\n        $ty:ident <K $(: $kbound1:ident $(+ $kbound2:ident)*)*, V $(, $typaram:ident : $bound:ident)*>\n    ) => {\n        $(#[$attr])*\n        impl<K, V $(, $typaram)*> Serialize for $ty<K, V $(, $typaram)*>\n        where\n            K: Serialize,\n            V: Serialize,\n        {\n            #[inline]\n            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n            where\n                S: Serializer,\n            {\n                serializer.collect_map(self)\n            }\n        }\n    }\n}\n\nmap_impl! {\n    #[cfg(any(feature = \"std\", feature = \"alloc\"))]\n    #[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\n    BTreeMap<K: Ord, V>\n}\n\nmap_impl! {\n    #[cfg(feature = \"std\")]\n    #[cfg_attr(docsrs, doc(cfg(feature = \"std\")))]\n    HashMap<K: Eq + Hash, V, H: BuildHasher>\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nmacro_rules! deref_impl {\n    (\n        $(#[$attr:meta])*\n        <$($desc:tt)+\n    ) => {\n        $(#[$attr])*\n        impl <$($desc)+ {\n            #[inline]\n            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n            where\n                S: Serializer,\n            {\n                (**self).serialize(serializer)\n            }\n        }\n    };\n}\n\nderef_impl! {\n    <'a, T> Serialize for &'a T where T: ?Sized + Serialize\n}\n\nderef_impl! {\n    <'a, T> Serialize for &'a mut T where T: ?Sized + Serialize\n}\n\nderef_impl! {\n    #[cfg(any(feature = \"std\", feature = \"alloc\"))]\n    #[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\n    <T> Serialize for Box<T> where T: ?Sized + Serialize\n}\n\nderef_impl! {\n    /// This impl requires the [`\"rc\"`] Cargo feature of Serde.\n    ///\n    /// Serializing a data structure containing `Rc` will serialize a copy of\n    /// the contents of the `Rc` each time the `Rc` is referenced within the\n    /// data structure. Serialization will not attempt to deduplicate these\n    /// repeated data.\n    ///\n    /// [`\"rc\"`]: https://serde.rs/feature-flags.html#-features-rc\n    #[cfg(all(feature = \"rc\", any(feature = \"std\", feature = \"alloc\")))]\n    #[cfg_attr(docsrs, doc(cfg(all(feature = \"rc\", any(feature = \"std\", feature = \"alloc\")))))]\n    <T> Serialize for Rc<T> where T: ?Sized + Serialize\n}\n\nderef_impl! {\n    /// This impl requires the [`\"rc\"`] Cargo feature of Serde.\n    ///\n    /// Serializing a data structure containing `Arc` will serialize a copy of\n    /// the contents of the `Arc` each time the `Arc` is referenced within the\n    /// data structure. Serialization will not attempt to deduplicate these\n    /// repeated data.\n    ///\n    /// [`\"rc\"`]: https://serde.rs/feature-flags.html#-features-rc\n    #[cfg(all(feature = \"rc\", any(feature = \"std\", feature = \"alloc\")))]\n    #[cfg_attr(docsrs, doc(cfg(all(feature = \"rc\", any(feature = \"std\", feature = \"alloc\")))))]\n    <T> Serialize for Arc<T> where T: ?Sized + Serialize\n}\n\nderef_impl! {\n    #[cfg(any(feature = \"std\", feature = \"alloc\"))]\n    #[cfg_attr(docsrs, doc(cfg(any(feature = \"std\", feature = \"alloc\"))))]\n    <'a, T> Serialize for Cow<'a, T> where T: ?Sized + Serialize + ToOwned\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/// This impl requires the [`\"rc\"`] Cargo feature of Serde.\n///\n/// [`\"rc\"`]: https://serde.rs/feature-flags.html#-features-rc\n#[cfg(all(feature = \"rc\", any(feature = \"std\", feature = \"alloc\")))]\n#[cfg_attr(\n    docsrs,\n    doc(cfg(all(feature = \"rc\", any(feature = \"std\", feature = \"alloc\"))))\n)]\nimpl<T> Serialize for RcWeak<T>\nwhere\n    T: ?Sized + Serialize,\n{\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        self.upgrade().serialize(serializer)\n    }\n}\n\n/// This impl requires the [`\"rc\"`] Cargo feature of Serde.\n///\n/// [`\"rc\"`]: https://serde.rs/feature-flags.html#-features-rc\n#[cfg(all(feature = \"rc\", any(feature = \"std\", feature = \"alloc\")))]\n#[cfg_attr(\n    docsrs,\n    doc(cfg(all(feature = \"rc\", any(feature = \"std\", feature = \"alloc\"))))\n)]\nimpl<T> Serialize for ArcWeak<T>\nwhere\n    T: ?Sized + Serialize,\n{\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        self.upgrade().serialize(serializer)\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nmacro_rules! nonzero_integers {\n    ($($T:ident,)+) => {\n        $(\n            impl Serialize for num::$T {\n                fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n                where\n                    S: Serializer,\n                {\n                    self.get().serialize(serializer)\n                }\n            }\n        )+\n    }\n}\n\nnonzero_integers! {\n    NonZeroI8,\n    NonZeroI16,\n    NonZeroI32,\n    NonZeroI64,\n    NonZeroI128,\n    NonZeroIsize,\n    NonZeroU8,\n    NonZeroU16,\n    NonZeroU32,\n    NonZeroU64,\n    NonZeroU128,\n    NonZeroUsize,\n}\n\nimpl<T> Serialize for Cell<T>\nwhere\n    T: Serialize + Copy,\n{\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        self.get().serialize(serializer)\n    }\n}\n\nimpl<T> Serialize for RefCell<T>\nwhere\n    T: ?Sized + Serialize,\n{\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        match self.try_borrow() {\n            Ok(value) => value.serialize(serializer),\n            Err(_) => Err(S::Error::custom(\"already mutably borrowed\")),\n        }\n    }\n}\n\n#[cfg(feature = \"std\")]\n#[cfg_attr(docsrs, doc(cfg(feature = \"std\")))]\nimpl<T> Serialize for Mutex<T>\nwhere\n    T: ?Sized + Serialize,\n{\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        match self.lock() {\n            Ok(locked) => locked.serialize(serializer),\n            Err(_) => Err(S::Error::custom(\"lock poison error while serializing\")),\n        }\n    }\n}\n\n#[cfg(feature = \"std\")]\n#[cfg_attr(docsrs, doc(cfg(feature = \"std\")))]\nimpl<T> Serialize for RwLock<T>\nwhere\n    T: ?Sized + Serialize,\n{\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        match self.read() {\n            Ok(locked) => locked.serialize(serializer),\n            Err(_) => Err(S::Error::custom(\"lock poison error while serializing\")),\n        }\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n#[cfg(feature = \"result\")]\n#[cfg_attr(docsrs, doc(cfg(feature = \"result\")))]\nimpl<T, E> Serialize for Result<T, E>\nwhere\n    T: Serialize,\n    E: Serialize,\n{\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        match *self {\n            Result::Ok(ref value) => serializer.serialize_newtype_variant(\"Result\", 0, \"Ok\", value),\n            Result::Err(ref value) => {\n                serializer.serialize_newtype_variant(\"Result\", 1, \"Err\", value)\n            }\n        }\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nimpl Serialize for Duration {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        use super::SerializeStruct;\n        let mut state = tri!(serializer.serialize_struct(\"Duration\", 2));\n        tri!(state.serialize_field(\"secs\", &self.as_secs()));\n        tri!(state.serialize_field(\"nanos\", &self.subsec_nanos()));\n        state.end()\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n#[cfg(feature = \"std\")]\n#[cfg_attr(docsrs, doc(cfg(feature = \"std\")))]\nimpl Serialize for SystemTime {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        use super::SerializeStruct;\n        let duration_since_epoch = match self.duration_since(UNIX_EPOCH) {\n            Ok(duration_since_epoch) => duration_since_epoch,\n            Err(_) => return Err(S::Error::custom(\"SystemTime must be later than UNIX_EPOCH\")),\n        };\n        let mut state = tri!(serializer.serialize_struct(\"SystemTime\", 2));\n        tri!(state.serialize_field(\"secs_since_epoch\", &duration_since_epoch.as_secs()));\n        tri!(state.serialize_field(\"nanos_since_epoch\", &duration_since_epoch.subsec_nanos()));\n        state.end()\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/// Serialize a value that implements `Display` as a string, when that string is\n/// statically known to never have more than a constant `MAX_LEN` bytes.\n///\n/// Panics if the `Display` impl tries to write more than `MAX_LEN` bytes.\n#[cfg(any(feature = \"std\", not(no_core_net)))]\nmacro_rules! serialize_display_bounded_length {\n    ($value:expr, $max:expr, $serializer:expr) => {{\n        let mut buffer = [0u8; $max];\n        let mut writer = crate::format::Buf::new(&mut buffer);\n        write!(&mut writer, \"{}\", $value).unwrap();\n        $serializer.serialize_str(writer.as_str())\n    }};\n}\n\n#[cfg(any(feature = \"std\", not(no_core_net)))]\nimpl Serialize for net::IpAddr {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        if serializer.is_human_readable() {\n            match *self {\n                net::IpAddr::V4(ref a) => a.serialize(serializer),\n                net::IpAddr::V6(ref a) => a.serialize(serializer),\n            }\n        } else {\n            match *self {\n                net::IpAddr::V4(ref a) => {\n                    serializer.serialize_newtype_variant(\"IpAddr\", 0, \"V4\", a)\n                }\n                net::IpAddr::V6(ref a) => {\n                    serializer.serialize_newtype_variant(\"IpAddr\", 1, \"V6\", a)\n                }\n            }\n        }\n    }\n}\n\n#[cfg(any(feature = \"std\", not(no_core_net)))]\nconst DEC_DIGITS_LUT: &[u8] = b\"\\\n      0001020304050607080910111213141516171819\\\n      2021222324252627282930313233343536373839\\\n      4041424344454647484950515253545556575859\\\n      6061626364656667686970717273747576777879\\\n      8081828384858687888990919293949596979899\";\n\n#[cfg(any(feature = \"std\", not(no_core_net)))]\n#[inline]\nfn format_u8(mut n: u8, out: &mut [u8]) -> usize {\n    if n >= 100 {\n        let d1 = ((n % 100) << 1) as usize;\n        n /= 100;\n        out[0] = b'0' + n;\n        out[1] = DEC_DIGITS_LUT[d1];\n        out[2] = DEC_DIGITS_LUT[d1 + 1];\n        3\n    } else if n >= 10 {\n        let d1 = (n << 1) as usize;\n        out[0] = DEC_DIGITS_LUT[d1];\n        out[1] = DEC_DIGITS_LUT[d1 + 1];\n        2\n    } else {\n        out[0] = b'0' + n;\n        1\n    }\n}\n\n#[cfg(any(feature = \"std\", not(no_core_net)))]\n#[test]\nfn test_format_u8() {\n    let mut i = 0u8;\n\n    loop {\n        let mut buf = [0u8; 3];\n        let written = format_u8(i, &mut buf);\n        assert_eq!(i.to_string().as_bytes(), &buf[..written]);\n\n        match i.checked_add(1) {\n            Some(next) => i = next,\n            None => break,\n        }\n    }\n}\n\n#[cfg(any(feature = \"std\", not(no_core_net)))]\nimpl Serialize for net::Ipv4Addr {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        if serializer.is_human_readable() {\n            const MAX_LEN: usize = 15;\n            debug_assert_eq!(MAX_LEN, \"101.102.103.104\".len());\n            let mut buf = [b'.'; MAX_LEN];\n            let mut written = format_u8(self.octets()[0], &mut buf);\n            for oct in &self.octets()[1..] {\n                // Skip over delimiters that we initialized buf with\n                written += format_u8(*oct, &mut buf[written + 1..]) + 1;\n            }\n            // Safety: We've only written ASCII bytes to the buffer, so it is valid UTF-8\n            let buf = unsafe { str::from_utf8_unchecked(&buf[..written]) };\n            serializer.serialize_str(buf)\n        } else {\n            self.octets().serialize(serializer)\n        }\n    }\n}\n\n#[cfg(any(feature = \"std\", not(no_core_net)))]\nimpl Serialize for net::Ipv6Addr {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        if serializer.is_human_readable() {\n            const MAX_LEN: usize = 39;\n            debug_assert_eq!(MAX_LEN, \"1001:1002:1003:1004:1005:1006:1007:1008\".len());\n            serialize_display_bounded_length!(self, MAX_LEN, serializer)\n        } else {\n            self.octets().serialize(serializer)\n        }\n    }\n}\n\n#[cfg(any(feature = \"std\", not(no_core_net)))]\nimpl Serialize for net::SocketAddr {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        if serializer.is_human_readable() {\n            match *self {\n                net::SocketAddr::V4(ref addr) => addr.serialize(serializer),\n                net::SocketAddr::V6(ref addr) => addr.serialize(serializer),\n            }\n        } else {\n            match *self {\n                net::SocketAddr::V4(ref addr) => {\n                    serializer.serialize_newtype_variant(\"SocketAddr\", 0, \"V4\", addr)\n                }\n                net::SocketAddr::V6(ref addr) => {\n                    serializer.serialize_newtype_variant(\"SocketAddr\", 1, \"V6\", addr)\n                }\n            }\n        }\n    }\n}\n\n#[cfg(any(feature = \"std\", not(no_core_net)))]\nimpl Serialize for net::SocketAddrV4 {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        if serializer.is_human_readable() {\n            const MAX_LEN: usize = 21;\n            debug_assert_eq!(MAX_LEN, \"101.102.103.104:65000\".len());\n            serialize_display_bounded_length!(self, MAX_LEN, serializer)\n        } else {\n            (self.ip(), self.port()).serialize(serializer)\n        }\n    }\n}\n\n#[cfg(any(feature = \"std\", not(no_core_net)))]\nimpl Serialize for net::SocketAddrV6 {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        if serializer.is_human_readable() {\n            const MAX_LEN: usize = 58;\n            debug_assert_eq!(\n                MAX_LEN,\n                \"[1001:1002:1003:1004:1005:1006:1007:1008%4294967295]:65000\".len()\n            );\n            serialize_display_bounded_length!(self, MAX_LEN, serializer)\n        } else {\n            (self.ip(), self.port()).serialize(serializer)\n        }\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n#[cfg(feature = \"std\")]\n#[cfg_attr(docsrs, doc(cfg(feature = \"std\")))]\nimpl Serialize for Path {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        match self.to_str() {\n            Some(s) => s.serialize(serializer),\n            None => Err(Error::custom(\"path contains invalid UTF-8 characters\")),\n        }\n    }\n}\n\n#[cfg(feature = \"std\")]\n#[cfg_attr(docsrs, doc(cfg(feature = \"std\")))]\nimpl Serialize for PathBuf {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        self.as_path().serialize(serializer)\n    }\n}\n\n#[cfg(all(feature = \"std\", any(unix, windows)))]\n#[cfg_attr(docsrs, doc(cfg(all(feature = \"std\", any(unix, windows)))))]\nimpl Serialize for OsStr {\n    #[cfg(unix)]\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        use std::os::unix::ffi::OsStrExt;\n        serializer.serialize_newtype_variant(\"OsString\", 0, \"Unix\", self.as_bytes())\n    }\n\n    #[cfg(windows)]\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        use std::os::windows::ffi::OsStrExt;\n        let val = self.encode_wide().collect::<Vec<_>>();\n        serializer.serialize_newtype_variant(\"OsString\", 1, \"Windows\", &val)\n    }\n}\n\n#[cfg(all(feature = \"std\", any(unix, windows)))]\n#[cfg_attr(docsrs, doc(cfg(all(feature = \"std\", any(unix, windows)))))]\nimpl Serialize for OsString {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        self.as_os_str().serialize(serializer)\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nimpl<T> Serialize for Wrapping<T>\nwhere\n    T: Serialize,\n{\n    #[inline]\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        self.0.serialize(serializer)\n    }\n}\n\n#[cfg(not(no_core_num_saturating))]\nimpl<T> Serialize for Saturating<T>\nwhere\n    T: Serialize,\n{\n    #[inline]\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        self.0.serialize(serializer)\n    }\n}\n\nimpl<T> Serialize for Reverse<T>\nwhere\n    T: Serialize,\n{\n    #[inline]\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        self.0.serialize(serializer)\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n#[cfg(all(feature = \"std\", not(no_std_atomic)))]\nmacro_rules! atomic_impl {\n    ($($ty:ident $size:expr)*) => {\n        $(\n            #[cfg(any(no_target_has_atomic, target_has_atomic = $size))]\n            #[cfg_attr(docsrs, doc(cfg(all(feature = \"std\", target_has_atomic = $size))))]\n            impl Serialize for $ty {\n                fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n                where\n                    S: Serializer,\n                {\n                    // Matches the atomic ordering used in libcore for the Debug impl\n                    self.load(Ordering::Relaxed).serialize(serializer)\n                }\n            }\n        )*\n    }\n}\n\n#[cfg(all(feature = \"std\", not(no_std_atomic)))]\natomic_impl! {\n    AtomicBool \"8\"\n    AtomicI8 \"8\"\n    AtomicI16 \"16\"\n    AtomicI32 \"32\"\n    AtomicIsize \"ptr\"\n    AtomicU8 \"8\"\n    AtomicU16 \"16\"\n    AtomicU32 \"32\"\n    AtomicUsize \"ptr\"\n}\n\n#[cfg(all(feature = \"std\", not(no_std_atomic64)))]\natomic_impl! {\n    AtomicI64 \"64\"\n    AtomicU64 \"64\"\n}\n"
  },
  {
    "path": "serde_core/src/ser/impossible.rs",
    "content": "//! This module contains `Impossible` serializer and its implementations.\n\nuse crate::lib::*;\n\nuse crate::ser::{\n    self, Serialize, SerializeMap, SerializeSeq, SerializeStruct, SerializeStructVariant,\n    SerializeTuple, SerializeTupleStruct, SerializeTupleVariant,\n};\n\n/// Helper type for implementing a `Serializer` that does not support\n/// serializing one of the compound types.\n///\n/// This type cannot be instantiated, but implements every one of the traits\n/// corresponding to the [`Serializer`] compound types: [`SerializeSeq`],\n/// [`SerializeTuple`], [`SerializeTupleStruct`], [`SerializeTupleVariant`],\n/// [`SerializeMap`], [`SerializeStruct`], and [`SerializeStructVariant`].\n///\n/// ```edition2021\n/// # use serde::ser::{Serializer, Impossible};\n/// # use serde_core::__private::doc::Error;\n/// #\n/// # struct MySerializer;\n/// #\n/// impl Serializer for MySerializer {\n///     type Ok = ();\n///     type Error = Error;\n///\n///     type SerializeSeq = Impossible<(), Error>;\n///     /* other associated types */\n///\n///     /// This data format does not support serializing sequences.\n///     fn serialize_seq(self,\n///                      len: Option<usize>)\n///                      -> Result<Self::SerializeSeq, Error> {\n///         // Given Impossible cannot be instantiated, the only\n///         // thing we can do here is to return an error.\n/// #         stringify! {\n///         Err(...)\n/// #         };\n/// #         unimplemented!()\n///     }\n///\n///     /* other Serializer methods */\n/// #     serde_core::__serialize_unimplemented! {\n/// #         bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str bytes none some\n/// #         unit unit_struct unit_variant newtype_struct newtype_variant\n/// #         tuple tuple_struct tuple_variant map struct struct_variant\n/// #     }\n/// }\n/// ```\n///\n/// [`Serializer`]: crate::Serializer\n/// [`SerializeSeq`]: crate::ser::SerializeSeq\n/// [`SerializeTuple`]: crate::ser::SerializeTuple\n/// [`SerializeTupleStruct`]: crate::ser::SerializeTupleStruct\n/// [`SerializeTupleVariant`]: crate::ser::SerializeTupleVariant\n/// [`SerializeMap`]: crate::ser::SerializeMap\n/// [`SerializeStruct`]: crate::ser::SerializeStruct\n/// [`SerializeStructVariant`]: crate::ser::SerializeStructVariant\npub struct Impossible<Ok, Error> {\n    void: Void,\n    ok: PhantomData<Ok>,\n    error: PhantomData<Error>,\n}\n\nenum Void {}\n\nimpl<Ok, Error> SerializeSeq for Impossible<Ok, Error>\nwhere\n    Error: ser::Error,\n{\n    type Ok = Ok;\n    type Error = Error;\n\n    fn serialize_element<T>(&mut self, value: &T) -> Result<(), Error>\n    where\n        T: ?Sized + Serialize,\n    {\n        let _ = value;\n        match self.void {}\n    }\n\n    fn end(self) -> Result<Ok, Error> {\n        match self.void {}\n    }\n}\n\nimpl<Ok, Error> SerializeTuple for Impossible<Ok, Error>\nwhere\n    Error: ser::Error,\n{\n    type Ok = Ok;\n    type Error = Error;\n\n    fn serialize_element<T>(&mut self, value: &T) -> Result<(), Error>\n    where\n        T: ?Sized + Serialize,\n    {\n        let _ = value;\n        match self.void {}\n    }\n\n    fn end(self) -> Result<Ok, Error> {\n        match self.void {}\n    }\n}\n\nimpl<Ok, Error> SerializeTupleStruct for Impossible<Ok, Error>\nwhere\n    Error: ser::Error,\n{\n    type Ok = Ok;\n    type Error = Error;\n\n    fn serialize_field<T>(&mut self, value: &T) -> Result<(), Error>\n    where\n        T: ?Sized + Serialize,\n    {\n        let _ = value;\n        match self.void {}\n    }\n\n    fn end(self) -> Result<Ok, Error> {\n        match self.void {}\n    }\n}\n\nimpl<Ok, Error> SerializeTupleVariant for Impossible<Ok, Error>\nwhere\n    Error: ser::Error,\n{\n    type Ok = Ok;\n    type Error = Error;\n\n    fn serialize_field<T>(&mut self, value: &T) -> Result<(), Error>\n    where\n        T: ?Sized + Serialize,\n    {\n        let _ = value;\n        match self.void {}\n    }\n\n    fn end(self) -> Result<Ok, Error> {\n        match self.void {}\n    }\n}\n\nimpl<Ok, Error> SerializeMap for Impossible<Ok, Error>\nwhere\n    Error: ser::Error,\n{\n    type Ok = Ok;\n    type Error = Error;\n\n    fn serialize_key<T>(&mut self, key: &T) -> Result<(), Error>\n    where\n        T: ?Sized + Serialize,\n    {\n        let _ = key;\n        match self.void {}\n    }\n\n    fn serialize_value<T>(&mut self, value: &T) -> Result<(), Error>\n    where\n        T: ?Sized + Serialize,\n    {\n        let _ = value;\n        match self.void {}\n    }\n\n    fn end(self) -> Result<Ok, Error> {\n        match self.void {}\n    }\n}\n\nimpl<Ok, Error> SerializeStruct for Impossible<Ok, Error>\nwhere\n    Error: ser::Error,\n{\n    type Ok = Ok;\n    type Error = Error;\n\n    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Error>\n    where\n        T: ?Sized + Serialize,\n    {\n        let _ = key;\n        let _ = value;\n        match self.void {}\n    }\n\n    fn end(self) -> Result<Ok, Error> {\n        match self.void {}\n    }\n}\n\nimpl<Ok, Error> SerializeStructVariant for Impossible<Ok, Error>\nwhere\n    Error: ser::Error,\n{\n    type Ok = Ok;\n    type Error = Error;\n\n    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Error>\n    where\n        T: ?Sized + Serialize,\n    {\n        let _ = key;\n        let _ = value;\n        match self.void {}\n    }\n\n    fn end(self) -> Result<Ok, Error> {\n        match self.void {}\n    }\n}\n"
  },
  {
    "path": "serde_core/src/ser/mod.rs",
    "content": "//! Generic data structure serialization framework.\n//!\n//! The two most important traits in this module are [`Serialize`] and\n//! [`Serializer`].\n//!\n//!  - **A type that implements `Serialize` is a data structure** that can be\n//!    serialized to any data format supported by Serde, and conversely\n//!  - **A type that implements `Serializer` is a data format** that can\n//!    serialize any data structure supported by Serde.\n//!\n//! # The Serialize trait\n//!\n//! Serde provides [`Serialize`] implementations for many Rust primitive and\n//! standard library types. The complete list is below. All of these can be\n//! serialized using Serde out of the box.\n//!\n//! Additionally, Serde provides a procedural macro called [`serde_derive`] to\n//! automatically generate [`Serialize`] implementations for structs and enums\n//! in your program. See the [derive section of the manual] for how to use this.\n//!\n//! In rare cases it may be necessary to implement [`Serialize`] manually for\n//! some type in your program. See the [Implementing `Serialize`] section of the\n//! manual for more about this.\n//!\n//! Third-party crates may provide [`Serialize`] implementations for types that\n//! they expose. For example the [`linked-hash-map`] crate provides a\n//! [`LinkedHashMap<K, V>`] type that is serializable by Serde because the crate\n//! provides an implementation of [`Serialize`] for it.\n//!\n//! # The Serializer trait\n//!\n//! [`Serializer`] implementations are provided by third-party crates, for\n//! example [`serde_json`], [`serde_yaml`] and [`postcard`].\n//!\n//! A partial list of well-maintained formats is given on the [Serde\n//! website][data formats].\n//!\n//! # Implementations of Serialize provided by Serde\n//!\n//!  - **Primitive types**:\n//!    - bool\n//!    - i8, i16, i32, i64, i128, isize\n//!    - u8, u16, u32, u64, u128, usize\n//!    - f32, f64\n//!    - char\n//!    - str\n//!    - &T and &mut T\n//!  - **Compound types**:\n//!    - \\[T\\]\n//!    - \\[T; 0\\] through \\[T; 32\\]\n//!    - tuples up to size 16\n//!  - **Common standard library types**:\n//!    - String\n//!    - Option\\<T\\>\n//!    - Result\\<T, E\\>\n//!    - PhantomData\\<T\\>\n//!  - **Wrapper types**:\n//!    - Box\\<T\\>\n//!    - Cow\\<'a, T\\>\n//!    - Cell\\<T\\>\n//!    - RefCell\\<T\\>\n//!    - Mutex\\<T\\>\n//!    - RwLock\\<T\\>\n//!    - Rc\\<T\\>&emsp;*(if* features = \\[\"rc\"\\] *is enabled)*\n//!    - Arc\\<T\\>&emsp;*(if* features = \\[\"rc\"\\] *is enabled)*\n//!  - **Collection types**:\n//!    - BTreeMap\\<K, V\\>\n//!    - BTreeSet\\<T\\>\n//!    - BinaryHeap\\<T\\>\n//!    - HashMap\\<K, V, H\\>\n//!    - HashSet\\<T, H\\>\n//!    - LinkedList\\<T\\>\n//!    - VecDeque\\<T\\>\n//!    - Vec\\<T\\>\n//!  - **FFI types**:\n//!    - CStr\n//!    - CString\n//!    - OsStr\n//!    - OsString\n//!  - **Miscellaneous standard library types**:\n//!    - Duration\n//!    - SystemTime\n//!    - Path\n//!    - PathBuf\n//!    - Range\\<T\\>\n//!    - RangeInclusive\\<T\\>\n//!    - Bound\\<T\\>\n//!    - num::NonZero*\n//!    - `!` *(unstable)*\n//!  - **Net types**:\n//!    - IpAddr\n//!    - Ipv4Addr\n//!    - Ipv6Addr\n//!    - SocketAddr\n//!    - SocketAddrV4\n//!    - SocketAddrV6\n//!\n//! [Implementing `Serialize`]: https://serde.rs/impl-serialize.html\n//! [`LinkedHashMap<K, V>`]: https://docs.rs/linked-hash-map/*/linked_hash_map/struct.LinkedHashMap.html\n//! [`Serialize`]: crate::Serialize\n//! [`Serializer`]: crate::Serializer\n//! [`postcard`]: https://github.com/jamesmunns/postcard\n//! [`linked-hash-map`]: https://crates.io/crates/linked-hash-map\n//! [`serde_derive`]: https://crates.io/crates/serde_derive\n//! [`serde_json`]: https://github.com/serde-rs/json\n//! [`serde_yaml`]: https://github.com/dtolnay/serde-yaml\n//! [derive section of the manual]: https://serde.rs/derive.html\n//! [data formats]: https://serde.rs/#data-formats\n\nuse crate::lib::*;\n\nmod fmt;\nmod impls;\nmod impossible;\n\npub use self::impossible::Impossible;\n\n#[cfg(all(not(feature = \"std\"), no_core_error))]\n#[doc(no_inline)]\npub use crate::std_error::Error as StdError;\n#[cfg(not(any(feature = \"std\", no_core_error)))]\n#[doc(no_inline)]\npub use core::error::Error as StdError;\n#[cfg(feature = \"std\")]\n#[doc(no_inline)]\npub use std::error::Error as StdError;\n\n////////////////////////////////////////////////////////////////////////////////\n\nmacro_rules! declare_error_trait {\n    (Error: Sized $(+ $($supertrait:ident)::+)*) => {\n        /// Trait used by `Serialize` implementations to generically construct\n        /// errors belonging to the `Serializer` against which they are\n        /// currently running.\n        ///\n        /// # Example implementation\n        ///\n        /// The [example data format] presented on the website shows an error\n        /// type appropriate for a basic JSON data format.\n        ///\n        /// [example data format]: https://serde.rs/data-format.html\n        #[cfg_attr(\n            not(no_diagnostic_namespace),\n            diagnostic::on_unimplemented(\n                message = \"the trait bound `{Self}: serde::ser::Error` is not satisfied\",\n            )\n        )]\n        pub trait Error: Sized $(+ $($supertrait)::+)* {\n            /// Used when a [`Serialize`] implementation encounters any error\n            /// while serializing a type.\n            ///\n            /// The message should not be capitalized and should not end with a\n            /// period.\n            ///\n            /// For example, a filesystem [`Path`] may refuse to serialize\n            /// itself if it contains invalid UTF-8 data.\n            ///\n            /// ```edition2021\n            /// # struct Path;\n            /// #\n            /// # impl Path {\n            /// #     fn to_str(&self) -> Option<&str> {\n            /// #         unimplemented!()\n            /// #     }\n            /// # }\n            /// #\n            /// use serde::ser::{self, Serialize, Serializer};\n            ///\n            /// impl Serialize for Path {\n            ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n            ///     where\n            ///         S: Serializer,\n            ///     {\n            ///         match self.to_str() {\n            ///             Some(s) => serializer.serialize_str(s),\n            ///             None => Err(ser::Error::custom(\"path contains invalid UTF-8 characters\")),\n            ///         }\n            ///     }\n            /// }\n            /// ```\n            ///\n            /// [`Path`]: std::path::Path\n            /// [`Serialize`]: crate::Serialize\n            fn custom<T>(msg: T) -> Self\n            where\n                T: Display;\n        }\n    }\n}\n\n#[cfg(feature = \"std\")]\ndeclare_error_trait!(Error: Sized + StdError);\n\n#[cfg(not(feature = \"std\"))]\ndeclare_error_trait!(Error: Sized + Debug + Display);\n\n////////////////////////////////////////////////////////////////////////////////\n\n/// A **data structure** that can be serialized into any data format supported\n/// by Serde.\n///\n/// Serde provides `Serialize` implementations for many Rust primitive and\n/// standard library types. The complete list is [here][crate::ser]. All of\n/// these can be serialized using Serde out of the box.\n///\n/// Additionally, Serde provides a procedural macro called [`serde_derive`] to\n/// automatically generate `Serialize` implementations for structs and enums in\n/// your program. See the [derive section of the manual] for how to use this.\n///\n/// In rare cases it may be necessary to implement `Serialize` manually for some\n/// type in your program. See the [Implementing `Serialize`] section of the\n/// manual for more about this.\n///\n/// Third-party crates may provide `Serialize` implementations for types that\n/// they expose. For example the [`linked-hash-map`] crate provides a\n/// [`LinkedHashMap<K, V>`] type that is serializable by Serde because the crate\n/// provides an implementation of `Serialize` for it.\n///\n/// [Implementing `Serialize`]: https://serde.rs/impl-serialize.html\n/// [`LinkedHashMap<K, V>`]: https://docs.rs/linked-hash-map/*/linked_hash_map/struct.LinkedHashMap.html\n/// [`linked-hash-map`]: https://crates.io/crates/linked-hash-map\n/// [`serde_derive`]: https://crates.io/crates/serde_derive\n/// [derive section of the manual]: https://serde.rs/derive.html\n#[cfg_attr(\n    not(no_diagnostic_namespace),\n    diagnostic::on_unimplemented(\n        // Prevents `serde_core::ser::Serialize` appearing in the error message\n        // in projects with no direct dependency on serde_core.\n        message = \"the trait bound `{Self}: serde::Serialize` is not satisfied\",\n        note = \"for local types consider adding `#[derive(serde::Serialize)]` to your `{Self}` type\",\n        note = \"for types from other crates check whether the crate offers a `serde` feature flag\",\n    )\n)]\npub trait Serialize {\n    /// Serialize this value into the given Serde serializer.\n    ///\n    /// See the [Implementing `Serialize`] section of the manual for more\n    /// information about how to implement this method.\n    ///\n    /// ```edition2021\n    /// use serde::ser::{Serialize, SerializeStruct, Serializer};\n    ///\n    /// struct Person {\n    ///     name: String,\n    ///     age: u8,\n    ///     phones: Vec<String>,\n    /// }\n    ///\n    /// // This is what #[derive(Serialize)] would generate.\n    /// impl Serialize for Person {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         let mut s = serializer.serialize_struct(\"Person\", 3)?;\n    ///         s.serialize_field(\"name\", &self.name)?;\n    ///         s.serialize_field(\"age\", &self.age)?;\n    ///         s.serialize_field(\"phones\", &self.phones)?;\n    ///         s.end()\n    ///     }\n    /// }\n    /// ```\n    ///\n    /// [Implementing `Serialize`]: https://serde.rs/impl-serialize.html\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/// A **data format** that can serialize any data structure supported by Serde.\n///\n/// The role of this trait is to define the serialization half of the [Serde\n/// data model], which is a way to categorize every Rust data structure into one\n/// of 29 possible types. Each method of the `Serializer` trait corresponds to\n/// one of the types of the data model.\n///\n/// Implementations of `Serialize` map themselves into this data model by\n/// invoking exactly one of the `Serializer` methods.\n///\n/// The types that make up the Serde data model are:\n///\n///  - **14 primitive types**\n///    - bool\n///    - i8, i16, i32, i64, i128\n///    - u8, u16, u32, u64, u128\n///    - f32, f64\n///    - char\n///  - **string**\n///    - UTF-8 bytes with a length and no null terminator.\n///    - When serializing, all strings are handled equally. When deserializing,\n///      there are three flavors of strings: transient, owned, and borrowed.\n///  - **byte array** - \\[u8\\]\n///    - Similar to strings, during deserialization byte arrays can be\n///      transient, owned, or borrowed.\n///  - **option**\n///    - Either none or some value.\n///  - **unit**\n///    - The type of `()` in Rust. It represents an anonymous value containing\n///      no data.\n///  - **unit_struct**\n///    - For example `struct Unit` or `PhantomData<T>`. It represents a named\n///      value containing no data.\n///  - **unit_variant**\n///    - For example the `E::A` and `E::B` in `enum E { A, B }`.\n///  - **newtype_struct**\n///    - For example `struct Millimeters(u8)`.\n///  - **newtype_variant**\n///    - For example the `E::N` in `enum E { N(u8) }`.\n///  - **seq**\n///    - A variably sized heterogeneous sequence of values, for example\n///      `Vec<T>` or `HashSet<T>`. When serializing, the length may or may not\n///      be known before iterating through all the data. When deserializing,\n///      the length is determined by looking at the serialized data.\n///  - **tuple**\n///    - A statically sized heterogeneous sequence of values for which the\n///      length will be known at deserialization time without looking at the\n///      serialized data, for example `(u8,)` or `(String, u64, Vec<T>)` or\n///      `[u64; 10]`.\n///  - **tuple_struct**\n///    - A named tuple, for example `struct Rgb(u8, u8, u8)`.\n///  - **tuple_variant**\n///    - For example the `E::T` in `enum E { T(u8, u8) }`.\n///  - **map**\n///    - A heterogeneous key-value pairing, for example `BTreeMap<K, V>`.\n///  - **struct**\n///    - A heterogeneous key-value pairing in which the keys are strings and\n///      will be known at deserialization time without looking at the\n///      serialized data, for example `struct S { r: u8, g: u8, b: u8 }`.\n///  - **struct_variant**\n///    - For example the `E::S` in `enum E { S { r: u8, g: u8, b: u8 } }`.\n///\n/// Many Serde serializers produce text or binary data as output, for example\n/// JSON or Postcard. This is not a requirement of the `Serializer` trait, and\n/// there are serializers that do not produce text or binary output. One example\n/// is the `serde_json::value::Serializer` (distinct from the main `serde_json`\n/// serializer) that produces a `serde_json::Value` data structure in memory as\n/// output.\n///\n/// [Serde data model]: https://serde.rs/data-model.html\n///\n/// # Example implementation\n///\n/// The [example data format] presented on the website contains example code for\n/// a basic JSON `Serializer`.\n///\n/// [example data format]: https://serde.rs/data-format.html\n#[cfg_attr(\n    not(no_diagnostic_namespace),\n    diagnostic::on_unimplemented(\n        message = \"the trait bound `{Self}: serde::Serializer` is not satisfied\",\n    )\n)]\npub trait Serializer: Sized {\n    /// The output type produced by this `Serializer` during successful\n    /// serialization. Most serializers that produce text or binary output\n    /// should set `Ok = ()` and serialize into an [`io::Write`] or buffer\n    /// contained within the `Serializer` instance. Serializers that build\n    /// in-memory data structures may be simplified by using `Ok` to propagate\n    /// the data structure around.\n    ///\n    /// [`io::Write`]: std::io::Write\n    type Ok;\n\n    /// The error type when some error occurs during serialization.\n    type Error: Error;\n\n    /// Type returned from [`serialize_seq`] for serializing the content of the\n    /// sequence.\n    ///\n    /// [`serialize_seq`]: #tymethod.serialize_seq\n    type SerializeSeq: SerializeSeq<Ok = Self::Ok, Error = Self::Error>;\n\n    /// Type returned from [`serialize_tuple`] for serializing the content of\n    /// the tuple.\n    ///\n    /// [`serialize_tuple`]: #tymethod.serialize_tuple\n    type SerializeTuple: SerializeTuple<Ok = Self::Ok, Error = Self::Error>;\n\n    /// Type returned from [`serialize_tuple_struct`] for serializing the\n    /// content of the tuple struct.\n    ///\n    /// [`serialize_tuple_struct`]: #tymethod.serialize_tuple_struct\n    type SerializeTupleStruct: SerializeTupleStruct<Ok = Self::Ok, Error = Self::Error>;\n\n    /// Type returned from [`serialize_tuple_variant`] for serializing the\n    /// content of the tuple variant.\n    ///\n    /// [`serialize_tuple_variant`]: #tymethod.serialize_tuple_variant\n    type SerializeTupleVariant: SerializeTupleVariant<Ok = Self::Ok, Error = Self::Error>;\n\n    /// Type returned from [`serialize_map`] for serializing the content of the\n    /// map.\n    ///\n    /// [`serialize_map`]: #tymethod.serialize_map\n    type SerializeMap: SerializeMap<Ok = Self::Ok, Error = Self::Error>;\n\n    /// Type returned from [`serialize_struct`] for serializing the content of\n    /// the struct.\n    ///\n    /// [`serialize_struct`]: #tymethod.serialize_struct\n    type SerializeStruct: SerializeStruct<Ok = Self::Ok, Error = Self::Error>;\n\n    /// Type returned from [`serialize_struct_variant`] for serializing the\n    /// content of the struct variant.\n    ///\n    /// [`serialize_struct_variant`]: #tymethod.serialize_struct_variant\n    type SerializeStructVariant: SerializeStructVariant<Ok = Self::Ok, Error = Self::Error>;\n\n    /// Serialize a `bool` value.\n    ///\n    /// ```edition2021\n    /// # use serde::Serializer;\n    /// #\n    /// # serde_core::__private_serialize!();\n    /// #\n    /// impl Serialize for bool {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         serializer.serialize_bool(*self)\n    ///     }\n    /// }\n    /// ```\n    fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error>;\n\n    /// Serialize an `i8` value.\n    ///\n    /// If the format does not differentiate between `i8` and `i64`, a\n    /// reasonable implementation would be to cast the value to `i64` and\n    /// forward to `serialize_i64`.\n    ///\n    /// ```edition2021\n    /// # use serde::Serializer;\n    /// #\n    /// # serde_core::__private_serialize!();\n    /// #\n    /// impl Serialize for i8 {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         serializer.serialize_i8(*self)\n    ///     }\n    /// }\n    /// ```\n    fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error>;\n\n    /// Serialize an `i16` value.\n    ///\n    /// If the format does not differentiate between `i16` and `i64`, a\n    /// reasonable implementation would be to cast the value to `i64` and\n    /// forward to `serialize_i64`.\n    ///\n    /// ```edition2021\n    /// # use serde::Serializer;\n    /// #\n    /// # serde_core::__private_serialize!();\n    /// #\n    /// impl Serialize for i16 {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         serializer.serialize_i16(*self)\n    ///     }\n    /// }\n    /// ```\n    fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error>;\n\n    /// Serialize an `i32` value.\n    ///\n    /// If the format does not differentiate between `i32` and `i64`, a\n    /// reasonable implementation would be to cast the value to `i64` and\n    /// forward to `serialize_i64`.\n    ///\n    /// ```edition2021\n    /// # use serde::Serializer;\n    /// #\n    /// # serde_core::__private_serialize!();\n    /// #\n    /// impl Serialize for i32 {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         serializer.serialize_i32(*self)\n    ///     }\n    /// }\n    /// ```\n    fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error>;\n\n    /// Serialize an `i64` value.\n    ///\n    /// ```edition2021\n    /// # use serde::Serializer;\n    /// #\n    /// # serde_core::__private_serialize!();\n    /// #\n    /// impl Serialize for i64 {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         serializer.serialize_i64(*self)\n    ///     }\n    /// }\n    /// ```\n    fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error>;\n\n    /// Serialize an `i128` value.\n    ///\n    /// ```edition2021\n    /// # use serde::Serializer;\n    /// #\n    /// # serde_core::__private_serialize!();\n    /// #\n    /// impl Serialize for i128 {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         serializer.serialize_i128(*self)\n    ///     }\n    /// }\n    /// ```\n    ///\n    /// The default behavior unconditionally returns an error.\n    fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {\n        let _ = v;\n        Err(Error::custom(\"i128 is not supported\"))\n    }\n\n    /// Serialize a `u8` value.\n    ///\n    /// If the format does not differentiate between `u8` and `u64`, a\n    /// reasonable implementation would be to cast the value to `u64` and\n    /// forward to `serialize_u64`.\n    ///\n    /// ```edition2021\n    /// # use serde::Serializer;\n    /// #\n    /// # serde_core::__private_serialize!();\n    /// #\n    /// impl Serialize for u8 {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         serializer.serialize_u8(*self)\n    ///     }\n    /// }\n    /// ```\n    fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error>;\n\n    /// Serialize a `u16` value.\n    ///\n    /// If the format does not differentiate between `u16` and `u64`, a\n    /// reasonable implementation would be to cast the value to `u64` and\n    /// forward to `serialize_u64`.\n    ///\n    /// ```edition2021\n    /// # use serde::Serializer;\n    /// #\n    /// # serde_core::__private_serialize!();\n    /// #\n    /// impl Serialize for u16 {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         serializer.serialize_u16(*self)\n    ///     }\n    /// }\n    /// ```\n    fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error>;\n\n    /// Serialize a `u32` value.\n    ///\n    /// If the format does not differentiate between `u32` and `u64`, a\n    /// reasonable implementation would be to cast the value to `u64` and\n    /// forward to `serialize_u64`.\n    ///\n    /// ```edition2021\n    /// # use serde::Serializer;\n    /// #\n    /// # serde_core::__private_serialize!();\n    /// #\n    /// impl Serialize for u32 {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         serializer.serialize_u32(*self)\n    ///     }\n    /// }\n    /// ```\n    fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error>;\n\n    /// Serialize a `u64` value.\n    ///\n    /// ```edition2021\n    /// # use serde::Serializer;\n    /// #\n    /// # serde_core::__private_serialize!();\n    /// #\n    /// impl Serialize for u64 {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         serializer.serialize_u64(*self)\n    ///     }\n    /// }\n    /// ```\n    fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error>;\n\n    /// Serialize a `u128` value.\n    ///\n    /// ```edition2021\n    /// # use serde::Serializer;\n    /// #\n    /// # serde_core::__private_serialize!();\n    /// #\n    /// impl Serialize for u128 {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         serializer.serialize_u128(*self)\n    ///     }\n    /// }\n    /// ```\n    ///\n    /// The default behavior unconditionally returns an error.\n    fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {\n        let _ = v;\n        Err(Error::custom(\"u128 is not supported\"))\n    }\n\n    /// Serialize an `f32` value.\n    ///\n    /// If the format does not differentiate between `f32` and `f64`, a\n    /// reasonable implementation would be to cast the value to `f64` and\n    /// forward to `serialize_f64`.\n    ///\n    /// ```edition2021\n    /// # use serde::Serializer;\n    /// #\n    /// # serde_core::__private_serialize!();\n    /// #\n    /// impl Serialize for f32 {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         serializer.serialize_f32(*self)\n    ///     }\n    /// }\n    /// ```\n    fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error>;\n\n    /// Serialize an `f64` value.\n    ///\n    /// ```edition2021\n    /// # use serde::Serializer;\n    /// #\n    /// # serde_core::__private_serialize!();\n    /// #\n    /// impl Serialize for f64 {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         serializer.serialize_f64(*self)\n    ///     }\n    /// }\n    /// ```\n    fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error>;\n\n    /// Serialize a character.\n    ///\n    /// If the format does not support characters, it is reasonable to serialize\n    /// it as a single element `str` or a `u32`.\n    ///\n    /// ```edition2021\n    /// # use serde::Serializer;\n    /// #\n    /// # serde_core::__private_serialize!();\n    /// #\n    /// impl Serialize for char {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         serializer.serialize_char(*self)\n    ///     }\n    /// }\n    /// ```\n    fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error>;\n\n    /// Serialize a `&str`.\n    ///\n    /// ```edition2021\n    /// # use serde::Serializer;\n    /// #\n    /// # serde_core::__private_serialize!();\n    /// #\n    /// impl Serialize for str {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         serializer.serialize_str(self)\n    ///     }\n    /// }\n    /// ```\n    fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error>;\n\n    /// Serialize a chunk of raw byte data.\n    ///\n    /// Enables serializers to serialize byte slices more compactly or more\n    /// efficiently than other types of slices. If no efficient implementation\n    /// is available, a reasonable implementation would be to forward to\n    /// `serialize_seq`. If forwarded, the implementation looks usually just\n    /// like this:\n    ///\n    /// ```edition2021\n    /// # use serde::ser::{Serializer, SerializeSeq};\n    /// # use serde_core::__private::doc::Error;\n    /// #\n    /// # struct MySerializer;\n    /// #\n    /// # impl Serializer for MySerializer {\n    /// #     type Ok = ();\n    /// #     type Error = Error;\n    /// #\n    /// fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {\n    ///     let mut seq = self.serialize_seq(Some(v.len()))?;\n    ///     for b in v {\n    ///         seq.serialize_element(b)?;\n    ///     }\n    ///     seq.end()\n    /// }\n    /// #\n    /// #     serde_core::__serialize_unimplemented! {\n    /// #         bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str none some\n    /// #         unit unit_struct unit_variant newtype_struct newtype_variant\n    /// #         seq tuple tuple_struct tuple_variant map struct struct_variant\n    /// #     }\n    /// # }\n    /// ```\n    fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error>;\n\n    /// Serialize a [`None`] value.\n    ///\n    /// ```edition2021\n    /// # use serde::{Serialize, Serializer};\n    /// #\n    /// # enum Option<T> {\n    /// #     Some(T),\n    /// #     None,\n    /// # }\n    /// #\n    /// # use self::Option::{Some, None};\n    /// #\n    /// impl<T> Serialize for Option<T>\n    /// where\n    ///     T: Serialize,\n    /// {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         match *self {\n    ///             Some(ref value) => serializer.serialize_some(value),\n    ///             None => serializer.serialize_none(),\n    ///         }\n    ///     }\n    /// }\n    /// #\n    /// # fn main() {}\n    /// ```\n    ///\n    /// [`None`]: core::option::Option::None\n    fn serialize_none(self) -> Result<Self::Ok, Self::Error>;\n\n    /// Serialize a [`Some(T)`] value.\n    ///\n    /// ```edition2021\n    /// # use serde::{Serialize, Serializer};\n    /// #\n    /// # enum Option<T> {\n    /// #     Some(T),\n    /// #     None,\n    /// # }\n    /// #\n    /// # use self::Option::{Some, None};\n    /// #\n    /// impl<T> Serialize for Option<T>\n    /// where\n    ///     T: Serialize,\n    /// {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         match *self {\n    ///             Some(ref value) => serializer.serialize_some(value),\n    ///             None => serializer.serialize_none(),\n    ///         }\n    ///     }\n    /// }\n    /// #\n    /// # fn main() {}\n    /// ```\n    ///\n    /// [`Some(T)`]: core::option::Option::Some\n    fn serialize_some<T>(self, value: &T) -> Result<Self::Ok, Self::Error>\n    where\n        T: ?Sized + Serialize;\n\n    /// Serialize a `()` value.\n    ///\n    /// ```edition2021\n    /// # use serde::Serializer;\n    /// #\n    /// # serde_core::__private_serialize!();\n    /// #\n    /// impl Serialize for () {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         serializer.serialize_unit()\n    ///     }\n    /// }\n    /// ```\n    fn serialize_unit(self) -> Result<Self::Ok, Self::Error>;\n\n    /// Serialize a unit struct like `struct Unit` or `PhantomData<T>`.\n    ///\n    /// A reasonable implementation would be to forward to `serialize_unit`.\n    ///\n    /// ```edition2021\n    /// use serde::{Serialize, Serializer};\n    ///\n    /// struct Nothing;\n    ///\n    /// impl Serialize for Nothing {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         serializer.serialize_unit_struct(\"Nothing\")\n    ///     }\n    /// }\n    /// ```\n    fn serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok, Self::Error>;\n\n    /// Serialize a unit variant like `E::A` in `enum E { A, B }`.\n    ///\n    /// The `name` is the name of the enum, the `variant_index` is the index of\n    /// this variant within the enum, and the `variant` is the name of the\n    /// variant.\n    ///\n    /// ```edition2021\n    /// use serde::{Serialize, Serializer};\n    ///\n    /// enum E {\n    ///     A,\n    ///     B,\n    /// }\n    ///\n    /// impl Serialize for E {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         match *self {\n    ///             E::A => serializer.serialize_unit_variant(\"E\", 0, \"A\"),\n    ///             E::B => serializer.serialize_unit_variant(\"E\", 1, \"B\"),\n    ///         }\n    ///     }\n    /// }\n    /// ```\n    fn serialize_unit_variant(\n        self,\n        name: &'static str,\n        variant_index: u32,\n        variant: &'static str,\n    ) -> Result<Self::Ok, Self::Error>;\n\n    /// Serialize a newtype struct like `struct Millimeters(u8)`.\n    ///\n    /// Serializers are encouraged to treat newtype structs as insignificant\n    /// wrappers around the data they contain. A reasonable implementation would\n    /// be to forward to `value.serialize(self)`.\n    ///\n    /// ```edition2021\n    /// use serde::{Serialize, Serializer};\n    ///\n    /// struct Millimeters(u8);\n    ///\n    /// impl Serialize for Millimeters {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         serializer.serialize_newtype_struct(\"Millimeters\", &self.0)\n    ///     }\n    /// }\n    /// ```\n    fn serialize_newtype_struct<T>(\n        self,\n        name: &'static str,\n        value: &T,\n    ) -> Result<Self::Ok, Self::Error>\n    where\n        T: ?Sized + Serialize;\n\n    /// Serialize a newtype variant like `E::N` in `enum E { N(u8) }`.\n    ///\n    /// The `name` is the name of the enum, the `variant_index` is the index of\n    /// this variant within the enum, and the `variant` is the name of the\n    /// variant. The `value` is the data contained within this newtype variant.\n    ///\n    /// ```edition2021\n    /// use serde::{Serialize, Serializer};\n    ///\n    /// enum E {\n    ///     M(String),\n    ///     N(u8),\n    /// }\n    ///\n    /// impl Serialize for E {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         match *self {\n    ///             E::M(ref s) => serializer.serialize_newtype_variant(\"E\", 0, \"M\", s),\n    ///             E::N(n) => serializer.serialize_newtype_variant(\"E\", 1, \"N\", &n),\n    ///         }\n    ///     }\n    /// }\n    /// ```\n    fn serialize_newtype_variant<T>(\n        self,\n        name: &'static str,\n        variant_index: u32,\n        variant: &'static str,\n        value: &T,\n    ) -> Result<Self::Ok, Self::Error>\n    where\n        T: ?Sized + Serialize;\n\n    /// Begin to serialize a variably sized sequence. This call must be\n    /// followed by zero or more calls to `serialize_element`, then a call to\n    /// `end`.\n    ///\n    /// The argument is the number of elements in the sequence, which may or may\n    /// not be computable before the sequence is iterated. Some serializers only\n    /// support sequences whose length is known up front.\n    ///\n    /// ```edition2021\n    /// # use std::marker::PhantomData;\n    /// #\n    /// # struct Vec<T>(PhantomData<T>);\n    /// #\n    /// # impl<T> Vec<T> {\n    /// #     fn len(&self) -> usize {\n    /// #         unimplemented!()\n    /// #     }\n    /// # }\n    /// #\n    /// # impl<'a, T> IntoIterator for &'a Vec<T> {\n    /// #     type Item = &'a T;\n    /// #     type IntoIter = Box<dyn Iterator<Item = &'a T>>;\n    /// #\n    /// #     fn into_iter(self) -> Self::IntoIter {\n    /// #         unimplemented!()\n    /// #     }\n    /// # }\n    /// #\n    /// use serde::ser::{Serialize, SerializeSeq, Serializer};\n    ///\n    /// impl<T> Serialize for Vec<T>\n    /// where\n    ///     T: Serialize,\n    /// {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         let mut seq = serializer.serialize_seq(Some(self.len()))?;\n    ///         for element in self {\n    ///             seq.serialize_element(element)?;\n    ///         }\n    ///         seq.end()\n    ///     }\n    /// }\n    /// ```\n    fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error>;\n\n    /// Begin to serialize a statically sized sequence whose length will be\n    /// known at deserialization time without looking at the serialized data.\n    /// This call must be followed by zero or more calls to `serialize_element`,\n    /// then a call to `end`.\n    ///\n    /// ```edition2021\n    /// use serde::ser::{Serialize, SerializeTuple, Serializer};\n    ///\n    /// # mod fool {\n    /// #     trait Serialize {}\n    /// impl<A, B, C> Serialize for (A, B, C)\n    /// #     {}\n    /// # }\n    /// #\n    /// # struct Tuple3<A, B, C>(A, B, C);\n    /// #\n    /// # impl<A, B, C> Serialize for Tuple3<A, B, C>\n    /// where\n    ///     A: Serialize,\n    ///     B: Serialize,\n    ///     C: Serialize,\n    /// {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         let mut tup = serializer.serialize_tuple(3)?;\n    ///         tup.serialize_element(&self.0)?;\n    ///         tup.serialize_element(&self.1)?;\n    ///         tup.serialize_element(&self.2)?;\n    ///         tup.end()\n    ///     }\n    /// }\n    /// ```\n    ///\n    /// ```edition2021\n    /// use serde::ser::{Serialize, SerializeTuple, Serializer};\n    ///\n    /// const VRAM_SIZE: usize = 386;\n    /// struct Vram([u16; VRAM_SIZE]);\n    ///\n    /// impl Serialize for Vram {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         let mut seq = serializer.serialize_tuple(VRAM_SIZE)?;\n    ///         for element in &self.0[..] {\n    ///             seq.serialize_element(element)?;\n    ///         }\n    ///         seq.end()\n    ///     }\n    /// }\n    /// ```\n    fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error>;\n\n    /// Begin to serialize a tuple struct like `struct Rgb(u8, u8, u8)`. This\n    /// call must be followed by zero or more calls to `serialize_field`, then a\n    /// call to `end`.\n    ///\n    /// The `name` is the name of the tuple struct and the `len` is the number\n    /// of data fields that will be serialized.\n    ///\n    /// ```edition2021\n    /// use serde::ser::{Serialize, SerializeTupleStruct, Serializer};\n    ///\n    /// struct Rgb(u8, u8, u8);\n    ///\n    /// impl Serialize for Rgb {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         let mut ts = serializer.serialize_tuple_struct(\"Rgb\", 3)?;\n    ///         ts.serialize_field(&self.0)?;\n    ///         ts.serialize_field(&self.1)?;\n    ///         ts.serialize_field(&self.2)?;\n    ///         ts.end()\n    ///     }\n    /// }\n    /// ```\n    fn serialize_tuple_struct(\n        self,\n        name: &'static str,\n        len: usize,\n    ) -> Result<Self::SerializeTupleStruct, Self::Error>;\n\n    /// Begin to serialize a tuple variant like `E::T` in `enum E { T(u8, u8)\n    /// }`. This call must be followed by zero or more calls to\n    /// `serialize_field`, then a call to `end`.\n    ///\n    /// The `name` is the name of the enum, the `variant_index` is the index of\n    /// this variant within the enum, the `variant` is the name of the variant,\n    /// and the `len` is the number of data fields that will be serialized.\n    ///\n    /// ```edition2021\n    /// use serde::ser::{Serialize, SerializeTupleVariant, Serializer};\n    ///\n    /// enum E {\n    ///     T(u8, u8),\n    ///     U(String, u32, u32),\n    /// }\n    ///\n    /// impl Serialize for E {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         match *self {\n    ///             E::T(ref a, ref b) => {\n    ///                 let mut tv = serializer.serialize_tuple_variant(\"E\", 0, \"T\", 2)?;\n    ///                 tv.serialize_field(a)?;\n    ///                 tv.serialize_field(b)?;\n    ///                 tv.end()\n    ///             }\n    ///             E::U(ref a, ref b, ref c) => {\n    ///                 let mut tv = serializer.serialize_tuple_variant(\"E\", 1, \"U\", 3)?;\n    ///                 tv.serialize_field(a)?;\n    ///                 tv.serialize_field(b)?;\n    ///                 tv.serialize_field(c)?;\n    ///                 tv.end()\n    ///             }\n    ///         }\n    ///     }\n    /// }\n    /// ```\n    fn serialize_tuple_variant(\n        self,\n        name: &'static str,\n        variant_index: u32,\n        variant: &'static str,\n        len: usize,\n    ) -> Result<Self::SerializeTupleVariant, Self::Error>;\n\n    /// Begin to serialize a map. This call must be followed by zero or more\n    /// calls to `serialize_key` and `serialize_value`, then a call to `end`.\n    ///\n    /// The argument is the number of elements in the map, which may or may not\n    /// be computable before the map is iterated. Some serializers only support\n    /// maps whose length is known up front.\n    ///\n    /// ```edition2021\n    /// # use std::marker::PhantomData;\n    /// #\n    /// # struct HashMap<K, V>(PhantomData<K>, PhantomData<V>);\n    /// #\n    /// # impl<K, V> HashMap<K, V> {\n    /// #     fn len(&self) -> usize {\n    /// #         unimplemented!()\n    /// #     }\n    /// # }\n    /// #\n    /// # impl<'a, K, V> IntoIterator for &'a HashMap<K, V> {\n    /// #     type Item = (&'a K, &'a V);\n    /// #     type IntoIter = Box<dyn Iterator<Item = (&'a K, &'a V)>>;\n    /// #\n    /// #     fn into_iter(self) -> Self::IntoIter {\n    /// #         unimplemented!()\n    /// #     }\n    /// # }\n    /// #\n    /// use serde::ser::{Serialize, SerializeMap, Serializer};\n    ///\n    /// impl<K, V> Serialize for HashMap<K, V>\n    /// where\n    ///     K: Serialize,\n    ///     V: Serialize,\n    /// {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         let mut map = serializer.serialize_map(Some(self.len()))?;\n    ///         for (k, v) in self {\n    ///             map.serialize_entry(k, v)?;\n    ///         }\n    ///         map.end()\n    ///     }\n    /// }\n    /// ```\n    fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error>;\n\n    /// Begin to serialize a struct like `struct Rgb { r: u8, g: u8, b: u8 }`.\n    /// This call must be followed by zero or more calls to `serialize_field`,\n    /// then a call to `end`.\n    ///\n    /// The `name` is the name of the struct and the `len` is the number of\n    /// data fields that will be serialized. `len` does not include fields\n    /// which are skipped with [`SerializeStruct::skip_field`].\n    ///\n    /// ```edition2021\n    /// use serde::ser::{Serialize, SerializeStruct, Serializer};\n    ///\n    /// struct Rgb {\n    ///     r: u8,\n    ///     g: u8,\n    ///     b: u8,\n    /// }\n    ///\n    /// impl Serialize for Rgb {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         let mut rgb = serializer.serialize_struct(\"Rgb\", 3)?;\n    ///         rgb.serialize_field(\"r\", &self.r)?;\n    ///         rgb.serialize_field(\"g\", &self.g)?;\n    ///         rgb.serialize_field(\"b\", &self.b)?;\n    ///         rgb.end()\n    ///     }\n    /// }\n    /// ```\n    fn serialize_struct(\n        self,\n        name: &'static str,\n        len: usize,\n    ) -> Result<Self::SerializeStruct, Self::Error>;\n\n    /// Begin to serialize a struct variant like `E::S` in `enum E { S { r: u8,\n    /// g: u8, b: u8 } }`. This call must be followed by zero or more calls to\n    /// `serialize_field`, then a call to `end`.\n    ///\n    /// The `name` is the name of the enum, the `variant_index` is the index of\n    /// this variant within the enum, the `variant` is the name of the variant,\n    /// and the `len` is the number of data fields that will be serialized.\n    /// `len` does not include fields which are skipped with\n    /// [`SerializeStructVariant::skip_field`].\n    ///\n    /// ```edition2021\n    /// use serde::ser::{Serialize, SerializeStructVariant, Serializer};\n    ///\n    /// enum E {\n    ///     S { r: u8, g: u8, b: u8 },\n    /// }\n    ///\n    /// impl Serialize for E {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         match *self {\n    ///             E::S {\n    ///                 ref r,\n    ///                 ref g,\n    ///                 ref b,\n    ///             } => {\n    ///                 let mut sv = serializer.serialize_struct_variant(\"E\", 0, \"S\", 3)?;\n    ///                 sv.serialize_field(\"r\", r)?;\n    ///                 sv.serialize_field(\"g\", g)?;\n    ///                 sv.serialize_field(\"b\", b)?;\n    ///                 sv.end()\n    ///             }\n    ///         }\n    ///     }\n    /// }\n    /// ```\n    fn serialize_struct_variant(\n        self,\n        name: &'static str,\n        variant_index: u32,\n        variant: &'static str,\n        len: usize,\n    ) -> Result<Self::SerializeStructVariant, Self::Error>;\n\n    /// Collect an iterator as a sequence.\n    ///\n    /// The default implementation serializes each item yielded by the iterator\n    /// using [`serialize_seq`]. Implementors should not need to override this\n    /// method.\n    ///\n    /// ```edition2021\n    /// use serde::{Serialize, Serializer};\n    ///\n    /// struct SecretlyOneHigher {\n    ///     data: Vec<i32>,\n    /// }\n    ///\n    /// impl Serialize for SecretlyOneHigher {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         serializer.collect_seq(self.data.iter().map(|x| x + 1))\n    ///     }\n    /// }\n    /// ```\n    ///\n    /// [`serialize_seq`]: #tymethod.serialize_seq\n    fn collect_seq<I>(self, iter: I) -> Result<Self::Ok, Self::Error>\n    where\n        I: IntoIterator,\n        <I as IntoIterator>::Item: Serialize,\n    {\n        let mut iter = iter.into_iter();\n        let mut serializer = tri!(self.serialize_seq(iterator_len_hint(&iter)));\n        tri!(iter.try_for_each(|item| serializer.serialize_element(&item)));\n        serializer.end()\n    }\n\n    /// Collect an iterator as a map.\n    ///\n    /// The default implementation serializes each pair yielded by the iterator\n    /// using [`serialize_map`]. Implementors should not need to override this\n    /// method.\n    ///\n    /// ```edition2021\n    /// use serde::{Serialize, Serializer};\n    /// use std::collections::BTreeSet;\n    ///\n    /// struct MapToUnit {\n    ///     keys: BTreeSet<i32>,\n    /// }\n    ///\n    /// // Serializes as a map in which the values are all unit.\n    /// impl Serialize for MapToUnit {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         serializer.collect_map(self.keys.iter().map(|k| (k, ())))\n    ///     }\n    /// }\n    /// ```\n    ///\n    /// [`serialize_map`]: #tymethod.serialize_map\n    fn collect_map<K, V, I>(self, iter: I) -> Result<Self::Ok, Self::Error>\n    where\n        K: Serialize,\n        V: Serialize,\n        I: IntoIterator<Item = (K, V)>,\n    {\n        let mut iter = iter.into_iter();\n        let mut serializer = tri!(self.serialize_map(iterator_len_hint(&iter)));\n        tri!(iter.try_for_each(|(key, value)| serializer.serialize_entry(&key, &value)));\n        serializer.end()\n    }\n\n    /// Serialize a string produced by an implementation of `Display`.\n    ///\n    /// The default implementation builds a heap-allocated [`String`] and\n    /// delegates to [`serialize_str`]. Serializers are encouraged to provide a\n    /// more efficient implementation if possible.\n    ///\n    /// ```edition2021\n    /// # struct DateTime;\n    /// #\n    /// # impl DateTime {\n    /// #     fn naive_local(&self) -> () { () }\n    /// #     fn offset(&self) -> () { () }\n    /// # }\n    /// #\n    /// use serde::{Serialize, Serializer};\n    ///\n    /// impl Serialize for DateTime {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         serializer.collect_str(&format_args!(\"{:?}{:?}\", self.naive_local(), self.offset()))\n    ///     }\n    /// }\n    /// ```\n    ///\n    /// [`serialize_str`]: Self::serialize_str\n    #[cfg(any(feature = \"std\", feature = \"alloc\"))]\n    fn collect_str<T>(self, value: &T) -> Result<Self::Ok, Self::Error>\n    where\n        T: ?Sized + Display,\n    {\n        self.serialize_str(&value.to_string())\n    }\n\n    /// Serialize a string produced by an implementation of `Display`.\n    ///\n    /// Serializers that use `no_std` are required to provide an implementation\n    /// of this method. If no more sensible behavior is possible, the\n    /// implementation is expected to return an error.\n    ///\n    /// ```edition2021\n    /// # struct DateTime;\n    /// #\n    /// # impl DateTime {\n    /// #     fn naive_local(&self) -> () { () }\n    /// #     fn offset(&self) -> () { () }\n    /// # }\n    /// #\n    /// use serde::{Serialize, Serializer};\n    ///\n    /// impl Serialize for DateTime {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         serializer.collect_str(&format_args!(\"{:?}{:?}\", self.naive_local(), self.offset()))\n    ///     }\n    /// }\n    /// ```\n    #[cfg(not(any(feature = \"std\", feature = \"alloc\")))]\n    fn collect_str<T>(self, value: &T) -> Result<Self::Ok, Self::Error>\n    where\n        T: ?Sized + Display;\n\n    /// Determine whether `Serialize` implementations should serialize in\n    /// human-readable form.\n    ///\n    /// Some types have a human-readable form that may be somewhat expensive to\n    /// construct, as well as a binary form that is compact and efficient.\n    /// Generally text-based formats like JSON and YAML will prefer to use the\n    /// human-readable one and binary formats like Postcard will prefer the\n    /// compact one.\n    ///\n    /// ```edition2021\n    /// # use std::fmt::{self, Display};\n    /// #\n    /// # struct Timestamp;\n    /// #\n    /// # impl Timestamp {\n    /// #     fn seconds_since_epoch(&self) -> u64 { unimplemented!() }\n    /// # }\n    /// #\n    /// # impl Display for Timestamp {\n    /// #     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n    /// #         unimplemented!()\n    /// #     }\n    /// # }\n    /// #\n    /// use serde::{Serialize, Serializer};\n    ///\n    /// impl Serialize for Timestamp {\n    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    ///     where\n    ///         S: Serializer,\n    ///     {\n    ///         if serializer.is_human_readable() {\n    ///             // Serialize to a human-readable string \"2015-05-15T17:01:00Z\".\n    ///             self.to_string().serialize(serializer)\n    ///         } else {\n    ///             // Serialize to a compact binary representation.\n    ///             self.seconds_since_epoch().serialize(serializer)\n    ///         }\n    ///     }\n    /// }\n    /// ```\n    ///\n    /// The default implementation of this method returns `true`. Data formats\n    /// may override this to `false` to request a compact form for types that\n    /// support one. Note that modifying this method to change a format from\n    /// human-readable to compact or vice versa should be regarded as a breaking\n    /// change, as a value serialized in human-readable mode is not required to\n    /// deserialize from the same data in compact mode.\n    #[inline]\n    fn is_human_readable(&self) -> bool {\n        true\n    }\n}\n\n/// Returned from `Serializer::serialize_seq`.\n///\n/// # Example use\n///\n/// ```edition2021\n/// # use std::marker::PhantomData;\n/// #\n/// # struct Vec<T>(PhantomData<T>);\n/// #\n/// # impl<T> Vec<T> {\n/// #     fn len(&self) -> usize {\n/// #         unimplemented!()\n/// #     }\n/// # }\n/// #\n/// # impl<'a, T> IntoIterator for &'a Vec<T> {\n/// #     type Item = &'a T;\n/// #     type IntoIter = Box<dyn Iterator<Item = &'a T>>;\n/// #     fn into_iter(self) -> Self::IntoIter {\n/// #         unimplemented!()\n/// #     }\n/// # }\n/// #\n/// use serde::ser::{Serialize, SerializeSeq, Serializer};\n///\n/// impl<T> Serialize for Vec<T>\n/// where\n///     T: Serialize,\n/// {\n///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n///     where\n///         S: Serializer,\n///     {\n///         let mut seq = serializer.serialize_seq(Some(self.len()))?;\n///         for element in self {\n///             seq.serialize_element(element)?;\n///         }\n///         seq.end()\n///     }\n/// }\n/// ```\n///\n/// # Example implementation\n///\n/// The [example data format] presented on the website demonstrates an\n/// implementation of `SerializeSeq` for a basic JSON data format.\n///\n/// [example data format]: https://serde.rs/data-format.html\n#[cfg_attr(\n    not(no_diagnostic_namespace),\n    diagnostic::on_unimplemented(\n        message = \"the trait bound `{Self}: serde::ser::SerializeSeq` is not satisfied\",\n    )\n)]\npub trait SerializeSeq {\n    /// Must match the `Ok` type of our `Serializer`.\n    type Ok;\n\n    /// Must match the `Error` type of our `Serializer`.\n    type Error: Error;\n\n    /// Serialize a sequence element.\n    fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>\n    where\n        T: ?Sized + Serialize;\n\n    /// Finish serializing a sequence.\n    fn end(self) -> Result<Self::Ok, Self::Error>;\n}\n\n/// Returned from `Serializer::serialize_tuple`.\n///\n/// # Example use\n///\n/// ```edition2021\n/// use serde::ser::{Serialize, SerializeTuple, Serializer};\n///\n/// # mod fool {\n/// #     trait Serialize {}\n/// impl<A, B, C> Serialize for (A, B, C)\n/// #     {}\n/// # }\n/// #\n/// # struct Tuple3<A, B, C>(A, B, C);\n/// #\n/// # impl<A, B, C> Serialize for Tuple3<A, B, C>\n/// where\n///     A: Serialize,\n///     B: Serialize,\n///     C: Serialize,\n/// {\n///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n///     where\n///         S: Serializer,\n///     {\n///         let mut tup = serializer.serialize_tuple(3)?;\n///         tup.serialize_element(&self.0)?;\n///         tup.serialize_element(&self.1)?;\n///         tup.serialize_element(&self.2)?;\n///         tup.end()\n///     }\n/// }\n/// ```\n///\n/// ```edition2021\n/// # use std::marker::PhantomData;\n/// #\n/// # struct Array<T>(PhantomData<T>);\n/// #\n/// # impl<T> Array<T> {\n/// #     fn len(&self) -> usize {\n/// #         unimplemented!()\n/// #     }\n/// # }\n/// #\n/// # impl<'a, T> IntoIterator for &'a Array<T> {\n/// #     type Item = &'a T;\n/// #     type IntoIter = Box<dyn Iterator<Item = &'a T>>;\n/// #     fn into_iter(self) -> Self::IntoIter {\n/// #         unimplemented!()\n/// #     }\n/// # }\n/// #\n/// use serde::ser::{Serialize, SerializeTuple, Serializer};\n///\n/// # mod fool {\n/// #     trait Serialize {}\n/// impl<T> Serialize for [T; 16]\n/// #     {}\n/// # }\n/// #\n/// # impl<T> Serialize for Array<T>\n/// where\n///     T: Serialize,\n/// {\n///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n///     where\n///         S: Serializer,\n///     {\n///         let mut seq = serializer.serialize_tuple(16)?;\n///         for element in self {\n///             seq.serialize_element(element)?;\n///         }\n///         seq.end()\n///     }\n/// }\n/// ```\n///\n/// # Example implementation\n///\n/// The [example data format] presented on the website demonstrates an\n/// implementation of `SerializeTuple` for a basic JSON data format.\n///\n/// [example data format]: https://serde.rs/data-format.html\n#[cfg_attr(\n    not(no_diagnostic_namespace),\n    diagnostic::on_unimplemented(\n        message = \"the trait bound `{Self}: serde::ser::SerializeTuple` is not satisfied\",\n    )\n)]\npub trait SerializeTuple {\n    /// Must match the `Ok` type of our `Serializer`.\n    type Ok;\n\n    /// Must match the `Error` type of our `Serializer`.\n    type Error: Error;\n\n    /// Serialize a tuple element.\n    fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>\n    where\n        T: ?Sized + Serialize;\n\n    /// Finish serializing a tuple.\n    fn end(self) -> Result<Self::Ok, Self::Error>;\n}\n\n/// Returned from `Serializer::serialize_tuple_struct`.\n///\n/// # Example use\n///\n/// ```edition2021\n/// use serde::ser::{Serialize, SerializeTupleStruct, Serializer};\n///\n/// struct Rgb(u8, u8, u8);\n///\n/// impl Serialize for Rgb {\n///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n///     where\n///         S: Serializer,\n///     {\n///         let mut ts = serializer.serialize_tuple_struct(\"Rgb\", 3)?;\n///         ts.serialize_field(&self.0)?;\n///         ts.serialize_field(&self.1)?;\n///         ts.serialize_field(&self.2)?;\n///         ts.end()\n///     }\n/// }\n/// ```\n///\n/// # Example implementation\n///\n/// The [example data format] presented on the website demonstrates an\n/// implementation of `SerializeTupleStruct` for a basic JSON data format.\n///\n/// [example data format]: https://serde.rs/data-format.html\n#[cfg_attr(\n    not(no_diagnostic_namespace),\n    diagnostic::on_unimplemented(\n        message = \"the trait bound `{Self}: serde::ser::SerializeTupleStruct` is not satisfied\",\n    )\n)]\npub trait SerializeTupleStruct {\n    /// Must match the `Ok` type of our `Serializer`.\n    type Ok;\n\n    /// Must match the `Error` type of our `Serializer`.\n    type Error: Error;\n\n    /// Serialize a tuple struct field.\n    fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>\n    where\n        T: ?Sized + Serialize;\n\n    /// Finish serializing a tuple struct.\n    fn end(self) -> Result<Self::Ok, Self::Error>;\n}\n\n/// Returned from `Serializer::serialize_tuple_variant`.\n///\n/// # Example use\n///\n/// ```edition2021\n/// use serde::ser::{Serialize, SerializeTupleVariant, Serializer};\n///\n/// enum E {\n///     T(u8, u8),\n///     U(String, u32, u32),\n/// }\n///\n/// impl Serialize for E {\n///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n///     where\n///         S: Serializer,\n///     {\n///         match *self {\n///             E::T(ref a, ref b) => {\n///                 let mut tv = serializer.serialize_tuple_variant(\"E\", 0, \"T\", 2)?;\n///                 tv.serialize_field(a)?;\n///                 tv.serialize_field(b)?;\n///                 tv.end()\n///             }\n///             E::U(ref a, ref b, ref c) => {\n///                 let mut tv = serializer.serialize_tuple_variant(\"E\", 1, \"U\", 3)?;\n///                 tv.serialize_field(a)?;\n///                 tv.serialize_field(b)?;\n///                 tv.serialize_field(c)?;\n///                 tv.end()\n///             }\n///         }\n///     }\n/// }\n/// ```\n///\n/// # Example implementation\n///\n/// The [example data format] presented on the website demonstrates an\n/// implementation of `SerializeTupleVariant` for a basic JSON data format.\n///\n/// [example data format]: https://serde.rs/data-format.html\n#[cfg_attr(\n    not(no_diagnostic_namespace),\n    diagnostic::on_unimplemented(\n        message = \"the trait bound `{Self}: serde::ser::SerializeTupleVariant` is not satisfied\",\n    )\n)]\npub trait SerializeTupleVariant {\n    /// Must match the `Ok` type of our `Serializer`.\n    type Ok;\n\n    /// Must match the `Error` type of our `Serializer`.\n    type Error: Error;\n\n    /// Serialize a tuple variant field.\n    fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>\n    where\n        T: ?Sized + Serialize;\n\n    /// Finish serializing a tuple variant.\n    fn end(self) -> Result<Self::Ok, Self::Error>;\n}\n\n/// Returned from `Serializer::serialize_map`.\n///\n/// # Example use\n///\n/// ```edition2021\n/// # use std::marker::PhantomData;\n/// #\n/// # struct HashMap<K, V>(PhantomData<K>, PhantomData<V>);\n/// #\n/// # impl<K, V> HashMap<K, V> {\n/// #     fn len(&self) -> usize {\n/// #         unimplemented!()\n/// #     }\n/// # }\n/// #\n/// # impl<'a, K, V> IntoIterator for &'a HashMap<K, V> {\n/// #     type Item = (&'a K, &'a V);\n/// #     type IntoIter = Box<dyn Iterator<Item = (&'a K, &'a V)>>;\n/// #\n/// #     fn into_iter(self) -> Self::IntoIter {\n/// #         unimplemented!()\n/// #     }\n/// # }\n/// #\n/// use serde::ser::{Serialize, SerializeMap, Serializer};\n///\n/// impl<K, V> Serialize for HashMap<K, V>\n/// where\n///     K: Serialize,\n///     V: Serialize,\n/// {\n///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n///     where\n///         S: Serializer,\n///     {\n///         let mut map = serializer.serialize_map(Some(self.len()))?;\n///         for (k, v) in self {\n///             map.serialize_entry(k, v)?;\n///         }\n///         map.end()\n///     }\n/// }\n/// ```\n///\n/// # Example implementation\n///\n/// The [example data format] presented on the website demonstrates an\n/// implementation of `SerializeMap` for a basic JSON data format.\n///\n/// [example data format]: https://serde.rs/data-format.html\n#[cfg_attr(\n    not(no_diagnostic_namespace),\n    diagnostic::on_unimplemented(\n        message = \"the trait bound `{Self}: serde::ser::SerializeMap` is not satisfied\",\n    )\n)]\npub trait SerializeMap {\n    /// Must match the `Ok` type of our `Serializer`.\n    type Ok;\n\n    /// Must match the `Error` type of our `Serializer`.\n    type Error: Error;\n\n    /// Serialize a map key.\n    ///\n    /// If possible, `Serialize` implementations are encouraged to use\n    /// `serialize_entry` instead as it may be implemented more efficiently in\n    /// some formats compared to a pair of calls to `serialize_key` and\n    /// `serialize_value`.\n    fn serialize_key<T>(&mut self, key: &T) -> Result<(), Self::Error>\n    where\n        T: ?Sized + Serialize;\n\n    /// Serialize a map value.\n    ///\n    /// # Panics\n    ///\n    /// Calling `serialize_value` before `serialize_key` is incorrect and is\n    /// allowed to panic or produce bogus results.\n    fn serialize_value<T>(&mut self, value: &T) -> Result<(), Self::Error>\n    where\n        T: ?Sized + Serialize;\n\n    /// Serialize a map entry consisting of a key and a value.\n    ///\n    /// Some [`Serialize`] types are not able to hold a key and value in memory\n    /// at the same time so `SerializeMap` implementations are required to\n    /// support [`serialize_key`] and [`serialize_value`] individually. The\n    /// `serialize_entry` method allows serializers to optimize for the case\n    /// where key and value are both available. [`Serialize`] implementations\n    /// are encouraged to use `serialize_entry` if possible.\n    ///\n    /// The default implementation delegates to [`serialize_key`] and\n    /// [`serialize_value`]. This is appropriate for serializers that do not\n    /// care about performance or are not able to optimize `serialize_entry` any\n    /// better than this.\n    ///\n    /// [`Serialize`]: crate::Serialize\n    /// [`serialize_key`]: Self::serialize_key\n    /// [`serialize_value`]: Self::serialize_value\n    fn serialize_entry<K, V>(&mut self, key: &K, value: &V) -> Result<(), Self::Error>\n    where\n        K: ?Sized + Serialize,\n        V: ?Sized + Serialize,\n    {\n        tri!(self.serialize_key(key));\n        self.serialize_value(value)\n    }\n\n    /// Finish serializing a map.\n    fn end(self) -> Result<Self::Ok, Self::Error>;\n}\n\n/// Returned from `Serializer::serialize_struct`.\n///\n/// # Example use\n///\n/// ```edition2021\n/// use serde::ser::{Serialize, SerializeStruct, Serializer};\n///\n/// struct Rgb {\n///     r: u8,\n///     g: u8,\n///     b: u8,\n/// }\n///\n/// impl Serialize for Rgb {\n///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n///     where\n///         S: Serializer,\n///     {\n///         let mut rgb = serializer.serialize_struct(\"Rgb\", 3)?;\n///         rgb.serialize_field(\"r\", &self.r)?;\n///         rgb.serialize_field(\"g\", &self.g)?;\n///         rgb.serialize_field(\"b\", &self.b)?;\n///         rgb.end()\n///     }\n/// }\n/// ```\n///\n/// # Example implementation\n///\n/// The [example data format] presented on the website demonstrates an\n/// implementation of `SerializeStruct` for a basic JSON data format.\n///\n/// [example data format]: https://serde.rs/data-format.html\n#[cfg_attr(\n    not(no_diagnostic_namespace),\n    diagnostic::on_unimplemented(\n        message = \"the trait bound `{Self}: serde::ser::SerializeStruct` is not satisfied\",\n    )\n)]\npub trait SerializeStruct {\n    /// Must match the `Ok` type of our `Serializer`.\n    type Ok;\n\n    /// Must match the `Error` type of our `Serializer`.\n    type Error: Error;\n\n    /// Serialize a struct field.\n    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>\n    where\n        T: ?Sized + Serialize;\n\n    /// Indicate that a struct field has been skipped.\n    ///\n    /// The default implementation does nothing.\n    #[inline]\n    fn skip_field(&mut self, key: &'static str) -> Result<(), Self::Error> {\n        let _ = key;\n        Ok(())\n    }\n\n    /// Finish serializing a struct.\n    fn end(self) -> Result<Self::Ok, Self::Error>;\n}\n\n/// Returned from `Serializer::serialize_struct_variant`.\n///\n/// # Example use\n///\n/// ```edition2021\n/// use serde::ser::{Serialize, SerializeStructVariant, Serializer};\n///\n/// enum E {\n///     S { r: u8, g: u8, b: u8 },\n/// }\n///\n/// impl Serialize for E {\n///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n///     where\n///         S: Serializer,\n///     {\n///         match *self {\n///             E::S {\n///                 ref r,\n///                 ref g,\n///                 ref b,\n///             } => {\n///                 let mut sv = serializer.serialize_struct_variant(\"E\", 0, \"S\", 3)?;\n///                 sv.serialize_field(\"r\", r)?;\n///                 sv.serialize_field(\"g\", g)?;\n///                 sv.serialize_field(\"b\", b)?;\n///                 sv.end()\n///             }\n///         }\n///     }\n/// }\n/// ```\n///\n/// # Example implementation\n///\n/// The [example data format] presented on the website demonstrates an\n/// implementation of `SerializeStructVariant` for a basic JSON data format.\n///\n/// [example data format]: https://serde.rs/data-format.html\n#[cfg_attr(\n    not(no_diagnostic_namespace),\n    diagnostic::on_unimplemented(\n        message = \"the trait bound `{Self}: serde::ser::SerializeStructVariant` is not satisfied\",\n    )\n)]\npub trait SerializeStructVariant {\n    /// Must match the `Ok` type of our `Serializer`.\n    type Ok;\n\n    /// Must match the `Error` type of our `Serializer`.\n    type Error: Error;\n\n    /// Serialize a struct variant field.\n    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>\n    where\n        T: ?Sized + Serialize;\n\n    /// Indicate that a struct variant field has been skipped.\n    ///\n    /// The default implementation does nothing.\n    #[inline]\n    fn skip_field(&mut self, key: &'static str) -> Result<(), Self::Error> {\n        let _ = key;\n        Ok(())\n    }\n\n    /// Finish serializing a struct variant.\n    fn end(self) -> Result<Self::Ok, Self::Error>;\n}\n\nfn iterator_len_hint<I>(iter: &I) -> Option<usize>\nwhere\n    I: Iterator,\n{\n    match iter.size_hint() {\n        (lo, Some(hi)) if lo == hi => Some(lo),\n        _ => None,\n    }\n}\n"
  },
  {
    "path": "serde_core/src/std_error.rs",
    "content": "use crate::lib::{Debug, Display};\n\n/// Either a re-export of std::error::Error or a new identical trait, depending\n/// on whether Serde's \"std\" feature is enabled.\n///\n/// Serde's error traits [`serde::ser::Error`] and [`serde::de::Error`] require\n/// [`std::error::Error`] as a supertrait, but only when Serde is built with\n/// \"std\" enabled. Data formats that don't care about no\\_std support should\n/// generally provide their error types with a `std::error::Error` impl\n/// directly:\n///\n/// ```edition2021\n/// #[derive(Debug)]\n/// struct MySerError {...}\n///\n/// impl serde::ser::Error for MySerError {...}\n///\n/// impl std::fmt::Display for MySerError {...}\n///\n/// // We don't support no_std!\n/// impl std::error::Error for MySerError {}\n/// ```\n///\n/// Data formats that *do* support no\\_std may either have a \"std\" feature of\n/// their own:\n///\n/// ```toml\n/// [features]\n/// std = [\"serde/std\"]\n/// ```\n///\n/// ```edition2021\n/// #[cfg(feature = \"std\")]\n/// impl std::error::Error for MySerError {}\n/// ```\n///\n/// ... or else provide the std Error impl unconditionally via Serde's\n/// re-export:\n///\n/// ```edition2021\n/// impl serde::ser::StdError for MySerError {}\n/// ```\npub trait Error: Debug + Display {\n    /// The underlying cause of this error, if any.\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\n        None\n    }\n}\n"
  },
  {
    "path": "serde_derive/Cargo.toml",
    "content": "[package]\nname = \"serde_derive\"\nversion = \"1.0.228\"\nauthors = [\"Erick Tryzelaar <erick.tryzelaar@gmail.com>\", \"David Tolnay <dtolnay@gmail.com>\"]\ncategories = [\"no-std\", \"no-std::no-alloc\"]\ndescription = \"Macros 1.1 implementation of #[derive(Serialize, Deserialize)]\"\ndocumentation = \"https://serde.rs/derive.html\"\nedition = \"2021\"\nexclude = [\"build.rs\"]\nhomepage = \"https://serde.rs\"\nkeywords = [\"serde\", \"serialization\", \"no_std\", \"derive\"]\nlicense = \"MIT OR Apache-2.0\"\nreadme = \"crates-io.md\"\nrepository = \"https://github.com/serde-rs/serde\"\nrust-version = \"1.71\"\n\n[features]\ndefault = []\ndeserialize_in_place = []\n\n[lib]\nname = \"serde_derive\"\nproc-macro = true\n\n[dependencies]\nproc-macro2 = { workspace = true, features = [\"proc-macro\"] }\nquote = { workspace = true, features = [\"proc-macro\"] }\nsyn = { workspace = true, features = [\"clone-impls\", \"derive\", \"parsing\", \"printing\", \"proc-macro\"] }\n\n[dev-dependencies]\nserde = { version = \"1\", path = \"../serde\" }\n\n[package.metadata.docs.rs]\ntargets = [\"x86_64-unknown-linux-gnu\"]\nrustdoc-args = [\n    \"--generate-link-to-definition\",\n    \"--generate-macro-expansion\",\n    \"--extern-html-root-url=core=https://doc.rust-lang.org\",\n    \"--extern-html-root-url=alloc=https://doc.rust-lang.org\",\n    \"--extern-html-root-url=std=https://doc.rust-lang.org\",\n    \"--extern-html-root-url=proc_macro=https://doc.rust-lang.org\",\n]\n"
  },
  {
    "path": "serde_derive/build.rs",
    "content": "fn main() {\n    // Warning: build.rs is not published to crates.io.\n\n    println!(\"cargo:rerun-if-changed=build.rs\");\n    println!(\"cargo:rustc-cfg=check_cfg\");\n    println!(\"cargo:rustc-check-cfg=cfg(check_cfg)\");\n    println!(\"cargo:rustc-check-cfg=cfg(exhaustive)\");\n}\n"
  },
  {
    "path": "serde_derive/src/bound.rs",
    "content": "use crate::internals::ast::{Container, Data};\nuse crate::internals::{attr, ungroup};\nuse proc_macro2::Span;\nuse std::collections::HashSet;\nuse syn::punctuated::{Pair, Punctuated};\nuse syn::Token;\n\n// Remove the default from every type parameter because in the generated impls\n// they look like associated types: \"error: associated type bindings are not\n// allowed here\".\npub fn without_defaults(generics: &syn::Generics) -> syn::Generics {\n    syn::Generics {\n        params: generics\n            .params\n            .iter()\n            .map(|param| match param {\n                syn::GenericParam::Type(param) => syn::GenericParam::Type(syn::TypeParam {\n                    eq_token: None,\n                    default: None,\n                    ..param.clone()\n                }),\n                _ => param.clone(),\n            })\n            .collect(),\n        ..generics.clone()\n    }\n}\n\npub fn with_where_predicates(\n    generics: &syn::Generics,\n    predicates: &[syn::WherePredicate],\n) -> syn::Generics {\n    let mut generics = generics.clone();\n    let dst_predicates = &mut generics.make_where_clause().predicates;\n\n    for predicate in predicates {\n        dst_predicates.push(predicate.clone());\n    }\n    generics\n}\n\npub fn with_where_predicates_from_fields(\n    cont: &Container,\n    generics: &syn::Generics,\n    from_field: fn(&attr::Field) -> Option<&[syn::WherePredicate]>,\n) -> syn::Generics {\n    let mut generics = generics.clone();\n    let dst_predicates = &mut generics.make_where_clause().predicates;\n\n    for field in cont.data.all_fields() {\n        let Some(predicate_slice) = from_field(&field.attrs) else {\n            continue;\n        };\n        for inner_predicate in predicate_slice {\n            dst_predicates.push(inner_predicate.clone());\n        }\n    }\n    generics\n}\n\npub fn with_where_predicates_from_variants(\n    cont: &Container,\n    generics: &syn::Generics,\n    from_variant: fn(&attr::Variant) -> Option<&[syn::WherePredicate]>,\n) -> syn::Generics {\n    let variants = match &cont.data {\n        Data::Enum(variants) => variants,\n        Data::Struct(_, _) => {\n            return generics.clone();\n        }\n    };\n    let mut generics = generics.clone();\n    let dst_predicates = &mut generics.make_where_clause().predicates;\n\n    for variant in variants {\n        let Some(predicate_slice) = from_variant(&variant.attrs) else {\n            continue;\n        };\n        for inner_predicate in predicate_slice {\n            dst_predicates.push(inner_predicate.clone());\n        }\n    }\n    generics\n}\n\n// Puts the given bound on any generic type parameters that are used in fields\n// for which filter returns true.\n//\n// For example, the following struct needs the bound `A: Serialize, B:\n// Serialize`.\n//\n//     struct S<'b, A, B: 'b, C> {\n//         a: A,\n//         b: Option<&'b B>\n//         #[serde(skip_serializing)]\n//         c: C,\n//     }\npub fn with_bound(\n    cont: &Container,\n    generics: &syn::Generics,\n    filter: fn(&attr::Field, Option<&attr::Variant>) -> bool,\n    bound: &syn::Path,\n) -> syn::Generics {\n    struct FindTyParams<'ast> {\n        // Set of all generic type parameters on the current struct (A, B, C in\n        // the example). Initialized up front.\n        all_type_params: HashSet<syn::Ident>,\n\n        // Set of generic type parameters used in fields for which filter\n        // returns true (A and B in the example). Filled in as the visitor sees\n        // them.\n        relevant_type_params: HashSet<syn::Ident>,\n\n        // Fields whose type is an associated type of one of the generic type\n        // parameters.\n        associated_type_usage: Vec<&'ast syn::TypePath>,\n    }\n\n    impl<'ast> FindTyParams<'ast> {\n        fn visit_field(&mut self, field: &'ast syn::Field) {\n            if let syn::Type::Path(ty) = ungroup(&field.ty) {\n                if let Some(Pair::Punctuated(t, _)) = ty.path.segments.pairs().next() {\n                    if self.all_type_params.contains(&t.ident) {\n                        self.associated_type_usage.push(ty);\n                    }\n                }\n            }\n            self.visit_type(&field.ty);\n        }\n\n        fn visit_path(&mut self, path: &'ast syn::Path) {\n            if let Some(seg) = path.segments.last() {\n                if seg.ident == \"PhantomData\" {\n                    // Hardcoded exception, because PhantomData<T> implements\n                    // Serialize and Deserialize whether or not T implements it.\n                    return;\n                }\n            }\n            if path.leading_colon.is_none() && path.segments.len() == 1 {\n                let id = &path.segments[0].ident;\n                if self.all_type_params.contains(id) {\n                    self.relevant_type_params.insert(id.clone());\n                }\n            }\n            for segment in &path.segments {\n                self.visit_path_segment(segment);\n            }\n        }\n\n        // Everything below is simply traversing the syntax tree.\n\n        fn visit_type(&mut self, ty: &'ast syn::Type) {\n            match ty {\n                #![cfg_attr(all(test, exhaustive), deny(non_exhaustive_omitted_patterns))]\n                syn::Type::Array(ty) => self.visit_type(&ty.elem),\n                syn::Type::BareFn(ty) => {\n                    for arg in &ty.inputs {\n                        self.visit_type(&arg.ty);\n                    }\n                    self.visit_return_type(&ty.output);\n                }\n                syn::Type::Group(ty) => self.visit_type(&ty.elem),\n                syn::Type::ImplTrait(ty) => {\n                    for bound in &ty.bounds {\n                        self.visit_type_param_bound(bound);\n                    }\n                }\n                syn::Type::Macro(ty) => self.visit_macro(&ty.mac),\n                syn::Type::Paren(ty) => self.visit_type(&ty.elem),\n                syn::Type::Path(ty) => {\n                    if let Some(qself) = &ty.qself {\n                        self.visit_type(&qself.ty);\n                    }\n                    self.visit_path(&ty.path);\n                }\n                syn::Type::Ptr(ty) => self.visit_type(&ty.elem),\n                syn::Type::Reference(ty) => self.visit_type(&ty.elem),\n                syn::Type::Slice(ty) => self.visit_type(&ty.elem),\n                syn::Type::TraitObject(ty) => {\n                    for bound in &ty.bounds {\n                        self.visit_type_param_bound(bound);\n                    }\n                }\n                syn::Type::Tuple(ty) => {\n                    for elem in &ty.elems {\n                        self.visit_type(elem);\n                    }\n                }\n\n                syn::Type::Infer(_) | syn::Type::Never(_) | syn::Type::Verbatim(_) => {}\n\n                _ => {}\n            }\n        }\n\n        fn visit_path_segment(&mut self, segment: &'ast syn::PathSegment) {\n            self.visit_path_arguments(&segment.arguments);\n        }\n\n        fn visit_path_arguments(&mut self, arguments: &'ast syn::PathArguments) {\n            match arguments {\n                syn::PathArguments::None => {}\n                syn::PathArguments::AngleBracketed(arguments) => {\n                    for arg in &arguments.args {\n                        match arg {\n                            #![cfg_attr(all(test, exhaustive), deny(non_exhaustive_omitted_patterns))]\n                            syn::GenericArgument::Type(arg) => self.visit_type(arg),\n                            syn::GenericArgument::AssocType(arg) => self.visit_type(&arg.ty),\n                            syn::GenericArgument::Lifetime(_)\n                            | syn::GenericArgument::Const(_)\n                            | syn::GenericArgument::AssocConst(_)\n                            | syn::GenericArgument::Constraint(_) => {}\n                            _ => {}\n                        }\n                    }\n                }\n                syn::PathArguments::Parenthesized(arguments) => {\n                    for argument in &arguments.inputs {\n                        self.visit_type(argument);\n                    }\n                    self.visit_return_type(&arguments.output);\n                }\n            }\n        }\n\n        fn visit_return_type(&mut self, return_type: &'ast syn::ReturnType) {\n            match return_type {\n                syn::ReturnType::Default => {}\n                syn::ReturnType::Type(_, output) => self.visit_type(output),\n            }\n        }\n\n        fn visit_type_param_bound(&mut self, bound: &'ast syn::TypeParamBound) {\n            match bound {\n                #![cfg_attr(all(test, exhaustive), deny(non_exhaustive_omitted_patterns))]\n                syn::TypeParamBound::Trait(bound) => self.visit_path(&bound.path),\n                syn::TypeParamBound::Lifetime(_)\n                | syn::TypeParamBound::PreciseCapture(_)\n                | syn::TypeParamBound::Verbatim(_) => {}\n                _ => {}\n            }\n        }\n\n        // Type parameter should not be considered used by a macro path.\n        //\n        //     struct TypeMacro<T> {\n        //         mac: T!(),\n        //         marker: PhantomData<T>,\n        //     }\n        fn visit_macro(&mut self, _mac: &'ast syn::Macro) {}\n    }\n\n    let all_type_params = generics\n        .type_params()\n        .map(|param| param.ident.clone())\n        .collect();\n\n    let mut visitor = FindTyParams {\n        all_type_params,\n        relevant_type_params: HashSet::new(),\n        associated_type_usage: Vec::new(),\n    };\n    match &cont.data {\n        Data::Enum(variants) => {\n            for variant in variants {\n                for field in &variant.fields {\n                    if filter(&field.attrs, Some(&variant.attrs)) {\n                        visitor.visit_field(field.original);\n                    }\n                }\n            }\n        }\n        Data::Struct(_, fields) => {\n            for field in fields {\n                if filter(&field.attrs, None) {\n                    visitor.visit_field(field.original);\n                }\n            }\n        }\n    }\n\n    let relevant_type_params = visitor.relevant_type_params;\n    let associated_type_usage = visitor.associated_type_usage;\n\n    fn make_where_bounded_type(\n        bounded_ty: syn::TypePath,\n        bound: &syn::Path,\n    ) -> syn::WherePredicate {\n        syn::WherePredicate::Type(syn::PredicateType {\n            lifetimes: None,\n            // the type parameter that is being bounded e.g. T\n            bounded_ty: syn::Type::Path(bounded_ty),\n            colon_token: <Token![:]>::default(),\n            // the bound e.g. Serialize\n            bounds: {\n                let mut punct = Punctuated::new();\n                punct.push(syn::TypeParamBound::Trait(syn::TraitBound {\n                    paren_token: None,\n                    modifier: syn::TraitBoundModifier::None,\n                    lifetimes: None,\n                    path: bound.clone(),\n                }));\n                punct\n            },\n        })\n    }\n\n    let mut dst_generics = generics.clone();\n    let dst_predicates = &mut dst_generics.make_where_clause().predicates;\n    for param in generics.type_params() {\n        let id = &param.ident;\n        if !relevant_type_params.contains(id) {\n            continue;\n        }\n        let bounded_ty = syn::TypePath {\n            qself: None,\n            path: id.clone().into(),\n        };\n        dst_predicates.push(make_where_bounded_type(bounded_ty, bound));\n    }\n    for bounded_ty in associated_type_usage {\n        dst_predicates.push(make_where_bounded_type(bounded_ty.clone(), bound));\n    }\n    dst_generics\n}\n\npub fn with_self_bound(\n    cont: &Container,\n    generics: &syn::Generics,\n    bound: &syn::Path,\n) -> syn::Generics {\n    let mut generics = generics.clone();\n    generics\n        .make_where_clause()\n        .predicates\n        .push(syn::WherePredicate::Type(syn::PredicateType {\n            lifetimes: None,\n            // the type that is being bounded e.g. MyStruct<'a, T>\n            bounded_ty: type_of_item(cont),\n            colon_token: <Token![:]>::default(),\n            // the bound e.g. Default\n            bounds: vec![syn::TypeParamBound::Trait(syn::TraitBound {\n                paren_token: None,\n                modifier: syn::TraitBoundModifier::None,\n                lifetimes: None,\n                path: bound.clone(),\n            })]\n            .into_iter()\n            .collect(),\n        }));\n    generics\n}\n\npub fn with_lifetime_bound(generics: &syn::Generics, lifetime: &str) -> syn::Generics {\n    let bound = syn::Lifetime::new(lifetime, Span::call_site());\n    let def = syn::LifetimeParam {\n        attrs: Vec::new(),\n        lifetime: bound.clone(),\n        colon_token: None,\n        bounds: Punctuated::new(),\n    };\n\n    let params = Some(syn::GenericParam::Lifetime(def))\n        .into_iter()\n        .chain(generics.params.iter().cloned().map(|mut param| {\n            match &mut param {\n                syn::GenericParam::Lifetime(param) => {\n                    param.bounds.push(bound.clone());\n                }\n                syn::GenericParam::Type(param) => {\n                    param\n                        .bounds\n                        .push(syn::TypeParamBound::Lifetime(bound.clone()));\n                }\n                syn::GenericParam::Const(_) => {}\n            }\n            param\n        }))\n        .collect();\n\n    syn::Generics {\n        params,\n        ..generics.clone()\n    }\n}\n\nfn type_of_item(cont: &Container) -> syn::Type {\n    syn::Type::Path(syn::TypePath {\n        qself: None,\n        path: syn::Path {\n            leading_colon: None,\n            segments: vec![syn::PathSegment {\n                ident: cont.ident.clone(),\n                arguments: syn::PathArguments::AngleBracketed(\n                    syn::AngleBracketedGenericArguments {\n                        colon2_token: None,\n                        lt_token: <Token![<]>::default(),\n                        args: cont\n                            .generics\n                            .params\n                            .iter()\n                            .map(|param| match param {\n                                syn::GenericParam::Type(param) => {\n                                    syn::GenericArgument::Type(syn::Type::Path(syn::TypePath {\n                                        qself: None,\n                                        path: param.ident.clone().into(),\n                                    }))\n                                }\n                                syn::GenericParam::Lifetime(param) => {\n                                    syn::GenericArgument::Lifetime(param.lifetime.clone())\n                                }\n                                syn::GenericParam::Const(_) => {\n                                    panic!(\"Serde does not support const generics yet\");\n                                }\n                            })\n                            .collect(),\n                        gt_token: <Token![>]>::default(),\n                    },\n                ),\n            }]\n            .into_iter()\n            .collect(),\n        },\n    })\n}\n"
  },
  {
    "path": "serde_derive/src/de/enum_.rs",
    "content": "use crate::de::enum_adjacently;\nuse crate::de::enum_externally;\nuse crate::de::enum_internally;\nuse crate::de::enum_untagged;\nuse crate::de::identifier;\nuse crate::de::{field_i, FieldWithAliases, Parameters};\nuse crate::fragment::{Expr, Fragment, Stmts};\nuse crate::internals::ast::Variant;\nuse crate::internals::attr;\nuse crate::private;\nuse proc_macro2::TokenStream;\nuse quote::quote;\n\n/// Generates `Deserialize::deserialize` body for an `enum Enum {...}`\npub(super) fn deserialize(\n    params: &Parameters,\n    variants: &[Variant],\n    cattrs: &attr::Container,\n) -> Fragment {\n    // The variants have already been checked (in ast.rs) that all untagged variants appear at the end\n    match variants.iter().position(|var| var.attrs.untagged()) {\n        Some(variant_idx) => {\n            let (tagged, untagged) = variants.split_at(variant_idx);\n            let tagged_frag = Expr(deserialize_homogeneous_enum(params, tagged, cattrs));\n            // Ignore any error associated with non-untagged deserialization so that we\n            // can fall through to the untagged variants. This may be infallible so we\n            // need to provide the error type.\n            let first_attempt = quote! {\n                if let _serde::#private::Result::<_, __D::Error>::Ok(__ok) = (|| #tagged_frag)() {\n                    return _serde::#private::Ok(__ok);\n                }\n            };\n            enum_untagged::deserialize(params, untagged, cattrs, Some(first_attempt))\n        }\n        None => deserialize_homogeneous_enum(params, variants, cattrs),\n    }\n}\n\nfn deserialize_homogeneous_enum(\n    params: &Parameters,\n    variants: &[Variant],\n    cattrs: &attr::Container,\n) -> Fragment {\n    match cattrs.tag() {\n        attr::TagType::External => enum_externally::deserialize(params, variants, cattrs),\n        attr::TagType::Internal { tag } => {\n            enum_internally::deserialize(params, variants, cattrs, tag)\n        }\n        attr::TagType::Adjacent { tag, content } => {\n            enum_adjacently::deserialize(params, variants, cattrs, tag, content)\n        }\n        attr::TagType::None => enum_untagged::deserialize(params, variants, cattrs, None),\n    }\n}\n\npub fn prepare_enum_variant_enum(variants: &[Variant]) -> (TokenStream, Stmts) {\n    let deserialized_variants = variants\n        .iter()\n        .enumerate()\n        .filter(|&(_i, variant)| !variant.attrs.skip_deserializing());\n\n    let fallthrough = deserialized_variants\n        .clone()\n        .find(|(_i, variant)| variant.attrs.other())\n        .map(|(i, _variant)| {\n            let ignore_variant = field_i(i);\n            quote!(_serde::#private::Ok(__Field::#ignore_variant))\n        });\n\n    let variants_stmt = {\n        let variant_names = deserialized_variants\n            .clone()\n            .flat_map(|(_i, variant)| variant.attrs.aliases());\n        quote! {\n            #[doc(hidden)]\n            const VARIANTS: &'static [&'static str] = &[ #(#variant_names),* ];\n        }\n    };\n\n    let deserialized_variants: Vec<_> = deserialized_variants\n        .map(|(i, variant)| FieldWithAliases {\n            ident: field_i(i),\n            aliases: variant.attrs.aliases(),\n        })\n        .collect();\n\n    let variant_visitor = Stmts(identifier::deserialize_generated(\n        &deserialized_variants,\n        false, // variant identifiers do not depend on the presence of flatten fields\n        true,\n        None,\n        fallthrough,\n    ));\n\n    (variants_stmt, variant_visitor)\n}\n"
  },
  {
    "path": "serde_derive/src/de/enum_adjacently.rs",
    "content": "//! Deserialization for adjacently tagged enums:\n//!\n//! ```ignore\n//! #[serde(tag = \"...\", content = \"...\")]\n//! enum Enum {}\n//! ```\n\nuse crate::de::enum_;\nuse crate::de::enum_untagged;\nuse crate::de::{field_i, Parameters};\nuse crate::fragment::{Fragment, Match};\nuse crate::internals::ast::{Style, Variant};\nuse crate::internals::attr;\nuse crate::private;\nuse quote::{quote, quote_spanned};\nuse syn::spanned::Spanned;\n\n/// Generates `Deserialize::deserialize` body for an `enum Enum {...}` with `#[serde(tag, content)]` attributes\npub(super) fn deserialize(\n    params: &Parameters,\n    variants: &[Variant],\n    cattrs: &attr::Container,\n    tag: &str,\n    content: &str,\n) -> Fragment {\n    let this_type = &params.this_type;\n    let this_value = &params.this_value;\n    let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =\n        params.generics_with_de_lifetime();\n    let delife = params.borrowed.de_lifetime();\n\n    let (variants_stmt, variant_visitor) = enum_::prepare_enum_variant_enum(variants);\n\n    let mut variant_arms = Vec::new();\n    for (i, variant) in variants.iter().enumerate() {\n        if variant.attrs.skip_deserializing() {\n            continue;\n        }\n        let variant_index = field_i(i);\n\n        let block = Match(enum_untagged::deserialize_variant(params, variant, cattrs));\n\n        variant_arms.push(quote! {\n            __Field::#variant_index => #block\n        });\n    }\n\n    let rust_name = params.type_name();\n    let expecting = format!(\"adjacently tagged enum {}\", rust_name);\n    let expecting = cattrs.expecting().unwrap_or(&expecting);\n    let type_name = cattrs.name().deserialize_name();\n    let deny_unknown_fields = cattrs.deny_unknown_fields();\n\n    // If unknown fields are allowed, we pick the visitor that can step over\n    // those. Otherwise we pick the visitor that fails on unknown keys.\n    let field_visitor_ty = if deny_unknown_fields {\n        quote! { _serde::#private::de::TagOrContentFieldVisitor }\n    } else {\n        quote! { _serde::#private::de::TagContentOtherFieldVisitor }\n    };\n\n    let mut missing_content = quote! {\n        _serde::#private::Err(<__A::Error as _serde::de::Error>::missing_field(#content))\n    };\n    let mut missing_content_fallthrough = quote!();\n    let mut missing_content_arms = Vec::new();\n    for (i, variant) in variants.iter().enumerate() {\n        if variant.attrs.skip_deserializing() {\n            continue;\n        }\n        let variant_index = field_i(i);\n        let variant_ident = &variant.ident;\n\n        let arm = match variant.style {\n            Style::Unit => quote! {\n                _serde::#private::Ok(#this_value::#variant_ident)\n            },\n            Style::Newtype if variant.attrs.deserialize_with().is_none() => {\n                let span = variant.original.span();\n                let func = quote_spanned!(span=> _serde::#private::de::missing_field);\n                quote! {\n                    #func(#content).map(#this_value::#variant_ident)\n                }\n            }\n            _ => {\n                missing_content_fallthrough = quote!(_ => #missing_content);\n                continue;\n            }\n        };\n        missing_content_arms.push(quote! {\n            __Field::#variant_index => #arm,\n        });\n    }\n\n    if !missing_content_arms.is_empty() {\n        missing_content = quote! {\n            match __field {\n                #(#missing_content_arms)*\n                #missing_content_fallthrough\n            }\n        };\n    }\n\n    // Advance the map by one key, returning early in case of error.\n    let next_key = quote! {\n        _serde::de::MapAccess::next_key_seed(&mut __map, #field_visitor_ty {\n            tag: #tag,\n            content: #content,\n        })?\n    };\n\n    let variant_from_map = quote! {\n        _serde::de::MapAccess::next_value_seed(&mut __map, _serde::#private::de::AdjacentlyTaggedEnumVariantSeed::<__Field> {\n            enum_name: #rust_name,\n            variants: VARIANTS,\n            fields_enum: _serde::#private::PhantomData\n        })?\n    };\n\n    // When allowing unknown fields, we want to transparently step through keys\n    // we don't care about until we find `tag`, `content`, or run out of keys.\n    let next_relevant_key = if deny_unknown_fields {\n        next_key\n    } else {\n        quote!({\n            let mut __rk : _serde::#private::Option<_serde::#private::de::TagOrContentField> = _serde::#private::None;\n            while let _serde::#private::Some(__k) = #next_key {\n                match __k {\n                    _serde::#private::de::TagContentOtherField::Other => {\n                        let _ = _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;\n                        continue;\n                    },\n                    _serde::#private::de::TagContentOtherField::Tag => {\n                        __rk = _serde::#private::Some(_serde::#private::de::TagOrContentField::Tag);\n                        break;\n                    }\n                    _serde::#private::de::TagContentOtherField::Content => {\n                        __rk = _serde::#private::Some(_serde::#private::de::TagOrContentField::Content);\n                        break;\n                    }\n                }\n            }\n\n            __rk\n        })\n    };\n\n    // Step through remaining keys, looking for duplicates of previously-seen\n    // keys. When unknown fields are denied, any key that isn't a duplicate will\n    // at this point immediately produce an error.\n    let visit_remaining_keys = quote! {\n        match #next_relevant_key {\n            _serde::#private::Some(_serde::#private::de::TagOrContentField::Tag) => {\n                _serde::#private::Err(<__A::Error as _serde::de::Error>::duplicate_field(#tag))\n            }\n            _serde::#private::Some(_serde::#private::de::TagOrContentField::Content) => {\n                _serde::#private::Err(<__A::Error as _serde::de::Error>::duplicate_field(#content))\n            }\n            _serde::#private::None => _serde::#private::Ok(__ret),\n        }\n    };\n\n    let finish_content_then_tag = if variant_arms.is_empty() {\n        quote! {\n            match #variant_from_map {}\n        }\n    } else {\n        quote! {\n            let __seed = __Seed {\n                variant: #variant_from_map,\n                marker: _serde::#private::PhantomData,\n                lifetime: _serde::#private::PhantomData,\n            };\n            let __deserializer = _serde::#private::de::ContentDeserializer::<__A::Error>::new(__content);\n            let __ret = _serde::de::DeserializeSeed::deserialize(__seed, __deserializer)?;\n            // Visit remaining keys, looking for duplicates.\n            #visit_remaining_keys\n        }\n    };\n\n    quote_block! {\n        #variant_visitor\n\n        #variants_stmt\n\n        #[doc(hidden)]\n        struct __Seed #de_impl_generics #where_clause {\n            variant: __Field,\n            marker: _serde::#private::PhantomData<#this_type #ty_generics>,\n            lifetime: _serde::#private::PhantomData<&#delife ()>,\n        }\n\n        #[automatically_derived]\n        impl #de_impl_generics _serde::de::DeserializeSeed<#delife> for __Seed #de_ty_generics #where_clause {\n            type Value = #this_type #ty_generics;\n\n            fn deserialize<__D>(self, __deserializer: __D) -> _serde::#private::Result<Self::Value, __D::Error>\n            where\n                __D: _serde::Deserializer<#delife>,\n            {\n                match self.variant {\n                    #(#variant_arms)*\n                }\n            }\n        }\n\n        #[doc(hidden)]\n        struct __Visitor #de_impl_generics #where_clause {\n            marker: _serde::#private::PhantomData<#this_type #ty_generics>,\n            lifetime: _serde::#private::PhantomData<&#delife ()>,\n        }\n\n        #[automatically_derived]\n        impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause {\n            type Value = #this_type #ty_generics;\n\n            fn expecting(&self, __formatter: &mut _serde::#private::Formatter) -> _serde::#private::fmt::Result {\n                _serde::#private::Formatter::write_str(__formatter, #expecting)\n            }\n\n            fn visit_map<__A>(self, mut __map: __A) -> _serde::#private::Result<Self::Value, __A::Error>\n            where\n                __A: _serde::de::MapAccess<#delife>,\n            {\n                // Visit the first relevant key.\n                match #next_relevant_key {\n                    // First key is the tag.\n                    _serde::#private::Some(_serde::#private::de::TagOrContentField::Tag) => {\n                        // Parse the tag.\n                        let __field = #variant_from_map;\n                        // Visit the second key.\n                        match #next_relevant_key {\n                            // Second key is a duplicate of the tag.\n                            _serde::#private::Some(_serde::#private::de::TagOrContentField::Tag) => {\n                                _serde::#private::Err(<__A::Error as _serde::de::Error>::duplicate_field(#tag))\n                            }\n                            // Second key is the content.\n                            _serde::#private::Some(_serde::#private::de::TagOrContentField::Content) => {\n                                let __ret = _serde::de::MapAccess::next_value_seed(&mut __map,\n                                    __Seed {\n                                        variant: __field,\n                                        marker: _serde::#private::PhantomData,\n                                        lifetime: _serde::#private::PhantomData,\n                                    })?;\n                                // Visit remaining keys, looking for duplicates.\n                                #visit_remaining_keys\n                            }\n                            // There is no second key; might be okay if the we have a unit variant.\n                            _serde::#private::None => #missing_content\n                        }\n                    }\n                    // First key is the content.\n                    _serde::#private::Some(_serde::#private::de::TagOrContentField::Content) => {\n                        // Buffer up the content.\n                        let __content = _serde::de::MapAccess::next_value_seed(&mut __map, _serde::#private::de::ContentVisitor::new())?;\n                        // Visit the second key.\n                        match #next_relevant_key {\n                            // Second key is the tag.\n                            _serde::#private::Some(_serde::#private::de::TagOrContentField::Tag) => {\n                                #finish_content_then_tag\n                            }\n                            // Second key is a duplicate of the content.\n                            _serde::#private::Some(_serde::#private::de::TagOrContentField::Content) => {\n                                _serde::#private::Err(<__A::Error as _serde::de::Error>::duplicate_field(#content))\n                            }\n                            // There is no second key.\n                            _serde::#private::None => {\n                                _serde::#private::Err(<__A::Error as _serde::de::Error>::missing_field(#tag))\n                            }\n                        }\n                    }\n                    // There is no first key.\n                    _serde::#private::None => {\n                        _serde::#private::Err(<__A::Error as _serde::de::Error>::missing_field(#tag))\n                    }\n                }\n            }\n\n            fn visit_seq<__A>(self, mut __seq: __A) -> _serde::#private::Result<Self::Value, __A::Error>\n            where\n                __A: _serde::de::SeqAccess<#delife>,\n            {\n                // Visit the first element - the tag.\n                match _serde::de::SeqAccess::next_element(&mut __seq) {\n                    _serde::#private::Ok(_serde::#private::Some(__variant)) => {\n                        // Visit the second element - the content.\n                        match _serde::de::SeqAccess::next_element_seed(\n                            &mut __seq,\n                            __Seed {\n                                variant: __variant,\n                                marker: _serde::#private::PhantomData,\n                                lifetime: _serde::#private::PhantomData,\n                            },\n                        ) {\n                            _serde::#private::Ok(_serde::#private::Some(__ret)) => _serde::#private::Ok(__ret),\n                            // There is no second element.\n                            _serde::#private::Ok(_serde::#private::None) => {\n                                _serde::#private::Err(_serde::de::Error::invalid_length(1, &self))\n                            }\n                            _serde::#private::Err(__err) => _serde::#private::Err(__err),\n                        }\n                    }\n                    // There is no first element.\n                    _serde::#private::Ok(_serde::#private::None) => {\n                        _serde::#private::Err(_serde::de::Error::invalid_length(0, &self))\n                    }\n                    _serde::#private::Err(__err) => _serde::#private::Err(__err),\n                }\n            }\n        }\n\n        #[doc(hidden)]\n        const FIELDS: &'static [&'static str] = &[#tag, #content];\n        _serde::Deserializer::deserialize_struct(\n            __deserializer,\n            #type_name,\n            FIELDS,\n            __Visitor {\n                marker: _serde::#private::PhantomData::<#this_type #ty_generics>,\n                lifetime: _serde::#private::PhantomData,\n            },\n        )\n    }\n}\n"
  },
  {
    "path": "serde_derive/src/de/enum_externally.rs",
    "content": "//! Deserialization for externally tagged enums:\n//!\n//! ```ignore\n//! enum Enum {}\n//! ```\n\nuse crate::de::enum_;\nuse crate::de::struct_;\nuse crate::de::tuple;\nuse crate::de::{\n    expr_is_missing, field_i, unwrap_to_variant_closure, wrap_deserialize_field_with,\n    wrap_deserialize_with, Parameters, StructForm, TupleForm,\n};\nuse crate::fragment::{Expr, Fragment, Match};\nuse crate::internals::ast::{Field, Style, Variant};\nuse crate::internals::attr;\nuse crate::private;\nuse proc_macro2::TokenStream;\nuse quote::{quote, quote_spanned};\nuse syn::spanned::Spanned;\n\n/// Generates `Deserialize::deserialize` body for an `enum Enum {...}` without additional attributes\npub(super) fn deserialize(\n    params: &Parameters,\n    variants: &[Variant],\n    cattrs: &attr::Container,\n) -> Fragment {\n    let this_type = &params.this_type;\n    let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =\n        params.generics_with_de_lifetime();\n    let delife = params.borrowed.de_lifetime();\n\n    let type_name = cattrs.name().deserialize_name();\n    let expecting = format!(\"enum {}\", params.type_name());\n    let expecting = cattrs.expecting().unwrap_or(&expecting);\n\n    let (variants_stmt, variant_visitor) = enum_::prepare_enum_variant_enum(variants);\n\n    // Match arms to extract a variant from a string\n    let variant_arms = variants\n        .iter()\n        .enumerate()\n        .filter(|&(_, variant)| !variant.attrs.skip_deserializing())\n        .map(|(i, variant)| {\n            let variant_name = field_i(i);\n\n            let block = Match(deserialize_externally_tagged_variant(\n                params, variant, cattrs,\n            ));\n\n            quote! {\n                _serde::#private::Ok((__Field::#variant_name, __variant)) => #block\n            }\n        });\n\n    let all_skipped = variants\n        .iter()\n        .all(|variant| variant.attrs.skip_deserializing());\n    let match_variant = if all_skipped {\n        // This is an empty enum like `enum Impossible {}` or an enum in which\n        // all variants have `#[serde(skip_deserializing)]`.\n        quote! {\n            // FIXME: Once feature(exhaustive_patterns) is stable:\n            // let _serde::#private::Err(__err) = _serde::de::EnumAccess::variant::<__Field>(__data);\n            // _serde::#private::Err(__err)\n            _serde::#private::Result::map(\n                _serde::de::EnumAccess::variant::<__Field>(__data),\n                |(__impossible, _)| match __impossible {})\n        }\n    } else {\n        quote! {\n            match _serde::de::EnumAccess::variant(__data) {\n                #(#variant_arms)*\n                _serde::#private::Err(__err) => _serde::#private::Err(__err),\n            }\n        }\n    };\n\n    quote_block! {\n        #variant_visitor\n\n        #[doc(hidden)]\n        struct __Visitor #de_impl_generics #where_clause {\n            marker: _serde::#private::PhantomData<#this_type #ty_generics>,\n            lifetime: _serde::#private::PhantomData<&#delife ()>,\n        }\n\n        #[automatically_derived]\n        impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause {\n            type Value = #this_type #ty_generics;\n\n            fn expecting(&self, __formatter: &mut _serde::#private::Formatter) -> _serde::#private::fmt::Result {\n                _serde::#private::Formatter::write_str(__formatter, #expecting)\n            }\n\n            fn visit_enum<__A>(self, __data: __A) -> _serde::#private::Result<Self::Value, __A::Error>\n            where\n                __A: _serde::de::EnumAccess<#delife>,\n            {\n                #match_variant\n            }\n        }\n\n        #variants_stmt\n\n        _serde::Deserializer::deserialize_enum(\n            __deserializer,\n            #type_name,\n            VARIANTS,\n            __Visitor {\n                marker: _serde::#private::PhantomData::<#this_type #ty_generics>,\n                lifetime: _serde::#private::PhantomData,\n            },\n        )\n    }\n}\n\nfn deserialize_externally_tagged_variant(\n    params: &Parameters,\n    variant: &Variant,\n    cattrs: &attr::Container,\n) -> Fragment {\n    if let Some(path) = variant.attrs.deserialize_with() {\n        let (wrapper, wrapper_ty, unwrap_fn) = wrap_deserialize_variant_with(params, variant, path);\n        return quote_block! {\n            #wrapper\n            _serde::#private::Result::map(\n                _serde::de::VariantAccess::newtype_variant::<#wrapper_ty>(__variant), #unwrap_fn)\n        };\n    }\n\n    let variant_ident = &variant.ident;\n\n    match variant.style {\n        Style::Unit => {\n            let this_value = &params.this_value;\n            quote_block! {\n                _serde::de::VariantAccess::unit_variant(__variant)?;\n                _serde::#private::Ok(#this_value::#variant_ident)\n            }\n        }\n        Style::Newtype => deserialize_externally_tagged_newtype_variant(\n            variant_ident,\n            params,\n            &variant.fields[0],\n            cattrs,\n        ),\n        Style::Tuple => tuple::deserialize(\n            params,\n            &variant.fields,\n            cattrs,\n            TupleForm::ExternallyTagged(variant_ident),\n        ),\n        Style::Struct => struct_::deserialize(\n            params,\n            &variant.fields,\n            cattrs,\n            StructForm::ExternallyTagged(variant_ident),\n        ),\n    }\n}\n\nfn wrap_deserialize_variant_with(\n    params: &Parameters,\n    variant: &Variant,\n    deserialize_with: &syn::ExprPath,\n) -> (TokenStream, TokenStream, TokenStream) {\n    let field_tys = variant.fields.iter().map(|field| field.ty);\n    let (wrapper, wrapper_ty) =\n        wrap_deserialize_with(params, &quote!((#(#field_tys),*)), deserialize_with);\n\n    let unwrap_fn = unwrap_to_variant_closure(params, variant, true);\n\n    (wrapper, wrapper_ty, unwrap_fn)\n}\n\nfn deserialize_externally_tagged_newtype_variant(\n    variant_ident: &syn::Ident,\n    params: &Parameters,\n    field: &Field,\n    cattrs: &attr::Container,\n) -> Fragment {\n    let this_value = &params.this_value;\n\n    if field.attrs.skip_deserializing() {\n        let default = Expr(expr_is_missing(field, cattrs));\n        return quote_block! {\n            _serde::de::VariantAccess::unit_variant(__variant)?;\n            _serde::#private::Ok(#this_value::#variant_ident(#default))\n        };\n    }\n\n    match field.attrs.deserialize_with() {\n        None => {\n            let field_ty = field.ty;\n            let span = field.original.span();\n            let func =\n                quote_spanned!(span=> _serde::de::VariantAccess::newtype_variant::<#field_ty>);\n            quote_expr! {\n                _serde::#private::Result::map(#func(__variant), #this_value::#variant_ident)\n            }\n        }\n        Some(path) => {\n            let (wrapper, wrapper_ty) = wrap_deserialize_field_with(params, field.ty, path);\n            quote_block! {\n                #wrapper\n                _serde::#private::Result::map(\n                    _serde::de::VariantAccess::newtype_variant::<#wrapper_ty>(__variant),\n                    |__wrapper| #this_value::#variant_ident(__wrapper.value))\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "serde_derive/src/de/enum_internally.rs",
    "content": "//! Deserialization for internally tagged enums:\n//!\n//! ```ignore\n//! #[serde(tag = \"...\")]\n//! enum Enum {}\n//! ```\n\nuse crate::de::enum_;\nuse crate::de::enum_untagged;\nuse crate::de::struct_;\nuse crate::de::{\n    effective_style, expr_is_missing, field_i, unwrap_to_variant_closure, Parameters, StructForm,\n};\nuse crate::fragment::{Expr, Fragment, Match};\nuse crate::internals::ast::{Style, Variant};\nuse crate::internals::attr;\nuse crate::private;\nuse quote::quote;\n\n/// Generates `Deserialize::deserialize` body for an `enum Enum {...}` with `#[serde(tag)]` attribute\npub(super) fn deserialize(\n    params: &Parameters,\n    variants: &[Variant],\n    cattrs: &attr::Container,\n    tag: &str,\n) -> Fragment {\n    let (variants_stmt, variant_visitor) = enum_::prepare_enum_variant_enum(variants);\n\n    // Match arms to extract a variant from a string\n    let variant_arms = variants\n        .iter()\n        .enumerate()\n        .filter(|&(_, variant)| !variant.attrs.skip_deserializing())\n        .map(|(i, variant)| {\n            let variant_name = field_i(i);\n\n            let block = Match(deserialize_internally_tagged_variant(\n                params, variant, cattrs,\n            ));\n\n            quote! {\n                __Field::#variant_name => #block\n            }\n        });\n\n    let expecting = format!(\"internally tagged enum {}\", params.type_name());\n    let expecting = cattrs.expecting().unwrap_or(&expecting);\n\n    quote_block! {\n        #variant_visitor\n\n        #variants_stmt\n\n        let (__tag, __content) = _serde::Deserializer::deserialize_any(\n            __deserializer,\n            _serde::#private::de::TaggedContentVisitor::<__Field>::new(#tag, #expecting))?;\n        let __deserializer = _serde::#private::de::ContentDeserializer::<__D::Error>::new(__content);\n\n        match __tag {\n            #(#variant_arms)*\n        }\n    }\n}\n\n// Generates significant part of the visit_seq and visit_map bodies of visitors\n// for the variants of internally tagged enum.\nfn deserialize_internally_tagged_variant(\n    params: &Parameters,\n    variant: &Variant,\n    cattrs: &attr::Container,\n) -> Fragment {\n    if let Some(path) = variant.attrs.deserialize_with() {\n        let unwrap_fn = unwrap_to_variant_closure(params, variant, false);\n        return quote_block! {\n            _serde::#private::Result::map(#path(__deserializer), #unwrap_fn)\n        };\n    }\n\n    let variant_ident = &variant.ident;\n\n    match effective_style(variant) {\n        Style::Unit => {\n            let this_value = &params.this_value;\n            let type_name = params.type_name();\n            let variant_name = variant.ident.to_string();\n            let default = variant.fields.first().map(|field| {\n                let default = Expr(expr_is_missing(field, cattrs));\n                quote!((#default))\n            });\n            quote_block! {\n                _serde::Deserializer::deserialize_any(__deserializer, _serde::#private::de::InternallyTaggedUnitVisitor::new(#type_name, #variant_name))?;\n                _serde::#private::Ok(#this_value::#variant_ident #default)\n            }\n        }\n        Style::Newtype => {\n            enum_untagged::deserialize_newtype_variant(variant_ident, params, &variant.fields[0])\n        }\n        Style::Struct => struct_::deserialize(\n            params,\n            &variant.fields,\n            cattrs,\n            StructForm::InternallyTagged(variant_ident),\n        ),\n        Style::Tuple => unreachable!(\"checked in serde_derive_internals\"),\n    }\n}\n"
  },
  {
    "path": "serde_derive/src/de/enum_untagged.rs",
    "content": "//! Deserialization for untagged enums:\n//!\n//! ```ignore\n//! #[serde(untagged)]\n//! enum Enum {}\n//! ```\n\nuse crate::de::struct_;\nuse crate::de::tuple;\nuse crate::de::{\n    effective_style, expr_is_missing, unwrap_to_variant_closure, Parameters, StructForm, TupleForm,\n};\nuse crate::fragment::{Expr, Fragment};\nuse crate::internals::ast::{Field, Style, Variant};\nuse crate::internals::attr;\nuse crate::private;\nuse proc_macro2::TokenStream;\nuse quote::{quote, quote_spanned};\nuse syn::spanned::Spanned;\n\n/// Generates `Deserialize::deserialize` body for an `enum Enum {...}` with `#[serde(untagged)]` attribute\npub(super) fn deserialize(\n    params: &Parameters,\n    variants: &[Variant],\n    cattrs: &attr::Container,\n    first_attempt: Option<TokenStream>,\n) -> Fragment {\n    let attempts = variants\n        .iter()\n        .filter(|variant| !variant.attrs.skip_deserializing())\n        .map(|variant| Expr(deserialize_variant(params, variant, cattrs)));\n    // TODO this message could be better by saving the errors from the failed\n    // attempts. The heuristic used by TOML was to count the number of fields\n    // processed before an error, and use the error that happened after the\n    // largest number of fields. I'm not sure I like that. Maybe it would be\n    // better to save all the errors and combine them into one message that\n    // explains why none of the variants matched.\n    let fallthrough_msg = format!(\n        \"data did not match any variant of untagged enum {}\",\n        params.type_name()\n    );\n    let fallthrough_msg = cattrs.expecting().unwrap_or(&fallthrough_msg);\n\n    let private2 = private;\n    quote_block! {\n        let __content = _serde::de::DeserializeSeed::deserialize(_serde::#private::de::ContentVisitor::new(), __deserializer)?;\n        let __deserializer = _serde::#private::de::ContentRefDeserializer::<__D::Error>::new(&__content);\n\n        #first_attempt\n\n        #(\n            if let _serde::#private2::Ok(__ok) = #attempts {\n                return _serde::#private2::Ok(__ok);\n            }\n        )*\n\n        _serde::#private::Err(_serde::de::Error::custom(#fallthrough_msg))\n    }\n}\n\n// Also used by adjacently tagged enums\npub(super) fn deserialize_variant(\n    params: &Parameters,\n    variant: &Variant,\n    cattrs: &attr::Container,\n) -> Fragment {\n    if let Some(path) = variant.attrs.deserialize_with() {\n        let unwrap_fn = unwrap_to_variant_closure(params, variant, false);\n        return quote_block! {\n            _serde::#private::Result::map(#path(__deserializer), #unwrap_fn)\n        };\n    }\n\n    let variant_ident = &variant.ident;\n\n    match effective_style(variant) {\n        Style::Unit => {\n            let this_value = &params.this_value;\n            let type_name = params.type_name();\n            let variant_name = variant.ident.to_string();\n            let default = variant.fields.first().map(|field| {\n                let default = Expr(expr_is_missing(field, cattrs));\n                quote!((#default))\n            });\n            quote_expr! {\n                match _serde::Deserializer::deserialize_any(\n                    __deserializer,\n                    _serde::#private::de::UntaggedUnitVisitor::new(#type_name, #variant_name)\n                ) {\n                    _serde::#private::Ok(()) => _serde::#private::Ok(#this_value::#variant_ident #default),\n                    _serde::#private::Err(__err) => _serde::#private::Err(__err),\n                }\n            }\n        }\n        Style::Newtype => deserialize_newtype_variant(variant_ident, params, &variant.fields[0]),\n        Style::Tuple => tuple::deserialize(\n            params,\n            &variant.fields,\n            cattrs,\n            TupleForm::Untagged(variant_ident),\n        ),\n        Style::Struct => struct_::deserialize(\n            params,\n            &variant.fields,\n            cattrs,\n            StructForm::Untagged(variant_ident),\n        ),\n    }\n}\n\n// Also used by internally tagged enums\n// Implicitly (via `generate_variant`) used by adjacently tagged enums\npub(super) fn deserialize_newtype_variant(\n    variant_ident: &syn::Ident,\n    params: &Parameters,\n    field: &Field,\n) -> Fragment {\n    let this_value = &params.this_value;\n    let field_ty = field.ty;\n    match field.attrs.deserialize_with() {\n        None => {\n            let span = field.original.span();\n            let func = quote_spanned!(span=> <#field_ty as _serde::Deserialize>::deserialize);\n            quote_expr! {\n                _serde::#private::Result::map(#func(__deserializer), #this_value::#variant_ident)\n            }\n        }\n        Some(path) => {\n            quote_block! {\n                let __value: _serde::#private::Result<#field_ty, _> = #path(__deserializer);\n                _serde::#private::Result::map(__value, #this_value::#variant_ident)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "serde_derive/src/de/identifier.rs",
    "content": "//! Deserialization of struct field identifiers and enum variant identifiers by\n//! way of a Rust enum.\n\nuse crate::de::{FieldWithAliases, Parameters};\nuse crate::fragment::{Fragment, Stmts};\nuse crate::internals::ast::{Style, Variant};\nuse crate::internals::attr;\nuse crate::private;\nuse proc_macro2::{Literal, TokenStream};\nuse quote::{quote, ToTokens};\n\n// Generates `Deserialize::deserialize` body for an enum with\n// `serde(field_identifier)` or `serde(variant_identifier)` attribute.\npub(super) fn deserialize_custom(\n    params: &Parameters,\n    variants: &[Variant],\n    cattrs: &attr::Container,\n) -> Fragment {\n    let is_variant = match cattrs.identifier() {\n        attr::Identifier::Variant => true,\n        attr::Identifier::Field => false,\n        attr::Identifier::No => unreachable!(),\n    };\n\n    let this_type = params.this_type.to_token_stream();\n    let this_value = params.this_value.to_token_stream();\n\n    let (ordinary, fallthrough, fallthrough_borrowed) = if let Some(last) = variants.last() {\n        let last_ident = &last.ident;\n        if last.attrs.other() {\n            // Process `serde(other)` attribute. It would always be found on the\n            // last variant (checked in `check_identifier`), so all preceding\n            // are ordinary variants.\n            let ordinary = &variants[..variants.len() - 1];\n            let fallthrough = quote!(_serde::#private::Ok(#this_value::#last_ident));\n            (ordinary, Some(fallthrough), None)\n        } else if let Style::Newtype = last.style {\n            let ordinary = &variants[..variants.len() - 1];\n            let fallthrough = |value| {\n                quote! {\n                    _serde::#private::Result::map(\n                        _serde::Deserialize::deserialize(\n                            _serde::#private::de::IdentifierDeserializer::from(#value)\n                        ),\n                        #this_value::#last_ident)\n                }\n            };\n            (\n                ordinary,\n                Some(fallthrough(quote!(__value))),\n                Some(fallthrough(quote!(_serde::#private::de::Borrowed(\n                    __value\n                )))),\n            )\n        } else {\n            (variants, None, None)\n        }\n    } else {\n        (variants, None, None)\n    };\n\n    let idents_aliases: Vec<_> = ordinary\n        .iter()\n        .map(|variant| FieldWithAliases {\n            ident: variant.ident.clone(),\n            aliases: variant.attrs.aliases(),\n        })\n        .collect();\n\n    let names = idents_aliases.iter().flat_map(|variant| variant.aliases);\n\n    let names_const = if fallthrough.is_some() {\n        None\n    } else if is_variant {\n        let variants = quote! {\n            #[doc(hidden)]\n            const VARIANTS: &'static [&'static str] = &[ #(#names),* ];\n        };\n        Some(variants)\n    } else {\n        let fields = quote! {\n            #[doc(hidden)]\n            const FIELDS: &'static [&'static str] = &[ #(#names),* ];\n        };\n        Some(fields)\n    };\n\n    let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =\n        params.generics_with_de_lifetime();\n    let delife = params.borrowed.de_lifetime();\n    let visitor_impl = Stmts(deserialize_identifier(\n        &this_value,\n        &idents_aliases,\n        is_variant,\n        fallthrough,\n        fallthrough_borrowed,\n        false,\n        cattrs.expecting(),\n    ));\n\n    quote_block! {\n        #names_const\n\n        #[doc(hidden)]\n        struct __FieldVisitor #de_impl_generics #where_clause {\n            marker: _serde::#private::PhantomData<#this_type #ty_generics>,\n            lifetime: _serde::#private::PhantomData<&#delife ()>,\n        }\n\n        #[automatically_derived]\n        impl #de_impl_generics _serde::de::Visitor<#delife> for __FieldVisitor #de_ty_generics #where_clause {\n            type Value = #this_type #ty_generics;\n\n            #visitor_impl\n        }\n\n        let __visitor = __FieldVisitor {\n            marker: _serde::#private::PhantomData::<#this_type #ty_generics>,\n            lifetime: _serde::#private::PhantomData,\n        };\n        _serde::Deserializer::deserialize_identifier(__deserializer, __visitor)\n    }\n}\n\npub(super) fn deserialize_generated(\n    deserialized_fields: &[FieldWithAliases],\n    has_flatten: bool,\n    is_variant: bool,\n    ignore_variant: Option<TokenStream>,\n    fallthrough: Option<TokenStream>,\n) -> Fragment {\n    let this_value = quote!(__Field);\n    let field_idents: &Vec<_> = &deserialized_fields\n        .iter()\n        .map(|field| &field.ident)\n        .collect();\n\n    let visitor_impl = Stmts(deserialize_identifier(\n        &this_value,\n        deserialized_fields,\n        is_variant,\n        fallthrough,\n        None,\n        !is_variant && has_flatten,\n        None,\n    ));\n\n    let lifetime = if !is_variant && has_flatten {\n        Some(quote!(<'de>))\n    } else {\n        None\n    };\n\n    quote_block! {\n        #[allow(non_camel_case_types)]\n        #[doc(hidden)]\n        enum __Field #lifetime {\n            #(#field_idents,)*\n            #ignore_variant\n        }\n\n        #[doc(hidden)]\n        struct __FieldVisitor;\n\n        #[automatically_derived]\n        impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {\n            type Value = __Field #lifetime;\n\n            #visitor_impl\n        }\n\n        #[automatically_derived]\n        impl<'de> _serde::Deserialize<'de> for __Field #lifetime {\n            #[inline]\n            fn deserialize<__D>(__deserializer: __D) -> _serde::#private::Result<Self, __D::Error>\n            where\n                __D: _serde::Deserializer<'de>,\n            {\n                _serde::Deserializer::deserialize_identifier(__deserializer, __FieldVisitor)\n            }\n        }\n    }\n}\n\nfn deserialize_identifier(\n    this_value: &TokenStream,\n    deserialized_fields: &[FieldWithAliases],\n    is_variant: bool,\n    fallthrough: Option<TokenStream>,\n    fallthrough_borrowed: Option<TokenStream>,\n    collect_other_fields: bool,\n    expecting: Option<&str>,\n) -> Fragment {\n    let str_mapping = deserialized_fields.iter().map(|field| {\n        let ident = &field.ident;\n        let aliases = field.aliases;\n        let private2 = private;\n        // `aliases` also contains a main name\n        quote! {\n            #(\n                #aliases => _serde::#private2::Ok(#this_value::#ident),\n            )*\n        }\n    });\n    let bytes_mapping = deserialized_fields.iter().map(|field| {\n        let ident = &field.ident;\n        // `aliases` also contains a main name\n        let aliases = field\n            .aliases\n            .iter()\n            .map(|alias| Literal::byte_string(alias.value.as_bytes()));\n        let private2 = private;\n        quote! {\n            #(\n                #aliases => _serde::#private2::Ok(#this_value::#ident),\n            )*\n        }\n    });\n\n    let expecting = expecting.unwrap_or(if is_variant {\n        \"variant identifier\"\n    } else {\n        \"field identifier\"\n    });\n\n    let bytes_to_str = if fallthrough.is_some() || collect_other_fields {\n        None\n    } else {\n        Some(quote! {\n            let __value = &_serde::#private::from_utf8_lossy(__value);\n        })\n    };\n\n    let (\n        value_as_str_content,\n        value_as_borrowed_str_content,\n        value_as_bytes_content,\n        value_as_borrowed_bytes_content,\n    ) = if collect_other_fields {\n        (\n            Some(quote! {\n                let __value = _serde::#private::de::Content::String(_serde::#private::ToString::to_string(__value));\n            }),\n            Some(quote! {\n                let __value = _serde::#private::de::Content::Str(__value);\n            }),\n            Some(quote! {\n                let __value = _serde::#private::de::Content::ByteBuf(__value.to_vec());\n            }),\n            Some(quote! {\n                let __value = _serde::#private::de::Content::Bytes(__value);\n            }),\n        )\n    } else {\n        (None, None, None, None)\n    };\n\n    let fallthrough_arm_tokens;\n    let fallthrough_arm = if let Some(fallthrough) = &fallthrough {\n        fallthrough\n    } else if is_variant {\n        fallthrough_arm_tokens = quote! {\n            _serde::#private::Err(_serde::de::Error::unknown_variant(__value, VARIANTS))\n        };\n        &fallthrough_arm_tokens\n    } else {\n        fallthrough_arm_tokens = quote! {\n            _serde::#private::Err(_serde::de::Error::unknown_field(__value, FIELDS))\n        };\n        &fallthrough_arm_tokens\n    };\n\n    let visit_other = if collect_other_fields {\n        quote! {\n            fn visit_bool<__E>(self, __value: bool) -> _serde::#private::Result<Self::Value, __E>\n            where\n                __E: _serde::de::Error,\n            {\n                _serde::#private::Ok(__Field::__other(_serde::#private::de::Content::Bool(__value)))\n            }\n\n            fn visit_i8<__E>(self, __value: i8) -> _serde::#private::Result<Self::Value, __E>\n            where\n                __E: _serde::de::Error,\n            {\n                _serde::#private::Ok(__Field::__other(_serde::#private::de::Content::I8(__value)))\n            }\n\n            fn visit_i16<__E>(self, __value: i16) -> _serde::#private::Result<Self::Value, __E>\n            where\n                __E: _serde::de::Error,\n            {\n                _serde::#private::Ok(__Field::__other(_serde::#private::de::Content::I16(__value)))\n            }\n\n            fn visit_i32<__E>(self, __value: i32) -> _serde::#private::Result<Self::Value, __E>\n            where\n                __E: _serde::de::Error,\n            {\n                _serde::#private::Ok(__Field::__other(_serde::#private::de::Content::I32(__value)))\n            }\n\n            fn visit_i64<__E>(self, __value: i64) -> _serde::#private::Result<Self::Value, __E>\n            where\n                __E: _serde::de::Error,\n            {\n                _serde::#private::Ok(__Field::__other(_serde::#private::de::Content::I64(__value)))\n            }\n\n            fn visit_u8<__E>(self, __value: u8) -> _serde::#private::Result<Self::Value, __E>\n            where\n                __E: _serde::de::Error,\n            {\n                _serde::#private::Ok(__Field::__other(_serde::#private::de::Content::U8(__value)))\n            }\n\n            fn visit_u16<__E>(self, __value: u16) -> _serde::#private::Result<Self::Value, __E>\n            where\n                __E: _serde::de::Error,\n            {\n                _serde::#private::Ok(__Field::__other(_serde::#private::de::Content::U16(__value)))\n            }\n\n            fn visit_u32<__E>(self, __value: u32) -> _serde::#private::Result<Self::Value, __E>\n            where\n                __E: _serde::de::Error,\n            {\n                _serde::#private::Ok(__Field::__other(_serde::#private::de::Content::U32(__value)))\n            }\n\n            fn visit_u64<__E>(self, __value: u64) -> _serde::#private::Result<Self::Value, __E>\n            where\n                __E: _serde::de::Error,\n            {\n                _serde::#private::Ok(__Field::__other(_serde::#private::de::Content::U64(__value)))\n            }\n\n            fn visit_f32<__E>(self, __value: f32) -> _serde::#private::Result<Self::Value, __E>\n            where\n                __E: _serde::de::Error,\n            {\n                _serde::#private::Ok(__Field::__other(_serde::#private::de::Content::F32(__value)))\n            }\n\n            fn visit_f64<__E>(self, __value: f64) -> _serde::#private::Result<Self::Value, __E>\n            where\n                __E: _serde::de::Error,\n            {\n                _serde::#private::Ok(__Field::__other(_serde::#private::de::Content::F64(__value)))\n            }\n\n            fn visit_char<__E>(self, __value: char) -> _serde::#private::Result<Self::Value, __E>\n            where\n                __E: _serde::de::Error,\n            {\n                _serde::#private::Ok(__Field::__other(_serde::#private::de::Content::Char(__value)))\n            }\n\n            fn visit_unit<__E>(self) -> _serde::#private::Result<Self::Value, __E>\n            where\n                __E: _serde::de::Error,\n            {\n                _serde::#private::Ok(__Field::__other(_serde::#private::de::Content::Unit))\n            }\n        }\n    } else {\n        let u64_mapping = deserialized_fields.iter().enumerate().map(|(i, field)| {\n            let i = i as u64;\n            let ident = &field.ident;\n            quote!(#i => _serde::#private::Ok(#this_value::#ident))\n        });\n\n        let u64_fallthrough_arm_tokens;\n        let u64_fallthrough_arm = if let Some(fallthrough) = &fallthrough {\n            fallthrough\n        } else {\n            let index_expecting = if is_variant { \"variant\" } else { \"field\" };\n            let fallthrough_msg = format!(\n                \"{} index 0 <= i < {}\",\n                index_expecting,\n                deserialized_fields.len(),\n            );\n            u64_fallthrough_arm_tokens = quote! {\n                _serde::#private::Err(_serde::de::Error::invalid_value(\n                    _serde::de::Unexpected::Unsigned(__value),\n                    &#fallthrough_msg,\n                ))\n            };\n            &u64_fallthrough_arm_tokens\n        };\n\n        quote! {\n            fn visit_u64<__E>(self, __value: u64) -> _serde::#private::Result<Self::Value, __E>\n            where\n                __E: _serde::de::Error,\n            {\n                match __value {\n                    #(#u64_mapping,)*\n                    _ => #u64_fallthrough_arm,\n                }\n            }\n        }\n    };\n\n    let visit_borrowed = if fallthrough_borrowed.is_some() || collect_other_fields {\n        let str_mapping = str_mapping.clone();\n        let bytes_mapping = bytes_mapping.clone();\n        let fallthrough_borrowed_arm = fallthrough_borrowed.as_ref().unwrap_or(fallthrough_arm);\n        Some(quote! {\n            fn visit_borrowed_str<__E>(self, __value: &'de str) -> _serde::#private::Result<Self::Value, __E>\n            where\n                __E: _serde::de::Error,\n            {\n                match __value {\n                    #(#str_mapping)*\n                    _ => {\n                        #value_as_borrowed_str_content\n                        #fallthrough_borrowed_arm\n                    }\n                }\n            }\n\n            fn visit_borrowed_bytes<__E>(self, __value: &'de [u8]) -> _serde::#private::Result<Self::Value, __E>\n            where\n                __E: _serde::de::Error,\n            {\n                match __value {\n                    #(#bytes_mapping)*\n                    _ => {\n                        #bytes_to_str\n                        #value_as_borrowed_bytes_content\n                        #fallthrough_borrowed_arm\n                    }\n                }\n            }\n        })\n    } else {\n        None\n    };\n\n    quote_block! {\n        fn expecting(&self, __formatter: &mut _serde::#private::Formatter) -> _serde::#private::fmt::Result {\n            _serde::#private::Formatter::write_str(__formatter, #expecting)\n        }\n\n        #visit_other\n\n        fn visit_str<__E>(self, __value: &str) -> _serde::#private::Result<Self::Value, __E>\n        where\n            __E: _serde::de::Error,\n        {\n            match __value {\n                #(#str_mapping)*\n                _ => {\n                    #value_as_str_content\n                    #fallthrough_arm\n                }\n            }\n        }\n\n        fn visit_bytes<__E>(self, __value: &[u8]) -> _serde::#private::Result<Self::Value, __E>\n        where\n            __E: _serde::de::Error,\n        {\n            match __value {\n                #(#bytes_mapping)*\n                _ => {\n                    #bytes_to_str\n                    #value_as_bytes_content\n                    #fallthrough_arm\n                }\n            }\n        }\n\n        #visit_borrowed\n    }\n}\n"
  },
  {
    "path": "serde_derive/src/de/struct_.rs",
    "content": "use crate::de::identifier;\nuse crate::de::{\n    deserialize_seq, expr_is_missing, field_i, has_flatten, wrap_deserialize_field_with,\n    FieldWithAliases, Parameters, StructForm,\n};\n#[cfg(feature = \"deserialize_in_place\")]\nuse crate::de::{deserialize_seq_in_place, place_lifetime};\nuse crate::fragment::{Expr, Fragment, Match, Stmts};\nuse crate::internals::ast::Field;\nuse crate::internals::attr;\nuse crate::private;\nuse proc_macro2::TokenStream;\nuse quote::{quote, quote_spanned};\nuse syn::spanned::Spanned;\n\n/// Generates `Deserialize::deserialize` body for a `struct Struct {...}`\npub(super) fn deserialize(\n    params: &Parameters,\n    fields: &[Field],\n    cattrs: &attr::Container,\n    form: StructForm,\n) -> Fragment {\n    let this_type = &params.this_type;\n    let this_value = &params.this_value;\n    let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =\n        params.generics_with_de_lifetime();\n    let delife = params.borrowed.de_lifetime();\n\n    // If there are getters (implying private fields), construct the local type\n    // and use an `Into` conversion to get the remote type. If there are no\n    // getters then construct the target type directly.\n    let construct = if params.has_getter {\n        let local = &params.local;\n        quote!(#local)\n    } else {\n        quote!(#this_value)\n    };\n\n    let type_path = match form {\n        StructForm::Struct => construct,\n        StructForm::ExternallyTagged(variant_ident)\n        | StructForm::InternallyTagged(variant_ident)\n        | StructForm::Untagged(variant_ident) => quote!(#construct::#variant_ident),\n    };\n    let expecting = match form {\n        StructForm::Struct => format!(\"struct {}\", params.type_name()),\n        StructForm::ExternallyTagged(variant_ident)\n        | StructForm::InternallyTagged(variant_ident)\n        | StructForm::Untagged(variant_ident) => {\n            format!(\"struct variant {}::{}\", params.type_name(), variant_ident)\n        }\n    };\n    let expecting = cattrs.expecting().unwrap_or(&expecting);\n\n    let deserialized_fields: Vec<_> = fields\n        .iter()\n        .enumerate()\n        // Skip fields that shouldn't be deserialized or that were flattened,\n        // so they don't appear in the storage in their literal form\n        .filter(|&(_, field)| !field.attrs.skip_deserializing() && !field.attrs.flatten())\n        .map(|(i, field)| FieldWithAliases {\n            ident: field_i(i),\n            aliases: field.attrs.aliases(),\n        })\n        .collect();\n\n    let has_flatten = has_flatten(fields);\n    let field_visitor = deserialize_field_identifier(&deserialized_fields, cattrs, has_flatten);\n\n    // untagged struct variants do not get a visit_seq method. The same applies to\n    // structs that only have a map representation.\n    let visit_seq = match form {\n        StructForm::Untagged(_) => None,\n        _ if has_flatten => None,\n        _ => {\n            let mut_seq = if deserialized_fields.is_empty() {\n                quote!(_)\n            } else {\n                quote!(mut __seq)\n            };\n\n            let visit_seq = Stmts(deserialize_seq(\n                &type_path, params, fields, true, cattrs, expecting,\n            ));\n\n            Some(quote! {\n                #[inline]\n                fn visit_seq<__A>(self, #mut_seq: __A) -> _serde::#private::Result<Self::Value, __A::Error>\n                where\n                    __A: _serde::de::SeqAccess<#delife>,\n                {\n                    #visit_seq\n                }\n            })\n        }\n    };\n    let visit_map = Stmts(deserialize_map(\n        &type_path,\n        params,\n        fields,\n        cattrs,\n        has_flatten,\n    ));\n\n    let visitor_seed = match form {\n        StructForm::ExternallyTagged(..) if has_flatten => Some(quote! {\n            #[automatically_derived]\n            impl #de_impl_generics _serde::de::DeserializeSeed<#delife> for __Visitor #de_ty_generics #where_clause {\n                type Value = #this_type #ty_generics;\n\n                fn deserialize<__D>(self, __deserializer: __D) -> _serde::#private::Result<Self::Value, __D::Error>\n                where\n                    __D: _serde::Deserializer<#delife>,\n                {\n                    _serde::Deserializer::deserialize_map(__deserializer, self)\n                }\n            }\n        }),\n        _ => None,\n    };\n\n    let fields_stmt = if has_flatten {\n        None\n    } else {\n        let field_names = deserialized_fields.iter().flat_map(|field| field.aliases);\n\n        Some(quote! {\n            #[doc(hidden)]\n            const FIELDS: &'static [&'static str] = &[ #(#field_names),* ];\n        })\n    };\n\n    let visitor_expr = quote! {\n        __Visitor {\n            marker: _serde::#private::PhantomData::<#this_type #ty_generics>,\n            lifetime: _serde::#private::PhantomData,\n        }\n    };\n    let dispatch = match form {\n        StructForm::Struct if has_flatten => quote! {\n            _serde::Deserializer::deserialize_map(__deserializer, #visitor_expr)\n        },\n        StructForm::Struct => {\n            let type_name = cattrs.name().deserialize_name();\n            quote! {\n                _serde::Deserializer::deserialize_struct(__deserializer, #type_name, FIELDS, #visitor_expr)\n            }\n        }\n        StructForm::ExternallyTagged(_) if has_flatten => quote! {\n            _serde::de::VariantAccess::newtype_variant_seed(__variant, #visitor_expr)\n        },\n        StructForm::ExternallyTagged(_) => quote! {\n            _serde::de::VariantAccess::struct_variant(__variant, FIELDS, #visitor_expr)\n        },\n        StructForm::InternallyTagged(_) => quote! {\n            _serde::Deserializer::deserialize_any(__deserializer, #visitor_expr)\n        },\n        StructForm::Untagged(_) => quote! {\n            _serde::Deserializer::deserialize_any(__deserializer, #visitor_expr)\n        },\n    };\n\n    quote_block! {\n        #field_visitor\n\n        #[doc(hidden)]\n        struct __Visitor #de_impl_generics #where_clause {\n            marker: _serde::#private::PhantomData<#this_type #ty_generics>,\n            lifetime: _serde::#private::PhantomData<&#delife ()>,\n        }\n\n        #[automatically_derived]\n        impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause {\n            type Value = #this_type #ty_generics;\n\n            fn expecting(&self, __formatter: &mut _serde::#private::Formatter) -> _serde::#private::fmt::Result {\n                _serde::#private::Formatter::write_str(__formatter, #expecting)\n            }\n\n            #visit_seq\n\n            #[inline]\n            fn visit_map<__A>(self, mut __map: __A) -> _serde::#private::Result<Self::Value, __A::Error>\n            where\n                __A: _serde::de::MapAccess<#delife>,\n            {\n                #visit_map\n            }\n        }\n\n        #visitor_seed\n\n        #fields_stmt\n\n        #dispatch\n    }\n}\n\nfn deserialize_map(\n    struct_path: &TokenStream,\n    params: &Parameters,\n    fields: &[Field],\n    cattrs: &attr::Container,\n    has_flatten: bool,\n) -> Fragment {\n    // Create the field names for the fields.\n    let fields_names: Vec<_> = fields\n        .iter()\n        .enumerate()\n        .map(|(i, field)| (field, field_i(i)))\n        .collect();\n\n    // Declare each field that will be deserialized.\n    let let_values = fields_names\n        .iter()\n        .filter(|&&(field, _)| !field.attrs.skip_deserializing() && !field.attrs.flatten())\n        .map(|(field, name)| {\n            let field_ty = field.ty;\n            quote! {\n                let mut #name: _serde::#private::Option<#field_ty> = _serde::#private::None;\n            }\n        });\n\n    // Collect contents for flatten fields into a buffer\n    let let_collect = if has_flatten {\n        Some(quote! {\n            let mut __collect = _serde::#private::Vec::<_serde::#private::Option<(\n                _serde::#private::de::Content,\n                _serde::#private::de::Content\n            )>>::new();\n        })\n    } else {\n        None\n    };\n\n    // Match arms to extract a value for a field.\n    let value_arms = fields_names\n        .iter()\n        .filter(|&&(field, _)| !field.attrs.skip_deserializing() && !field.attrs.flatten())\n        .map(|(field, name)| {\n            let deser_name = field.attrs.name().deserialize_name();\n\n            let visit = match field.attrs.deserialize_with() {\n                None => {\n                    let field_ty = field.ty;\n                    let span = field.original.span();\n                    let func =\n                        quote_spanned!(span=> _serde::de::MapAccess::next_value::<#field_ty>);\n                    quote! {\n                        #func(&mut __map)?\n                    }\n                }\n                Some(path) => {\n                    let (wrapper, wrapper_ty) = wrap_deserialize_field_with(params, field.ty, path);\n                    quote!({\n                        #wrapper\n                        match _serde::de::MapAccess::next_value::<#wrapper_ty>(&mut __map) {\n                            _serde::#private::Ok(__wrapper) => __wrapper.value,\n                            _serde::#private::Err(__err) => {\n                                return _serde::#private::Err(__err);\n                            }\n                        }\n                    })\n                }\n            };\n            quote! {\n                __Field::#name => {\n                    if _serde::#private::Option::is_some(&#name) {\n                        return _serde::#private::Err(<__A::Error as _serde::de::Error>::duplicate_field(#deser_name));\n                    }\n                    #name = _serde::#private::Some(#visit);\n                }\n            }\n        });\n\n    // Visit ignored values to consume them\n    let ignored_arm = if has_flatten {\n        Some(quote! {\n            __Field::__other(__name) => {\n                __collect.push(_serde::#private::Some((\n                    __name,\n                    _serde::de::MapAccess::next_value_seed(&mut __map, _serde::#private::de::ContentVisitor::new())?)));\n            }\n        })\n    } else if cattrs.deny_unknown_fields() {\n        None\n    } else {\n        Some(quote! {\n            _ => { let _ = _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?; }\n        })\n    };\n\n    let all_skipped = fields.iter().all(|field| field.attrs.skip_deserializing());\n    let match_keys = if cattrs.deny_unknown_fields() && all_skipped {\n        quote! {\n            // FIXME: Once feature(exhaustive_patterns) is stable:\n            // let _serde::#private::None::<__Field> = _serde::de::MapAccess::next_key(&mut __map)?;\n            _serde::#private::Option::map(\n                _serde::de::MapAccess::next_key::<__Field>(&mut __map)?,\n                |__impossible| match __impossible {});\n        }\n    } else {\n        quote! {\n            while let _serde::#private::Some(__key) = _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {\n                match __key {\n                    #(#value_arms)*\n                    #ignored_arm\n                }\n            }\n        }\n    };\n\n    let extract_values = fields_names\n        .iter()\n        .filter(|&&(field, _)| !field.attrs.skip_deserializing() && !field.attrs.flatten())\n        .map(|(field, name)| {\n            let missing_expr = Match(expr_is_missing(field, cattrs));\n\n            quote! {\n                let #name = match #name {\n                    _serde::#private::Some(#name) => #name,\n                    _serde::#private::None => #missing_expr\n                };\n            }\n        });\n\n    let extract_collected = fields_names\n        .iter()\n        .filter(|&&(field, _)| field.attrs.flatten() && !field.attrs.skip_deserializing())\n        .map(|(field, name)| {\n            let field_ty = field.ty;\n            let func = match field.attrs.deserialize_with() {\n                None => {\n                    let span = field.original.span();\n                    quote_spanned!(span=> _serde::de::Deserialize::deserialize)\n                }\n                Some(path) => quote!(#path),\n            };\n            quote! {\n                let #name: #field_ty = #func(\n                    _serde::#private::de::FlatMapDeserializer(\n                        &mut __collect,\n                        _serde::#private::PhantomData))?;\n            }\n        });\n\n    let collected_deny_unknown_fields = if has_flatten && cattrs.deny_unknown_fields() {\n        Some(quote! {\n            if let _serde::#private::Some(_serde::#private::Some((__key, _))) =\n                __collect.into_iter().filter(_serde::#private::Option::is_some).next()\n            {\n                if let _serde::#private::Some(__key) = _serde::#private::de::content_as_str(&__key) {\n                    return _serde::#private::Err(\n                        _serde::de::Error::custom(format_args!(\"unknown field `{}`\", &__key)));\n                } else {\n                    return _serde::#private::Err(\n                        _serde::de::Error::custom(format_args!(\"unexpected map key\")));\n                }\n            }\n        })\n    } else {\n        None\n    };\n\n    let result = fields_names.iter().map(|(field, name)| {\n        let member = &field.member;\n        if field.attrs.skip_deserializing() {\n            let value = Expr(expr_is_missing(field, cattrs));\n            quote!(#member: #value)\n        } else {\n            quote!(#member: #name)\n        }\n    });\n\n    let let_default = match cattrs.default() {\n        attr::Default::Default => Some(quote!(\n            let __default: Self::Value = _serde::#private::Default::default();\n        )),\n        // If #path returns wrong type, error will be reported here (^^^^^).\n        // We attach span of the path to the function so it will be reported\n        // on the #[serde(default = \"...\")]\n        //                          ^^^^^\n        attr::Default::Path(path) => Some(quote_spanned!(path.span()=>\n            let __default: Self::Value = #path();\n        )),\n        attr::Default::None => {\n            // We don't need the default value, to prevent an unused variable warning\n            // we'll leave the line empty.\n            None\n        }\n    };\n\n    let mut result = quote!(#struct_path { #(#result),* });\n    if params.has_getter {\n        let this_type = &params.this_type;\n        let (_, ty_generics, _) = params.generics.split_for_impl();\n        result = quote! {\n            _serde::#private::Into::<#this_type #ty_generics>::into(#result)\n        };\n    }\n\n    quote_block! {\n        #(#let_values)*\n\n        #let_collect\n\n        #match_keys\n\n        #let_default\n\n        #(#extract_values)*\n\n        #(#extract_collected)*\n\n        #collected_deny_unknown_fields\n\n        _serde::#private::Ok(#result)\n    }\n}\n\n/// Generates `Deserialize::deserialize_in_place` body for a `struct Struct {...}`\n#[cfg(feature = \"deserialize_in_place\")]\npub(super) fn deserialize_in_place(\n    params: &Parameters,\n    fields: &[Field],\n    cattrs: &attr::Container,\n) -> Option<Fragment> {\n    // for now we do not support in_place deserialization for structs that\n    // are represented as map.\n    if has_flatten(fields) {\n        return None;\n    }\n\n    let this_type = &params.this_type;\n    let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =\n        params.generics_with_de_lifetime();\n    let delife = params.borrowed.de_lifetime();\n\n    let expecting = format!(\"struct {}\", params.type_name());\n    let expecting = cattrs.expecting().unwrap_or(&expecting);\n\n    let deserialized_fields: Vec<_> = fields\n        .iter()\n        .enumerate()\n        .filter(|&(_, field)| !field.attrs.skip_deserializing())\n        .map(|(i, field)| FieldWithAliases {\n            ident: field_i(i),\n            aliases: field.attrs.aliases(),\n        })\n        .collect();\n\n    let field_visitor = deserialize_field_identifier(&deserialized_fields, cattrs, false);\n\n    let mut_seq = if deserialized_fields.is_empty() {\n        quote!(_)\n    } else {\n        quote!(mut __seq)\n    };\n    let visit_seq = Stmts(deserialize_seq_in_place(params, fields, cattrs, expecting));\n    let visit_map = Stmts(deserialize_map_in_place(params, fields, cattrs));\n    let field_names = deserialized_fields.iter().flat_map(|field| field.aliases);\n    let type_name = cattrs.name().deserialize_name();\n\n    let in_place_impl_generics = de_impl_generics.in_place();\n    let in_place_ty_generics = de_ty_generics.in_place();\n    let place_life = place_lifetime();\n\n    Some(quote_block! {\n        #field_visitor\n\n        #[doc(hidden)]\n        struct __Visitor #in_place_impl_generics #where_clause {\n            place: &#place_life mut #this_type #ty_generics,\n            lifetime: _serde::#private::PhantomData<&#delife ()>,\n        }\n\n        #[automatically_derived]\n        impl #in_place_impl_generics _serde::de::Visitor<#delife> for __Visitor #in_place_ty_generics #where_clause {\n            type Value = ();\n\n            fn expecting(&self, __formatter: &mut _serde::#private::Formatter) -> _serde::#private::fmt::Result {\n                _serde::#private::Formatter::write_str(__formatter, #expecting)\n            }\n\n            #[inline]\n            fn visit_seq<__A>(self, #mut_seq: __A) -> _serde::#private::Result<Self::Value, __A::Error>\n            where\n                __A: _serde::de::SeqAccess<#delife>,\n            {\n                #visit_seq\n            }\n\n            #[inline]\n            fn visit_map<__A>(self, mut __map: __A) -> _serde::#private::Result<Self::Value, __A::Error>\n            where\n                __A: _serde::de::MapAccess<#delife>,\n            {\n                #visit_map\n            }\n        }\n\n        #[doc(hidden)]\n        const FIELDS: &'static [&'static str] = &[ #(#field_names),* ];\n\n        _serde::Deserializer::deserialize_struct(__deserializer, #type_name, FIELDS, __Visitor {\n            place: __place,\n            lifetime: _serde::#private::PhantomData,\n        })\n    })\n}\n\n#[cfg(feature = \"deserialize_in_place\")]\nfn deserialize_map_in_place(\n    params: &Parameters,\n    fields: &[Field],\n    cattrs: &attr::Container,\n) -> Fragment {\n    assert!(\n        !has_flatten(fields),\n        \"inplace deserialization of maps does not support flatten fields\"\n    );\n\n    // Create the field names for the fields.\n    let fields_names: Vec<_> = fields\n        .iter()\n        .enumerate()\n        .map(|(i, field)| (field, field_i(i)))\n        .collect();\n\n    // For deserialize_in_place, declare booleans for each field that will be\n    // deserialized.\n    let let_flags = fields_names\n        .iter()\n        .filter(|&&(field, _)| !field.attrs.skip_deserializing())\n        .map(|(_, name)| {\n            quote! {\n                let mut #name: bool = false;\n            }\n        });\n\n    // Match arms to extract a value for a field.\n    let value_arms_from = fields_names\n        .iter()\n        .filter(|&&(field, _)| !field.attrs.skip_deserializing())\n        .map(|(field, name)| {\n            let deser_name = field.attrs.name().deserialize_name();\n            let member = &field.member;\n\n            let visit = match field.attrs.deserialize_with() {\n                None => {\n                    quote! {\n                        _serde::de::MapAccess::next_value_seed(&mut __map, _serde::#private::de::InPlaceSeed(&mut self.place.#member))?\n                    }\n                }\n                Some(path) => {\n                    let (wrapper, wrapper_ty) = wrap_deserialize_field_with(params, field.ty, path);\n                    quote!({\n                        #wrapper\n                        self.place.#member = match _serde::de::MapAccess::next_value::<#wrapper_ty>(&mut __map) {\n                            _serde::#private::Ok(__wrapper) => __wrapper.value,\n                            _serde::#private::Err(__err) => {\n                                return _serde::#private::Err(__err);\n                            }\n                        };\n                    })\n                }\n            };\n            quote! {\n                __Field::#name => {\n                    if #name {\n                        return _serde::#private::Err(<__A::Error as _serde::de::Error>::duplicate_field(#deser_name));\n                    }\n                    #visit;\n                    #name = true;\n                }\n            }\n        });\n\n    // Visit ignored values to consume them\n    let ignored_arm = if cattrs.deny_unknown_fields() {\n        None\n    } else {\n        Some(quote! {\n            _ => { let _ = _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?; }\n        })\n    };\n\n    let all_skipped = fields.iter().all(|field| field.attrs.skip_deserializing());\n\n    let match_keys = if cattrs.deny_unknown_fields() && all_skipped {\n        quote! {\n            // FIXME: Once feature(exhaustive_patterns) is stable:\n            // let _serde::#private::None::<__Field> = _serde::de::MapAccess::next_key(&mut __map)?;\n            _serde::#private::Option::map(\n                _serde::de::MapAccess::next_key::<__Field>(&mut __map)?,\n                |__impossible| match __impossible {});\n        }\n    } else {\n        quote! {\n            while let _serde::#private::Some(__key) = _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {\n                match __key {\n                    #(#value_arms_from)*\n                    #ignored_arm\n                }\n            }\n        }\n    };\n\n    let check_flags = fields_names\n        .iter()\n        .filter(|&&(field, _)| !field.attrs.skip_deserializing())\n        .map(|(field, name)| {\n            let missing_expr = expr_is_missing(field, cattrs);\n            // If missing_expr unconditionally returns an error, don't try\n            // to assign its value to self.place.\n            if field.attrs.default().is_none()\n                && cattrs.default().is_none()\n                && field.attrs.deserialize_with().is_some()\n            {\n                let missing_expr = Stmts(missing_expr);\n                quote! {\n                    if !#name {\n                        #missing_expr;\n                    }\n                }\n            } else {\n                let member = &field.member;\n                let missing_expr = Expr(missing_expr);\n                quote! {\n                    if !#name {\n                        self.place.#member = #missing_expr;\n                    };\n                }\n            }\n        });\n\n    let this_type = &params.this_type;\n    let (_, ty_generics, _) = params.generics.split_for_impl();\n\n    let let_default = match cattrs.default() {\n        attr::Default::Default => Some(quote!(\n            let __default: #this_type #ty_generics = _serde::#private::Default::default();\n        )),\n        // If #path returns wrong type, error will be reported here (^^^^^).\n        // We attach span of the path to the function so it will be reported\n        // on the #[serde(default = \"...\")]\n        //                          ^^^^^\n        attr::Default::Path(path) => Some(quote_spanned!(path.span()=>\n            let __default: #this_type #ty_generics = #path();\n        )),\n        attr::Default::None => {\n            // We don't need the default value, to prevent an unused variable warning\n            // we'll leave the line empty.\n            None\n        }\n    };\n\n    quote_block! {\n        #(#let_flags)*\n\n        #match_keys\n\n        #let_default\n\n        #(#check_flags)*\n\n        _serde::#private::Ok(())\n    }\n}\n\n/// Generates enum and its `Deserialize` implementation that represents each\n/// non-skipped field of the struct\nfn deserialize_field_identifier(\n    deserialized_fields: &[FieldWithAliases],\n    cattrs: &attr::Container,\n    has_flatten: bool,\n) -> Stmts {\n    let (ignore_variant, fallthrough) = if has_flatten {\n        let ignore_variant = quote!(__other(_serde::#private::de::Content<'de>),);\n        let fallthrough = quote!(_serde::#private::Ok(__Field::__other(__value)));\n        (Some(ignore_variant), Some(fallthrough))\n    } else if cattrs.deny_unknown_fields() {\n        (None, None)\n    } else {\n        let ignore_variant = quote!(__ignore,);\n        let fallthrough = quote!(_serde::#private::Ok(__Field::__ignore));\n        (Some(ignore_variant), Some(fallthrough))\n    };\n\n    Stmts(identifier::deserialize_generated(\n        deserialized_fields,\n        has_flatten,\n        false,\n        ignore_variant,\n        fallthrough,\n    ))\n}\n"
  },
  {
    "path": "serde_derive/src/de/tuple.rs",
    "content": "use crate::de::{deserialize_seq, has_flatten, Parameters, TupleForm};\n#[cfg(feature = \"deserialize_in_place\")]\nuse crate::de::{deserialize_seq_in_place, place_lifetime};\nuse crate::fragment::{Fragment, Stmts};\nuse crate::internals::ast::Field;\nuse crate::internals::attr;\nuse crate::private;\nuse proc_macro2::TokenStream;\nuse quote::{quote, quote_spanned};\nuse syn::spanned::Spanned;\n\n/// Generates `Deserialize::deserialize` body for a `struct Tuple(...);` including `struct Newtype(T);`\npub(super) fn deserialize(\n    params: &Parameters,\n    fields: &[Field],\n    cattrs: &attr::Container,\n    form: TupleForm,\n) -> Fragment {\n    assert!(\n        !has_flatten(fields),\n        \"tuples and tuple variants cannot have flatten fields\"\n    );\n\n    let field_count = fields\n        .iter()\n        .filter(|field| !field.attrs.skip_deserializing())\n        .count();\n\n    let this_type = &params.this_type;\n    let this_value = &params.this_value;\n    let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =\n        params.generics_with_de_lifetime();\n    let delife = params.borrowed.de_lifetime();\n\n    // If there are getters (implying private fields), construct the local type\n    // and use an `Into` conversion to get the remote type. If there are no\n    // getters then construct the target type directly.\n    let construct = if params.has_getter {\n        let local = &params.local;\n        quote!(#local)\n    } else {\n        quote!(#this_value)\n    };\n\n    let type_path = match form {\n        TupleForm::Tuple => construct,\n        TupleForm::ExternallyTagged(variant_ident) | TupleForm::Untagged(variant_ident) => {\n            quote!(#construct::#variant_ident)\n        }\n    };\n    let expecting = match form {\n        TupleForm::Tuple => format!(\"tuple struct {}\", params.type_name()),\n        TupleForm::ExternallyTagged(variant_ident) | TupleForm::Untagged(variant_ident) => {\n            format!(\"tuple variant {}::{}\", params.type_name(), variant_ident)\n        }\n    };\n    let expecting = cattrs.expecting().unwrap_or(&expecting);\n\n    let nfields = fields.len();\n\n    let visit_newtype_struct = match form {\n        TupleForm::Tuple if nfields == 1 => {\n            Some(deserialize_newtype_struct(&type_path, params, &fields[0]))\n        }\n        _ => None,\n    };\n\n    let visit_seq = Stmts(deserialize_seq(\n        &type_path, params, fields, false, cattrs, expecting,\n    ));\n\n    let visitor_expr = quote! {\n        __Visitor {\n            marker: _serde::#private::PhantomData::<#this_type #ty_generics>,\n            lifetime: _serde::#private::PhantomData,\n        }\n    };\n    let dispatch = match form {\n        TupleForm::Tuple if nfields == 1 => {\n            let type_name = cattrs.name().deserialize_name();\n            quote! {\n                _serde::Deserializer::deserialize_newtype_struct(__deserializer, #type_name, #visitor_expr)\n            }\n        }\n        TupleForm::Tuple => {\n            let type_name = cattrs.name().deserialize_name();\n            quote! {\n                _serde::Deserializer::deserialize_tuple_struct(__deserializer, #type_name, #field_count, #visitor_expr)\n            }\n        }\n        TupleForm::ExternallyTagged(_) => quote! {\n            _serde::de::VariantAccess::tuple_variant(__variant, #field_count, #visitor_expr)\n        },\n        TupleForm::Untagged(_) => quote! {\n            _serde::Deserializer::deserialize_tuple(__deserializer, #field_count, #visitor_expr)\n        },\n    };\n\n    let visitor_var = if field_count == 0 {\n        quote!(_)\n    } else {\n        quote!(mut __seq)\n    };\n\n    quote_block! {\n        #[doc(hidden)]\n        struct __Visitor #de_impl_generics #where_clause {\n            marker: _serde::#private::PhantomData<#this_type #ty_generics>,\n            lifetime: _serde::#private::PhantomData<&#delife ()>,\n        }\n\n        #[automatically_derived]\n        impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause {\n            type Value = #this_type #ty_generics;\n\n            fn expecting(&self, __formatter: &mut _serde::#private::Formatter) -> _serde::#private::fmt::Result {\n                _serde::#private::Formatter::write_str(__formatter, #expecting)\n            }\n\n            #visit_newtype_struct\n\n            #[inline]\n            fn visit_seq<__A>(self, #visitor_var: __A) -> _serde::#private::Result<Self::Value, __A::Error>\n            where\n                __A: _serde::de::SeqAccess<#delife>,\n            {\n                #visit_seq\n            }\n        }\n\n        #dispatch\n    }\n}\n\nfn deserialize_newtype_struct(\n    type_path: &TokenStream,\n    params: &Parameters,\n    field: &Field,\n) -> TokenStream {\n    let delife = params.borrowed.de_lifetime();\n    let field_ty = field.ty;\n    let deserializer_var = quote!(__e);\n\n    let value = match field.attrs.deserialize_with() {\n        None => {\n            let span = field.original.span();\n            let func = quote_spanned!(span=> <#field_ty as _serde::Deserialize>::deserialize);\n            quote! {\n                #func(#deserializer_var)?\n            }\n        }\n        Some(path) => {\n            // If #path returns wrong type, error will be reported here (^^^^^).\n            // We attach span of the path to the function so it will be reported\n            // on the #[serde(with = \"...\")]\n            //                       ^^^^^\n            quote_spanned! {path.span()=>\n                #path(#deserializer_var)?\n            }\n        }\n    };\n\n    let mut result = quote!(#type_path(__field0));\n    if params.has_getter {\n        let this_type = &params.this_type;\n        let (_, ty_generics, _) = params.generics.split_for_impl();\n        result = quote! {\n            _serde::#private::Into::<#this_type #ty_generics>::into(#result)\n        };\n    }\n\n    quote! {\n        #[inline]\n        fn visit_newtype_struct<__E>(self, #deserializer_var: __E) -> _serde::#private::Result<Self::Value, __E::Error>\n        where\n            __E: _serde::Deserializer<#delife>,\n        {\n            let __field0: #field_ty = #value;\n            _serde::#private::Ok(#result)\n        }\n    }\n}\n\n/// Generates `Deserialize::deserialize_in_place` body for a `struct Tuple(...);` including `struct Newtype(T);`\n#[cfg(feature = \"deserialize_in_place\")]\npub(super) fn deserialize_in_place(\n    params: &Parameters,\n    fields: &[Field],\n    cattrs: &attr::Container,\n) -> Fragment {\n    assert!(\n        !has_flatten(fields),\n        \"tuples and tuple variants cannot have flatten fields\"\n    );\n\n    let field_count = fields\n        .iter()\n        .filter(|field| !field.attrs.skip_deserializing())\n        .count();\n\n    let this_type = &params.this_type;\n    let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =\n        params.generics_with_de_lifetime();\n    let delife = params.borrowed.de_lifetime();\n\n    let expecting = format!(\"tuple struct {}\", params.type_name());\n    let expecting = cattrs.expecting().unwrap_or(&expecting);\n\n    let nfields = fields.len();\n\n    let visit_newtype_struct = if nfields == 1 {\n        // We do not generate deserialize_in_place if every field has a\n        // deserialize_with.\n        assert!(fields[0].attrs.deserialize_with().is_none());\n\n        Some(quote! {\n            #[inline]\n            fn visit_newtype_struct<__E>(self, __e: __E) -> _serde::#private::Result<Self::Value, __E::Error>\n            where\n                __E: _serde::Deserializer<#delife>,\n            {\n                _serde::Deserialize::deserialize_in_place(__e, &mut self.place.0)\n            }\n        })\n    } else {\n        None\n    };\n\n    let visit_seq = Stmts(deserialize_seq_in_place(params, fields, cattrs, expecting));\n\n    let visitor_expr = quote! {\n        __Visitor {\n            place: __place,\n            lifetime: _serde::#private::PhantomData,\n        }\n    };\n\n    let type_name = cattrs.name().deserialize_name();\n    let dispatch = if nfields == 1 {\n        quote!(_serde::Deserializer::deserialize_newtype_struct(__deserializer, #type_name, #visitor_expr))\n    } else {\n        quote!(_serde::Deserializer::deserialize_tuple_struct(__deserializer, #type_name, #field_count, #visitor_expr))\n    };\n\n    let visitor_var = if field_count == 0 {\n        quote!(_)\n    } else {\n        quote!(mut __seq)\n    };\n\n    let in_place_impl_generics = de_impl_generics.in_place();\n    let in_place_ty_generics = de_ty_generics.in_place();\n    let place_life = place_lifetime();\n\n    quote_block! {\n        #[doc(hidden)]\n        struct __Visitor #in_place_impl_generics #where_clause {\n            place: &#place_life mut #this_type #ty_generics,\n            lifetime: _serde::#private::PhantomData<&#delife ()>,\n        }\n\n        #[automatically_derived]\n        impl #in_place_impl_generics _serde::de::Visitor<#delife> for __Visitor #in_place_ty_generics #where_clause {\n            type Value = ();\n\n            fn expecting(&self, __formatter: &mut _serde::#private::Formatter) -> _serde::#private::fmt::Result {\n                _serde::#private::Formatter::write_str(__formatter, #expecting)\n            }\n\n            #visit_newtype_struct\n\n            #[inline]\n            fn visit_seq<__A>(self, #visitor_var: __A) -> _serde::#private::Result<Self::Value, __A::Error>\n            where\n                __A: _serde::de::SeqAccess<#delife>,\n            {\n                #visit_seq\n            }\n        }\n\n        #dispatch\n    }\n}\n"
  },
  {
    "path": "serde_derive/src/de/unit.rs",
    "content": "use crate::de::Parameters;\nuse crate::fragment::Fragment;\nuse crate::internals::attr;\nuse crate::private;\nuse quote::quote;\n\n/// Generates `Deserialize::deserialize` body for a `struct Unit;`\npub(super) fn deserialize(params: &Parameters, cattrs: &attr::Container) -> Fragment {\n    let this_type = &params.this_type;\n    let this_value = &params.this_value;\n    let type_name = cattrs.name().deserialize_name();\n    let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =\n        params.generics_with_de_lifetime();\n    let delife = params.borrowed.de_lifetime();\n\n    let expecting = format!(\"unit struct {}\", params.type_name());\n    let expecting = cattrs.expecting().unwrap_or(&expecting);\n\n    quote_block! {\n        #[doc(hidden)]\n        struct __Visitor #de_impl_generics #where_clause {\n            marker: _serde::#private::PhantomData<#this_type #ty_generics>,\n            lifetime: _serde::#private::PhantomData<&#delife ()>,\n        }\n\n        #[automatically_derived]\n        impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause {\n            type Value = #this_type #ty_generics;\n\n            fn expecting(&self, __formatter: &mut _serde::#private::Formatter) -> _serde::#private::fmt::Result {\n                _serde::#private::Formatter::write_str(__formatter, #expecting)\n            }\n\n            #[inline]\n            fn visit_unit<__E>(self) -> _serde::#private::Result<Self::Value, __E>\n            where\n                __E: _serde::de::Error,\n            {\n                _serde::#private::Ok(#this_value)\n            }\n        }\n\n        _serde::Deserializer::deserialize_unit_struct(\n            __deserializer,\n            #type_name,\n            __Visitor {\n                marker: _serde::#private::PhantomData::<#this_type #ty_generics>,\n                lifetime: _serde::#private::PhantomData,\n            },\n        )\n    }\n}\n"
  },
  {
    "path": "serde_derive/src/de.rs",
    "content": "use crate::deprecated::allow_deprecated;\nuse crate::fragment::{Expr, Fragment, Stmts};\nuse crate::internals::ast::{Container, Data, Field, Style, Variant};\nuse crate::internals::name::Name;\nuse crate::internals::{attr, replace_receiver, ungroup, Ctxt, Derive};\nuse crate::{bound, dummy, pretend, private, this};\nuse proc_macro2::{Span, TokenStream};\nuse quote::{quote, quote_spanned, ToTokens};\nuse std::collections::BTreeSet;\nuse std::ptr;\nuse syn::punctuated::Punctuated;\nuse syn::spanned::Spanned;\nuse syn::{parse_quote, Ident, Index, Member};\n\nmod enum_;\nmod enum_adjacently;\nmod enum_externally;\nmod enum_internally;\nmod enum_untagged;\nmod identifier;\nmod struct_;\nmod tuple;\nmod unit;\n\npub fn expand_derive_deserialize(input: &mut syn::DeriveInput) -> syn::Result<TokenStream> {\n    replace_receiver(input);\n\n    let ctxt = Ctxt::new();\n    let Some(cont) = Container::from_ast(&ctxt, input, Derive::Deserialize, &private.ident())\n    else {\n        return Err(ctxt.check().unwrap_err());\n    };\n    precondition(&ctxt, &cont);\n    ctxt.check()?;\n\n    let ident = &cont.ident;\n    let params = Parameters::new(&cont);\n    let (de_impl_generics, _, ty_generics, where_clause) = params.generics_with_de_lifetime();\n    let body = Stmts(deserialize_body(&cont, &params));\n    let delife = params.borrowed.de_lifetime();\n    let allow_deprecated = allow_deprecated(input);\n\n    let impl_block = if let Some(remote) = cont.attrs.remote() {\n        let vis = &input.vis;\n        let used = pretend::pretend_used(&cont, params.is_packed);\n        quote! {\n            #[automatically_derived]\n            #allow_deprecated\n            impl #de_impl_generics #ident #ty_generics #where_clause {\n                #vis fn deserialize<__D>(__deserializer: __D) -> _serde::#private::Result<#remote #ty_generics, __D::Error>\n                where\n                    __D: _serde::Deserializer<#delife>,\n                {\n                    #used\n                    #body\n                }\n            }\n        }\n    } else {\n        let fn_deserialize_in_place = deserialize_in_place_body(&cont, &params);\n\n        quote! {\n            #[automatically_derived]\n            #allow_deprecated\n            impl #de_impl_generics _serde::Deserialize<#delife> for #ident #ty_generics #where_clause {\n                fn deserialize<__D>(__deserializer: __D) -> _serde::#private::Result<Self, __D::Error>\n                where\n                    __D: _serde::Deserializer<#delife>,\n                {\n                    #body\n                }\n\n                #fn_deserialize_in_place\n            }\n        }\n    };\n\n    Ok(dummy::wrap_in_const(\n        cont.attrs.custom_serde_path(),\n        impl_block,\n    ))\n}\n\nfn precondition(cx: &Ctxt, cont: &Container) {\n    precondition_sized(cx, cont);\n    precondition_no_de_lifetime(cx, cont);\n}\n\nfn precondition_sized(cx: &Ctxt, cont: &Container) {\n    if let Data::Struct(_, fields) = &cont.data {\n        if let Some(last) = fields.last() {\n            if let syn::Type::Slice(_) = ungroup(last.ty) {\n                cx.error_spanned_by(\n                    cont.original,\n                    \"cannot deserialize a dynamically sized struct\",\n                );\n            }\n        }\n    }\n}\n\nfn precondition_no_de_lifetime(cx: &Ctxt, cont: &Container) {\n    if let BorrowedLifetimes::Borrowed(_) = borrowed_lifetimes(cont) {\n        for param in cont.generics.lifetimes() {\n            if param.lifetime.to_string() == \"'de\" {\n                cx.error_spanned_by(\n                    &param.lifetime,\n                    \"cannot deserialize when there is a lifetime parameter called 'de\",\n                );\n                return;\n            }\n        }\n    }\n}\n\nstruct Parameters {\n    /// Name of the type the `derive` is on.\n    local: syn::Ident,\n\n    /// Path to the type the impl is for. Either a single `Ident` for local\n    /// types (does not include generic parameters) or `some::remote::Path` for\n    /// remote types.\n    this_type: syn::Path,\n\n    /// Same as `this_type` but using `::<T>` for generic parameters for use in\n    /// expression position.\n    this_value: syn::Path,\n\n    /// Generics including any explicit and inferred bounds for the impl.\n    generics: syn::Generics,\n\n    /// Lifetimes borrowed from the deserializer. These will become bounds on\n    /// the `'de` lifetime of the deserializer.\n    borrowed: BorrowedLifetimes,\n\n    /// At least one field has a serde(getter) attribute, implying that the\n    /// remote type has a private field.\n    has_getter: bool,\n\n    /// Type has a repr(packed) attribute.\n    is_packed: bool,\n}\n\nimpl Parameters {\n    fn new(cont: &Container) -> Self {\n        let local = cont.ident.clone();\n        let this_type = this::this_type(cont);\n        let this_value = this::this_value(cont);\n        let borrowed = borrowed_lifetimes(cont);\n        let generics = build_generics(cont, &borrowed);\n        let has_getter = cont.data.has_getter();\n        let is_packed = cont.attrs.is_packed();\n\n        Parameters {\n            local,\n            this_type,\n            this_value,\n            generics,\n            borrowed,\n            has_getter,\n            is_packed,\n        }\n    }\n\n    /// Type name to use in error messages and `&'static str` arguments to\n    /// various Deserializer methods.\n    fn type_name(&self) -> String {\n        self.this_type.segments.last().unwrap().ident.to_string()\n    }\n\n    /// Split the data structure's generics into the pieces to use for its\n    /// `Deserialize` impl, augmented with an additional `'de` lifetime for use\n    /// as the `Deserialize` trait's lifetime.\n    fn generics_with_de_lifetime(\n        &self,\n    ) -> (\n        DeImplGenerics,\n        DeTypeGenerics,\n        syn::TypeGenerics,\n        Option<&syn::WhereClause>,\n    ) {\n        let de_impl_generics = DeImplGenerics(self);\n        let de_ty_generics = DeTypeGenerics(self);\n        let (_, ty_generics, where_clause) = self.generics.split_for_impl();\n        (de_impl_generics, de_ty_generics, ty_generics, where_clause)\n    }\n}\n\n// All the generics in the input, plus a bound `T: Deserialize` for each generic\n// field type that will be deserialized by us, plus a bound `T: Default` for\n// each generic field type that will be set to a default value.\nfn build_generics(cont: &Container, borrowed: &BorrowedLifetimes) -> syn::Generics {\n    let generics = bound::without_defaults(cont.generics);\n\n    let generics = bound::with_where_predicates_from_fields(cont, &generics, attr::Field::de_bound);\n\n    let generics =\n        bound::with_where_predicates_from_variants(cont, &generics, attr::Variant::de_bound);\n\n    match cont.attrs.de_bound() {\n        Some(predicates) => bound::with_where_predicates(&generics, predicates),\n        None => {\n            let generics = match *cont.attrs.default() {\n                attr::Default::Default => bound::with_self_bound(\n                    cont,\n                    &generics,\n                    &parse_quote!(_serde::#private::Default),\n                ),\n                attr::Default::None | attr::Default::Path(_) => generics,\n            };\n\n            let delife = borrowed.de_lifetime();\n            let generics = bound::with_bound(\n                cont,\n                &generics,\n                needs_deserialize_bound,\n                &parse_quote!(_serde::Deserialize<#delife>),\n            );\n\n            bound::with_bound(\n                cont,\n                &generics,\n                requires_default,\n                &parse_quote!(_serde::#private::Default),\n            )\n        }\n    }\n}\n\n// Fields with a `skip_deserializing` or `deserialize_with` attribute, or which\n// belong to a variant with a `skip_deserializing` or `deserialize_with`\n// attribute, are not deserialized by us so we do not generate a bound. Fields\n// with a `bound` attribute specify their own bound so we do not generate one.\n// All other fields may need a `T: Deserialize` bound where T is the type of the\n// field.\nfn needs_deserialize_bound(field: &attr::Field, variant: Option<&attr::Variant>) -> bool {\n    !field.skip_deserializing()\n        && field.deserialize_with().is_none()\n        && field.de_bound().is_none()\n        && variant.map_or(true, |variant| {\n            !variant.skip_deserializing()\n                && variant.deserialize_with().is_none()\n                && variant.de_bound().is_none()\n        })\n}\n\n// Fields with a `default` attribute (not `default=...`), and fields with a\n// `skip_deserializing` attribute that do not also have `default=...`.\nfn requires_default(field: &attr::Field, _variant: Option<&attr::Variant>) -> bool {\n    if let attr::Default::Default = *field.default() {\n        true\n    } else {\n        false\n    }\n}\n\nenum BorrowedLifetimes {\n    Borrowed(BTreeSet<syn::Lifetime>),\n    Static,\n}\n\nimpl BorrowedLifetimes {\n    fn de_lifetime(&self) -> syn::Lifetime {\n        match *self {\n            BorrowedLifetimes::Borrowed(_) => syn::Lifetime::new(\"'de\", Span::call_site()),\n            BorrowedLifetimes::Static => syn::Lifetime::new(\"'static\", Span::call_site()),\n        }\n    }\n\n    fn de_lifetime_param(&self) -> Option<syn::LifetimeParam> {\n        match self {\n            BorrowedLifetimes::Borrowed(bounds) => Some(syn::LifetimeParam {\n                attrs: Vec::new(),\n                lifetime: syn::Lifetime::new(\"'de\", Span::call_site()),\n                colon_token: None,\n                bounds: bounds.iter().cloned().collect(),\n            }),\n            BorrowedLifetimes::Static => None,\n        }\n    }\n}\n\n// The union of lifetimes borrowed by each field of the container.\n//\n// These turn into bounds on the `'de` lifetime of the Deserialize impl. If\n// lifetimes `'a` and `'b` are borrowed but `'c` is not, the impl is:\n//\n//     impl<'de: 'a + 'b, 'a, 'b, 'c> Deserialize<'de> for S<'a, 'b, 'c>\n//\n// If any borrowed lifetime is `'static`, then `'de: 'static` would be redundant\n// and we use plain `'static` instead of `'de`.\nfn borrowed_lifetimes(cont: &Container) -> BorrowedLifetimes {\n    let mut lifetimes = BTreeSet::new();\n    for field in cont.data.all_fields() {\n        if !field.attrs.skip_deserializing() {\n            lifetimes.extend(field.attrs.borrowed_lifetimes().iter().cloned());\n        }\n    }\n    if lifetimes.iter().any(|b| b.to_string() == \"'static\") {\n        BorrowedLifetimes::Static\n    } else {\n        BorrowedLifetimes::Borrowed(lifetimes)\n    }\n}\n\nfn deserialize_body(cont: &Container, params: &Parameters) -> Fragment {\n    if cont.attrs.transparent() {\n        deserialize_transparent(cont, params)\n    } else if let Some(type_from) = cont.attrs.type_from() {\n        deserialize_from(type_from)\n    } else if let Some(type_try_from) = cont.attrs.type_try_from() {\n        deserialize_try_from(type_try_from)\n    } else if let attr::Identifier::No = cont.attrs.identifier() {\n        match &cont.data {\n            Data::Enum(variants) => enum_::deserialize(params, variants, &cont.attrs),\n            Data::Struct(Style::Struct, fields) => {\n                struct_::deserialize(params, fields, &cont.attrs, StructForm::Struct)\n            }\n            Data::Struct(Style::Tuple, fields) | Data::Struct(Style::Newtype, fields) => {\n                tuple::deserialize(params, fields, &cont.attrs, TupleForm::Tuple)\n            }\n            Data::Struct(Style::Unit, _) => unit::deserialize(params, &cont.attrs),\n        }\n    } else {\n        match &cont.data {\n            Data::Enum(variants) => identifier::deserialize_custom(params, variants, &cont.attrs),\n            Data::Struct(_, _) => unreachable!(\"checked in serde_derive_internals\"),\n        }\n    }\n}\n\n#[cfg(feature = \"deserialize_in_place\")]\nfn deserialize_in_place_body(cont: &Container, params: &Parameters) -> Option<Stmts> {\n    // Only remote derives have getters, and we do not generate\n    // deserialize_in_place for remote derives.\n    assert!(!params.has_getter);\n\n    if cont.attrs.transparent()\n        || cont.attrs.type_from().is_some()\n        || cont.attrs.type_try_from().is_some()\n        || cont.attrs.identifier().is_some()\n        || cont\n            .data\n            .all_fields()\n            .all(|f| f.attrs.deserialize_with().is_some())\n    {\n        return None;\n    }\n\n    let code = match &cont.data {\n        Data::Struct(Style::Struct, fields) => {\n            struct_::deserialize_in_place(params, fields, &cont.attrs)?\n        }\n        Data::Struct(Style::Tuple, fields) | Data::Struct(Style::Newtype, fields) => {\n            tuple::deserialize_in_place(params, fields, &cont.attrs)\n        }\n        Data::Enum(_) | Data::Struct(Style::Unit, _) => {\n            return None;\n        }\n    };\n\n    let delife = params.borrowed.de_lifetime();\n    let stmts = Stmts(code);\n\n    let fn_deserialize_in_place = quote_block! {\n        fn deserialize_in_place<__D>(__deserializer: __D, __place: &mut Self) -> _serde::#private::Result<(), __D::Error>\n        where\n            __D: _serde::Deserializer<#delife>,\n        {\n            #stmts\n        }\n    };\n\n    Some(Stmts(fn_deserialize_in_place))\n}\n\n#[cfg(not(feature = \"deserialize_in_place\"))]\nfn deserialize_in_place_body(_cont: &Container, _params: &Parameters) -> Option<Stmts> {\n    None\n}\n\n/// Generates `Deserialize::deserialize` body for a type with `#[serde(transparent)]` attribute\nfn deserialize_transparent(cont: &Container, params: &Parameters) -> Fragment {\n    let fields = match &cont.data {\n        Data::Struct(_, fields) => fields,\n        Data::Enum(_) => unreachable!(),\n    };\n\n    let this_value = &params.this_value;\n    let transparent_field = fields.iter().find(|f| f.attrs.transparent()).unwrap();\n\n    let path = match transparent_field.attrs.deserialize_with() {\n        Some(path) => quote!(#path),\n        None => {\n            let span = transparent_field.original.span();\n            quote_spanned!(span=> _serde::Deserialize::deserialize)\n        }\n    };\n\n    let assign = fields.iter().map(|field| {\n        let member = &field.member;\n        if ptr::eq(field, transparent_field) {\n            quote!(#member: __transparent)\n        } else {\n            let value = match field.attrs.default() {\n                attr::Default::Default => quote!(_serde::#private::Default::default()),\n                // If #path returns wrong type, error will be reported here (^^^^^).\n                // We attach span of the path to the function so it will be reported\n                // on the #[serde(default = \"...\")]\n                //                          ^^^^^\n                attr::Default::Path(path) => quote_spanned!(path.span()=> #path()),\n                attr::Default::None => quote!(_serde::#private::PhantomData),\n            };\n            quote!(#member: #value)\n        }\n    });\n\n    quote_block! {\n        _serde::#private::Result::map(\n            #path(__deserializer),\n            |__transparent| #this_value { #(#assign),* })\n    }\n}\n\n/// Generates `Deserialize::deserialize` body for a type with `#[serde(from)]` attribute\nfn deserialize_from(type_from: &syn::Type) -> Fragment {\n    quote_block! {\n        _serde::#private::Result::map(\n            <#type_from as _serde::Deserialize>::deserialize(__deserializer),\n            _serde::#private::From::from)\n    }\n}\n\n/// Generates `Deserialize::deserialize` body for a type with `#[serde(try_from)]` attribute\nfn deserialize_try_from(type_try_from: &syn::Type) -> Fragment {\n    quote_block! {\n        _serde::#private::Result::and_then(\n            <#type_try_from as _serde::Deserialize>::deserialize(__deserializer),\n            |v| _serde::#private::TryFrom::try_from(v).map_err(_serde::de::Error::custom))\n    }\n}\n\nenum TupleForm<'a> {\n    Tuple,\n    /// Contains a variant name\n    ExternallyTagged(&'a syn::Ident),\n    /// Contains a variant name\n    Untagged(&'a syn::Ident),\n}\n\nfn deserialize_seq(\n    type_path: &TokenStream,\n    params: &Parameters,\n    fields: &[Field],\n    is_struct: bool,\n    cattrs: &attr::Container,\n    expecting: &str,\n) -> Fragment {\n    let vars = (0..fields.len()).map(field_i as fn(_) -> _);\n\n    let deserialized_count = fields\n        .iter()\n        .filter(|field| !field.attrs.skip_deserializing())\n        .count();\n    let expecting = if deserialized_count == 1 {\n        format!(\"{} with 1 element\", expecting)\n    } else {\n        format!(\"{} with {} elements\", expecting, deserialized_count)\n    };\n    let expecting = cattrs.expecting().unwrap_or(&expecting);\n\n    let mut index_in_seq = 0_usize;\n    let let_values = vars.clone().zip(fields).map(|(var, field)| {\n        if field.attrs.skip_deserializing() {\n            let default = Expr(expr_is_missing(field, cattrs));\n            quote! {\n                let #var = #default;\n            }\n        } else {\n            let visit = match field.attrs.deserialize_with() {\n                None => {\n                    let field_ty = field.ty;\n                    let span = field.original.span();\n                    let func =\n                        quote_spanned!(span=> _serde::de::SeqAccess::next_element::<#field_ty>);\n                    quote!(#func(&mut __seq)?)\n                }\n                Some(path) => {\n                    let (wrapper, wrapper_ty) = wrap_deserialize_field_with(params, field.ty, path);\n                    quote!({\n                        #wrapper\n                        _serde::#private::Option::map(\n                            _serde::de::SeqAccess::next_element::<#wrapper_ty>(&mut __seq)?,\n                            |__wrap| __wrap.value)\n                    })\n                }\n            };\n            let value_if_none = expr_is_missing_seq(None, index_in_seq, field, cattrs, expecting);\n            let assign = quote! {\n                let #var = match #visit {\n                    _serde::#private::Some(__value) => __value,\n                    _serde::#private::None => #value_if_none,\n                };\n            };\n            index_in_seq += 1;\n            assign\n        }\n    });\n\n    let mut result = if is_struct {\n        let names = fields.iter().map(|f| &f.member);\n        quote! {\n            #type_path { #( #names: #vars ),* }\n        }\n    } else {\n        quote! {\n            #type_path ( #(#vars),* )\n        }\n    };\n\n    if params.has_getter {\n        let this_type = &params.this_type;\n        let (_, ty_generics, _) = params.generics.split_for_impl();\n        result = quote! {\n            _serde::#private::Into::<#this_type #ty_generics>::into(#result)\n        };\n    }\n\n    let let_default = match cattrs.default() {\n        attr::Default::Default => Some(quote!(\n            let __default: Self::Value = _serde::#private::Default::default();\n        )),\n        // If #path returns wrong type, error will be reported here (^^^^^).\n        // We attach span of the path to the function so it will be reported\n        // on the #[serde(default = \"...\")]\n        //                          ^^^^^\n        attr::Default::Path(path) => Some(quote_spanned!(path.span()=>\n            let __default: Self::Value = #path();\n        )),\n        attr::Default::None => {\n            // We don't need the default value, to prevent an unused variable warning\n            // we'll leave the line empty.\n            None\n        }\n    };\n\n    quote_block! {\n        #let_default\n        #(#let_values)*\n        _serde::#private::Ok(#result)\n    }\n}\n\n#[cfg(feature = \"deserialize_in_place\")]\nfn deserialize_seq_in_place(\n    params: &Parameters,\n    fields: &[Field],\n    cattrs: &attr::Container,\n    expecting: &str,\n) -> Fragment {\n    let deserialized_count = fields\n        .iter()\n        .filter(|field| !field.attrs.skip_deserializing())\n        .count();\n    let expecting = if deserialized_count == 1 {\n        format!(\"{} with 1 element\", expecting)\n    } else {\n        format!(\"{} with {} elements\", expecting, deserialized_count)\n    };\n    let expecting = cattrs.expecting().unwrap_or(&expecting);\n\n    let mut index_in_seq = 0usize;\n    let write_values = fields.iter().map(|field| {\n        let member = &field.member;\n\n        if field.attrs.skip_deserializing() {\n            let default = Expr(expr_is_missing(field, cattrs));\n            quote! {\n                self.place.#member = #default;\n            }\n        } else {\n            let value_if_none = expr_is_missing_seq(Some(quote!(self.place.#member = )), index_in_seq, field, cattrs, expecting);\n            let write = match field.attrs.deserialize_with() {\n                None => {\n                    quote! {\n                        if let _serde::#private::None = _serde::de::SeqAccess::next_element_seed(&mut __seq,\n                            _serde::#private::de::InPlaceSeed(&mut self.place.#member))?\n                        {\n                            #value_if_none;\n                        }\n                    }\n                }\n                Some(path) => {\n                    let (wrapper, wrapper_ty) = wrap_deserialize_field_with(params, field.ty, path);\n                    quote!({\n                        #wrapper\n                        match _serde::de::SeqAccess::next_element::<#wrapper_ty>(&mut __seq) {\n                            _serde::#private::Ok(_serde::#private::Some(__wrap)) => {\n                                self.place.#member = __wrap.value;\n                            }\n                            _serde::#private::Ok(_serde::#private::None) => {\n                                #value_if_none;\n                            }\n                            _serde::#private::Err(__err) => {\n                                return _serde::#private::Err(__err);\n                            }\n                        }\n                    })\n                }\n            };\n            index_in_seq += 1;\n            write\n        }\n    });\n\n    let this_type = &params.this_type;\n    let (_, ty_generics, _) = params.generics.split_for_impl();\n    let let_default = match cattrs.default() {\n        attr::Default::Default => Some(quote!(\n            let __default: #this_type #ty_generics = _serde::#private::Default::default();\n        )),\n        // If #path returns wrong type, error will be reported here (^^^^^).\n        // We attach span of the path to the function so it will be reported\n        // on the #[serde(default = \"...\")]\n        //                          ^^^^^\n        attr::Default::Path(path) => Some(quote_spanned!(path.span()=>\n            let __default: #this_type #ty_generics = #path();\n        )),\n        attr::Default::None => {\n            // We don't need the default value, to prevent an unused variable warning\n            // we'll leave the line empty.\n            None\n        }\n    };\n\n    quote_block! {\n        #let_default\n        #(#write_values)*\n        _serde::#private::Ok(())\n    }\n}\n\nenum StructForm<'a> {\n    Struct,\n    /// Contains a variant name\n    ExternallyTagged(&'a syn::Ident),\n    /// Contains a variant name\n    InternallyTagged(&'a syn::Ident),\n    /// Contains a variant name\n    Untagged(&'a syn::Ident),\n}\n\nstruct FieldWithAliases<'a> {\n    ident: Ident,\n    aliases: &'a BTreeSet<Name>,\n}\n\npub(crate) fn field_i(i: usize) -> Ident {\n    Ident::new(&format!(\"__field{}\", i), Span::call_site())\n}\n\n/// This function wraps the expression in `#[serde(deserialize_with = \"...\")]`\n/// in a trait to prevent it from accessing the internal `Deserialize` state.\nfn wrap_deserialize_with(\n    params: &Parameters,\n    value_ty: &TokenStream,\n    deserialize_with: &syn::ExprPath,\n) -> (TokenStream, TokenStream) {\n    let this_type = &params.this_type;\n    let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =\n        params.generics_with_de_lifetime();\n    let delife = params.borrowed.de_lifetime();\n    let deserializer_var = quote!(__deserializer);\n\n    // If #deserialize_with returns wrong type, error will be reported here (^^^^^).\n    // We attach span of the path to the function so it will be reported\n    // on the #[serde(with = \"...\")]\n    //                       ^^^^^\n    let value = quote_spanned! {deserialize_with.span()=>\n        #deserialize_with(#deserializer_var)?\n    };\n    let wrapper = quote! {\n        #[doc(hidden)]\n        struct __DeserializeWith #de_impl_generics #where_clause {\n            value: #value_ty,\n            phantom: _serde::#private::PhantomData<#this_type #ty_generics>,\n            lifetime: _serde::#private::PhantomData<&#delife ()>,\n        }\n\n        #[automatically_derived]\n        impl #de_impl_generics _serde::Deserialize<#delife> for __DeserializeWith #de_ty_generics #where_clause {\n            fn deserialize<__D>(#deserializer_var: __D) -> _serde::#private::Result<Self, __D::Error>\n            where\n                __D: _serde::Deserializer<#delife>,\n            {\n                _serde::#private::Ok(__DeserializeWith {\n                    value: #value,\n                    phantom: _serde::#private::PhantomData,\n                    lifetime: _serde::#private::PhantomData,\n                })\n            }\n        }\n    };\n\n    let wrapper_ty = quote!(__DeserializeWith #de_ty_generics);\n\n    (wrapper, wrapper_ty)\n}\n\nfn wrap_deserialize_field_with(\n    params: &Parameters,\n    field_ty: &syn::Type,\n    deserialize_with: &syn::ExprPath,\n) -> (TokenStream, TokenStream) {\n    wrap_deserialize_with(params, &quote!(#field_ty), deserialize_with)\n}\n\n// Generates closure that converts single input parameter to the final value.\nfn unwrap_to_variant_closure(\n    params: &Parameters,\n    variant: &Variant,\n    with_wrapper: bool,\n) -> TokenStream {\n    let this_value = &params.this_value;\n    let variant_ident = &variant.ident;\n\n    let (arg, wrapper) = if with_wrapper {\n        (quote! { __wrap }, quote! { __wrap.value })\n    } else {\n        let field_tys = variant.fields.iter().map(|field| field.ty);\n        (quote! { __wrap: (#(#field_tys),*) }, quote! { __wrap })\n    };\n\n    let field_access = (0..variant.fields.len()).map(|n| {\n        Member::Unnamed(Index {\n            index: n as u32,\n            span: Span::call_site(),\n        })\n    });\n\n    match variant.style {\n        Style::Struct if variant.fields.len() == 1 => {\n            let member = &variant.fields[0].member;\n            quote! {\n                |#arg| #this_value::#variant_ident { #member: #wrapper }\n            }\n        }\n        Style::Struct => {\n            let members = variant.fields.iter().map(|field| &field.member);\n            quote! {\n                |#arg| #this_value::#variant_ident { #(#members: #wrapper.#field_access),* }\n            }\n        }\n        Style::Tuple => quote! {\n            |#arg| #this_value::#variant_ident(#(#wrapper.#field_access),*)\n        },\n        Style::Newtype => quote! {\n            |#arg| #this_value::#variant_ident(#wrapper)\n        },\n        Style::Unit => quote! {\n            |#arg| #this_value::#variant_ident\n        },\n    }\n}\n\nfn expr_is_missing(field: &Field, cattrs: &attr::Container) -> Fragment {\n    match field.attrs.default() {\n        attr::Default::Default => {\n            let span = field.original.span();\n            let func = quote_spanned!(span=> _serde::#private::Default::default);\n            return quote_expr!(#func());\n        }\n        attr::Default::Path(path) => {\n            // If #path returns wrong type, error will be reported here (^^^^^).\n            // We attach span of the path to the function so it will be reported\n            // on the #[serde(default = \"...\")]\n            //                          ^^^^^\n            return Fragment::Expr(quote_spanned!(path.span()=> #path()));\n        }\n        attr::Default::None => { /* below */ }\n    }\n\n    match *cattrs.default() {\n        attr::Default::Default | attr::Default::Path(_) => {\n            let member = &field.member;\n            return quote_expr!(__default.#member);\n        }\n        attr::Default::None => { /* below */ }\n    }\n\n    let name = field.attrs.name().deserialize_name();\n    match field.attrs.deserialize_with() {\n        None => {\n            let span = field.original.span();\n            let func = quote_spanned!(span=> _serde::#private::de::missing_field);\n            quote_expr! {\n                #func(#name)?\n            }\n        }\n        Some(_) => {\n            quote_expr! {\n                return _serde::#private::Err(<__A::Error as _serde::de::Error>::missing_field(#name))\n            }\n        }\n    }\n}\n\nfn expr_is_missing_seq(\n    assign_to: Option<TokenStream>,\n    index: usize,\n    field: &Field,\n    cattrs: &attr::Container,\n    expecting: &str,\n) -> TokenStream {\n    match field.attrs.default() {\n        attr::Default::Default => {\n            let span = field.original.span();\n            return quote_spanned!(span=> #assign_to _serde::#private::Default::default());\n        }\n        attr::Default::Path(path) => {\n            // If #path returns wrong type, error will be reported here (^^^^^).\n            // We attach span of the path to the function so it will be reported\n            // on the #[serde(default = \"...\")]\n            //                          ^^^^^\n            return quote_spanned!(path.span()=> #assign_to #path());\n        }\n        attr::Default::None => { /* below */ }\n    }\n\n    match *cattrs.default() {\n        attr::Default::Default | attr::Default::Path(_) => {\n            let member = &field.member;\n            quote!(#assign_to __default.#member)\n        }\n        attr::Default::None => quote!(\n            return _serde::#private::Err(_serde::de::Error::invalid_length(#index, &#expecting))\n        ),\n    }\n}\n\nfn effective_style(variant: &Variant) -> Style {\n    match variant.style {\n        Style::Newtype if variant.fields[0].attrs.skip_deserializing() => Style::Unit,\n        other => other,\n    }\n}\n\n/// True if there is any field with a `#[serde(flatten)]` attribute, other than\n/// fields which are skipped.\nfn has_flatten(fields: &[Field]) -> bool {\n    fields\n        .iter()\n        .any(|field| field.attrs.flatten() && !field.attrs.skip_deserializing())\n}\n\nstruct DeImplGenerics<'a>(&'a Parameters);\n#[cfg(feature = \"deserialize_in_place\")]\nstruct InPlaceImplGenerics<'a>(&'a Parameters);\n\nimpl<'a> ToTokens for DeImplGenerics<'a> {\n    fn to_tokens(&self, tokens: &mut TokenStream) {\n        let mut generics = self.0.generics.clone();\n        if let Some(de_lifetime) = self.0.borrowed.de_lifetime_param() {\n            generics.params = Some(syn::GenericParam::Lifetime(de_lifetime))\n                .into_iter()\n                .chain(generics.params)\n                .collect();\n        }\n        let (impl_generics, _, _) = generics.split_for_impl();\n        impl_generics.to_tokens(tokens);\n    }\n}\n\n#[cfg(feature = \"deserialize_in_place\")]\nimpl<'a> ToTokens for InPlaceImplGenerics<'a> {\n    fn to_tokens(&self, tokens: &mut TokenStream) {\n        let place_lifetime = place_lifetime();\n        let mut generics = self.0.generics.clone();\n\n        // Add lifetime for `&'place mut Self, and `'a: 'place`\n        for param in &mut generics.params {\n            match param {\n                syn::GenericParam::Lifetime(param) => {\n                    param.bounds.push(place_lifetime.lifetime.clone());\n                }\n                syn::GenericParam::Type(param) => {\n                    param.bounds.push(syn::TypeParamBound::Lifetime(\n                        place_lifetime.lifetime.clone(),\n                    ));\n                }\n                syn::GenericParam::Const(_) => {}\n            }\n        }\n        generics.params = Some(syn::GenericParam::Lifetime(place_lifetime))\n            .into_iter()\n            .chain(generics.params)\n            .collect();\n        if let Some(de_lifetime) = self.0.borrowed.de_lifetime_param() {\n            generics.params = Some(syn::GenericParam::Lifetime(de_lifetime))\n                .into_iter()\n                .chain(generics.params)\n                .collect();\n        }\n        let (impl_generics, _, _) = generics.split_for_impl();\n        impl_generics.to_tokens(tokens);\n    }\n}\n\n#[cfg(feature = \"deserialize_in_place\")]\nimpl<'a> DeImplGenerics<'a> {\n    fn in_place(self) -> InPlaceImplGenerics<'a> {\n        InPlaceImplGenerics(self.0)\n    }\n}\n\nstruct DeTypeGenerics<'a>(&'a Parameters);\n#[cfg(feature = \"deserialize_in_place\")]\nstruct InPlaceTypeGenerics<'a>(&'a Parameters);\n\nfn de_type_generics_to_tokens(\n    mut generics: syn::Generics,\n    borrowed: &BorrowedLifetimes,\n    tokens: &mut TokenStream,\n) {\n    if borrowed.de_lifetime_param().is_some() {\n        let def = syn::LifetimeParam {\n            attrs: Vec::new(),\n            lifetime: syn::Lifetime::new(\"'de\", Span::call_site()),\n            colon_token: None,\n            bounds: Punctuated::new(),\n        };\n        // Prepend 'de lifetime to list of generics\n        generics.params = Some(syn::GenericParam::Lifetime(def))\n            .into_iter()\n            .chain(generics.params)\n            .collect();\n    }\n    let (_, ty_generics, _) = generics.split_for_impl();\n    ty_generics.to_tokens(tokens);\n}\n\nimpl<'a> ToTokens for DeTypeGenerics<'a> {\n    fn to_tokens(&self, tokens: &mut TokenStream) {\n        de_type_generics_to_tokens(self.0.generics.clone(), &self.0.borrowed, tokens);\n    }\n}\n\n#[cfg(feature = \"deserialize_in_place\")]\nimpl<'a> ToTokens for InPlaceTypeGenerics<'a> {\n    fn to_tokens(&self, tokens: &mut TokenStream) {\n        let mut generics = self.0.generics.clone();\n        generics.params = Some(syn::GenericParam::Lifetime(place_lifetime()))\n            .into_iter()\n            .chain(generics.params)\n            .collect();\n\n        de_type_generics_to_tokens(generics, &self.0.borrowed, tokens);\n    }\n}\n\n#[cfg(feature = \"deserialize_in_place\")]\nimpl<'a> DeTypeGenerics<'a> {\n    fn in_place(self) -> InPlaceTypeGenerics<'a> {\n        InPlaceTypeGenerics(self.0)\n    }\n}\n\n#[cfg(feature = \"deserialize_in_place\")]\nfn place_lifetime() -> syn::LifetimeParam {\n    syn::LifetimeParam {\n        attrs: Vec::new(),\n        lifetime: syn::Lifetime::new(\"'place\", Span::call_site()),\n        colon_token: None,\n        bounds: Punctuated::new(),\n    }\n}\n"
  },
  {
    "path": "serde_derive/src/deprecated.rs",
    "content": "use proc_macro2::TokenStream;\nuse quote::quote;\n\npub fn allow_deprecated(input: &syn::DeriveInput) -> Option<TokenStream> {\n    if should_allow_deprecated(input) {\n        Some(quote! { #[allow(deprecated)] })\n    } else {\n        None\n    }\n}\n\n/// Determine if an `#[allow(deprecated)]` should be added to the derived impl.\n///\n/// This should happen if the derive input or an enum variant it contains has\n/// one of:\n///   - `#[deprecated]`\n///   - `#[allow(deprecated)]`\nfn should_allow_deprecated(input: &syn::DeriveInput) -> bool {\n    if contains_deprecated(&input.attrs) {\n        return true;\n    }\n    if let syn::Data::Enum(data_enum) = &input.data {\n        for variant in &data_enum.variants {\n            if contains_deprecated(&variant.attrs) {\n                return true;\n            }\n        }\n    }\n    false\n}\n\n/// Check whether the given attributes contains one of:\n///   - `#[deprecated]`\n///   - `#[allow(deprecated)]`\nfn contains_deprecated(attrs: &[syn::Attribute]) -> bool {\n    for attr in attrs {\n        if attr.path().is_ident(\"deprecated\") {\n            return true;\n        }\n        if let syn::Meta::List(meta_list) = &attr.meta {\n            if meta_list.path.is_ident(\"allow\") {\n                let mut allow_deprecated = false;\n                let _ = meta_list.parse_nested_meta(|meta| {\n                    if meta.path.is_ident(\"deprecated\") {\n                        allow_deprecated = true;\n                    }\n                    Ok(())\n                });\n                if allow_deprecated {\n                    return true;\n                }\n            }\n        }\n    }\n    false\n}\n"
  },
  {
    "path": "serde_derive/src/dummy.rs",
    "content": "use proc_macro2::TokenStream;\nuse quote::quote;\n\npub fn wrap_in_const(serde_path: Option<&syn::Path>, code: TokenStream) -> TokenStream {\n    let use_serde = match serde_path {\n        Some(path) => quote! {\n            use #path as _serde;\n        },\n        None => quote! {\n            #[allow(unused_extern_crates, clippy::useless_attribute)]\n            extern crate serde as _serde;\n        },\n    };\n\n    quote! {\n        #[doc(hidden)]\n        #[allow(\n            non_upper_case_globals,\n            unused_attributes,\n            unused_qualifications,\n            clippy::absolute_paths,\n        )]\n        const _: () = {\n            #use_serde\n\n            _serde::__require_serde_not_serde_core!();\n\n            #code\n        };\n    }\n}\n"
  },
  {
    "path": "serde_derive/src/fragment.rs",
    "content": "use proc_macro2::TokenStream;\nuse quote::ToTokens;\nuse syn::{token, Token};\n\npub enum Fragment {\n    /// Tokens that can be used as an expression.\n    Expr(TokenStream),\n    /// Tokens that can be used inside a block. The surrounding curly braces are\n    /// not part of these tokens.\n    Block(TokenStream),\n}\n\nmacro_rules! quote_expr {\n    ($($tt:tt)*) => {\n        $crate::fragment::Fragment::Expr(quote!($($tt)*))\n    }\n}\n\nmacro_rules! quote_block {\n    ($($tt:tt)*) => {\n        $crate::fragment::Fragment::Block(quote!($($tt)*))\n    }\n}\n\n/// Interpolate a fragment in place of an expression. This involves surrounding\n/// Block fragments in curly braces.\npub struct Expr(pub Fragment);\nimpl ToTokens for Expr {\n    fn to_tokens(&self, out: &mut TokenStream) {\n        match &self.0 {\n            Fragment::Expr(expr) => expr.to_tokens(out),\n            Fragment::Block(block) => {\n                token::Brace::default().surround(out, |out| block.to_tokens(out));\n            }\n        }\n    }\n}\n\n/// Interpolate a fragment as the statements of a block.\npub struct Stmts(pub Fragment);\nimpl ToTokens for Stmts {\n    fn to_tokens(&self, out: &mut TokenStream) {\n        match &self.0 {\n            Fragment::Expr(expr) => expr.to_tokens(out),\n            Fragment::Block(block) => block.to_tokens(out),\n        }\n    }\n}\n\n/// Interpolate a fragment as the value part of a `match` expression. This\n/// involves putting a comma after expressions and curly braces around blocks.\npub struct Match(pub Fragment);\nimpl ToTokens for Match {\n    fn to_tokens(&self, out: &mut TokenStream) {\n        match &self.0 {\n            Fragment::Expr(expr) => {\n                expr.to_tokens(out);\n                <Token![,]>::default().to_tokens(out);\n            }\n            Fragment::Block(block) => {\n                token::Brace::default().surround(out, |out| block.to_tokens(out));\n            }\n        }\n    }\n}\n\nimpl AsRef<TokenStream> for Fragment {\n    fn as_ref(&self) -> &TokenStream {\n        match self {\n            Fragment::Expr(expr) => expr,\n            Fragment::Block(block) => block,\n        }\n    }\n}\n"
  },
  {
    "path": "serde_derive/src/internals/ast.rs",
    "content": "//! A Serde ast, parsed from the Syn ast and ready to generate Rust code.\n\nuse crate::internals::{attr, check, Ctxt, Derive};\nuse proc_macro2::Ident;\nuse syn::punctuated::Punctuated;\nuse syn::Token;\n\n/// A source data structure annotated with `#[derive(Serialize)]` and/or `#[derive(Deserialize)]`,\n/// parsed into an internal representation.\npub struct Container<'a> {\n    /// The struct or enum name (without generics).\n    pub ident: syn::Ident,\n    /// Attributes on the structure, parsed for Serde.\n    pub attrs: attr::Container,\n    /// The contents of the struct or enum.\n    pub data: Data<'a>,\n    /// Any generics on the struct or enum.\n    pub generics: &'a syn::Generics,\n    /// Original input.\n    pub original: &'a syn::DeriveInput,\n}\n\n/// The fields of a struct or enum.\n///\n/// Analogous to `syn::Data`.\npub enum Data<'a> {\n    Enum(Vec<Variant<'a>>),\n    Struct(Style, Vec<Field<'a>>),\n}\n\n/// A variant of an enum.\npub struct Variant<'a> {\n    pub ident: syn::Ident,\n    pub attrs: attr::Variant,\n    pub style: Style,\n    pub fields: Vec<Field<'a>>,\n    pub original: &'a syn::Variant,\n}\n\n/// A field of a struct.\npub struct Field<'a> {\n    pub member: syn::Member,\n    pub attrs: attr::Field,\n    pub ty: &'a syn::Type,\n    pub original: &'a syn::Field,\n}\n\n#[derive(Copy, Clone)]\npub enum Style {\n    /// Named fields.\n    Struct,\n    /// Many unnamed fields.\n    Tuple,\n    /// One unnamed field.\n    Newtype,\n    /// No fields.\n    Unit,\n}\n\nimpl<'a> Container<'a> {\n    /// Convert the raw Syn ast into a parsed container object, collecting errors in `cx`.\n    pub fn from_ast(\n        cx: &Ctxt,\n        item: &'a syn::DeriveInput,\n        derive: Derive,\n        private: &Ident,\n    ) -> Option<Container<'a>> {\n        let attrs = attr::Container::from_ast(cx, item);\n\n        let mut data = match &item.data {\n            syn::Data::Enum(data) => {\n                Data::Enum(enum_from_ast(cx, &data.variants, attrs.default(), private))\n            }\n            syn::Data::Struct(data) => {\n                let (style, fields) =\n                    struct_from_ast(cx, &data.fields, None, attrs.default(), private);\n                Data::Struct(style, fields)\n            }\n            syn::Data::Union(_) => {\n                cx.error_spanned_by(item, \"Serde does not support derive for unions\");\n                return None;\n            }\n        };\n\n        match &mut data {\n            Data::Enum(variants) => {\n                for variant in variants {\n                    variant.attrs.rename_by_rules(attrs.rename_all_rules());\n                    for field in &mut variant.fields {\n                        field.attrs.rename_by_rules(\n                            variant\n                                .attrs\n                                .rename_all_rules()\n                                .or(attrs.rename_all_fields_rules()),\n                        );\n                    }\n                }\n            }\n            Data::Struct(_, fields) => {\n                for field in fields {\n                    field.attrs.rename_by_rules(attrs.rename_all_rules());\n                }\n            }\n        }\n\n        let mut item = Container {\n            ident: item.ident.clone(),\n            attrs,\n            data,\n            generics: &item.generics,\n            original: item,\n        };\n        check::check(cx, &mut item, derive);\n        Some(item)\n    }\n}\n\nimpl<'a> Data<'a> {\n    pub fn all_fields(&'a self) -> Box<dyn Iterator<Item = &'a Field<'a>> + 'a> {\n        match self {\n            Data::Enum(variants) => {\n                Box::new(variants.iter().flat_map(|variant| variant.fields.iter()))\n            }\n            Data::Struct(_, fields) => Box::new(fields.iter()),\n        }\n    }\n\n    pub fn has_getter(&self) -> bool {\n        self.all_fields().any(|f| f.attrs.getter().is_some())\n    }\n}\n\nfn enum_from_ast<'a>(\n    cx: &Ctxt,\n    variants: &'a Punctuated<syn::Variant, Token![,]>,\n    container_default: &attr::Default,\n    private: &Ident,\n) -> Vec<Variant<'a>> {\n    let variants: Vec<Variant> = variants\n        .iter()\n        .map(|variant| {\n            let attrs = attr::Variant::from_ast(cx, variant);\n            let (style, fields) = struct_from_ast(\n                cx,\n                &variant.fields,\n                Some(&attrs),\n                container_default,\n                private,\n            );\n            Variant {\n                ident: variant.ident.clone(),\n                attrs,\n                style,\n                fields,\n                original: variant,\n            }\n        })\n        .collect();\n\n    let index_of_last_tagged_variant = variants\n        .iter()\n        .rposition(|variant| !variant.attrs.untagged());\n    if let Some(index_of_last_tagged_variant) = index_of_last_tagged_variant {\n        for variant in &variants[..index_of_last_tagged_variant] {\n            if variant.attrs.untagged() {\n                cx.error_spanned_by(&variant.ident, \"all variants with the #[serde(untagged)] attribute must be placed at the end of the enum\");\n            }\n        }\n    }\n\n    variants\n}\n\nfn struct_from_ast<'a>(\n    cx: &Ctxt,\n    fields: &'a syn::Fields,\n    attrs: Option<&attr::Variant>,\n    container_default: &attr::Default,\n    private: &Ident,\n) -> (Style, Vec<Field<'a>>) {\n    match fields {\n        syn::Fields::Named(fields) => (\n            Style::Struct,\n            fields_from_ast(cx, &fields.named, attrs, container_default, private),\n        ),\n        syn::Fields::Unnamed(fields) if fields.unnamed.len() == 1 => (\n            Style::Newtype,\n            fields_from_ast(cx, &fields.unnamed, attrs, container_default, private),\n        ),\n        syn::Fields::Unnamed(fields) => (\n            Style::Tuple,\n            fields_from_ast(cx, &fields.unnamed, attrs, container_default, private),\n        ),\n        syn::Fields::Unit => (Style::Unit, Vec::new()),\n    }\n}\n\nfn fields_from_ast<'a>(\n    cx: &Ctxt,\n    fields: &'a Punctuated<syn::Field, Token![,]>,\n    attrs: Option<&attr::Variant>,\n    container_default: &attr::Default,\n    private: &Ident,\n) -> Vec<Field<'a>> {\n    let mut dst_fields = Vec::with_capacity(fields.len());\n    for field in fields {\n        dst_fields.push(Field {\n            member: match &field.ident {\n                Some(ident) => syn::Member::Named(ident.clone()),\n                None => syn::Member::Unnamed(dst_fields.len().into()),\n            },\n            attrs: attr::Field::from_ast(\n                cx,\n                dst_fields.len(),\n                field,\n                attrs,\n                container_default,\n                private,\n            ),\n            ty: &field.ty,\n            original: field,\n        });\n    }\n    dst_fields\n}\n"
  },
  {
    "path": "serde_derive/src/internals/attr.rs",
    "content": "use crate::internals::name::{MultiName, Name};\nuse crate::internals::symbol::*;\nuse crate::internals::{ungroup, Ctxt};\nuse proc_macro2::{Spacing, Span, TokenStream, TokenTree};\nuse quote::ToTokens;\nuse std::collections::BTreeSet;\nuse std::iter::FromIterator;\nuse syn::meta::ParseNestedMeta;\nuse syn::parse::ParseStream;\nuse syn::punctuated::Punctuated;\nuse syn::spanned::Spanned;\nuse syn::{token, Ident, Lifetime, Token};\n\n// This module handles parsing of `#[serde(...)]` attributes. The entrypoints\n// are `attr::Container::from_ast`, `attr::Variant::from_ast`, and\n// `attr::Field::from_ast`. Each returns an instance of the corresponding\n// struct. Note that none of them return a Result. Unrecognized, malformed, or\n// duplicated attributes result in a span_err but otherwise are ignored. The\n// user will see errors simultaneously for all bad attributes in the crate\n// rather than just the first.\n\npub use crate::internals::case::RenameRule;\n\npub(crate) struct Attr<'c, T> {\n    cx: &'c Ctxt,\n    name: Symbol,\n    tokens: TokenStream,\n    value: Option<T>,\n}\n\nimpl<'c, T> Attr<'c, T> {\n    fn none(cx: &'c Ctxt, name: Symbol) -> Self {\n        Attr {\n            cx,\n            name,\n            tokens: TokenStream::new(),\n            value: None,\n        }\n    }\n\n    fn set<A: ToTokens>(&mut self, obj: A, value: T) {\n        let tokens = obj.into_token_stream();\n\n        if self.value.is_some() {\n            let msg = format!(\"duplicate serde attribute `{}`\", self.name);\n            self.cx.error_spanned_by(tokens, msg);\n        } else {\n            self.tokens = tokens;\n            self.value = Some(value);\n        }\n    }\n\n    fn set_opt<A: ToTokens>(&mut self, obj: A, value: Option<T>) {\n        if let Some(value) = value {\n            self.set(obj, value);\n        }\n    }\n\n    fn set_if_none(&mut self, value: T) {\n        if self.value.is_none() {\n            self.value = Some(value);\n        }\n    }\n\n    pub(crate) fn get(self) -> Option<T> {\n        self.value\n    }\n\n    fn get_with_tokens(self) -> Option<(TokenStream, T)> {\n        match self.value {\n            Some(v) => Some((self.tokens, v)),\n            None => None,\n        }\n    }\n}\n\nstruct BoolAttr<'c>(Attr<'c, ()>);\n\nimpl<'c> BoolAttr<'c> {\n    fn none(cx: &'c Ctxt, name: Symbol) -> Self {\n        BoolAttr(Attr::none(cx, name))\n    }\n\n    fn set_true<A: ToTokens>(&mut self, obj: A) {\n        self.0.set(obj, ());\n    }\n\n    fn get(&self) -> bool {\n        self.0.value.is_some()\n    }\n}\n\npub(crate) struct VecAttr<'c, T> {\n    cx: &'c Ctxt,\n    name: Symbol,\n    first_dup_tokens: TokenStream,\n    values: Vec<T>,\n}\n\nimpl<'c, T> VecAttr<'c, T> {\n    fn none(cx: &'c Ctxt, name: Symbol) -> Self {\n        VecAttr {\n            cx,\n            name,\n            first_dup_tokens: TokenStream::new(),\n            values: Vec::new(),\n        }\n    }\n\n    fn insert<A: ToTokens>(&mut self, obj: A, value: T) {\n        if self.values.len() == 1 {\n            self.first_dup_tokens = obj.into_token_stream();\n        }\n        self.values.push(value);\n    }\n\n    fn at_most_one(mut self) -> Option<T> {\n        if self.values.len() > 1 {\n            let dup_token = self.first_dup_tokens;\n            let msg = format!(\"duplicate serde attribute `{}`\", self.name);\n            self.cx.error_spanned_by(dup_token, msg);\n            None\n        } else {\n            self.values.pop()\n        }\n    }\n\n    pub(crate) fn get(self) -> Vec<T> {\n        self.values\n    }\n}\n\nfn unraw(ident: &Ident) -> Ident {\n    Ident::new(ident.to_string().trim_start_matches(\"r#\"), ident.span())\n}\n\n#[derive(Copy, Clone)]\npub struct RenameAllRules {\n    pub serialize: RenameRule,\n    pub deserialize: RenameRule,\n}\n\nimpl RenameAllRules {\n    /// Returns a new `RenameAllRules` with the individual rules of `self` and\n    /// `other_rules` joined by `RenameRules::or`.\n    pub fn or(self, other_rules: Self) -> Self {\n        Self {\n            serialize: self.serialize.or(other_rules.serialize),\n            deserialize: self.deserialize.or(other_rules.deserialize),\n        }\n    }\n}\n\n/// Represents struct or enum attribute information.\npub struct Container {\n    name: MultiName,\n    transparent: bool,\n    deny_unknown_fields: bool,\n    default: Default,\n    rename_all_rules: RenameAllRules,\n    rename_all_fields_rules: RenameAllRules,\n    ser_bound: Option<Vec<syn::WherePredicate>>,\n    de_bound: Option<Vec<syn::WherePredicate>>,\n    tag: TagType,\n    type_from: Option<syn::Type>,\n    type_try_from: Option<syn::Type>,\n    type_into: Option<syn::Type>,\n    remote: Option<syn::Path>,\n    identifier: Identifier,\n    serde_path: Option<syn::Path>,\n    is_packed: bool,\n    /// Error message generated when type can't be deserialized\n    expecting: Option<String>,\n    non_exhaustive: bool,\n}\n\n/// Styles of representing an enum.\npub enum TagType {\n    /// The default.\n    ///\n    /// ```json\n    /// {\"variant1\": {\"key1\": \"value1\", \"key2\": \"value2\"}}\n    /// ```\n    External,\n\n    /// `#[serde(tag = \"type\")]`\n    ///\n    /// ```json\n    /// {\"type\": \"variant1\", \"key1\": \"value1\", \"key2\": \"value2\"}\n    /// ```\n    Internal { tag: String },\n\n    /// `#[serde(tag = \"t\", content = \"c\")]`\n    ///\n    /// ```json\n    /// {\"t\": \"variant1\", \"c\": {\"key1\": \"value1\", \"key2\": \"value2\"}}\n    /// ```\n    Adjacent { tag: String, content: String },\n\n    /// `#[serde(untagged)]`\n    ///\n    /// ```json\n    /// {\"key1\": \"value1\", \"key2\": \"value2\"}\n    /// ```\n    None,\n}\n\n/// Whether this enum represents the fields of a struct or the variants of an\n/// enum.\n#[derive(Copy, Clone)]\npub enum Identifier {\n    /// It does not.\n    No,\n\n    /// This enum represents the fields of a struct. All of the variants must be\n    /// unit variants, except possibly one which is annotated with\n    /// `#[serde(other)]` and is a newtype variant.\n    Field,\n\n    /// This enum represents the variants of an enum. All of the variants must\n    /// be unit variants.\n    Variant,\n}\n\nimpl Identifier {\n    #[cfg(feature = \"deserialize_in_place\")]\n    pub fn is_some(self) -> bool {\n        match self {\n            Identifier::No => false,\n            Identifier::Field | Identifier::Variant => true,\n        }\n    }\n}\n\nimpl Container {\n    /// Extract out the `#[serde(...)]` attributes from an item.\n    pub fn from_ast(cx: &Ctxt, item: &syn::DeriveInput) -> Self {\n        let mut ser_name = Attr::none(cx, RENAME);\n        let mut de_name = Attr::none(cx, RENAME);\n        let mut transparent = BoolAttr::none(cx, TRANSPARENT);\n        let mut deny_unknown_fields = BoolAttr::none(cx, DENY_UNKNOWN_FIELDS);\n        let mut default = Attr::none(cx, DEFAULT);\n        let mut rename_all_ser_rule = Attr::none(cx, RENAME_ALL);\n        let mut rename_all_de_rule = Attr::none(cx, RENAME_ALL);\n        let mut rename_all_fields_ser_rule = Attr::none(cx, RENAME_ALL_FIELDS);\n        let mut rename_all_fields_de_rule = Attr::none(cx, RENAME_ALL_FIELDS);\n        let mut ser_bound = Attr::none(cx, BOUND);\n        let mut de_bound = Attr::none(cx, BOUND);\n        let mut untagged = BoolAttr::none(cx, UNTAGGED);\n        let mut internal_tag = Attr::none(cx, TAG);\n        let mut content = Attr::none(cx, CONTENT);\n        let mut type_from = Attr::none(cx, FROM);\n        let mut type_try_from = Attr::none(cx, TRY_FROM);\n        let mut type_into = Attr::none(cx, INTO);\n        let mut remote = Attr::none(cx, REMOTE);\n        let mut field_identifier = BoolAttr::none(cx, FIELD_IDENTIFIER);\n        let mut variant_identifier = BoolAttr::none(cx, VARIANT_IDENTIFIER);\n        let mut serde_path = Attr::none(cx, CRATE);\n        let mut expecting = Attr::none(cx, EXPECTING);\n        let mut non_exhaustive = false;\n\n        for attr in &item.attrs {\n            if attr.path() != SERDE {\n                non_exhaustive |=\n                    matches!(&attr.meta, syn::Meta::Path(path) if path == NON_EXHAUSTIVE);\n                continue;\n            }\n\n            if let syn::Meta::List(meta) = &attr.meta {\n                if meta.tokens.is_empty() {\n                    continue;\n                }\n            }\n\n            if let Err(err) = attr.parse_nested_meta(|meta| {\n                if meta.path == RENAME {\n                    // #[serde(rename = \"foo\")]\n                    // #[serde(rename(serialize = \"foo\", deserialize = \"bar\"))]\n                    let (ser, de) = get_renames(cx, RENAME, &meta)?;\n                    ser_name.set_opt(&meta.path, ser.as_ref().map(Name::from));\n                    de_name.set_opt(&meta.path, de.as_ref().map(Name::from));\n                } else if meta.path == RENAME_ALL {\n                    // #[serde(rename_all = \"foo\")]\n                    // #[serde(rename_all(serialize = \"foo\", deserialize = \"bar\"))]\n                    let one_name = meta.input.peek(Token![=]);\n                    let (ser, de) = get_renames(cx, RENAME_ALL, &meta)?;\n                    if let Some(ser) = ser {\n                        match RenameRule::from_str(&ser.value()) {\n                            Ok(rename_rule) => rename_all_ser_rule.set(&meta.path, rename_rule),\n                            Err(err) => cx.error_spanned_by(ser, err),\n                        }\n                    }\n                    if let Some(de) = de {\n                        match RenameRule::from_str(&de.value()) {\n                            Ok(rename_rule) => rename_all_de_rule.set(&meta.path, rename_rule),\n                            Err(err) => {\n                                if !one_name {\n                                    cx.error_spanned_by(de, err);\n                                }\n                            }\n                        }\n                    }\n                } else if meta.path == RENAME_ALL_FIELDS {\n                    // #[serde(rename_all_fields = \"foo\")]\n                    // #[serde(rename_all_fields(serialize = \"foo\", deserialize = \"bar\"))]\n                    let one_name = meta.input.peek(Token![=]);\n                    let (ser, de) = get_renames(cx, RENAME_ALL_FIELDS, &meta)?;\n\n                    match item.data {\n                        syn::Data::Enum(_) => {\n                            if let Some(ser) = ser {\n                                match RenameRule::from_str(&ser.value()) {\n                                    Ok(rename_rule) => {\n                                        rename_all_fields_ser_rule.set(&meta.path, rename_rule);\n                                    }\n                                    Err(err) => cx.error_spanned_by(ser, err),\n                                }\n                            }\n                            if let Some(de) = de {\n                                match RenameRule::from_str(&de.value()) {\n                                    Ok(rename_rule) => {\n                                        rename_all_fields_de_rule.set(&meta.path, rename_rule);\n                                    }\n                                    Err(err) => {\n                                        if !one_name {\n                                            cx.error_spanned_by(de, err);\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        syn::Data::Struct(_) => {\n                            let msg = \"#[serde(rename_all_fields)] can only be used on enums\";\n                            cx.syn_error(meta.error(msg));\n                        }\n                        syn::Data::Union(_) => {\n                            let msg = \"#[serde(rename_all_fields)] can only be used on enums\";\n                            cx.syn_error(meta.error(msg));\n                        }\n                    }\n                } else if meta.path == TRANSPARENT {\n                    // #[serde(transparent)]\n                    transparent.set_true(meta.path);\n                } else if meta.path == DENY_UNKNOWN_FIELDS {\n                    // #[serde(deny_unknown_fields)]\n                    deny_unknown_fields.set_true(meta.path);\n                } else if meta.path == DEFAULT {\n                    if meta.input.peek(Token![=]) {\n                        // #[serde(default = \"...\")]\n                        if let Some(path) = parse_lit_into_expr_path(cx, DEFAULT, &meta)? {\n                            match &item.data {\n                                syn::Data::Struct(syn::DataStruct { fields, .. }) => match fields {\n                                    syn::Fields::Named(_) | syn::Fields::Unnamed(_) => {\n                                        default.set(&meta.path, Default::Path(path));\n                                    }\n                                    syn::Fields::Unit => {\n                                        let msg = \"#[serde(default = \\\"...\\\")] can only be used on structs that have fields\";\n                                        cx.syn_error(meta.error(msg));\n                                    }\n                                },\n                                syn::Data::Enum(_) => {\n                                    let msg = \"#[serde(default = \\\"...\\\")] can only be used on structs\";\n                                    cx.syn_error(meta.error(msg));\n                                }\n                                syn::Data::Union(_) => {\n                                    let msg = \"#[serde(default = \\\"...\\\")] can only be used on structs\";\n                                    cx.syn_error(meta.error(msg));\n                                }\n                            }\n                        }\n                    } else {\n                        // #[serde(default)]\n                        match &item.data {\n                            syn::Data::Struct(syn::DataStruct { fields, .. }) => match fields {\n                                syn::Fields::Named(_) | syn::Fields::Unnamed(_) => {\n                                    default.set(meta.path, Default::Default);\n                                }\n                                syn::Fields::Unit => {\n                                    let msg = \"#[serde(default)] can only be used on structs that have fields\";\n                                    cx.error_spanned_by(fields, msg);\n                                }\n                            },\n                            syn::Data::Enum(_) => {\n                                let msg = \"#[serde(default)] can only be used on structs\";\n                                cx.syn_error(meta.error(msg));\n                            }\n                            syn::Data::Union(_) => {\n                                let msg = \"#[serde(default)] can only be used on structs\";\n                                cx.syn_error(meta.error(msg));\n                            }\n                        }\n                    }\n                } else if meta.path == BOUND {\n                    // #[serde(bound = \"T: SomeBound\")]\n                    // #[serde(bound(serialize = \"...\", deserialize = \"...\"))]\n                    let (ser, de) = get_where_predicates(cx, &meta)?;\n                    ser_bound.set_opt(&meta.path, ser);\n                    de_bound.set_opt(&meta.path, de);\n                } else if meta.path == UNTAGGED {\n                    // #[serde(untagged)]\n                    match item.data {\n                        syn::Data::Enum(_) => {\n                            untagged.set_true(&meta.path);\n                        }\n                        syn::Data::Struct(_) => {\n                            let msg = \"#[serde(untagged)] can only be used on enums\";\n                            cx.syn_error(meta.error(msg));\n                        }\n                        syn::Data::Union(_) => {\n                            let msg = \"#[serde(untagged)] can only be used on enums\";\n                            cx.syn_error(meta.error(msg));\n                        }\n                    }\n                } else if meta.path == TAG {\n                    // #[serde(tag = \"type\")]\n                    if let Some(s) = get_lit_str(cx, TAG, &meta)? {\n                        match &item.data {\n                            syn::Data::Enum(_) => {\n                                internal_tag.set(&meta.path, s.value());\n                            }\n                            syn::Data::Struct(syn::DataStruct { fields, .. }) => match fields {\n                                syn::Fields::Named(_) => {\n                                    internal_tag.set(&meta.path, s.value());\n                                }\n                                syn::Fields::Unnamed(_) | syn::Fields::Unit => {\n                                    let msg = \"#[serde(tag = \\\"...\\\")] can only be used on enums and structs with named fields\";\n                                    cx.syn_error(meta.error(msg));\n                                }\n                            },\n                            syn::Data::Union(_) => {\n                                let msg = \"#[serde(tag = \\\"...\\\")] can only be used on enums and structs with named fields\";\n                                cx.syn_error(meta.error(msg));\n                            }\n                        }\n                    }\n                } else if meta.path == CONTENT {\n                    // #[serde(content = \"c\")]\n                    if let Some(s) = get_lit_str(cx, CONTENT, &meta)? {\n                        match &item.data {\n                            syn::Data::Enum(_) => {\n                                content.set(&meta.path, s.value());\n                            }\n                            syn::Data::Struct(_) => {\n                                let msg = \"#[serde(content = \\\"...\\\")] can only be used on enums\";\n                                cx.syn_error(meta.error(msg));\n                            }\n                            syn::Data::Union(_) => {\n                                let msg = \"#[serde(content = \\\"...\\\")] can only be used on enums\";\n                                cx.syn_error(meta.error(msg));\n                            }\n                        }\n                    }\n                } else if meta.path == FROM {\n                    // #[serde(from = \"Type\")]\n                    if let Some(from_ty) = parse_lit_into_ty(cx, FROM, &meta)? {\n                        type_from.set_opt(&meta.path, Some(from_ty));\n                    }\n                } else if meta.path == TRY_FROM {\n                    // #[serde(try_from = \"Type\")]\n                    if let Some(try_from_ty) = parse_lit_into_ty(cx, TRY_FROM, &meta)? {\n                        type_try_from.set_opt(&meta.path, Some(try_from_ty));\n                    }\n                } else if meta.path == INTO {\n                    // #[serde(into = \"Type\")]\n                    if let Some(into_ty) = parse_lit_into_ty(cx, INTO, &meta)? {\n                        type_into.set_opt(&meta.path, Some(into_ty));\n                    }\n                } else if meta.path == REMOTE {\n                    // #[serde(remote = \"...\")]\n                    if let Some(path) = parse_lit_into_path(cx, REMOTE, &meta)? {\n                        if is_primitive_path(&path, \"Self\") {\n                            remote.set(&meta.path, item.ident.clone().into());\n                        } else {\n                            remote.set(&meta.path, path);\n                        }\n                    }\n                } else if meta.path == FIELD_IDENTIFIER {\n                    // #[serde(field_identifier)]\n                    field_identifier.set_true(&meta.path);\n                } else if meta.path == VARIANT_IDENTIFIER {\n                    // #[serde(variant_identifier)]\n                    variant_identifier.set_true(&meta.path);\n                } else if meta.path == CRATE {\n                    // #[serde(crate = \"foo\")]\n                    if let Some(path) = parse_lit_into_path(cx, CRATE, &meta)? {\n                        serde_path.set(&meta.path, path);\n                    }\n                } else if meta.path == EXPECTING {\n                    // #[serde(expecting = \"a message\")]\n                    if let Some(s) = get_lit_str(cx, EXPECTING, &meta)? {\n                        expecting.set(&meta.path, s.value());\n                    }\n                } else {\n                    let path = meta.path.to_token_stream().to_string().replace(' ', \"\");\n                    return Err(\n                        meta.error(format_args!(\"unknown serde container attribute `{}`\", path))\n                    );\n                }\n                Ok(())\n            }) {\n                cx.syn_error(err);\n            }\n        }\n\n        let mut is_packed = false;\n        for attr in &item.attrs {\n            if attr.path() == REPR {\n                let _ = attr.parse_args_with(|input: ParseStream| {\n                    while let Some(token) = input.parse()? {\n                        if let TokenTree::Ident(ident) = token {\n                            is_packed |= ident == \"packed\";\n                        }\n                    }\n                    Ok(())\n                });\n            }\n        }\n\n        Container {\n            name: MultiName::from_attrs(Name::from(&unraw(&item.ident)), ser_name, de_name, None),\n            transparent: transparent.get(),\n            deny_unknown_fields: deny_unknown_fields.get(),\n            default: default.get().unwrap_or(Default::None),\n            rename_all_rules: RenameAllRules {\n                serialize: rename_all_ser_rule.get().unwrap_or(RenameRule::None),\n                deserialize: rename_all_de_rule.get().unwrap_or(RenameRule::None),\n            },\n            rename_all_fields_rules: RenameAllRules {\n                serialize: rename_all_fields_ser_rule.get().unwrap_or(RenameRule::None),\n                deserialize: rename_all_fields_de_rule.get().unwrap_or(RenameRule::None),\n            },\n            ser_bound: ser_bound.get(),\n            de_bound: de_bound.get(),\n            tag: decide_tag(cx, item, untagged, internal_tag, content),\n            type_from: type_from.get(),\n            type_try_from: type_try_from.get(),\n            type_into: type_into.get(),\n            remote: remote.get(),\n            identifier: decide_identifier(cx, item, field_identifier, variant_identifier),\n            serde_path: serde_path.get(),\n            is_packed,\n            expecting: expecting.get(),\n            non_exhaustive,\n        }\n    }\n\n    pub fn name(&self) -> &MultiName {\n        &self.name\n    }\n\n    pub fn rename_all_rules(&self) -> RenameAllRules {\n        self.rename_all_rules\n    }\n\n    pub fn rename_all_fields_rules(&self) -> RenameAllRules {\n        self.rename_all_fields_rules\n    }\n\n    pub fn transparent(&self) -> bool {\n        self.transparent\n    }\n\n    pub fn deny_unknown_fields(&self) -> bool {\n        self.deny_unknown_fields\n    }\n\n    pub fn default(&self) -> &Default {\n        &self.default\n    }\n\n    pub fn ser_bound(&self) -> Option<&[syn::WherePredicate]> {\n        self.ser_bound.as_ref().map(|vec| &vec[..])\n    }\n\n    pub fn de_bound(&self) -> Option<&[syn::WherePredicate]> {\n        self.de_bound.as_ref().map(|vec| &vec[..])\n    }\n\n    pub fn tag(&self) -> &TagType {\n        &self.tag\n    }\n\n    pub fn type_from(&self) -> Option<&syn::Type> {\n        self.type_from.as_ref()\n    }\n\n    pub fn type_try_from(&self) -> Option<&syn::Type> {\n        self.type_try_from.as_ref()\n    }\n\n    pub fn type_into(&self) -> Option<&syn::Type> {\n        self.type_into.as_ref()\n    }\n\n    pub fn remote(&self) -> Option<&syn::Path> {\n        self.remote.as_ref()\n    }\n\n    pub fn is_packed(&self) -> bool {\n        self.is_packed\n    }\n\n    pub fn identifier(&self) -> Identifier {\n        self.identifier\n    }\n\n    pub fn custom_serde_path(&self) -> Option<&syn::Path> {\n        self.serde_path.as_ref()\n    }\n\n    /// Error message generated when type can't be deserialized.\n    /// If `None`, default message will be used\n    pub fn expecting(&self) -> Option<&str> {\n        self.expecting.as_ref().map(String::as_ref)\n    }\n\n    pub fn non_exhaustive(&self) -> bool {\n        self.non_exhaustive\n    }\n}\n\nfn decide_tag(\n    cx: &Ctxt,\n    item: &syn::DeriveInput,\n    untagged: BoolAttr,\n    internal_tag: Attr<String>,\n    content: Attr<String>,\n) -> TagType {\n    match (\n        untagged.0.get_with_tokens(),\n        internal_tag.get_with_tokens(),\n        content.get_with_tokens(),\n    ) {\n        (None, None, None) => TagType::External,\n        (Some(_), None, None) => TagType::None,\n        (None, Some((_, tag)), None) => {\n            // Check that there are no tuple variants.\n            if let syn::Data::Enum(data) = &item.data {\n                for variant in &data.variants {\n                    match &variant.fields {\n                        syn::Fields::Named(_) | syn::Fields::Unit => {}\n                        syn::Fields::Unnamed(fields) => {\n                            if fields.unnamed.len() != 1 {\n                                let msg =\n                                    \"#[serde(tag = \\\"...\\\")] cannot be used with tuple variants\";\n                                cx.error_spanned_by(variant, msg);\n                                break;\n                            }\n                        }\n                    }\n                }\n            }\n            TagType::Internal { tag }\n        }\n        (Some((untagged_tokens, ())), Some((tag_tokens, _)), None) => {\n            let msg = \"enum cannot be both untagged and internally tagged\";\n            cx.error_spanned_by(untagged_tokens, msg);\n            cx.error_spanned_by(tag_tokens, msg);\n            TagType::External // doesn't matter, will error\n        }\n        (None, None, Some((content_tokens, _))) => {\n            let msg = \"#[serde(tag = \\\"...\\\", content = \\\"...\\\")] must be used together\";\n            cx.error_spanned_by(content_tokens, msg);\n            TagType::External\n        }\n        (Some((untagged_tokens, ())), None, Some((content_tokens, _))) => {\n            let msg = \"untagged enum cannot have #[serde(content = \\\"...\\\")]\";\n            cx.error_spanned_by(untagged_tokens, msg);\n            cx.error_spanned_by(content_tokens, msg);\n            TagType::External\n        }\n        (None, Some((_, tag)), Some((_, content))) => TagType::Adjacent { tag, content },\n        (Some((untagged_tokens, ())), Some((tag_tokens, _)), Some((content_tokens, _))) => {\n            let msg = \"untagged enum cannot have #[serde(tag = \\\"...\\\", content = \\\"...\\\")]\";\n            cx.error_spanned_by(untagged_tokens, msg);\n            cx.error_spanned_by(tag_tokens, msg);\n            cx.error_spanned_by(content_tokens, msg);\n            TagType::External\n        }\n    }\n}\n\nfn decide_identifier(\n    cx: &Ctxt,\n    item: &syn::DeriveInput,\n    field_identifier: BoolAttr,\n    variant_identifier: BoolAttr,\n) -> Identifier {\n    match (\n        &item.data,\n        field_identifier.0.get_with_tokens(),\n        variant_identifier.0.get_with_tokens(),\n    ) {\n        (_, None, None) => Identifier::No,\n        (_, Some((field_identifier_tokens, ())), Some((variant_identifier_tokens, ()))) => {\n            let msg =\n                \"#[serde(field_identifier)] and #[serde(variant_identifier)] cannot both be set\";\n            cx.error_spanned_by(field_identifier_tokens, msg);\n            cx.error_spanned_by(variant_identifier_tokens, msg);\n            Identifier::No\n        }\n        (syn::Data::Enum(_), Some(_), None) => Identifier::Field,\n        (syn::Data::Enum(_), None, Some(_)) => Identifier::Variant,\n        (syn::Data::Struct(syn::DataStruct { struct_token, .. }), Some(_), None) => {\n            let msg = \"#[serde(field_identifier)] can only be used on an enum\";\n            cx.error_spanned_by(struct_token, msg);\n            Identifier::No\n        }\n        (syn::Data::Union(syn::DataUnion { union_token, .. }), Some(_), None) => {\n            let msg = \"#[serde(field_identifier)] can only be used on an enum\";\n            cx.error_spanned_by(union_token, msg);\n            Identifier::No\n        }\n        (syn::Data::Struct(syn::DataStruct { struct_token, .. }), None, Some(_)) => {\n            let msg = \"#[serde(variant_identifier)] can only be used on an enum\";\n            cx.error_spanned_by(struct_token, msg);\n            Identifier::No\n        }\n        (syn::Data::Union(syn::DataUnion { union_token, .. }), None, Some(_)) => {\n            let msg = \"#[serde(variant_identifier)] can only be used on an enum\";\n            cx.error_spanned_by(union_token, msg);\n            Identifier::No\n        }\n    }\n}\n\n/// Represents variant attribute information\npub struct Variant {\n    name: MultiName,\n    rename_all_rules: RenameAllRules,\n    ser_bound: Option<Vec<syn::WherePredicate>>,\n    de_bound: Option<Vec<syn::WherePredicate>>,\n    skip_deserializing: bool,\n    skip_serializing: bool,\n    other: bool,\n    serialize_with: Option<syn::ExprPath>,\n    deserialize_with: Option<syn::ExprPath>,\n    borrow: Option<BorrowAttribute>,\n    untagged: bool,\n}\n\nstruct BorrowAttribute {\n    path: syn::Path,\n    lifetimes: Option<BTreeSet<syn::Lifetime>>,\n}\n\nimpl Variant {\n    pub fn from_ast(cx: &Ctxt, variant: &syn::Variant) -> Self {\n        let mut ser_name = Attr::none(cx, RENAME);\n        let mut de_name = Attr::none(cx, RENAME);\n        let mut de_aliases = VecAttr::none(cx, RENAME);\n        let mut skip_deserializing = BoolAttr::none(cx, SKIP_DESERIALIZING);\n        let mut skip_serializing = BoolAttr::none(cx, SKIP_SERIALIZING);\n        let mut rename_all_ser_rule = Attr::none(cx, RENAME_ALL);\n        let mut rename_all_de_rule = Attr::none(cx, RENAME_ALL);\n        let mut ser_bound = Attr::none(cx, BOUND);\n        let mut de_bound = Attr::none(cx, BOUND);\n        let mut other = BoolAttr::none(cx, OTHER);\n        let mut serialize_with = Attr::none(cx, SERIALIZE_WITH);\n        let mut deserialize_with = Attr::none(cx, DESERIALIZE_WITH);\n        let mut borrow = Attr::none(cx, BORROW);\n        let mut untagged = BoolAttr::none(cx, UNTAGGED);\n\n        for attr in &variant.attrs {\n            if attr.path() != SERDE {\n                continue;\n            }\n\n            if let syn::Meta::List(meta) = &attr.meta {\n                if meta.tokens.is_empty() {\n                    continue;\n                }\n            }\n\n            if let Err(err) = attr.parse_nested_meta(|meta| {\n                if meta.path == RENAME {\n                    // #[serde(rename = \"foo\")]\n                    // #[serde(rename(serialize = \"foo\", deserialize = \"bar\"))]\n                    let (ser, de) = get_multiple_renames(cx, &meta)?;\n                    ser_name.set_opt(&meta.path, ser.as_ref().map(Name::from));\n                    for de_value in de {\n                        de_name.set_if_none(Name::from(&de_value));\n                        de_aliases.insert(&meta.path, Name::from(&de_value));\n                    }\n                } else if meta.path == ALIAS {\n                    // #[serde(alias = \"foo\")]\n                    if let Some(s) = get_lit_str(cx, ALIAS, &meta)? {\n                        de_aliases.insert(&meta.path, Name::from(&s));\n                    }\n                } else if meta.path == RENAME_ALL {\n                    // #[serde(rename_all = \"foo\")]\n                    // #[serde(rename_all(serialize = \"foo\", deserialize = \"bar\"))]\n                    let one_name = meta.input.peek(Token![=]);\n                    let (ser, de) = get_renames(cx, RENAME_ALL, &meta)?;\n                    if let Some(ser) = ser {\n                        match RenameRule::from_str(&ser.value()) {\n                            Ok(rename_rule) => rename_all_ser_rule.set(&meta.path, rename_rule),\n                            Err(err) => cx.error_spanned_by(ser, err),\n                        }\n                    }\n                    if let Some(de) = de {\n                        match RenameRule::from_str(&de.value()) {\n                            Ok(rename_rule) => rename_all_de_rule.set(&meta.path, rename_rule),\n                            Err(err) => {\n                                if !one_name {\n                                    cx.error_spanned_by(de, err);\n                                }\n                            }\n                        }\n                    }\n                } else if meta.path == SKIP {\n                    // #[serde(skip)]\n                    skip_serializing.set_true(&meta.path);\n                    skip_deserializing.set_true(&meta.path);\n                } else if meta.path == SKIP_DESERIALIZING {\n                    // #[serde(skip_deserializing)]\n                    skip_deserializing.set_true(&meta.path);\n                } else if meta.path == SKIP_SERIALIZING {\n                    // #[serde(skip_serializing)]\n                    skip_serializing.set_true(&meta.path);\n                } else if meta.path == OTHER {\n                    // #[serde(other)]\n                    other.set_true(&meta.path);\n                } else if meta.path == BOUND {\n                    // #[serde(bound = \"T: SomeBound\")]\n                    // #[serde(bound(serialize = \"...\", deserialize = \"...\"))]\n                    let (ser, de) = get_where_predicates(cx, &meta)?;\n                    ser_bound.set_opt(&meta.path, ser);\n                    de_bound.set_opt(&meta.path, de);\n                } else if meta.path == WITH {\n                    // #[serde(with = \"...\")]\n                    if let Some(path) = parse_lit_into_expr_path(cx, WITH, &meta)? {\n                        let mut ser_path = path.clone();\n                        ser_path\n                            .path\n                            .segments\n                            .push(Ident::new(\"serialize\", ser_path.span()).into());\n                        serialize_with.set(&meta.path, ser_path);\n                        let mut de_path = path;\n                        de_path\n                            .path\n                            .segments\n                            .push(Ident::new(\"deserialize\", de_path.span()).into());\n                        deserialize_with.set(&meta.path, de_path);\n                    }\n                } else if meta.path == SERIALIZE_WITH {\n                    // #[serde(serialize_with = \"...\")]\n                    if let Some(path) = parse_lit_into_expr_path(cx, SERIALIZE_WITH, &meta)? {\n                        serialize_with.set(&meta.path, path);\n                    }\n                } else if meta.path == DESERIALIZE_WITH {\n                    // #[serde(deserialize_with = \"...\")]\n                    if let Some(path) = parse_lit_into_expr_path(cx, DESERIALIZE_WITH, &meta)? {\n                        deserialize_with.set(&meta.path, path);\n                    }\n                } else if meta.path == BORROW {\n                    let borrow_attribute = if meta.input.peek(Token![=]) {\n                        // #[serde(borrow = \"'a + 'b\")]\n                        let lifetimes = parse_lit_into_lifetimes(cx, &meta)?;\n                        BorrowAttribute {\n                            path: meta.path.clone(),\n                            lifetimes: Some(lifetimes),\n                        }\n                    } else {\n                        // #[serde(borrow)]\n                        BorrowAttribute {\n                            path: meta.path.clone(),\n                            lifetimes: None,\n                        }\n                    };\n                    match &variant.fields {\n                        syn::Fields::Unnamed(fields) if fields.unnamed.len() == 1 => {\n                            borrow.set(&meta.path, borrow_attribute);\n                        }\n                        _ => {\n                            let msg = \"#[serde(borrow)] may only be used on newtype variants\";\n                            cx.error_spanned_by(variant, msg);\n                        }\n                    }\n                } else if meta.path == UNTAGGED {\n                    untagged.set_true(&meta.path);\n                } else {\n                    let path = meta.path.to_token_stream().to_string().replace(' ', \"\");\n                    return Err(\n                        meta.error(format_args!(\"unknown serde variant attribute `{}`\", path))\n                    );\n                }\n                Ok(())\n            }) {\n                cx.syn_error(err);\n            }\n        }\n\n        Variant {\n            name: MultiName::from_attrs(\n                Name::from(&unraw(&variant.ident)),\n                ser_name,\n                de_name,\n                Some(de_aliases),\n            ),\n            rename_all_rules: RenameAllRules {\n                serialize: rename_all_ser_rule.get().unwrap_or(RenameRule::None),\n                deserialize: rename_all_de_rule.get().unwrap_or(RenameRule::None),\n            },\n            ser_bound: ser_bound.get(),\n            de_bound: de_bound.get(),\n            skip_deserializing: skip_deserializing.get(),\n            skip_serializing: skip_serializing.get(),\n            other: other.get(),\n            serialize_with: serialize_with.get(),\n            deserialize_with: deserialize_with.get(),\n            borrow: borrow.get(),\n            untagged: untagged.get(),\n        }\n    }\n\n    pub fn name(&self) -> &MultiName {\n        &self.name\n    }\n\n    pub fn aliases(&self) -> &BTreeSet<Name> {\n        self.name.deserialize_aliases()\n    }\n\n    pub fn rename_by_rules(&mut self, rules: RenameAllRules) {\n        if !self.name.serialize_renamed {\n            self.name.serialize.value =\n                rules.serialize.apply_to_variant(&self.name.serialize.value);\n        }\n        if !self.name.deserialize_renamed {\n            self.name.deserialize.value = rules\n                .deserialize\n                .apply_to_variant(&self.name.deserialize.value);\n        }\n        self.name\n            .deserialize_aliases\n            .insert(self.name.deserialize.clone());\n    }\n\n    pub fn rename_all_rules(&self) -> RenameAllRules {\n        self.rename_all_rules\n    }\n\n    pub fn ser_bound(&self) -> Option<&[syn::WherePredicate]> {\n        self.ser_bound.as_ref().map(|vec| &vec[..])\n    }\n\n    pub fn de_bound(&self) -> Option<&[syn::WherePredicate]> {\n        self.de_bound.as_ref().map(|vec| &vec[..])\n    }\n\n    pub fn skip_deserializing(&self) -> bool {\n        self.skip_deserializing\n    }\n\n    pub fn skip_serializing(&self) -> bool {\n        self.skip_serializing\n    }\n\n    pub fn other(&self) -> bool {\n        self.other\n    }\n\n    pub fn serialize_with(&self) -> Option<&syn::ExprPath> {\n        self.serialize_with.as_ref()\n    }\n\n    pub fn deserialize_with(&self) -> Option<&syn::ExprPath> {\n        self.deserialize_with.as_ref()\n    }\n\n    pub fn untagged(&self) -> bool {\n        self.untagged\n    }\n}\n\n/// Represents field attribute information\npub struct Field {\n    name: MultiName,\n    skip_serializing: bool,\n    skip_deserializing: bool,\n    skip_serializing_if: Option<syn::ExprPath>,\n    default: Default,\n    serialize_with: Option<syn::ExprPath>,\n    deserialize_with: Option<syn::ExprPath>,\n    ser_bound: Option<Vec<syn::WherePredicate>>,\n    de_bound: Option<Vec<syn::WherePredicate>>,\n    borrowed_lifetimes: BTreeSet<syn::Lifetime>,\n    getter: Option<syn::ExprPath>,\n    flatten: bool,\n    transparent: bool,\n}\n\n/// Represents the default to use for a field when deserializing.\npub enum Default {\n    /// Field must always be specified because it does not have a default.\n    None,\n    /// The default is given by `std::default::Default::default()`.\n    Default,\n    /// The default is given by this function.\n    Path(syn::ExprPath),\n}\n\nimpl Default {\n    pub fn is_none(&self) -> bool {\n        match self {\n            Default::None => true,\n            Default::Default | Default::Path(_) => false,\n        }\n    }\n}\n\nimpl Field {\n    /// Extract out the `#[serde(...)]` attributes from a struct field.\n    pub fn from_ast(\n        cx: &Ctxt,\n        index: usize,\n        field: &syn::Field,\n        attrs: Option<&Variant>,\n        container_default: &Default,\n        private: &Ident,\n    ) -> Self {\n        let mut ser_name = Attr::none(cx, RENAME);\n        let mut de_name = Attr::none(cx, RENAME);\n        let mut de_aliases = VecAttr::none(cx, RENAME);\n        let mut skip_serializing = BoolAttr::none(cx, SKIP_SERIALIZING);\n        let mut skip_deserializing = BoolAttr::none(cx, SKIP_DESERIALIZING);\n        let mut skip_serializing_if = Attr::none(cx, SKIP_SERIALIZING_IF);\n        let mut default = Attr::none(cx, DEFAULT);\n        let mut serialize_with = Attr::none(cx, SERIALIZE_WITH);\n        let mut deserialize_with = Attr::none(cx, DESERIALIZE_WITH);\n        let mut ser_bound = Attr::none(cx, BOUND);\n        let mut de_bound = Attr::none(cx, BOUND);\n        let mut borrowed_lifetimes = Attr::none(cx, BORROW);\n        let mut getter = Attr::none(cx, GETTER);\n        let mut flatten = BoolAttr::none(cx, FLATTEN);\n\n        let ident = match &field.ident {\n            Some(ident) => Name::from(&unraw(ident)),\n            None => Name {\n                value: index.to_string(),\n                span: Span::call_site(),\n            },\n        };\n\n        if let Some(borrow_attribute) = attrs.and_then(|variant| variant.borrow.as_ref()) {\n            if let Ok(borrowable) = borrowable_lifetimes(cx, &ident, field) {\n                if let Some(lifetimes) = &borrow_attribute.lifetimes {\n                    for lifetime in lifetimes {\n                        if !borrowable.contains(lifetime) {\n                            let msg =\n                                format!(\"field `{}` does not have lifetime {}\", ident, lifetime);\n                            cx.error_spanned_by(field, msg);\n                        }\n                    }\n                    borrowed_lifetimes.set(&borrow_attribute.path, lifetimes.clone());\n                } else {\n                    borrowed_lifetimes.set(&borrow_attribute.path, borrowable);\n                }\n            }\n        }\n\n        for attr in &field.attrs {\n            if attr.path() != SERDE {\n                continue;\n            }\n\n            if let syn::Meta::List(meta) = &attr.meta {\n                if meta.tokens.is_empty() {\n                    continue;\n                }\n            }\n\n            if let Err(err) = attr.parse_nested_meta(|meta| {\n                if meta.path == RENAME {\n                    // #[serde(rename = \"foo\")]\n                    // #[serde(rename(serialize = \"foo\", deserialize = \"bar\"))]\n                    let (ser, de) = get_multiple_renames(cx, &meta)?;\n                    ser_name.set_opt(&meta.path, ser.as_ref().map(Name::from));\n                    for de_value in de {\n                        de_name.set_if_none(Name::from(&de_value));\n                        de_aliases.insert(&meta.path, Name::from(&de_value));\n                    }\n                } else if meta.path == ALIAS {\n                    // #[serde(alias = \"foo\")]\n                    if let Some(s) = get_lit_str(cx, ALIAS, &meta)? {\n                        de_aliases.insert(&meta.path, Name::from(&s));\n                    }\n                } else if meta.path == DEFAULT {\n                    if meta.input.peek(Token![=]) {\n                        // #[serde(default = \"...\")]\n                        if let Some(path) = parse_lit_into_expr_path(cx, DEFAULT, &meta)? {\n                            default.set(&meta.path, Default::Path(path));\n                        }\n                    } else {\n                        // #[serde(default)]\n                        default.set(&meta.path, Default::Default);\n                    }\n                } else if meta.path == SKIP_SERIALIZING {\n                    // #[serde(skip_serializing)]\n                    skip_serializing.set_true(&meta.path);\n                } else if meta.path == SKIP_DESERIALIZING {\n                    // #[serde(skip_deserializing)]\n                    skip_deserializing.set_true(&meta.path);\n                } else if meta.path == SKIP {\n                    // #[serde(skip)]\n                    skip_serializing.set_true(&meta.path);\n                    skip_deserializing.set_true(&meta.path);\n                } else if meta.path == SKIP_SERIALIZING_IF {\n                    // #[serde(skip_serializing_if = \"...\")]\n                    if let Some(path) = parse_lit_into_expr_path(cx, SKIP_SERIALIZING_IF, &meta)? {\n                        skip_serializing_if.set(&meta.path, path);\n                    }\n                } else if meta.path == SERIALIZE_WITH {\n                    // #[serde(serialize_with = \"...\")]\n                    if let Some(path) = parse_lit_into_expr_path(cx, SERIALIZE_WITH, &meta)? {\n                        serialize_with.set(&meta.path, path);\n                    }\n                } else if meta.path == DESERIALIZE_WITH {\n                    // #[serde(deserialize_with = \"...\")]\n                    if let Some(path) = parse_lit_into_expr_path(cx, DESERIALIZE_WITH, &meta)? {\n                        deserialize_with.set(&meta.path, path);\n                    }\n                } else if meta.path == WITH {\n                    // #[serde(with = \"...\")]\n                    if let Some(path) = parse_lit_into_expr_path(cx, WITH, &meta)? {\n                        let mut ser_path = path.clone();\n                        ser_path\n                            .path\n                            .segments\n                            .push(Ident::new(\"serialize\", ser_path.span()).into());\n                        serialize_with.set(&meta.path, ser_path);\n                        let mut de_path = path;\n                        de_path\n                            .path\n                            .segments\n                            .push(Ident::new(\"deserialize\", de_path.span()).into());\n                        deserialize_with.set(&meta.path, de_path);\n                    }\n                } else if meta.path == BOUND {\n                    // #[serde(bound = \"T: SomeBound\")]\n                    // #[serde(bound(serialize = \"...\", deserialize = \"...\"))]\n                    let (ser, de) = get_where_predicates(cx, &meta)?;\n                    ser_bound.set_opt(&meta.path, ser);\n                    de_bound.set_opt(&meta.path, de);\n                } else if meta.path == BORROW {\n                    if meta.input.peek(Token![=]) {\n                        // #[serde(borrow = \"'a + 'b\")]\n                        let lifetimes = parse_lit_into_lifetimes(cx, &meta)?;\n                        if let Ok(borrowable) = borrowable_lifetimes(cx, &ident, field) {\n                            for lifetime in &lifetimes {\n                                if !borrowable.contains(lifetime) {\n                                    let msg = format!(\n                                        \"field `{}` does not have lifetime {}\",\n                                        ident, lifetime,\n                                    );\n                                    cx.error_spanned_by(field, msg);\n                                }\n                            }\n                            borrowed_lifetimes.set(&meta.path, lifetimes);\n                        }\n                    } else {\n                        // #[serde(borrow)]\n                        if let Ok(borrowable) = borrowable_lifetimes(cx, &ident, field) {\n                            borrowed_lifetimes.set(&meta.path, borrowable);\n                        }\n                    }\n                } else if meta.path == GETTER {\n                    // #[serde(getter = \"...\")]\n                    if let Some(path) = parse_lit_into_expr_path(cx, GETTER, &meta)? {\n                        getter.set(&meta.path, path);\n                    }\n                } else if meta.path == FLATTEN {\n                    // #[serde(flatten)]\n                    flatten.set_true(&meta.path);\n                } else {\n                    let path = meta.path.to_token_stream().to_string().replace(' ', \"\");\n                    return Err(\n                        meta.error(format_args!(\"unknown serde field attribute `{}`\", path))\n                    );\n                }\n                Ok(())\n            }) {\n                cx.syn_error(err);\n            }\n        }\n\n        // If skip_deserializing, initialize the field to Default::default() unless a\n        // different default is specified by `#[serde(default = \"...\")]` on\n        // ourselves or our container (e.g. the struct we are in).\n        if container_default.is_none() && skip_deserializing.0.value.is_some() {\n            default.set_if_none(Default::Default);\n        }\n\n        let mut borrowed_lifetimes = borrowed_lifetimes.get().unwrap_or_default();\n        if !borrowed_lifetimes.is_empty() {\n            // Cow<str> and Cow<[u8]> never borrow by default:\n            //\n            //     impl<'de, 'a, T: ?Sized> Deserialize<'de> for Cow<'a, T>\n            //\n            // A #[serde(borrow)] attribute enables borrowing that corresponds\n            // roughly to these impls:\n            //\n            //     impl<'de: 'a, 'a> Deserialize<'de> for Cow<'a, str>\n            //     impl<'de: 'a, 'a> Deserialize<'de> for Cow<'a, [u8]>\n            if is_cow(&field.ty, is_str) {\n                let mut path = syn::Path {\n                    leading_colon: None,\n                    segments: Punctuated::new(),\n                };\n                let span = Span::call_site();\n                path.segments.push(Ident::new(\"_serde\", span).into());\n                path.segments.push(private.clone().into());\n                path.segments.push(Ident::new(\"de\", span).into());\n                path.segments\n                    .push(Ident::new(\"borrow_cow_str\", span).into());\n                let expr = syn::ExprPath {\n                    attrs: Vec::new(),\n                    qself: None,\n                    path,\n                };\n                deserialize_with.set_if_none(expr);\n            } else if is_cow(&field.ty, is_slice_u8) {\n                let mut path = syn::Path {\n                    leading_colon: None,\n                    segments: Punctuated::new(),\n                };\n                let span = Span::call_site();\n                path.segments.push(Ident::new(\"_serde\", span).into());\n                path.segments.push(private.clone().into());\n                path.segments.push(Ident::new(\"de\", span).into());\n                path.segments\n                    .push(Ident::new(\"borrow_cow_bytes\", span).into());\n                let expr = syn::ExprPath {\n                    attrs: Vec::new(),\n                    qself: None,\n                    path,\n                };\n                deserialize_with.set_if_none(expr);\n            }\n        } else if is_implicitly_borrowed(&field.ty) {\n            // Types &str and &[u8] are always implicitly borrowed. No need for\n            // a #[serde(borrow)].\n            collect_lifetimes(&field.ty, &mut borrowed_lifetimes);\n        }\n\n        Field {\n            name: MultiName::from_attrs(ident, ser_name, de_name, Some(de_aliases)),\n            skip_serializing: skip_serializing.get(),\n            skip_deserializing: skip_deserializing.get(),\n            skip_serializing_if: skip_serializing_if.get(),\n            default: default.get().unwrap_or(Default::None),\n            serialize_with: serialize_with.get(),\n            deserialize_with: deserialize_with.get(),\n            ser_bound: ser_bound.get(),\n            de_bound: de_bound.get(),\n            borrowed_lifetimes,\n            getter: getter.get(),\n            flatten: flatten.get(),\n            transparent: false,\n        }\n    }\n\n    pub fn name(&self) -> &MultiName {\n        &self.name\n    }\n\n    pub fn aliases(&self) -> &BTreeSet<Name> {\n        self.name.deserialize_aliases()\n    }\n\n    pub fn rename_by_rules(&mut self, rules: RenameAllRules) {\n        if !self.name.serialize_renamed {\n            self.name.serialize.value = rules.serialize.apply_to_field(&self.name.serialize.value);\n        }\n        if !self.name.deserialize_renamed {\n            self.name.deserialize.value = rules\n                .deserialize\n                .apply_to_field(&self.name.deserialize.value);\n        }\n        self.name\n            .deserialize_aliases\n            .insert(self.name.deserialize.clone());\n    }\n\n    pub fn skip_serializing(&self) -> bool {\n        self.skip_serializing\n    }\n\n    pub fn skip_deserializing(&self) -> bool {\n        self.skip_deserializing\n    }\n\n    pub fn skip_serializing_if(&self) -> Option<&syn::ExprPath> {\n        self.skip_serializing_if.as_ref()\n    }\n\n    pub fn default(&self) -> &Default {\n        &self.default\n    }\n\n    pub fn serialize_with(&self) -> Option<&syn::ExprPath> {\n        self.serialize_with.as_ref()\n    }\n\n    pub fn deserialize_with(&self) -> Option<&syn::ExprPath> {\n        self.deserialize_with.as_ref()\n    }\n\n    pub fn ser_bound(&self) -> Option<&[syn::WherePredicate]> {\n        self.ser_bound.as_ref().map(|vec| &vec[..])\n    }\n\n    pub fn de_bound(&self) -> Option<&[syn::WherePredicate]> {\n        self.de_bound.as_ref().map(|vec| &vec[..])\n    }\n\n    pub fn borrowed_lifetimes(&self) -> &BTreeSet<syn::Lifetime> {\n        &self.borrowed_lifetimes\n    }\n\n    pub fn getter(&self) -> Option<&syn::ExprPath> {\n        self.getter.as_ref()\n    }\n\n    pub fn flatten(&self) -> bool {\n        self.flatten\n    }\n\n    pub fn transparent(&self) -> bool {\n        self.transparent\n    }\n\n    pub fn mark_transparent(&mut self) {\n        self.transparent = true;\n    }\n}\n\ntype SerAndDe<T> = (Option<T>, Option<T>);\n\nfn get_ser_and_de<'c, T, F, R>(\n    cx: &'c Ctxt,\n    attr_name: Symbol,\n    meta: &ParseNestedMeta,\n    f: F,\n) -> syn::Result<(VecAttr<'c, T>, VecAttr<'c, T>)>\nwhere\n    T: Clone,\n    F: Fn(&Ctxt, Symbol, Symbol, &ParseNestedMeta) -> syn::Result<R>,\n    R: Into<Option<T>>,\n{\n    let mut ser_meta = VecAttr::none(cx, attr_name);\n    let mut de_meta = VecAttr::none(cx, attr_name);\n\n    let lookahead = meta.input.lookahead1();\n    if lookahead.peek(Token![=]) {\n        if let Some(both) = f(cx, attr_name, attr_name, meta)?.into() {\n            ser_meta.insert(&meta.path, both.clone());\n            de_meta.insert(&meta.path, both);\n        }\n    } else if lookahead.peek(token::Paren) {\n        meta.parse_nested_meta(|meta| {\n            if meta.path == SERIALIZE {\n                if let Some(v) = f(cx, attr_name, SERIALIZE, &meta)?.into() {\n                    ser_meta.insert(&meta.path, v);\n                }\n            } else if meta.path == DESERIALIZE {\n                if let Some(v) = f(cx, attr_name, DESERIALIZE, &meta)?.into() {\n                    de_meta.insert(&meta.path, v);\n                }\n            } else {\n                return Err(meta.error(format_args!(\n                    \"malformed {0} attribute, expected `{0}(serialize = ..., deserialize = ...)`\",\n                    attr_name,\n                )));\n            }\n            Ok(())\n        })?;\n    } else {\n        return Err(lookahead.error());\n    }\n\n    Ok((ser_meta, de_meta))\n}\n\nfn get_renames(\n    cx: &Ctxt,\n    attr_name: Symbol,\n    meta: &ParseNestedMeta,\n) -> syn::Result<SerAndDe<syn::LitStr>> {\n    let (ser, de) = get_ser_and_de(cx, attr_name, meta, get_lit_str2)?;\n    Ok((ser.at_most_one(), de.at_most_one()))\n}\n\nfn get_multiple_renames(\n    cx: &Ctxt,\n    meta: &ParseNestedMeta,\n) -> syn::Result<(Option<syn::LitStr>, Vec<syn::LitStr>)> {\n    let (ser, de) = get_ser_and_de(cx, RENAME, meta, get_lit_str2)?;\n    Ok((ser.at_most_one(), de.get()))\n}\n\nfn get_where_predicates(\n    cx: &Ctxt,\n    meta: &ParseNestedMeta,\n) -> syn::Result<SerAndDe<Vec<syn::WherePredicate>>> {\n    let (ser, de) = get_ser_and_de(cx, BOUND, meta, parse_lit_into_where)?;\n    Ok((ser.at_most_one(), de.at_most_one()))\n}\n\nfn get_lit_str(\n    cx: &Ctxt,\n    attr_name: Symbol,\n    meta: &ParseNestedMeta,\n) -> syn::Result<Option<syn::LitStr>> {\n    get_lit_str2(cx, attr_name, attr_name, meta)\n}\n\nfn get_lit_str2(\n    cx: &Ctxt,\n    attr_name: Symbol,\n    meta_item_name: Symbol,\n    meta: &ParseNestedMeta,\n) -> syn::Result<Option<syn::LitStr>> {\n    let expr: syn::Expr = meta.value()?.parse()?;\n    let mut value = &expr;\n    while let syn::Expr::Group(e) = value {\n        value = &e.expr;\n    }\n    if let syn::Expr::Lit(syn::ExprLit {\n        lit: syn::Lit::Str(lit),\n        ..\n    }) = value\n    {\n        let suffix = lit.suffix();\n        if !suffix.is_empty() {\n            cx.error_spanned_by(\n                lit,\n                format!(\"unexpected suffix `{}` on string literal\", suffix),\n            );\n        }\n        Ok(Some(lit.clone()))\n    } else {\n        cx.error_spanned_by(\n            expr,\n            format!(\n                \"expected serde {} attribute to be a string: `{} = \\\"...\\\"`\",\n                attr_name, meta_item_name\n            ),\n        );\n        Ok(None)\n    }\n}\n\nfn parse_lit_into_path(\n    cx: &Ctxt,\n    attr_name: Symbol,\n    meta: &ParseNestedMeta,\n) -> syn::Result<Option<syn::Path>> {\n    let Some(string) = get_lit_str(cx, attr_name, meta)? else {\n        return Ok(None);\n    };\n\n    Ok(match string.parse() {\n        Ok(path) => Some(path),\n        Err(_) => {\n            cx.error_spanned_by(\n                &string,\n                format!(\"failed to parse path: {:?}\", string.value()),\n            );\n            None\n        }\n    })\n}\n\nfn parse_lit_into_expr_path(\n    cx: &Ctxt,\n    attr_name: Symbol,\n    meta: &ParseNestedMeta,\n) -> syn::Result<Option<syn::ExprPath>> {\n    let Some(string) = get_lit_str(cx, attr_name, meta)? else {\n        return Ok(None);\n    };\n\n    Ok(match string.parse() {\n        Ok(expr) => Some(expr),\n        Err(_) => {\n            cx.error_spanned_by(\n                &string,\n                format!(\"failed to parse path: {:?}\", string.value()),\n            );\n            None\n        }\n    })\n}\n\nfn parse_lit_into_where(\n    cx: &Ctxt,\n    attr_name: Symbol,\n    meta_item_name: Symbol,\n    meta: &ParseNestedMeta,\n) -> syn::Result<Vec<syn::WherePredicate>> {\n    let Some(string) = get_lit_str2(cx, attr_name, meta_item_name, meta)? else {\n        return Ok(Vec::new());\n    };\n\n    Ok(\n        match string.parse_with(Punctuated::<syn::WherePredicate, Token![,]>::parse_terminated) {\n            Ok(predicates) => Vec::from_iter(predicates),\n            Err(err) => {\n                cx.error_spanned_by(string, err);\n                Vec::new()\n            }\n        },\n    )\n}\n\nfn parse_lit_into_ty(\n    cx: &Ctxt,\n    attr_name: Symbol,\n    meta: &ParseNestedMeta,\n) -> syn::Result<Option<syn::Type>> {\n    let Some(string) = get_lit_str(cx, attr_name, meta)? else {\n        return Ok(None);\n    };\n\n    Ok(match string.parse() {\n        Ok(ty) => Some(ty),\n        Err(_) => {\n            cx.error_spanned_by(\n                &string,\n                format!(\"failed to parse type: {} = {:?}\", attr_name, string.value()),\n            );\n            None\n        }\n    })\n}\n\n// Parses a string literal like \"'a + 'b + 'c\" containing a nonempty list of\n// lifetimes separated by `+`.\nfn parse_lit_into_lifetimes(\n    cx: &Ctxt,\n    meta: &ParseNestedMeta,\n) -> syn::Result<BTreeSet<syn::Lifetime>> {\n    let Some(string) = get_lit_str(cx, BORROW, meta)? else {\n        return Ok(BTreeSet::new());\n    };\n\n    if let Ok(lifetimes) = string.parse_with(|input: ParseStream| {\n        let mut set = BTreeSet::new();\n        while !input.is_empty() {\n            let lifetime: Lifetime = input.parse()?;\n            if !set.insert(lifetime.clone()) {\n                cx.error_spanned_by(\n                    &string,\n                    format!(\"duplicate borrowed lifetime `{}`\", lifetime),\n                );\n            }\n            if input.is_empty() {\n                break;\n            }\n            input.parse::<Token![+]>()?;\n        }\n        Ok(set)\n    }) {\n        if lifetimes.is_empty() {\n            cx.error_spanned_by(string, \"at least one lifetime must be borrowed\");\n        }\n        return Ok(lifetimes);\n    }\n\n    cx.error_spanned_by(\n        &string,\n        format!(\"failed to parse borrowed lifetimes: {:?}\", string.value()),\n    );\n    Ok(BTreeSet::new())\n}\n\nfn is_implicitly_borrowed(ty: &syn::Type) -> bool {\n    is_implicitly_borrowed_reference(ty) || is_option(ty, is_implicitly_borrowed_reference)\n}\n\nfn is_implicitly_borrowed_reference(ty: &syn::Type) -> bool {\n    is_reference(ty, is_str) || is_reference(ty, is_slice_u8)\n}\n\n// Whether the type looks like it might be `std::borrow::Cow<T>` where elem=\"T\".\n// This can have false negatives and false positives.\n//\n// False negative:\n//\n//     use std::borrow::Cow as Pig;\n//\n//     #[derive(Deserialize)]\n//     struct S<'a> {\n//         #[serde(borrow)]\n//         pig: Pig<'a, str>,\n//     }\n//\n// False positive:\n//\n//     type str = [i16];\n//\n//     #[derive(Deserialize)]\n//     struct S<'a> {\n//         #[serde(borrow)]\n//         cow: Cow<'a, str>,\n//     }\nfn is_cow(ty: &syn::Type, elem: fn(&syn::Type) -> bool) -> bool {\n    let path = match ungroup(ty) {\n        syn::Type::Path(ty) => &ty.path,\n        _ => {\n            return false;\n        }\n    };\n    let Some(seg) = path.segments.last() else {\n        return false;\n    };\n    let args = match &seg.arguments {\n        syn::PathArguments::AngleBracketed(bracketed) => &bracketed.args,\n        _ => {\n            return false;\n        }\n    };\n    seg.ident == \"Cow\"\n        && args.len() == 2\n        && match (&args[0], &args[1]) {\n            (syn::GenericArgument::Lifetime(_), syn::GenericArgument::Type(arg)) => elem(arg),\n            _ => false,\n        }\n}\n\nfn is_option(ty: &syn::Type, elem: fn(&syn::Type) -> bool) -> bool {\n    let path = match ungroup(ty) {\n        syn::Type::Path(ty) => &ty.path,\n        _ => {\n            return false;\n        }\n    };\n    let Some(seg) = path.segments.last() else {\n        return false;\n    };\n    let args = match &seg.arguments {\n        syn::PathArguments::AngleBracketed(bracketed) => &bracketed.args,\n        _ => {\n            return false;\n        }\n    };\n    seg.ident == \"Option\"\n        && args.len() == 1\n        && match &args[0] {\n            syn::GenericArgument::Type(arg) => elem(arg),\n            _ => false,\n        }\n}\n\n// Whether the type looks like it might be `&T` where elem=\"T\". This can have\n// false negatives and false positives.\n//\n// False negative:\n//\n//     type Yarn = str;\n//\n//     #[derive(Deserialize)]\n//     struct S<'a> {\n//         r: &'a Yarn,\n//     }\n//\n// False positive:\n//\n//     type str = [i16];\n//\n//     #[derive(Deserialize)]\n//     struct S<'a> {\n//         r: &'a str,\n//     }\nfn is_reference(ty: &syn::Type, elem: fn(&syn::Type) -> bool) -> bool {\n    match ungroup(ty) {\n        syn::Type::Reference(ty) => ty.mutability.is_none() && elem(&ty.elem),\n        _ => false,\n    }\n}\n\nfn is_str(ty: &syn::Type) -> bool {\n    is_primitive_type(ty, \"str\")\n}\n\nfn is_slice_u8(ty: &syn::Type) -> bool {\n    match ungroup(ty) {\n        syn::Type::Slice(ty) => is_primitive_type(&ty.elem, \"u8\"),\n        _ => false,\n    }\n}\n\nfn is_primitive_type(ty: &syn::Type, primitive: &str) -> bool {\n    match ungroup(ty) {\n        syn::Type::Path(ty) => ty.qself.is_none() && is_primitive_path(&ty.path, primitive),\n        _ => false,\n    }\n}\n\nfn is_primitive_path(path: &syn::Path, primitive: &str) -> bool {\n    path.leading_colon.is_none()\n        && path.segments.len() == 1\n        && path.segments[0].ident == primitive\n        && path.segments[0].arguments.is_empty()\n}\n\n// All lifetimes that this type could borrow from a Deserializer.\n//\n// For example a type `S<'a, 'b>` could borrow `'a` and `'b`. On the other hand\n// a type `for<'a> fn(&'a str)` could not borrow `'a` from the Deserializer.\n//\n// This is used when there is an explicit or implicit `#[serde(borrow)]`\n// attribute on the field so there must be at least one borrowable lifetime.\nfn borrowable_lifetimes(\n    cx: &Ctxt,\n    name: &Name,\n    field: &syn::Field,\n) -> Result<BTreeSet<syn::Lifetime>, ()> {\n    let mut lifetimes = BTreeSet::new();\n    collect_lifetimes(&field.ty, &mut lifetimes);\n    if lifetimes.is_empty() {\n        let msg = format!(\"field `{}` has no lifetimes to borrow\", name);\n        cx.error_spanned_by(field, msg);\n        Err(())\n    } else {\n        Ok(lifetimes)\n    }\n}\n\nfn collect_lifetimes(ty: &syn::Type, out: &mut BTreeSet<syn::Lifetime>) {\n    match ty {\n        #![cfg_attr(all(test, exhaustive), deny(non_exhaustive_omitted_patterns))]\n        syn::Type::Slice(ty) => {\n            collect_lifetimes(&ty.elem, out);\n        }\n        syn::Type::Array(ty) => {\n            collect_lifetimes(&ty.elem, out);\n        }\n        syn::Type::Ptr(ty) => {\n            collect_lifetimes(&ty.elem, out);\n        }\n        syn::Type::Reference(ty) => {\n            out.extend(ty.lifetime.iter().cloned());\n            collect_lifetimes(&ty.elem, out);\n        }\n        syn::Type::Tuple(ty) => {\n            for elem in &ty.elems {\n                collect_lifetimes(elem, out);\n            }\n        }\n        syn::Type::Path(ty) => {\n            if let Some(qself) = &ty.qself {\n                collect_lifetimes(&qself.ty, out);\n            }\n            for seg in &ty.path.segments {\n                if let syn::PathArguments::AngleBracketed(bracketed) = &seg.arguments {\n                    for arg in &bracketed.args {\n                        match arg {\n                            syn::GenericArgument::Lifetime(lifetime) => {\n                                out.insert(lifetime.clone());\n                            }\n                            syn::GenericArgument::Type(ty) => {\n                                collect_lifetimes(ty, out);\n                            }\n                            syn::GenericArgument::AssocType(binding) => {\n                                collect_lifetimes(&binding.ty, out);\n                            }\n                            syn::GenericArgument::Const(_)\n                            | syn::GenericArgument::AssocConst(_)\n                            | syn::GenericArgument::Constraint(_)\n                            | _ => {}\n                        }\n                    }\n                }\n            }\n        }\n        syn::Type::Paren(ty) => {\n            collect_lifetimes(&ty.elem, out);\n        }\n        syn::Type::Group(ty) => {\n            collect_lifetimes(&ty.elem, out);\n        }\n        syn::Type::Macro(ty) => {\n            collect_lifetimes_from_tokens(ty.mac.tokens.clone(), out);\n        }\n        syn::Type::BareFn(_)\n        | syn::Type::Never(_)\n        | syn::Type::TraitObject(_)\n        | syn::Type::ImplTrait(_)\n        | syn::Type::Infer(_)\n        | syn::Type::Verbatim(_) => {}\n\n        _ => {}\n    }\n}\n\nfn collect_lifetimes_from_tokens(tokens: TokenStream, out: &mut BTreeSet<syn::Lifetime>) {\n    let mut iter = tokens.into_iter();\n    while let Some(tt) = iter.next() {\n        match &tt {\n            TokenTree::Punct(op) if op.as_char() == '\\'' && op.spacing() == Spacing::Joint => {\n                if let Some(TokenTree::Ident(ident)) = iter.next() {\n                    out.insert(syn::Lifetime {\n                        apostrophe: op.span(),\n                        ident,\n                    });\n                }\n            }\n            TokenTree::Group(group) => {\n                let tokens = group.stream();\n                collect_lifetimes_from_tokens(tokens, out);\n            }\n            _ => {}\n        }\n    }\n}\n"
  },
  {
    "path": "serde_derive/src/internals/case.rs",
    "content": "//! Code to convert the Rust-styled field/variant (e.g. `my_field`, `MyType`) to the\n//! case of the source (e.g. `my-field`, `MY_FIELD`).\n\nuse self::RenameRule::*;\nuse std::fmt::{self, Debug, Display};\n\n/// The different possible ways to change case of fields in a struct, or variants in an enum.\n#[derive(Copy, Clone, PartialEq)]\npub enum RenameRule {\n    /// Don't apply a default rename rule.\n    None,\n    /// Rename direct children to \"lowercase\" style.\n    LowerCase,\n    /// Rename direct children to \"UPPERCASE\" style.\n    UpperCase,\n    /// Rename direct children to \"PascalCase\" style, as typically used for\n    /// enum variants.\n    PascalCase,\n    /// Rename direct children to \"camelCase\" style.\n    CamelCase,\n    /// Rename direct children to \"snake_case\" style, as commonly used for\n    /// fields.\n    SnakeCase,\n    /// Rename direct children to \"SCREAMING_SNAKE_CASE\" style, as commonly\n    /// used for constants.\n    ScreamingSnakeCase,\n    /// Rename direct children to \"kebab-case\" style.\n    KebabCase,\n    /// Rename direct children to \"SCREAMING-KEBAB-CASE\" style.\n    ScreamingKebabCase,\n}\n\nstatic RENAME_RULES: &[(&str, RenameRule)] = &[\n    (\"lowercase\", LowerCase),\n    (\"UPPERCASE\", UpperCase),\n    (\"PascalCase\", PascalCase),\n    (\"camelCase\", CamelCase),\n    (\"snake_case\", SnakeCase),\n    (\"SCREAMING_SNAKE_CASE\", ScreamingSnakeCase),\n    (\"kebab-case\", KebabCase),\n    (\"SCREAMING-KEBAB-CASE\", ScreamingKebabCase),\n];\n\nimpl RenameRule {\n    pub fn from_str(rename_all_str: &str) -> Result<Self, ParseError> {\n        for (name, rule) in RENAME_RULES {\n            if rename_all_str == *name {\n                return Ok(*rule);\n            }\n        }\n        Err(ParseError {\n            unknown: rename_all_str,\n        })\n    }\n\n    /// Apply a renaming rule to an enum variant, returning the version expected in the source.\n    pub fn apply_to_variant(self, variant: &str) -> String {\n        match self {\n            None | PascalCase => variant.to_owned(),\n            LowerCase => variant.to_ascii_lowercase(),\n            UpperCase => variant.to_ascii_uppercase(),\n            CamelCase => variant[..1].to_ascii_lowercase() + &variant[1..],\n            SnakeCase => {\n                let mut snake = String::new();\n                for (i, ch) in variant.char_indices() {\n                    if i > 0 && ch.is_uppercase() {\n                        snake.push('_');\n                    }\n                    snake.push(ch.to_ascii_lowercase());\n                }\n                snake\n            }\n            ScreamingSnakeCase => SnakeCase.apply_to_variant(variant).to_ascii_uppercase(),\n            KebabCase => SnakeCase.apply_to_variant(variant).replace('_', \"-\"),\n            ScreamingKebabCase => ScreamingSnakeCase\n                .apply_to_variant(variant)\n                .replace('_', \"-\"),\n        }\n    }\n\n    /// Apply a renaming rule to a struct field, returning the version expected in the source.\n    pub fn apply_to_field(self, field: &str) -> String {\n        match self {\n            None | LowerCase | SnakeCase => field.to_owned(),\n            UpperCase => field.to_ascii_uppercase(),\n            PascalCase => {\n                let mut pascal = String::new();\n                let mut capitalize = true;\n                for ch in field.chars() {\n                    if ch == '_' {\n                        capitalize = true;\n                    } else if capitalize {\n                        pascal.push(ch.to_ascii_uppercase());\n                        capitalize = false;\n                    } else {\n                        pascal.push(ch);\n                    }\n                }\n                pascal\n            }\n            CamelCase => {\n                let pascal = PascalCase.apply_to_field(field);\n                pascal[..1].to_ascii_lowercase() + &pascal[1..]\n            }\n            ScreamingSnakeCase => field.to_ascii_uppercase(),\n            KebabCase => field.replace('_', \"-\"),\n            ScreamingKebabCase => ScreamingSnakeCase.apply_to_field(field).replace('_', \"-\"),\n        }\n    }\n\n    /// Returns the `RenameRule` if it is not `None`, `rule_b` otherwise.\n    pub fn or(self, rule_b: Self) -> Self {\n        match self {\n            None => rule_b,\n            _ => self,\n        }\n    }\n}\n\npub struct ParseError<'a> {\n    unknown: &'a str,\n}\n\nimpl<'a> Display for ParseError<'a> {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        f.write_str(\"unknown rename rule `rename_all = \")?;\n        Debug::fmt(self.unknown, f)?;\n        f.write_str(\"`, expected one of \")?;\n        for (i, (name, _rule)) in RENAME_RULES.iter().enumerate() {\n            if i > 0 {\n                f.write_str(\", \")?;\n            }\n            Debug::fmt(name, f)?;\n        }\n        Ok(())\n    }\n}\n\n#[test]\nfn rename_variants() {\n    for &(original, lower, upper, camel, snake, screaming, kebab, screaming_kebab) in &[\n        (\n            \"Outcome\", \"outcome\", \"OUTCOME\", \"outcome\", \"outcome\", \"OUTCOME\", \"outcome\", \"OUTCOME\",\n        ),\n        (\n            \"VeryTasty\",\n            \"verytasty\",\n            \"VERYTASTY\",\n            \"veryTasty\",\n            \"very_tasty\",\n            \"VERY_TASTY\",\n            \"very-tasty\",\n            \"VERY-TASTY\",\n        ),\n        (\"A\", \"a\", \"A\", \"a\", \"a\", \"A\", \"a\", \"A\"),\n        (\"Z42\", \"z42\", \"Z42\", \"z42\", \"z42\", \"Z42\", \"z42\", \"Z42\"),\n    ] {\n        assert_eq!(None.apply_to_variant(original), original);\n        assert_eq!(LowerCase.apply_to_variant(original), lower);\n        assert_eq!(UpperCase.apply_to_variant(original), upper);\n        assert_eq!(PascalCase.apply_to_variant(original), original);\n        assert_eq!(CamelCase.apply_to_variant(original), camel);\n        assert_eq!(SnakeCase.apply_to_variant(original), snake);\n        assert_eq!(ScreamingSnakeCase.apply_to_variant(original), screaming);\n        assert_eq!(KebabCase.apply_to_variant(original), kebab);\n        assert_eq!(\n            ScreamingKebabCase.apply_to_variant(original),\n            screaming_kebab\n        );\n    }\n}\n\n#[test]\nfn rename_fields() {\n    for &(original, upper, pascal, camel, screaming, kebab, screaming_kebab) in &[\n        (\n            \"outcome\", \"OUTCOME\", \"Outcome\", \"outcome\", \"OUTCOME\", \"outcome\", \"OUTCOME\",\n        ),\n        (\n            \"very_tasty\",\n            \"VERY_TASTY\",\n            \"VeryTasty\",\n            \"veryTasty\",\n            \"VERY_TASTY\",\n            \"very-tasty\",\n            \"VERY-TASTY\",\n        ),\n        (\"a\", \"A\", \"A\", \"a\", \"A\", \"a\", \"A\"),\n        (\"z42\", \"Z42\", \"Z42\", \"z42\", \"Z42\", \"z42\", \"Z42\"),\n    ] {\n        assert_eq!(None.apply_to_field(original), original);\n        assert_eq!(UpperCase.apply_to_field(original), upper);\n        assert_eq!(PascalCase.apply_to_field(original), pascal);\n        assert_eq!(CamelCase.apply_to_field(original), camel);\n        assert_eq!(SnakeCase.apply_to_field(original), original);\n        assert_eq!(ScreamingSnakeCase.apply_to_field(original), screaming);\n        assert_eq!(KebabCase.apply_to_field(original), kebab);\n        assert_eq!(ScreamingKebabCase.apply_to_field(original), screaming_kebab);\n    }\n}\n"
  },
  {
    "path": "serde_derive/src/internals/check.rs",
    "content": "use crate::internals::ast::{Container, Data, Field, Style};\nuse crate::internals::attr::{Default, Identifier, TagType};\nuse crate::internals::{ungroup, Ctxt, Derive};\nuse syn::{Member, Type};\n\n// Cross-cutting checks that require looking at more than a single attrs object.\n// Simpler checks should happen when parsing and building the attrs.\npub fn check(cx: &Ctxt, cont: &mut Container, derive: Derive) {\n    check_default_on_tuple(cx, cont);\n    check_remote_generic(cx, cont);\n    check_getter(cx, cont);\n    check_flatten(cx, cont);\n    check_identifier(cx, cont);\n    check_variant_skip_attrs(cx, cont);\n    check_internal_tag_field_name_conflict(cx, cont);\n    check_adjacent_tag_conflict(cx, cont);\n    check_transparent(cx, cont, derive);\n    check_from_and_try_from(cx, cont);\n}\n\n// If some field of a tuple struct is marked #[serde(default)] then all fields\n// after it must also be marked with that attribute, or the struct must have a\n// container-level serde(default) attribute. A field's default value is only\n// used for tuple fields if the sequence is exhausted at that point; that means\n// all subsequent fields will fail to deserialize if they don't have their own\n// default.\nfn check_default_on_tuple(cx: &Ctxt, cont: &Container) {\n    if let Default::None = cont.attrs.default() {\n        if let Data::Struct(Style::Tuple, fields) = &cont.data {\n            let mut first_default_index = None;\n            for (i, field) in fields.iter().enumerate() {\n                // Skipped fields automatically get the #[serde(default)]\n                // attribute. We are interested only on non-skipped fields here.\n                if field.attrs.skip_deserializing() {\n                    continue;\n                }\n                if let Default::None = field.attrs.default() {\n                    if let Some(first) = first_default_index {\n                        cx.error_spanned_by(\n                            field.ty,\n                            format!(\"field must have #[serde(default)] because previous field {} has #[serde(default)]\", first),\n                        );\n                    }\n                    continue;\n                }\n                if first_default_index.is_none() {\n                    first_default_index = Some(i);\n                }\n            }\n        }\n    }\n}\n\n// Remote derive definition type must have either all of the generics of the\n// remote type:\n//\n//     #[serde(remote = \"Generic\")]\n//     struct Generic<T> {…}\n//\n// or none of them, i.e. defining impls for one concrete instantiation of the\n// remote type only:\n//\n//     #[serde(remote = \"Generic<T>\")]\n//     struct ConcreteDef {…}\n//\nfn check_remote_generic(cx: &Ctxt, cont: &Container) {\n    if let Some(remote) = cont.attrs.remote() {\n        let local_has_generic = !cont.generics.params.is_empty();\n        let remote_has_generic = !remote.segments.last().unwrap().arguments.is_none();\n        if local_has_generic && remote_has_generic {\n            cx.error_spanned_by(remote, \"remove generic parameters from this path\");\n        }\n    }\n}\n\n// Getters are only allowed inside structs (not enums) with the `remote`\n// attribute.\nfn check_getter(cx: &Ctxt, cont: &Container) {\n    match cont.data {\n        Data::Enum(_) => {\n            if cont.data.has_getter() {\n                cx.error_spanned_by(\n                    cont.original,\n                    \"#[serde(getter = \\\"...\\\")] is not allowed in an enum\",\n                );\n            }\n        }\n        Data::Struct(_, _) => {\n            if cont.data.has_getter() && cont.attrs.remote().is_none() {\n                cx.error_spanned_by(\n                    cont.original,\n                    \"#[serde(getter = \\\"...\\\")] can only be used in structs that have #[serde(remote = \\\"...\\\")]\",\n                );\n            }\n        }\n    }\n}\n\n// Flattening has some restrictions we can test.\nfn check_flatten(cx: &Ctxt, cont: &Container) {\n    match &cont.data {\n        Data::Enum(variants) => {\n            for variant in variants {\n                for field in &variant.fields {\n                    check_flatten_field(cx, variant.style, field);\n                }\n            }\n        }\n        Data::Struct(style, fields) => {\n            for field in fields {\n                check_flatten_field(cx, *style, field);\n            }\n        }\n    }\n}\n\nfn check_flatten_field(cx: &Ctxt, style: Style, field: &Field) {\n    if !field.attrs.flatten() {\n        return;\n    }\n    match style {\n        Style::Tuple => {\n            cx.error_spanned_by(\n                field.original,\n                \"#[serde(flatten)] cannot be used on tuple structs\",\n            );\n        }\n        Style::Newtype => {\n            cx.error_spanned_by(\n                field.original,\n                \"#[serde(flatten)] cannot be used on newtype structs\",\n            );\n        }\n        _ => {}\n    }\n}\n\n// The `other` attribute must be used at most once and it must be the last\n// variant of an enum.\n//\n// Inside a `variant_identifier` all variants must be unit variants. Inside a\n// `field_identifier` all but possibly one variant must be unit variants. The\n// last variant may be a newtype variant which is an implicit \"other\" case.\nfn check_identifier(cx: &Ctxt, cont: &Container) {\n    let variants = match &cont.data {\n        Data::Enum(variants) => variants,\n        Data::Struct(_, _) => return,\n    };\n\n    for (i, variant) in variants.iter().enumerate() {\n        match (\n            variant.style,\n            cont.attrs.identifier(),\n            variant.attrs.other(),\n            cont.attrs.tag(),\n        ) {\n            // The `other` attribute may not be used in a variant_identifier.\n            (_, Identifier::Variant, true, _) => {\n                cx.error_spanned_by(\n                    variant.original,\n                    \"#[serde(other)] may not be used on a variant identifier\",\n                );\n            }\n\n            // Variant with `other` attribute cannot appear in untagged enum\n            (_, Identifier::No, true, &TagType::None) => {\n                cx.error_spanned_by(\n                    variant.original,\n                    \"#[serde(other)] cannot appear on untagged enum\",\n                );\n            }\n\n            // Variant with `other` attribute must be the last one.\n            (Style::Unit, Identifier::Field, true, _) | (Style::Unit, Identifier::No, true, _) => {\n                if i < variants.len() - 1 {\n                    cx.error_spanned_by(\n                        variant.original,\n                        \"#[serde(other)] must be on the last variant\",\n                    );\n                }\n            }\n\n            // Variant with `other` attribute must be a unit variant.\n            (_, Identifier::Field, true, _) | (_, Identifier::No, true, _) => {\n                cx.error_spanned_by(\n                    variant.original,\n                    \"#[serde(other)] must be on a unit variant\",\n                );\n            }\n\n            // Any sort of variant is allowed if this is not an identifier.\n            (_, Identifier::No, false, _) => {}\n\n            // Unit variant without `other` attribute is always fine.\n            (Style::Unit, _, false, _) => {}\n\n            // The last field is allowed to be a newtype catch-all.\n            (Style::Newtype, Identifier::Field, false, _) => {\n                if i < variants.len() - 1 {\n                    cx.error_spanned_by(\n                        variant.original,\n                        format!(\"`{}` must be the last variant\", variant.ident),\n                    );\n                }\n            }\n\n            (_, Identifier::Field, false, _) => {\n                cx.error_spanned_by(\n                    variant.original,\n                    \"#[serde(field_identifier)] may only contain unit variants\",\n                );\n            }\n\n            (_, Identifier::Variant, false, _) => {\n                cx.error_spanned_by(\n                    variant.original,\n                    \"#[serde(variant_identifier)] may only contain unit variants\",\n                );\n            }\n        }\n    }\n}\n\n// Skip-(de)serializing attributes are not allowed on variants marked\n// (de)serialize_with.\nfn check_variant_skip_attrs(cx: &Ctxt, cont: &Container) {\n    let variants = match &cont.data {\n        Data::Enum(variants) => variants,\n        Data::Struct(_, _) => return,\n    };\n\n    for variant in variants {\n        if variant.attrs.serialize_with().is_some() {\n            if variant.attrs.skip_serializing() {\n                cx.error_spanned_by(\n                    variant.original,\n                    format!(\n                        \"variant `{}` cannot have both #[serde(serialize_with)] and #[serde(skip_serializing)]\",\n                        variant.ident\n                    ),\n                );\n            }\n\n            for field in &variant.fields {\n                let member = member_message(&field.member);\n\n                if field.attrs.skip_serializing() {\n                    cx.error_spanned_by(\n                        variant.original,\n                        format!(\n                            \"variant `{}` cannot have both #[serde(serialize_with)] and a field {} marked with #[serde(skip_serializing)]\",\n                            variant.ident, member\n                        ),\n                    );\n                }\n\n                if field.attrs.skip_serializing_if().is_some() {\n                    cx.error_spanned_by(\n                        variant.original,\n                        format!(\n                            \"variant `{}` cannot have both #[serde(serialize_with)] and a field {} marked with #[serde(skip_serializing_if)]\",\n                            variant.ident, member\n                        ),\n                    );\n                }\n            }\n        }\n\n        if variant.attrs.deserialize_with().is_some() {\n            if variant.attrs.skip_deserializing() {\n                cx.error_spanned_by(\n                    variant.original,\n                    format!(\n                        \"variant `{}` cannot have both #[serde(deserialize_with)] and #[serde(skip_deserializing)]\",\n                        variant.ident\n                    ),\n                );\n            }\n\n            for field in &variant.fields {\n                if field.attrs.skip_deserializing() {\n                    let member = member_message(&field.member);\n\n                    cx.error_spanned_by(\n                        variant.original,\n                        format!(\n                            \"variant `{}` cannot have both #[serde(deserialize_with)] and a field {} marked with #[serde(skip_deserializing)]\",\n                            variant.ident, member\n                        ),\n                    );\n                }\n            }\n        }\n    }\n}\n\n// The tag of an internally-tagged struct variant must not be the same as either\n// one of its fields, as this would result in duplicate keys in the serialized\n// output and/or ambiguity in the to-be-deserialized input.\nfn check_internal_tag_field_name_conflict(cx: &Ctxt, cont: &Container) {\n    let variants = match &cont.data {\n        Data::Enum(variants) => variants,\n        Data::Struct(_, _) => return,\n    };\n\n    let tag = match cont.attrs.tag() {\n        TagType::Internal { tag } => tag.as_str(),\n        TagType::External | TagType::Adjacent { .. } | TagType::None => return,\n    };\n\n    let diagnose_conflict = || {\n        cx.error_spanned_by(\n            cont.original,\n            format!(\"variant field name `{}` conflicts with internal tag\", tag),\n        );\n    };\n\n    for variant in variants {\n        match variant.style {\n            Style::Struct => {\n                if variant.attrs.untagged() {\n                    continue;\n                }\n                for field in &variant.fields {\n                    let check_ser =\n                        !(field.attrs.skip_serializing() || variant.attrs.skip_serializing());\n                    let check_de =\n                        !(field.attrs.skip_deserializing() || variant.attrs.skip_deserializing());\n                    let name = field.attrs.name();\n                    let ser_name = name.serialize_name();\n\n                    if check_ser && ser_name.value == tag {\n                        diagnose_conflict();\n                        return;\n                    }\n\n                    for de_name in field.attrs.aliases() {\n                        if check_de && de_name.value == tag {\n                            diagnose_conflict();\n                            return;\n                        }\n                    }\n                }\n            }\n            Style::Unit | Style::Newtype | Style::Tuple => {}\n        }\n    }\n}\n\n// In the case of adjacently-tagged enums, the type and the contents tag must\n// differ, for the same reason.\nfn check_adjacent_tag_conflict(cx: &Ctxt, cont: &Container) {\n    let (type_tag, content_tag) = match cont.attrs.tag() {\n        TagType::Adjacent { tag, content } => (tag, content),\n        TagType::Internal { .. } | TagType::External | TagType::None => return,\n    };\n\n    if type_tag == content_tag {\n        cx.error_spanned_by(\n            cont.original,\n            format!(\n                \"enum tags `{}` for type and content conflict with each other\",\n                type_tag\n            ),\n        );\n    }\n}\n\n// Enums and unit structs cannot be transparent.\nfn check_transparent(cx: &Ctxt, cont: &mut Container, derive: Derive) {\n    if !cont.attrs.transparent() {\n        return;\n    }\n\n    if cont.attrs.type_from().is_some() {\n        cx.error_spanned_by(\n            cont.original,\n            \"#[serde(transparent)] is not allowed with #[serde(from = \\\"...\\\")]\",\n        );\n    }\n\n    if cont.attrs.type_try_from().is_some() {\n        cx.error_spanned_by(\n            cont.original,\n            \"#[serde(transparent)] is not allowed with #[serde(try_from = \\\"...\\\")]\",\n        );\n    }\n\n    if cont.attrs.type_into().is_some() {\n        cx.error_spanned_by(\n            cont.original,\n            \"#[serde(transparent)] is not allowed with #[serde(into = \\\"...\\\")]\",\n        );\n    }\n\n    let fields = match &mut cont.data {\n        Data::Enum(_) => {\n            cx.error_spanned_by(\n                cont.original,\n                \"#[serde(transparent)] is not allowed on an enum\",\n            );\n            return;\n        }\n        Data::Struct(Style::Unit, _) => {\n            cx.error_spanned_by(\n                cont.original,\n                \"#[serde(transparent)] is not allowed on a unit struct\",\n            );\n            return;\n        }\n        Data::Struct(_, fields) => fields,\n    };\n\n    let mut transparent_field = None;\n\n    for field in fields {\n        if allow_transparent(field, derive) {\n            if transparent_field.is_some() {\n                cx.error_spanned_by(\n                    cont.original,\n                    \"#[serde(transparent)] requires struct to have at most one transparent field\",\n                );\n                return;\n            }\n            transparent_field = Some(field);\n        }\n    }\n\n    match transparent_field {\n        Some(transparent_field) => transparent_field.attrs.mark_transparent(),\n        None => match derive {\n            Derive::Serialize => {\n                cx.error_spanned_by(\n                    cont.original,\n                    \"#[serde(transparent)] requires at least one field that is not skipped\",\n                );\n            }\n            Derive::Deserialize => {\n                cx.error_spanned_by(\n                    cont.original,\n                    \"#[serde(transparent)] requires at least one field that is neither skipped nor has a default\",\n                );\n            }\n        },\n    }\n}\n\nfn member_message(member: &Member) -> String {\n    match member {\n        Member::Named(ident) => format!(\"`{}`\", ident),\n        Member::Unnamed(i) => format!(\"#{}\", i.index),\n    }\n}\n\nfn allow_transparent(field: &Field, derive: Derive) -> bool {\n    if let Type::Path(ty) = ungroup(field.ty) {\n        if let Some(seg) = ty.path.segments.last() {\n            if seg.ident == \"PhantomData\" {\n                return false;\n            }\n        }\n    }\n\n    match derive {\n        Derive::Serialize => !field.attrs.skip_serializing(),\n        Derive::Deserialize => !field.attrs.skip_deserializing() && field.attrs.default().is_none(),\n    }\n}\n\nfn check_from_and_try_from(cx: &Ctxt, cont: &mut Container) {\n    if cont.attrs.type_from().is_some() && cont.attrs.type_try_from().is_some() {\n        cx.error_spanned_by(\n            cont.original,\n            \"#[serde(from = \\\"...\\\")] and #[serde(try_from = \\\"...\\\")] conflict with each other\",\n        );\n    }\n}\n"
  },
  {
    "path": "serde_derive/src/internals/ctxt.rs",
    "content": "use quote::ToTokens;\nuse std::cell::RefCell;\nuse std::fmt::Display;\nuse std::thread;\n\n/// A type to collect errors together and format them.\n///\n/// Dropping this object will cause a panic. It must be consumed using `check`.\n///\n/// References can be shared since this type uses run-time exclusive mut checking.\n#[derive(Default)]\npub struct Ctxt {\n    // The contents will be set to `None` during checking. This is so that checking can be\n    // enforced.\n    errors: RefCell<Option<Vec<syn::Error>>>,\n}\n\nimpl Ctxt {\n    /// Create a new context object.\n    ///\n    /// This object contains no errors, but will still trigger a panic if it is not `check`ed.\n    pub fn new() -> Self {\n        Ctxt {\n            errors: RefCell::new(Some(Vec::new())),\n        }\n    }\n\n    /// Add an error to the context object with a tokenizable object.\n    ///\n    /// The object is used for spanning in error messages.\n    pub fn error_spanned_by<A: ToTokens, T: Display>(&self, obj: A, msg: T) {\n        self.errors\n            .borrow_mut()\n            .as_mut()\n            .unwrap()\n            // Curb monomorphization from generating too many identical methods.\n            .push(syn::Error::new_spanned(obj.into_token_stream(), msg));\n    }\n\n    /// Add one of Syn's parse errors.\n    pub fn syn_error(&self, err: syn::Error) {\n        self.errors.borrow_mut().as_mut().unwrap().push(err);\n    }\n\n    /// Consume this object, producing a formatted error string if there are errors.\n    pub fn check(self) -> syn::Result<()> {\n        let mut errors = self.errors.borrow_mut().take().unwrap().into_iter();\n\n        let Some(mut combined) = errors.next() else {\n            return Ok(());\n        };\n\n        for rest in errors {\n            combined.combine(rest);\n        }\n\n        Err(combined)\n    }\n}\n\nimpl Drop for Ctxt {\n    fn drop(&mut self) {\n        if !thread::panicking() && self.errors.borrow().is_some() {\n            panic!(\"forgot to check for errors\");\n        }\n    }\n}\n"
  },
  {
    "path": "serde_derive/src/internals/mod.rs",
    "content": "pub mod ast;\npub mod attr;\npub mod name;\n\nmod case;\nmod check;\nmod ctxt;\nmod receiver;\nmod respan;\nmod symbol;\n\nuse syn::Type;\n\npub use self::ctxt::Ctxt;\npub use self::receiver::replace_receiver;\n\n#[derive(Copy, Clone)]\npub enum Derive {\n    Serialize,\n    Deserialize,\n}\n\npub fn ungroup(mut ty: &Type) -> &Type {\n    while let Type::Group(group) = ty {\n        ty = &group.elem;\n    }\n    ty\n}\n"
  },
  {
    "path": "serde_derive/src/internals/name.rs",
    "content": "use crate::internals::attr::{Attr, VecAttr};\nuse proc_macro2::{Ident, Span, TokenStream};\nuse quote::ToTokens;\nuse std::cmp::Ordering;\nuse std::collections::BTreeSet;\nuse std::fmt::{self, Display};\nuse syn::LitStr;\n\npub struct MultiName {\n    pub(crate) serialize: Name,\n    pub(crate) serialize_renamed: bool,\n    pub(crate) deserialize: Name,\n    pub(crate) deserialize_renamed: bool,\n    pub(crate) deserialize_aliases: BTreeSet<Name>,\n}\n\nimpl MultiName {\n    pub(crate) fn from_attrs(\n        source_name: Name,\n        ser_name: Attr<Name>,\n        de_name: Attr<Name>,\n        de_aliases: Option<VecAttr<Name>>,\n    ) -> Self {\n        let mut alias_set = BTreeSet::new();\n        if let Some(de_aliases) = de_aliases {\n            for alias_name in de_aliases.get() {\n                alias_set.insert(alias_name);\n            }\n        }\n\n        let ser_name = ser_name.get();\n        let ser_renamed = ser_name.is_some();\n        let de_name = de_name.get();\n        let de_renamed = de_name.is_some();\n        MultiName {\n            serialize: ser_name.unwrap_or_else(|| source_name.clone()),\n            serialize_renamed: ser_renamed,\n            deserialize: de_name.unwrap_or(source_name),\n            deserialize_renamed: de_renamed,\n            deserialize_aliases: alias_set,\n        }\n    }\n\n    /// Return the container name for the container when serializing.\n    pub fn serialize_name(&self) -> &Name {\n        &self.serialize\n    }\n\n    /// Return the container name for the container when deserializing.\n    pub fn deserialize_name(&self) -> &Name {\n        &self.deserialize\n    }\n\n    pub(crate) fn deserialize_aliases(&self) -> &BTreeSet<Name> {\n        &self.deserialize_aliases\n    }\n}\n\n#[derive(Clone)]\npub struct Name {\n    pub value: String,\n    pub span: Span,\n}\n\nimpl ToTokens for Name {\n    fn to_tokens(&self, tokens: &mut TokenStream) {\n        LitStr::new(&self.value, self.span).to_tokens(tokens);\n    }\n}\n\nimpl Ord for Name {\n    fn cmp(&self, other: &Self) -> Ordering {\n        Ord::cmp(&self.value, &other.value)\n    }\n}\n\nimpl PartialOrd for Name {\n    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {\n        Some(Ord::cmp(self, other))\n    }\n}\n\nimpl Eq for Name {}\n\nimpl PartialEq for Name {\n    fn eq(&self, other: &Self) -> bool {\n        self.value == other.value\n    }\n}\n\nimpl From<&Ident> for Name {\n    fn from(ident: &Ident) -> Self {\n        Name {\n            value: ident.to_string(),\n            span: ident.span(),\n        }\n    }\n}\n\nimpl From<&LitStr> for Name {\n    fn from(lit: &LitStr) -> Self {\n        Name {\n            value: lit.value(),\n            span: lit.span(),\n        }\n    }\n}\n\nimpl Display for Name {\n    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        Display::fmt(&self.value, formatter)\n    }\n}\n"
  },
  {
    "path": "serde_derive/src/internals/receiver.rs",
    "content": "use crate::internals::respan::respan;\nuse proc_macro2::Span;\nuse quote::ToTokens;\nuse std::mem;\nuse syn::{\n    parse_quote, Data, DeriveInput, Expr, ExprPath, GenericArgument, GenericParam, Generics, Macro,\n    Path, PathArguments, QSelf, ReturnType, Token, Type, TypeParamBound, TypePath, WherePredicate,\n};\n\npub fn replace_receiver(input: &mut DeriveInput) {\n    let self_ty = {\n        let ident = &input.ident;\n        let ty_generics = input.generics.split_for_impl().1;\n        parse_quote!(#ident #ty_generics)\n    };\n    let mut visitor = ReplaceReceiver(&self_ty);\n    visitor.visit_generics_mut(&mut input.generics);\n    visitor.visit_data_mut(&mut input.data);\n}\n\nstruct ReplaceReceiver<'a>(&'a TypePath);\n\nimpl ReplaceReceiver<'_> {\n    fn self_ty(&self, span: Span) -> TypePath {\n        let tokens = self.0.to_token_stream();\n        let respanned = respan(tokens, span);\n        syn::parse2(respanned).unwrap()\n    }\n\n    fn self_to_qself(&self, qself: &mut Option<QSelf>, path: &mut Path) {\n        if path.leading_colon.is_some() || path.segments[0].ident != \"Self\" {\n            return;\n        }\n\n        if path.segments.len() == 1 {\n            self.self_to_expr_path(path);\n            return;\n        }\n\n        let span = path.segments[0].ident.span();\n        *qself = Some(QSelf {\n            lt_token: Token![<](span),\n            ty: Box::new(Type::Path(self.self_ty(span))),\n            position: 0,\n            as_token: None,\n            gt_token: Token![>](span),\n        });\n\n        path.leading_colon = Some(**path.segments.pairs().next().unwrap().punct().unwrap());\n\n        let segments = mem::take(&mut path.segments);\n        path.segments = segments.into_pairs().skip(1).collect();\n    }\n\n    fn self_to_expr_path(&self, path: &mut Path) {\n        let self_ty = self.self_ty(path.segments[0].ident.span());\n        let variant = mem::replace(path, self_ty.path);\n        for segment in &mut path.segments {\n            if let PathArguments::AngleBracketed(bracketed) = &mut segment.arguments {\n                if bracketed.colon2_token.is_none() && !bracketed.args.is_empty() {\n                    bracketed.colon2_token = Some(<Token![::]>::default());\n                }\n            }\n        }\n        if variant.segments.len() > 1 {\n            path.segments.push_punct(<Token![::]>::default());\n            path.segments.extend(variant.segments.into_pairs().skip(1));\n        }\n    }\n}\n\nimpl ReplaceReceiver<'_> {\n    // `Self` -> `Receiver`\n    fn visit_type_mut(&mut self, ty: &mut Type) {\n        let span = if let Type::Path(node) = ty {\n            if node.qself.is_none() && node.path.is_ident(\"Self\") {\n                node.path.segments[0].ident.span()\n            } else {\n                self.visit_type_path_mut(node);\n                return;\n            }\n        } else {\n            self.visit_type_mut_impl(ty);\n            return;\n        };\n        *ty = Type::Path(self.self_ty(span));\n    }\n\n    // `Self::Assoc` -> `<Receiver>::Assoc`\n    fn visit_type_path_mut(&mut self, ty: &mut TypePath) {\n        if ty.qself.is_none() {\n            self.self_to_qself(&mut ty.qself, &mut ty.path);\n        }\n        self.visit_type_path_mut_impl(ty);\n    }\n\n    // `Self::method` -> `<Receiver>::method`\n    fn visit_expr_path_mut(&mut self, expr: &mut ExprPath) {\n        if expr.qself.is_none() {\n            self.self_to_qself(&mut expr.qself, &mut expr.path);\n        }\n        self.visit_expr_path_mut_impl(expr);\n    }\n\n    // Everything below is simply traversing the syntax tree.\n\n    fn visit_type_mut_impl(&mut self, ty: &mut Type) {\n        match ty {\n            #![cfg_attr(all(test, exhaustive), deny(non_exhaustive_omitted_patterns))]\n            Type::Array(ty) => {\n                self.visit_type_mut(&mut ty.elem);\n                self.visit_expr_mut(&mut ty.len);\n            }\n            Type::BareFn(ty) => {\n                for arg in &mut ty.inputs {\n                    self.visit_type_mut(&mut arg.ty);\n                }\n                self.visit_return_type_mut(&mut ty.output);\n            }\n            Type::Group(ty) => self.visit_type_mut(&mut ty.elem),\n            Type::ImplTrait(ty) => {\n                for bound in &mut ty.bounds {\n                    self.visit_type_param_bound_mut(bound);\n                }\n            }\n            Type::Macro(ty) => self.visit_macro_mut(&mut ty.mac),\n            Type::Paren(ty) => self.visit_type_mut(&mut ty.elem),\n            Type::Path(ty) => {\n                if let Some(qself) = &mut ty.qself {\n                    self.visit_type_mut(&mut qself.ty);\n                }\n                self.visit_path_mut(&mut ty.path);\n            }\n            Type::Ptr(ty) => self.visit_type_mut(&mut ty.elem),\n            Type::Reference(ty) => self.visit_type_mut(&mut ty.elem),\n            Type::Slice(ty) => self.visit_type_mut(&mut ty.elem),\n            Type::TraitObject(ty) => {\n                for bound in &mut ty.bounds {\n                    self.visit_type_param_bound_mut(bound);\n                }\n            }\n            Type::Tuple(ty) => {\n                for elem in &mut ty.elems {\n                    self.visit_type_mut(elem);\n                }\n            }\n\n            Type::Infer(_) | Type::Never(_) | Type::Verbatim(_) => {}\n\n            _ => {}\n        }\n    }\n\n    fn visit_type_path_mut_impl(&mut self, ty: &mut TypePath) {\n        if let Some(qself) = &mut ty.qself {\n            self.visit_type_mut(&mut qself.ty);\n        }\n        self.visit_path_mut(&mut ty.path);\n    }\n\n    fn visit_expr_path_mut_impl(&mut self, expr: &mut ExprPath) {\n        if let Some(qself) = &mut expr.qself {\n            self.visit_type_mut(&mut qself.ty);\n        }\n        self.visit_path_mut(&mut expr.path);\n    }\n\n    fn visit_path_mut(&mut self, path: &mut Path) {\n        for segment in &mut path.segments {\n            self.visit_path_arguments_mut(&mut segment.arguments);\n        }\n    }\n\n    fn visit_path_arguments_mut(&mut self, arguments: &mut PathArguments) {\n        match arguments {\n            PathArguments::None => {}\n            PathArguments::AngleBracketed(arguments) => {\n                for arg in &mut arguments.args {\n                    match arg {\n                        #![cfg_attr(all(test, exhaustive), deny(non_exhaustive_omitted_patterns))]\n                        GenericArgument::Type(arg) => self.visit_type_mut(arg),\n                        GenericArgument::AssocType(arg) => self.visit_type_mut(&mut arg.ty),\n                        GenericArgument::Lifetime(_)\n                        | GenericArgument::Const(_)\n                        | GenericArgument::AssocConst(_)\n                        | GenericArgument::Constraint(_) => {}\n                        _ => {}\n                    }\n                }\n            }\n            PathArguments::Parenthesized(arguments) => {\n                for argument in &mut arguments.inputs {\n                    self.visit_type_mut(argument);\n                }\n                self.visit_return_type_mut(&mut arguments.output);\n            }\n        }\n    }\n\n    fn visit_return_type_mut(&mut self, return_type: &mut ReturnType) {\n        match return_type {\n            ReturnType::Default => {}\n            ReturnType::Type(_, output) => self.visit_type_mut(output),\n        }\n    }\n\n    fn visit_type_param_bound_mut(&mut self, bound: &mut TypeParamBound) {\n        match bound {\n            #![cfg_attr(all(test, exhaustive), deny(non_exhaustive_omitted_patterns))]\n            TypeParamBound::Trait(bound) => self.visit_path_mut(&mut bound.path),\n            TypeParamBound::Lifetime(_)\n            | TypeParamBound::PreciseCapture(_)\n            | TypeParamBound::Verbatim(_) => {}\n            _ => {}\n        }\n    }\n\n    fn visit_generics_mut(&mut self, generics: &mut Generics) {\n        for param in &mut generics.params {\n            match param {\n                GenericParam::Type(param) => {\n                    for bound in &mut param.bounds {\n                        self.visit_type_param_bound_mut(bound);\n                    }\n                }\n                GenericParam::Lifetime(_) | GenericParam::Const(_) => {}\n            }\n        }\n        if let Some(where_clause) = &mut generics.where_clause {\n            for predicate in &mut where_clause.predicates {\n                match predicate {\n                    #![cfg_attr(all(test, exhaustive), deny(non_exhaustive_omitted_patterns))]\n                    WherePredicate::Type(predicate) => {\n                        self.visit_type_mut(&mut predicate.bounded_ty);\n                        for bound in &mut predicate.bounds {\n                            self.visit_type_param_bound_mut(bound);\n                        }\n                    }\n                    WherePredicate::Lifetime(_) => {}\n                    _ => {}\n                }\n            }\n        }\n    }\n\n    fn visit_data_mut(&mut self, data: &mut Data) {\n        match data {\n            Data::Struct(data) => {\n                for field in &mut data.fields {\n                    self.visit_type_mut(&mut field.ty);\n                }\n            }\n            Data::Enum(data) => {\n                for variant in &mut data.variants {\n                    for field in &mut variant.fields {\n                        self.visit_type_mut(&mut field.ty);\n                    }\n                }\n            }\n            Data::Union(_) => {}\n        }\n    }\n\n    fn visit_expr_mut(&mut self, expr: &mut Expr) {\n        match expr {\n            Expr::Binary(expr) => {\n                self.visit_expr_mut(&mut expr.left);\n                self.visit_expr_mut(&mut expr.right);\n            }\n            Expr::Call(expr) => {\n                self.visit_expr_mut(&mut expr.func);\n                for arg in &mut expr.args {\n                    self.visit_expr_mut(arg);\n                }\n            }\n            Expr::Cast(expr) => {\n                self.visit_expr_mut(&mut expr.expr);\n                self.visit_type_mut(&mut expr.ty);\n            }\n            Expr::Field(expr) => self.visit_expr_mut(&mut expr.base),\n            Expr::Index(expr) => {\n                self.visit_expr_mut(&mut expr.expr);\n                self.visit_expr_mut(&mut expr.index);\n            }\n            Expr::Paren(expr) => self.visit_expr_mut(&mut expr.expr),\n            Expr::Path(expr) => self.visit_expr_path_mut(expr),\n            Expr::Unary(expr) => self.visit_expr_mut(&mut expr.expr),\n            _ => {}\n        }\n    }\n\n    fn visit_macro_mut(&mut self, _mac: &mut Macro) {}\n}\n"
  },
  {
    "path": "serde_derive/src/internals/respan.rs",
    "content": "use proc_macro2::{Group, Span, TokenStream, TokenTree};\n\npub(crate) fn respan(stream: TokenStream, span: Span) -> TokenStream {\n    stream\n        .into_iter()\n        .map(|token| respan_token(token, span))\n        .collect()\n}\n\nfn respan_token(mut token: TokenTree, span: Span) -> TokenTree {\n    if let TokenTree::Group(g) = &mut token {\n        *g = Group::new(g.delimiter(), respan(g.stream(), span));\n    }\n    token.set_span(span);\n    token\n}\n"
  },
  {
    "path": "serde_derive/src/internals/symbol.rs",
    "content": "use std::fmt::{self, Display};\nuse syn::{Ident, Path};\n\n#[derive(Copy, Clone)]\npub struct Symbol(&'static str);\n\npub const ALIAS: Symbol = Symbol(\"alias\");\npub const BORROW: Symbol = Symbol(\"borrow\");\npub const BOUND: Symbol = Symbol(\"bound\");\npub const CONTENT: Symbol = Symbol(\"content\");\npub const CRATE: Symbol = Symbol(\"crate\");\npub const DEFAULT: Symbol = Symbol(\"default\");\npub const DENY_UNKNOWN_FIELDS: Symbol = Symbol(\"deny_unknown_fields\");\npub const DESERIALIZE: Symbol = Symbol(\"deserialize\");\npub const DESERIALIZE_WITH: Symbol = Symbol(\"deserialize_with\");\npub const EXPECTING: Symbol = Symbol(\"expecting\");\npub const FIELD_IDENTIFIER: Symbol = Symbol(\"field_identifier\");\npub const FLATTEN: Symbol = Symbol(\"flatten\");\npub const FROM: Symbol = Symbol(\"from\");\npub const GETTER: Symbol = Symbol(\"getter\");\npub const INTO: Symbol = Symbol(\"into\");\npub const NON_EXHAUSTIVE: Symbol = Symbol(\"non_exhaustive\");\npub const OTHER: Symbol = Symbol(\"other\");\npub const REMOTE: Symbol = Symbol(\"remote\");\npub const RENAME: Symbol = Symbol(\"rename\");\npub const RENAME_ALL: Symbol = Symbol(\"rename_all\");\npub const RENAME_ALL_FIELDS: Symbol = Symbol(\"rename_all_fields\");\npub const REPR: Symbol = Symbol(\"repr\");\npub const SERDE: Symbol = Symbol(\"serde\");\npub const SERIALIZE: Symbol = Symbol(\"serialize\");\npub const SERIALIZE_WITH: Symbol = Symbol(\"serialize_with\");\npub const SKIP: Symbol = Symbol(\"skip\");\npub const SKIP_DESERIALIZING: Symbol = Symbol(\"skip_deserializing\");\npub const SKIP_SERIALIZING: Symbol = Symbol(\"skip_serializing\");\npub const SKIP_SERIALIZING_IF: Symbol = Symbol(\"skip_serializing_if\");\npub const TAG: Symbol = Symbol(\"tag\");\npub const TRANSPARENT: Symbol = Symbol(\"transparent\");\npub const TRY_FROM: Symbol = Symbol(\"try_from\");\npub const UNTAGGED: Symbol = Symbol(\"untagged\");\npub const VARIANT_IDENTIFIER: Symbol = Symbol(\"variant_identifier\");\npub const WITH: Symbol = Symbol(\"with\");\n\nimpl PartialEq<Symbol> for Ident {\n    fn eq(&self, word: &Symbol) -> bool {\n        self == word.0\n    }\n}\n\nimpl PartialEq<Symbol> for &Ident {\n    fn eq(&self, word: &Symbol) -> bool {\n        *self == word.0\n    }\n}\n\nimpl PartialEq<Symbol> for Path {\n    fn eq(&self, word: &Symbol) -> bool {\n        self.is_ident(word.0)\n    }\n}\n\nimpl PartialEq<Symbol> for &Path {\n    fn eq(&self, word: &Symbol) -> bool {\n        self.is_ident(word.0)\n    }\n}\n\nimpl Display for Symbol {\n    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter.write_str(self.0)\n    }\n}\n"
  },
  {
    "path": "serde_derive/src/lib.rs",
    "content": "//! This crate provides Serde's two derive macros.\n//!\n//! ```edition2021\n//! # use serde_derive::{Deserialize, Serialize};\n//! #\n//! #[derive(Serialize, Deserialize)]\n//! # struct S;\n//! #\n//! # fn main() {}\n//! ```\n//!\n//! Please refer to [https://serde.rs/derive.html] for how to set this up.\n//!\n//! [https://serde.rs/derive.html]: https://serde.rs/derive.html\n\n#![doc(html_root_url = \"https://docs.rs/serde_derive/1.0.228\")]\n#![cfg_attr(not(check_cfg), allow(unexpected_cfgs))]\n// Ignored clippy lints\n#![allow(\n    // clippy false positive: https://github.com/rust-lang/rust-clippy/issues/7054\n    clippy::branches_sharing_code,\n    clippy::cognitive_complexity,\n    // clippy bug: https://github.com/rust-lang/rust-clippy/issues/7575\n    clippy::collapsible_match,\n    clippy::derive_partial_eq_without_eq,\n    clippy::enum_variant_names,\n    // clippy bug: https://github.com/rust-lang/rust-clippy/issues/6797\n    clippy::manual_map,\n    clippy::match_like_matches_macro,\n    clippy::needless_lifetimes,\n    clippy::needless_pass_by_value,\n    clippy::too_many_arguments,\n    clippy::trivially_copy_pass_by_ref,\n    clippy::used_underscore_binding,\n    clippy::wildcard_in_or_patterns,\n    // clippy bug: https://github.com/rust-lang/rust-clippy/issues/5704\n    clippy::unnested_or_patterns,\n)]\n// Ignored clippy_pedantic lints\n#![allow(\n    clippy::cast_possible_truncation,\n    clippy::checked_conversions,\n    clippy::doc_markdown,\n    clippy::elidable_lifetime_names,\n    clippy::enum_glob_use,\n    clippy::indexing_slicing,\n    clippy::items_after_statements,\n    clippy::let_underscore_untyped,\n    clippy::manual_assert,\n    clippy::map_err_ignore,\n    clippy::match_same_arms,\n    // clippy bug: https://github.com/rust-lang/rust-clippy/issues/6984\n    clippy::match_wildcard_for_single_variants,\n    clippy::module_name_repetitions,\n    clippy::must_use_candidate,\n    clippy::similar_names,\n    clippy::single_match_else,\n    clippy::struct_excessive_bools,\n    clippy::too_many_lines,\n    clippy::uninlined_format_args,\n    clippy::unseparated_literal_suffix,\n    clippy::unused_self,\n    clippy::use_self,\n    clippy::wildcard_imports\n)]\n#![cfg_attr(all(test, exhaustive), feature(non_exhaustive_omitted_patterns_lint))]\n#![allow(unknown_lints, mismatched_lifetime_syntaxes)]\n\nextern crate proc_macro2;\nextern crate quote;\nextern crate syn;\n\nextern crate proc_macro;\n\nmod internals;\n\nuse proc_macro::TokenStream;\nuse proc_macro2::{Ident, Span};\nuse quote::{ToTokens, TokenStreamExt as _};\nuse syn::parse_macro_input;\nuse syn::DeriveInput;\n\n#[macro_use]\nmod bound;\n#[macro_use]\nmod fragment;\n\nmod de;\nmod deprecated;\nmod dummy;\nmod pretend;\nmod ser;\nmod this;\n\n#[allow(non_camel_case_types)]\nstruct private;\n\nimpl private {\n    fn ident(&self) -> Ident {\n        Ident::new(\n            concat!(\"__private\", env!(\"CARGO_PKG_VERSION_PATCH\")),\n            Span::call_site(),\n        )\n    }\n}\n\nimpl ToTokens for private {\n    fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {\n        tokens.append(self.ident());\n    }\n}\n\n#[proc_macro_derive(Serialize, attributes(serde))]\npub fn derive_serialize(input: TokenStream) -> TokenStream {\n    let mut input = parse_macro_input!(input as DeriveInput);\n    ser::expand_derive_serialize(&mut input)\n        .unwrap_or_else(syn::Error::into_compile_error)\n        .into()\n}\n\n#[proc_macro_derive(Deserialize, attributes(serde))]\npub fn derive_deserialize(input: TokenStream) -> TokenStream {\n    let mut input = parse_macro_input!(input as DeriveInput);\n    de::expand_derive_deserialize(&mut input)\n        .unwrap_or_else(syn::Error::into_compile_error)\n        .into()\n}\n"
  },
  {
    "path": "serde_derive/src/pretend.rs",
    "content": "use crate::internals::ast::{Container, Data, Field, Style, Variant};\nuse crate::private;\nuse proc_macro2::TokenStream;\nuse quote::{format_ident, quote};\n\n// Suppress dead_code warnings that would otherwise appear when using a remote\n// derive. Other than this pretend code, a struct annotated with remote derive\n// never has its fields referenced and an enum annotated with remote derive\n// never has its variants constructed.\n//\n//     warning: field is never used: `i`\n//      --> src/main.rs:4:20\n//       |\n//     4 | struct StructDef { i: i32 }\n//       |                    ^^^^^^\n//\n//     warning: variant is never constructed: `V`\n//      --> src/main.rs:8:16\n//       |\n//     8 | enum EnumDef { V }\n//       |                ^\n//\npub fn pretend_used(cont: &Container, is_packed: bool) -> TokenStream {\n    let pretend_fields = pretend_fields_used(cont, is_packed);\n    let pretend_variants = pretend_variants_used(cont);\n\n    quote! {\n        #pretend_fields\n        #pretend_variants\n    }\n}\n\n// For structs with named fields, expands to:\n//\n//     match None::<&T> {\n//         Some(T { a: __v0, b: __v1 }) => {}\n//         _ => {}\n//     }\n//\n// For packed structs on sufficiently new rustc, expands to:\n//\n//     match None::<&T> {\n//         Some(__v @ T { a: _, b: _ }) => {\n//             let _ = addr_of!(__v.a);\n//             let _ = addr_of!(__v.b);\n//         }\n//         _ => {}\n//     }\n//\n// For packed structs on older rustc, we assume Sized and !Drop, and expand to:\n//\n//     match None::<T> {\n//         Some(T { a: __v0, b: __v1 }) => {}\n//         _ => {}\n//     }\n//\n// For enums, expands to the following but only including struct variants:\n//\n//     match None::<&T> {\n//         Some(T::A { a: __v0 }) => {}\n//         Some(T::B { b: __v0 }) => {}\n//         _ => {}\n//     }\n//\nfn pretend_fields_used(cont: &Container, is_packed: bool) -> TokenStream {\n    match &cont.data {\n        Data::Enum(variants) => pretend_fields_used_enum(cont, variants),\n        Data::Struct(Style::Struct | Style::Tuple | Style::Newtype, fields) => {\n            if is_packed {\n                pretend_fields_used_struct_packed(cont, fields)\n            } else {\n                pretend_fields_used_struct(cont, fields)\n            }\n        }\n        Data::Struct(Style::Unit, _) => quote!(),\n    }\n}\n\nfn pretend_fields_used_struct(cont: &Container, fields: &[Field]) -> TokenStream {\n    let type_ident = &cont.ident;\n    let (_, ty_generics, _) = cont.generics.split_for_impl();\n\n    let members = fields.iter().map(|field| &field.member);\n    let placeholders = (0usize..).map(|i| format_ident!(\"__v{}\", i));\n\n    quote! {\n        match _serde::#private::None::<&#type_ident #ty_generics> {\n            _serde::#private::Some(#type_ident { #(#members: #placeholders),* }) => {}\n            _ => {}\n        }\n    }\n}\n\nfn pretend_fields_used_struct_packed(cont: &Container, fields: &[Field]) -> TokenStream {\n    let type_ident = &cont.ident;\n    let (_, ty_generics, _) = cont.generics.split_for_impl();\n\n    let members = fields.iter().map(|field| &field.member).collect::<Vec<_>>();\n\n    let private2 = private;\n    quote! {\n        match _serde::#private::None::<&#type_ident #ty_generics> {\n            _serde::#private::Some(__v @ #type_ident { #(#members: _),* }) => {\n                #(\n                    let _ = _serde::#private2::ptr::addr_of!(__v.#members);\n                )*\n            }\n            _ => {}\n        }\n    }\n}\n\nfn pretend_fields_used_enum(cont: &Container, variants: &[Variant]) -> TokenStream {\n    let type_ident = &cont.ident;\n    let (_, ty_generics, _) = cont.generics.split_for_impl();\n\n    let mut patterns = Vec::new();\n    for variant in variants {\n        match variant.style {\n            Style::Struct | Style::Tuple | Style::Newtype => {\n                let variant_ident = &variant.ident;\n                let members = variant.fields.iter().map(|field| &field.member);\n                let placeholders = (0usize..).map(|i| format_ident!(\"__v{}\", i));\n                patterns.push(quote!(#type_ident::#variant_ident { #(#members: #placeholders),* }));\n            }\n            Style::Unit => {}\n        }\n    }\n\n    let private2 = private;\n    quote! {\n        match _serde::#private::None::<&#type_ident #ty_generics> {\n            #(\n                _serde::#private2::Some(#patterns) => {}\n            )*\n            _ => {}\n        }\n    }\n}\n\n// Expands to one of these per enum variant:\n//\n//     match None {\n//         Some((__v0, __v1,)) => {\n//             let _ = E::V { a: __v0, b: __v1 };\n//         }\n//         _ => {}\n//     }\n//\nfn pretend_variants_used(cont: &Container) -> TokenStream {\n    let variants = match &cont.data {\n        Data::Enum(variants) => variants,\n        Data::Struct(_, _) => {\n            return quote!();\n        }\n    };\n\n    let type_ident = &cont.ident;\n    let (_, ty_generics, _) = cont.generics.split_for_impl();\n    let turbofish = ty_generics.as_turbofish();\n\n    let cases = variants.iter().map(|variant| {\n        let variant_ident = &variant.ident;\n        let placeholders = &(0..variant.fields.len())\n            .map(|i| format_ident!(\"__v{}\", i))\n            .collect::<Vec<_>>();\n\n        let pat = match variant.style {\n            Style::Struct => {\n                let members = variant.fields.iter().map(|field| &field.member);\n                quote!({ #(#members: #placeholders),* })\n            }\n            Style::Tuple | Style::Newtype => quote!(( #(#placeholders),* )),\n            Style::Unit => quote!(),\n        };\n\n        quote! {\n            match _serde::#private::None {\n                _serde::#private::Some((#(#placeholders,)*)) => {\n                    let _ = #type_ident::#variant_ident #turbofish #pat;\n                }\n                _ => {}\n            }\n        }\n    });\n\n    quote!(#(#cases)*)\n}\n"
  },
  {
    "path": "serde_derive/src/ser.rs",
    "content": "use crate::de::field_i;\nuse crate::deprecated::allow_deprecated;\nuse crate::fragment::{Fragment, Match, Stmts};\nuse crate::internals::ast::{Container, Data, Field, Style, Variant};\nuse crate::internals::name::Name;\nuse crate::internals::{attr, replace_receiver, Ctxt, Derive};\nuse crate::{bound, dummy, pretend, private, this};\nuse proc_macro2::{Span, TokenStream};\nuse quote::{quote, quote_spanned};\nuse syn::spanned::Spanned;\nuse syn::{parse_quote, Ident, Index, Member};\n\npub fn expand_derive_serialize(input: &mut syn::DeriveInput) -> syn::Result<TokenStream> {\n    replace_receiver(input);\n\n    let ctxt = Ctxt::new();\n    let Some(cont) = Container::from_ast(&ctxt, input, Derive::Serialize, &private.ident()) else {\n        return Err(ctxt.check().unwrap_err());\n    };\n    precondition(&ctxt, &cont);\n    ctxt.check()?;\n\n    let ident = &cont.ident;\n    let params = Parameters::new(&cont);\n    let (impl_generics, ty_generics, where_clause) = params.generics.split_for_impl();\n    let body = Stmts(serialize_body(&cont, &params));\n    let allow_deprecated = allow_deprecated(input);\n\n    let impl_block = if let Some(remote) = cont.attrs.remote() {\n        let vis = &input.vis;\n        let used = pretend::pretend_used(&cont, params.is_packed);\n        quote! {\n            #[automatically_derived]\n            #allow_deprecated\n            impl #impl_generics #ident #ty_generics #where_clause {\n                #vis fn serialize<__S>(__self: &#remote #ty_generics, __serializer: __S) -> _serde::#private::Result<__S::Ok, __S::Error>\n                where\n                    __S: _serde::Serializer,\n                {\n                    #used\n                    #body\n                }\n            }\n        }\n    } else {\n        quote! {\n            #[automatically_derived]\n            #allow_deprecated\n            impl #impl_generics _serde::Serialize for #ident #ty_generics #where_clause {\n                fn serialize<__S>(&self, __serializer: __S) -> _serde::#private::Result<__S::Ok, __S::Error>\n                where\n                    __S: _serde::Serializer,\n                {\n                    #body\n                }\n            }\n        }\n    };\n\n    Ok(dummy::wrap_in_const(\n        cont.attrs.custom_serde_path(),\n        impl_block,\n    ))\n}\n\nfn precondition(cx: &Ctxt, cont: &Container) {\n    match cont.attrs.identifier() {\n        attr::Identifier::No => {}\n        attr::Identifier::Field => {\n            cx.error_spanned_by(cont.original, \"field identifiers cannot be serialized\");\n        }\n        attr::Identifier::Variant => {\n            cx.error_spanned_by(cont.original, \"variant identifiers cannot be serialized\");\n        }\n    }\n}\n\nstruct Parameters {\n    /// Variable holding the value being serialized. Either `self` for local\n    /// types or `__self` for remote types.\n    self_var: Ident,\n\n    /// Path to the type the impl is for. Either a single `Ident` for local\n    /// types (does not include generic parameters) or `some::remote::Path` for\n    /// remote types.\n    this_type: syn::Path,\n\n    /// Same as `this_type` but using `::<T>` for generic parameters for use in\n    /// expression position.\n    this_value: syn::Path,\n\n    /// Generics including any explicit and inferred bounds for the impl.\n    generics: syn::Generics,\n\n    /// Type has a `serde(remote = \"...\")` attribute.\n    is_remote: bool,\n\n    /// Type has a repr(packed) attribute.\n    is_packed: bool,\n}\n\nimpl Parameters {\n    fn new(cont: &Container) -> Self {\n        let is_remote = cont.attrs.remote().is_some();\n        let self_var = if is_remote {\n            Ident::new(\"__self\", Span::call_site())\n        } else {\n            Ident::new(\"self\", Span::call_site())\n        };\n\n        let this_type = this::this_type(cont);\n        let this_value = this::this_value(cont);\n        let is_packed = cont.attrs.is_packed();\n        let generics = build_generics(cont);\n\n        Parameters {\n            self_var,\n            this_type,\n            this_value,\n            generics,\n            is_remote,\n            is_packed,\n        }\n    }\n\n    /// Type name to use in error messages and `&'static str` arguments to\n    /// various Serializer methods.\n    fn type_name(&self) -> String {\n        self.this_type.segments.last().unwrap().ident.to_string()\n    }\n}\n\n// All the generics in the input, plus a bound `T: Serialize` for each generic\n// field type that will be serialized by us.\nfn build_generics(cont: &Container) -> syn::Generics {\n    let generics = bound::without_defaults(cont.generics);\n\n    let generics =\n        bound::with_where_predicates_from_fields(cont, &generics, attr::Field::ser_bound);\n\n    let generics =\n        bound::with_where_predicates_from_variants(cont, &generics, attr::Variant::ser_bound);\n\n    match cont.attrs.ser_bound() {\n        Some(predicates) => bound::with_where_predicates(&generics, predicates),\n        None => bound::with_bound(\n            cont,\n            &generics,\n            needs_serialize_bound,\n            &parse_quote!(_serde::Serialize),\n        ),\n    }\n}\n\n// Fields with a `skip_serializing` or `serialize_with` attribute, or which\n// belong to a variant with a `skip_serializing` or `serialize_with` attribute,\n// are not serialized by us so we do not generate a bound. Fields with a `bound`\n// attribute specify their own bound so we do not generate one. All other fields\n// may need a `T: Serialize` bound where T is the type of the field.\nfn needs_serialize_bound(field: &attr::Field, variant: Option<&attr::Variant>) -> bool {\n    !field.skip_serializing()\n        && field.serialize_with().is_none()\n        && field.ser_bound().is_none()\n        && variant.map_or(true, |variant| {\n            !variant.skip_serializing()\n                && variant.serialize_with().is_none()\n                && variant.ser_bound().is_none()\n        })\n}\n\nfn serialize_body(cont: &Container, params: &Parameters) -> Fragment {\n    if cont.attrs.transparent() {\n        serialize_transparent(cont, params)\n    } else if let Some(type_into) = cont.attrs.type_into() {\n        serialize_into(params, type_into)\n    } else {\n        match &cont.data {\n            Data::Enum(variants) => serialize_enum(params, variants, &cont.attrs),\n            Data::Struct(Style::Struct, fields) => serialize_struct(params, fields, &cont.attrs),\n            Data::Struct(Style::Tuple, fields) => {\n                serialize_tuple_struct(params, fields, &cont.attrs)\n            }\n            Data::Struct(Style::Newtype, fields) => {\n                serialize_newtype_struct(params, &fields[0], &cont.attrs)\n            }\n            Data::Struct(Style::Unit, _) => serialize_unit_struct(&cont.attrs),\n        }\n    }\n}\n\nfn serialize_transparent(cont: &Container, params: &Parameters) -> Fragment {\n    let fields = match &cont.data {\n        Data::Struct(_, fields) => fields,\n        Data::Enum(_) => unreachable!(),\n    };\n\n    let self_var = &params.self_var;\n    let transparent_field = fields.iter().find(|f| f.attrs.transparent()).unwrap();\n    let member = &transparent_field.member;\n\n    let path = match transparent_field.attrs.serialize_with() {\n        Some(path) => quote!(#path),\n        None => {\n            let span = transparent_field.original.span();\n            quote_spanned!(span=> _serde::Serialize::serialize)\n        }\n    };\n\n    quote_block! {\n        #path(&#self_var.#member, __serializer)\n    }\n}\n\nfn serialize_into(params: &Parameters, type_into: &syn::Type) -> Fragment {\n    let self_var = &params.self_var;\n    quote_block! {\n        _serde::Serialize::serialize(\n            &_serde::#private::Into::<#type_into>::into(_serde::#private::Clone::clone(#self_var)),\n            __serializer)\n    }\n}\n\nfn serialize_unit_struct(cattrs: &attr::Container) -> Fragment {\n    let type_name = cattrs.name().serialize_name();\n\n    quote_expr! {\n        _serde::Serializer::serialize_unit_struct(__serializer, #type_name)\n    }\n}\n\nfn serialize_newtype_struct(\n    params: &Parameters,\n    field: &Field,\n    cattrs: &attr::Container,\n) -> Fragment {\n    let type_name = cattrs.name().serialize_name();\n\n    let mut field_expr = get_member(\n        params,\n        field,\n        &Member::Unnamed(Index {\n            index: 0,\n            span: Span::call_site(),\n        }),\n    );\n    if let Some(path) = field.attrs.serialize_with() {\n        field_expr = wrap_serialize_field_with(params, field.ty, path, &field_expr);\n    }\n\n    let span = field.original.span();\n    let func = quote_spanned!(span=> _serde::Serializer::serialize_newtype_struct);\n    quote_expr! {\n        #func(__serializer, #type_name, #field_expr)\n    }\n}\n\nfn serialize_tuple_struct(\n    params: &Parameters,\n    fields: &[Field],\n    cattrs: &attr::Container,\n) -> Fragment {\n    let serialize_stmts =\n        serialize_tuple_struct_visitor(fields, params, false, &TupleTrait::SerializeTupleStruct);\n\n    let type_name = cattrs.name().serialize_name();\n\n    let mut serialized_fields = fields\n        .iter()\n        .enumerate()\n        .filter(|(_, field)| !field.attrs.skip_serializing())\n        .peekable();\n\n    let let_mut = mut_if(serialized_fields.peek().is_some());\n\n    let len = serialized_fields\n        .map(|(i, field)| match field.attrs.skip_serializing_if() {\n            None => quote!(1),\n            Some(path) => {\n                let index = syn::Index {\n                    index: i as u32,\n                    span: Span::call_site(),\n                };\n                let field_expr = get_member(params, field, &Member::Unnamed(index));\n                quote!(if #path(#field_expr) { 0 } else { 1 })\n            }\n        })\n        .fold(quote!(0), |sum, expr| quote!(#sum + #expr));\n\n    quote_block! {\n        let #let_mut __serde_state = _serde::Serializer::serialize_tuple_struct(__serializer, #type_name, #len)?;\n        #(#serialize_stmts)*\n        _serde::ser::SerializeTupleStruct::end(__serde_state)\n    }\n}\n\nfn serialize_struct(params: &Parameters, fields: &[Field], cattrs: &attr::Container) -> Fragment {\n    assert!(\n        fields.len() as u64 <= u64::from(u32::MAX),\n        \"too many fields in {}: {}, maximum supported count is {}\",\n        cattrs.name().serialize_name(),\n        fields.len(),\n        u32::MAX,\n    );\n\n    let has_non_skipped_flatten = fields\n        .iter()\n        .any(|field| field.attrs.flatten() && !field.attrs.skip_serializing());\n    if has_non_skipped_flatten {\n        serialize_struct_as_map(params, fields, cattrs)\n    } else {\n        serialize_struct_as_struct(params, fields, cattrs)\n    }\n}\n\nfn serialize_struct_tag_field(cattrs: &attr::Container, struct_trait: &StructTrait) -> TokenStream {\n    match cattrs.tag() {\n        attr::TagType::Internal { tag } => {\n            let type_name = cattrs.name().serialize_name();\n            let func = struct_trait.serialize_field(Span::call_site());\n            quote! {\n                #func(&mut __serde_state, #tag, #type_name)?;\n            }\n        }\n        _ => quote! {},\n    }\n}\n\nfn serialize_struct_as_struct(\n    params: &Parameters,\n    fields: &[Field],\n    cattrs: &attr::Container,\n) -> Fragment {\n    let serialize_fields =\n        serialize_struct_visitor(fields, params, false, &StructTrait::SerializeStruct);\n\n    let type_name = cattrs.name().serialize_name();\n\n    let tag_field = serialize_struct_tag_field(cattrs, &StructTrait::SerializeStruct);\n    let tag_field_exists = !tag_field.is_empty();\n\n    let mut serialized_fields = fields\n        .iter()\n        .filter(|&field| !field.attrs.skip_serializing())\n        .peekable();\n\n    let let_mut = mut_if(serialized_fields.peek().is_some() || tag_field_exists);\n\n    let len = serialized_fields\n        .map(|field| match field.attrs.skip_serializing_if() {\n            None => quote!(1),\n            Some(path) => {\n                let field_expr = get_member(params, field, &field.member);\n                quote!(if #path(#field_expr) { 0 } else { 1 })\n            }\n        })\n        .fold(\n            quote!(#tag_field_exists as usize),\n            |sum, expr| quote!(#sum + #expr),\n        );\n\n    quote_block! {\n        let #let_mut __serde_state = _serde::Serializer::serialize_struct(__serializer, #type_name, #len)?;\n        #tag_field\n        #(#serialize_fields)*\n        _serde::ser::SerializeStruct::end(__serde_state)\n    }\n}\n\nfn serialize_struct_as_map(\n    params: &Parameters,\n    fields: &[Field],\n    cattrs: &attr::Container,\n) -> Fragment {\n    let serialize_fields =\n        serialize_struct_visitor(fields, params, false, &StructTrait::SerializeMap);\n\n    let tag_field = serialize_struct_tag_field(cattrs, &StructTrait::SerializeMap);\n    let tag_field_exists = !tag_field.is_empty();\n\n    let mut serialized_fields = fields\n        .iter()\n        .filter(|&field| !field.attrs.skip_serializing())\n        .peekable();\n\n    let let_mut = mut_if(serialized_fields.peek().is_some() || tag_field_exists);\n\n    quote_block! {\n        let #let_mut __serde_state = _serde::Serializer::serialize_map(__serializer, _serde::#private::None)?;\n        #tag_field\n        #(#serialize_fields)*\n        _serde::ser::SerializeMap::end(__serde_state)\n    }\n}\n\nfn serialize_enum(params: &Parameters, variants: &[Variant], cattrs: &attr::Container) -> Fragment {\n    assert!(variants.len() as u64 <= u64::from(u32::MAX));\n\n    let self_var = &params.self_var;\n\n    let mut arms: Vec<_> = variants\n        .iter()\n        .enumerate()\n        .map(|(variant_index, variant)| {\n            serialize_variant(params, variant, variant_index as u32, cattrs)\n        })\n        .collect();\n\n    if cattrs.remote().is_some() && cattrs.non_exhaustive() {\n        arms.push(quote! {\n            ref unrecognized => _serde::#private::Err(_serde::ser::Error::custom(_serde::#private::ser::CannotSerializeVariant(unrecognized))),\n        });\n    }\n\n    quote_expr! {\n        match *#self_var {\n            #(#arms)*\n        }\n    }\n}\n\nfn serialize_variant(\n    params: &Parameters,\n    variant: &Variant,\n    variant_index: u32,\n    cattrs: &attr::Container,\n) -> TokenStream {\n    let this_value = &params.this_value;\n    let variant_ident = &variant.ident;\n\n    if variant.attrs.skip_serializing() {\n        let skipped_msg = format!(\n            \"the enum variant {}::{} cannot be serialized\",\n            params.type_name(),\n            variant_ident\n        );\n        let skipped_err = quote! {\n            _serde::#private::Err(_serde::ser::Error::custom(#skipped_msg))\n        };\n        let fields_pat = match variant.style {\n            Style::Unit => quote!(),\n            Style::Newtype | Style::Tuple => quote!((..)),\n            Style::Struct => quote!({ .. }),\n        };\n        quote! {\n            #this_value::#variant_ident #fields_pat => #skipped_err,\n        }\n    } else {\n        // variant wasn't skipped\n        let case = match variant.style {\n            Style::Unit => {\n                quote! {\n                    #this_value::#variant_ident\n                }\n            }\n            Style::Newtype => {\n                quote! {\n                    #this_value::#variant_ident(ref __field0)\n                }\n            }\n            Style::Tuple => {\n                let field_names = (0..variant.fields.len()).map(field_i);\n                quote! {\n                    #this_value::#variant_ident(#(ref #field_names),*)\n                }\n            }\n            Style::Struct => {\n                let members = variant.fields.iter().map(|f| &f.member);\n                quote! {\n                    #this_value::#variant_ident { #(ref #members),* }\n                }\n            }\n        };\n\n        let body = Match(match (cattrs.tag(), variant.attrs.untagged()) {\n            (attr::TagType::External, false) => {\n                serialize_externally_tagged_variant(params, variant, variant_index, cattrs)\n            }\n            (attr::TagType::Internal { tag }, false) => {\n                serialize_internally_tagged_variant(params, variant, cattrs, tag)\n            }\n            (attr::TagType::Adjacent { tag, content }, false) => {\n                serialize_adjacently_tagged_variant(\n                    params,\n                    variant,\n                    cattrs,\n                    variant_index,\n                    tag,\n                    content,\n                )\n            }\n            (attr::TagType::None, _) | (_, true) => {\n                serialize_untagged_variant(params, variant, cattrs)\n            }\n        });\n\n        quote! {\n            #case => #body\n        }\n    }\n}\n\nfn serialize_externally_tagged_variant(\n    params: &Parameters,\n    variant: &Variant,\n    variant_index: u32,\n    cattrs: &attr::Container,\n) -> Fragment {\n    let type_name = cattrs.name().serialize_name();\n    let variant_name = variant.attrs.name().serialize_name();\n\n    if let Some(path) = variant.attrs.serialize_with() {\n        let ser = wrap_serialize_variant_with(params, path, variant);\n        return quote_expr! {\n            _serde::Serializer::serialize_newtype_variant(\n                __serializer,\n                #type_name,\n                #variant_index,\n                #variant_name,\n                #ser,\n            )\n        };\n    }\n\n    match effective_style(variant) {\n        Style::Unit => {\n            quote_expr! {\n                _serde::Serializer::serialize_unit_variant(\n                    __serializer,\n                    #type_name,\n                    #variant_index,\n                    #variant_name,\n                )\n            }\n        }\n        Style::Newtype => {\n            let field = &variant.fields[0];\n            let mut field_expr = quote!(__field0);\n            if let Some(path) = field.attrs.serialize_with() {\n                field_expr = wrap_serialize_field_with(params, field.ty, path, &field_expr);\n            }\n\n            let span = field.original.span();\n            let func = quote_spanned!(span=> _serde::Serializer::serialize_newtype_variant);\n            quote_expr! {\n                #func(\n                    __serializer,\n                    #type_name,\n                    #variant_index,\n                    #variant_name,\n                    #field_expr,\n                )\n            }\n        }\n        Style::Tuple => serialize_tuple_variant(\n            TupleVariant::ExternallyTagged {\n                type_name,\n                variant_index,\n                variant_name,\n            },\n            params,\n            &variant.fields,\n        ),\n        Style::Struct => serialize_struct_variant(\n            StructVariant::ExternallyTagged {\n                variant_index,\n                variant_name,\n            },\n            params,\n            &variant.fields,\n            type_name,\n        ),\n    }\n}\n\nfn serialize_internally_tagged_variant(\n    params: &Parameters,\n    variant: &Variant,\n    cattrs: &attr::Container,\n    tag: &str,\n) -> Fragment {\n    let type_name = cattrs.name().serialize_name();\n    let variant_name = variant.attrs.name().serialize_name();\n\n    let enum_ident_str = params.type_name();\n    let variant_ident_str = variant.ident.to_string();\n\n    if let Some(path) = variant.attrs.serialize_with() {\n        let ser = wrap_serialize_variant_with(params, path, variant);\n        return quote_expr! {\n            _serde::#private::ser::serialize_tagged_newtype(\n                __serializer,\n                #enum_ident_str,\n                #variant_ident_str,\n                #tag,\n                #variant_name,\n                #ser,\n            )\n        };\n    }\n\n    match effective_style(variant) {\n        Style::Unit => {\n            quote_block! {\n                let mut __struct = _serde::Serializer::serialize_struct(\n                    __serializer, #type_name, 1)?;\n                _serde::ser::SerializeStruct::serialize_field(\n                    &mut __struct, #tag, #variant_name)?;\n                _serde::ser::SerializeStruct::end(__struct)\n            }\n        }\n        Style::Newtype => {\n            let field = &variant.fields[0];\n            let mut field_expr = quote!(__field0);\n            if let Some(path) = field.attrs.serialize_with() {\n                field_expr = wrap_serialize_field_with(params, field.ty, path, &field_expr);\n            }\n\n            let span = field.original.span();\n            let func = quote_spanned!(span=> _serde::#private::ser::serialize_tagged_newtype);\n            quote_expr! {\n                #func(\n                    __serializer,\n                    #enum_ident_str,\n                    #variant_ident_str,\n                    #tag,\n                    #variant_name,\n                    #field_expr,\n                )\n            }\n        }\n        Style::Struct => serialize_struct_variant(\n            StructVariant::InternallyTagged { tag, variant_name },\n            params,\n            &variant.fields,\n            type_name,\n        ),\n        Style::Tuple => unreachable!(\"checked in serde_derive_internals\"),\n    }\n}\n\nfn serialize_adjacently_tagged_variant(\n    params: &Parameters,\n    variant: &Variant,\n    cattrs: &attr::Container,\n    variant_index: u32,\n    tag: &str,\n    content: &str,\n) -> Fragment {\n    let this_type = &params.this_type;\n    let type_name = cattrs.name().serialize_name();\n    let variant_name = variant.attrs.name().serialize_name();\n    let serialize_variant = quote! {\n        &_serde::#private::ser::AdjacentlyTaggedEnumVariant {\n            enum_name: #type_name,\n            variant_index: #variant_index,\n            variant_name: #variant_name,\n        }\n    };\n\n    let inner = Stmts(if let Some(path) = variant.attrs.serialize_with() {\n        let ser = wrap_serialize_variant_with(params, path, variant);\n        quote_expr! {\n            _serde::Serialize::serialize(#ser, __serializer)\n        }\n    } else {\n        match effective_style(variant) {\n            Style::Unit => {\n                return quote_block! {\n                    let mut __struct = _serde::Serializer::serialize_struct(\n                        __serializer, #type_name, 1)?;\n                    _serde::ser::SerializeStruct::serialize_field(\n                        &mut __struct, #tag, #serialize_variant)?;\n                    _serde::ser::SerializeStruct::end(__struct)\n                };\n            }\n            Style::Newtype => {\n                let field = &variant.fields[0];\n                let mut field_expr = quote!(__field0);\n                if let Some(path) = field.attrs.serialize_with() {\n                    field_expr = wrap_serialize_field_with(params, field.ty, path, &field_expr);\n                }\n\n                let span = field.original.span();\n                let func = quote_spanned!(span=> _serde::ser::SerializeStruct::serialize_field);\n                return quote_block! {\n                    let mut __struct = _serde::Serializer::serialize_struct(\n                        __serializer, #type_name, 2)?;\n                    _serde::ser::SerializeStruct::serialize_field(\n                        &mut __struct, #tag, #serialize_variant)?;\n                    #func(\n                        &mut __struct, #content, #field_expr)?;\n                    _serde::ser::SerializeStruct::end(__struct)\n                };\n            }\n            Style::Tuple => {\n                serialize_tuple_variant(TupleVariant::Untagged, params, &variant.fields)\n            }\n            Style::Struct => serialize_struct_variant(\n                StructVariant::Untagged,\n                params,\n                &variant.fields,\n                variant_name,\n            ),\n        }\n    });\n\n    let fields_ty = variant.fields.iter().map(|f| &f.ty);\n    let fields_ident: &[_] = &match variant.style {\n        Style::Unit => {\n            if variant.attrs.serialize_with().is_some() {\n                vec![]\n            } else {\n                unreachable!()\n            }\n        }\n        Style::Newtype => vec![Member::Named(field_i(0))],\n        Style::Tuple => (0..variant.fields.len())\n            .map(|i| Member::Named(field_i(i)))\n            .collect(),\n        Style::Struct => variant.fields.iter().map(|f| f.member.clone()).collect(),\n    };\n\n    let (_, ty_generics, where_clause) = params.generics.split_for_impl();\n\n    let wrapper_generics = if fields_ident.is_empty() {\n        params.generics.clone()\n    } else {\n        bound::with_lifetime_bound(&params.generics, \"'__a\")\n    };\n    let (wrapper_impl_generics, wrapper_ty_generics, _) = wrapper_generics.split_for_impl();\n\n    quote_block! {\n        #[doc(hidden)]\n        struct __AdjacentlyTagged #wrapper_generics #where_clause {\n            data: (#(&'__a #fields_ty,)*),\n            phantom: _serde::#private::PhantomData<#this_type #ty_generics>,\n        }\n\n        #[automatically_derived]\n        impl #wrapper_impl_generics _serde::Serialize for __AdjacentlyTagged #wrapper_ty_generics #where_clause {\n            fn serialize<__S>(&self, __serializer: __S) -> _serde::#private::Result<__S::Ok, __S::Error>\n            where\n                __S: _serde::Serializer,\n            {\n                // Elements that have skip_serializing will be unused.\n                #[allow(unused_variables)]\n                let (#(#fields_ident,)*) = self.data;\n                #inner\n            }\n        }\n\n        let mut __struct = _serde::Serializer::serialize_struct(\n            __serializer, #type_name, 2)?;\n        _serde::ser::SerializeStruct::serialize_field(\n            &mut __struct, #tag, #serialize_variant)?;\n        _serde::ser::SerializeStruct::serialize_field(\n            &mut __struct, #content, &__AdjacentlyTagged {\n                data: (#(#fields_ident,)*),\n                phantom: _serde::#private::PhantomData::<#this_type #ty_generics>,\n            })?;\n        _serde::ser::SerializeStruct::end(__struct)\n    }\n}\n\nfn serialize_untagged_variant(\n    params: &Parameters,\n    variant: &Variant,\n    cattrs: &attr::Container,\n) -> Fragment {\n    if let Some(path) = variant.attrs.serialize_with() {\n        let ser = wrap_serialize_variant_with(params, path, variant);\n        return quote_expr! {\n            _serde::Serialize::serialize(#ser, __serializer)\n        };\n    }\n\n    match effective_style(variant) {\n        Style::Unit => {\n            quote_expr! {\n                _serde::Serializer::serialize_unit(__serializer)\n            }\n        }\n        Style::Newtype => {\n            let field = &variant.fields[0];\n            let mut field_expr = quote!(__field0);\n            if let Some(path) = field.attrs.serialize_with() {\n                field_expr = wrap_serialize_field_with(params, field.ty, path, &field_expr);\n            }\n\n            let span = field.original.span();\n            let func = quote_spanned!(span=> _serde::Serialize::serialize);\n            quote_expr! {\n                #func(#field_expr, __serializer)\n            }\n        }\n        Style::Tuple => serialize_tuple_variant(TupleVariant::Untagged, params, &variant.fields),\n        Style::Struct => {\n            let type_name = cattrs.name().serialize_name();\n            serialize_struct_variant(StructVariant::Untagged, params, &variant.fields, type_name)\n        }\n    }\n}\n\nenum TupleVariant<'a> {\n    ExternallyTagged {\n        type_name: &'a Name,\n        variant_index: u32,\n        variant_name: &'a Name,\n    },\n    Untagged,\n}\n\nfn serialize_tuple_variant(\n    context: TupleVariant,\n    params: &Parameters,\n    fields: &[Field],\n) -> Fragment {\n    let tuple_trait = match context {\n        TupleVariant::ExternallyTagged { .. } => TupleTrait::SerializeTupleVariant,\n        TupleVariant::Untagged => TupleTrait::SerializeTuple,\n    };\n\n    let serialize_stmts = serialize_tuple_struct_visitor(fields, params, true, &tuple_trait);\n\n    let mut serialized_fields = fields\n        .iter()\n        .enumerate()\n        .filter(|(_, field)| !field.attrs.skip_serializing())\n        .peekable();\n\n    let let_mut = mut_if(serialized_fields.peek().is_some());\n\n    let len = serialized_fields\n        .map(|(i, field)| match field.attrs.skip_serializing_if() {\n            None => quote!(1),\n            Some(path) => {\n                let field_expr = field_i(i);\n                quote!(if #path(#field_expr) { 0 } else { 1 })\n            }\n        })\n        .fold(quote!(0), |sum, expr| quote!(#sum + #expr));\n\n    match context {\n        TupleVariant::ExternallyTagged {\n            type_name,\n            variant_index,\n            variant_name,\n        } => {\n            quote_block! {\n                let #let_mut __serde_state = _serde::Serializer::serialize_tuple_variant(\n                    __serializer,\n                    #type_name,\n                    #variant_index,\n                    #variant_name,\n                    #len)?;\n                #(#serialize_stmts)*\n                _serde::ser::SerializeTupleVariant::end(__serde_state)\n            }\n        }\n        TupleVariant::Untagged => {\n            quote_block! {\n                let #let_mut __serde_state = _serde::Serializer::serialize_tuple(\n                    __serializer,\n                    #len)?;\n                #(#serialize_stmts)*\n                _serde::ser::SerializeTuple::end(__serde_state)\n            }\n        }\n    }\n}\n\nenum StructVariant<'a> {\n    ExternallyTagged {\n        variant_index: u32,\n        variant_name: &'a Name,\n    },\n    InternallyTagged {\n        tag: &'a str,\n        variant_name: &'a Name,\n    },\n    Untagged,\n}\n\nfn serialize_struct_variant(\n    context: StructVariant,\n    params: &Parameters,\n    fields: &[Field],\n    name: &Name,\n) -> Fragment {\n    if fields.iter().any(|field| field.attrs.flatten()) {\n        return serialize_struct_variant_with_flatten(context, params, fields, name);\n    }\n\n    let struct_trait = match context {\n        StructVariant::ExternallyTagged { .. } => StructTrait::SerializeStructVariant,\n        StructVariant::InternallyTagged { .. } | StructVariant::Untagged => {\n            StructTrait::SerializeStruct\n        }\n    };\n\n    let serialize_fields = serialize_struct_visitor(fields, params, true, &struct_trait);\n\n    let mut serialized_fields = fields\n        .iter()\n        .filter(|&field| !field.attrs.skip_serializing())\n        .peekable();\n\n    let let_mut = mut_if(serialized_fields.peek().is_some());\n\n    let len = serialized_fields\n        .map(|field| {\n            let member = &field.member;\n\n            match field.attrs.skip_serializing_if() {\n                Some(path) => quote!(if #path(#member) { 0 } else { 1 }),\n                None => quote!(1),\n            }\n        })\n        .fold(quote!(0), |sum, expr| quote!(#sum + #expr));\n\n    match context {\n        StructVariant::ExternallyTagged {\n            variant_index,\n            variant_name,\n        } => {\n            quote_block! {\n                let #let_mut __serde_state = _serde::Serializer::serialize_struct_variant(\n                    __serializer,\n                    #name,\n                    #variant_index,\n                    #variant_name,\n                    #len,\n                )?;\n                #(#serialize_fields)*\n                _serde::ser::SerializeStructVariant::end(__serde_state)\n            }\n        }\n        StructVariant::InternallyTagged { tag, variant_name } => {\n            quote_block! {\n                let mut __serde_state = _serde::Serializer::serialize_struct(\n                    __serializer,\n                    #name,\n                    #len + 1,\n                )?;\n                _serde::ser::SerializeStruct::serialize_field(\n                    &mut __serde_state,\n                    #tag,\n                    #variant_name,\n                )?;\n                #(#serialize_fields)*\n                _serde::ser::SerializeStruct::end(__serde_state)\n            }\n        }\n        StructVariant::Untagged => {\n            quote_block! {\n                let #let_mut __serde_state = _serde::Serializer::serialize_struct(\n                    __serializer,\n                    #name,\n                    #len,\n                )?;\n                #(#serialize_fields)*\n                _serde::ser::SerializeStruct::end(__serde_state)\n            }\n        }\n    }\n}\n\nfn serialize_struct_variant_with_flatten(\n    context: StructVariant,\n    params: &Parameters,\n    fields: &[Field],\n    name: &Name,\n) -> Fragment {\n    let struct_trait = StructTrait::SerializeMap;\n    let serialize_fields = serialize_struct_visitor(fields, params, true, &struct_trait);\n\n    let mut serialized_fields = fields\n        .iter()\n        .filter(|&field| !field.attrs.skip_serializing())\n        .peekable();\n\n    let let_mut = mut_if(serialized_fields.peek().is_some());\n\n    match context {\n        StructVariant::ExternallyTagged {\n            variant_index,\n            variant_name,\n        } => {\n            let this_type = &params.this_type;\n            let fields_ty = fields.iter().map(|f| &f.ty);\n            let members = &fields.iter().map(|f| &f.member).collect::<Vec<_>>();\n\n            let (_, ty_generics, where_clause) = params.generics.split_for_impl();\n            let wrapper_generics = bound::with_lifetime_bound(&params.generics, \"'__a\");\n            let (wrapper_impl_generics, wrapper_ty_generics, _) = wrapper_generics.split_for_impl();\n\n            quote_block! {\n                #[doc(hidden)]\n                struct __EnumFlatten #wrapper_generics #where_clause {\n                    data: (#(&'__a #fields_ty,)*),\n                    phantom: _serde::#private::PhantomData<#this_type #ty_generics>,\n                }\n\n                #[automatically_derived]\n                impl #wrapper_impl_generics _serde::Serialize for __EnumFlatten #wrapper_ty_generics #where_clause {\n                    fn serialize<__S>(&self, __serializer: __S) -> _serde::#private::Result<__S::Ok, __S::Error>\n                    where\n                        __S: _serde::Serializer,\n                    {\n                        let (#(#members,)*) = self.data;\n                        let #let_mut __serde_state = _serde::Serializer::serialize_map(\n                            __serializer,\n                            _serde::#private::None)?;\n                        #(#serialize_fields)*\n                        _serde::ser::SerializeMap::end(__serde_state)\n                    }\n                }\n\n                _serde::Serializer::serialize_newtype_variant(\n                    __serializer,\n                    #name,\n                    #variant_index,\n                    #variant_name,\n                    &__EnumFlatten {\n                        data: (#(#members,)*),\n                        phantom: _serde::#private::PhantomData::<#this_type #ty_generics>,\n                    })\n            }\n        }\n        StructVariant::InternallyTagged { tag, variant_name } => {\n            quote_block! {\n                let #let_mut __serde_state = _serde::Serializer::serialize_map(\n                    __serializer,\n                    _serde::#private::None)?;\n                _serde::ser::SerializeMap::serialize_entry(\n                    &mut __serde_state,\n                    #tag,\n                    #variant_name,\n                )?;\n                #(#serialize_fields)*\n                _serde::ser::SerializeMap::end(__serde_state)\n            }\n        }\n        StructVariant::Untagged => {\n            quote_block! {\n                let #let_mut __serde_state = _serde::Serializer::serialize_map(\n                    __serializer,\n                    _serde::#private::None)?;\n                #(#serialize_fields)*\n                _serde::ser::SerializeMap::end(__serde_state)\n            }\n        }\n    }\n}\n\nfn serialize_tuple_struct_visitor(\n    fields: &[Field],\n    params: &Parameters,\n    is_enum: bool,\n    tuple_trait: &TupleTrait,\n) -> Vec<TokenStream> {\n    let mut dst_fields = Vec::new();\n\n    for (i, field) in fields.iter().enumerate() {\n        if field.attrs.skip_serializing() {\n            continue;\n        }\n        let mut field_expr = if is_enum {\n            let id = field_i(i);\n            quote!(#id)\n        } else {\n            get_member(\n                params,\n                field,\n                &Member::Unnamed(Index {\n                    index: i as u32,\n                    span: Span::call_site(),\n                }),\n            )\n        };\n\n        let skip = field\n            .attrs\n            .skip_serializing_if()\n            .map(|path| quote!(#path(#field_expr)));\n\n        if let Some(path) = field.attrs.serialize_with() {\n            field_expr = wrap_serialize_field_with(params, field.ty, path, &field_expr);\n        }\n\n        let span = field.original.span();\n        let func = tuple_trait.serialize_element(span);\n        let ser = quote! {\n            #func(&mut __serde_state, #field_expr)?;\n        };\n\n        dst_fields.push(match skip {\n            None => ser,\n            Some(skip) => quote!(if !#skip { #ser }),\n        });\n    }\n    dst_fields\n}\n\nfn serialize_struct_visitor(\n    fields: &[Field],\n    params: &Parameters,\n    is_enum: bool,\n    struct_trait: &StructTrait,\n) -> Vec<TokenStream> {\n    let mut dst_fields = Vec::new();\n\n    for field in fields {\n        if field.attrs.skip_serializing() {\n            continue;\n        }\n        let member = &field.member;\n\n        let mut field_expr = if is_enum {\n            quote!(#member)\n        } else {\n            get_member(params, field, member)\n        };\n\n        let key_expr = field.attrs.name().serialize_name();\n\n        let skip = field\n            .attrs\n            .skip_serializing_if()\n            .map(|path| quote!(#path(#field_expr)));\n\n        if let Some(path) = field.attrs.serialize_with() {\n            field_expr = wrap_serialize_field_with(params, field.ty, path, &field_expr);\n        }\n\n        let span = field.original.span();\n        let ser = if field.attrs.flatten() {\n            let func = quote_spanned!(span=> _serde::Serialize::serialize);\n            quote! {\n                #func(&#field_expr, _serde::#private::ser::FlatMapSerializer(&mut __serde_state))?;\n            }\n        } else {\n            let func = struct_trait.serialize_field(span);\n            quote! {\n                #func(&mut __serde_state, #key_expr, #field_expr)?;\n            }\n        };\n\n        dst_fields.push(match skip {\n            None => ser,\n            Some(skip) => {\n                if let Some(skip_func) = struct_trait.skip_field(span) {\n                    quote! {\n                        if !#skip {\n                            #ser\n                        } else {\n                            #skip_func(&mut __serde_state, #key_expr)?;\n                        }\n                    }\n                } else {\n                    quote! {\n                        if !#skip {\n                            #ser\n                        }\n                    }\n                }\n            }\n        });\n    }\n    dst_fields\n}\n\nfn wrap_serialize_field_with(\n    params: &Parameters,\n    field_ty: &syn::Type,\n    serialize_with: &syn::ExprPath,\n    field_expr: &TokenStream,\n) -> TokenStream {\n    wrap_serialize_with(params, serialize_with, &[field_ty], &[quote!(#field_expr)])\n}\n\nfn wrap_serialize_variant_with(\n    params: &Parameters,\n    serialize_with: &syn::ExprPath,\n    variant: &Variant,\n) -> TokenStream {\n    let field_tys: Vec<_> = variant.fields.iter().map(|field| field.ty).collect();\n    let field_exprs: Vec<_> = variant\n        .fields\n        .iter()\n        .map(|field| {\n            let id = match &field.member {\n                Member::Named(ident) => ident.clone(),\n                Member::Unnamed(member) => field_i(member.index as usize),\n            };\n            quote!(#id)\n        })\n        .collect();\n    wrap_serialize_with(\n        params,\n        serialize_with,\n        field_tys.as_slice(),\n        field_exprs.as_slice(),\n    )\n}\n\nfn wrap_serialize_with(\n    params: &Parameters,\n    serialize_with: &syn::ExprPath,\n    field_tys: &[&syn::Type],\n    field_exprs: &[TokenStream],\n) -> TokenStream {\n    let this_type = &params.this_type;\n    let (_, ty_generics, where_clause) = params.generics.split_for_impl();\n\n    let wrapper_generics = if field_exprs.is_empty() {\n        params.generics.clone()\n    } else {\n        bound::with_lifetime_bound(&params.generics, \"'__a\")\n    };\n    let (wrapper_impl_generics, wrapper_ty_generics, _) = wrapper_generics.split_for_impl();\n\n    let field_access = (0..field_exprs.len()).map(|n| {\n        Member::Unnamed(Index {\n            index: n as u32,\n            span: Span::call_site(),\n        })\n    });\n\n    let self_var = quote!(self);\n    let serializer_var = quote!(__s);\n\n    // If #serialize_with returns wrong type, error will be reported on here.\n    // We attach span of the path to this piece so error will be reported\n    // on the #[serde(with = \"...\")]\n    //                       ^^^^^\n    let wrapper_serialize = quote_spanned! {serialize_with.span()=>\n        #serialize_with(#(#self_var.values.#field_access, )* #serializer_var)\n    };\n\n    quote!(&{\n        #[doc(hidden)]\n        struct __SerializeWith #wrapper_impl_generics #where_clause {\n            values: (#(&'__a #field_tys, )*),\n            phantom: _serde::#private::PhantomData<#this_type #ty_generics>,\n        }\n\n        #[automatically_derived]\n        impl #wrapper_impl_generics _serde::Serialize for __SerializeWith #wrapper_ty_generics #where_clause {\n            fn serialize<__S>(&#self_var, #serializer_var: __S) -> _serde::#private::Result<__S::Ok, __S::Error>\n            where\n                __S: _serde::Serializer,\n            {\n                #wrapper_serialize\n            }\n        }\n\n        __SerializeWith {\n            values: (#(#field_exprs, )*),\n            phantom: _serde::#private::PhantomData::<#this_type #ty_generics>,\n        }\n    })\n}\n\n// Serialization of an empty struct results in code like:\n//\n//     let mut __serde_state = serializer.serialize_struct(\"S\", 0)?;\n//     _serde::ser::SerializeStruct::end(__serde_state)\n//\n// where we want to omit the `mut` to avoid a warning.\nfn mut_if(is_mut: bool) -> Option<TokenStream> {\n    if is_mut {\n        Some(quote!(mut))\n    } else {\n        None\n    }\n}\n\nfn get_member(params: &Parameters, field: &Field, member: &Member) -> TokenStream {\n    let self_var = &params.self_var;\n    match (params.is_remote, field.attrs.getter()) {\n        (false, None) => {\n            if params.is_packed {\n                quote!(&{#self_var.#member})\n            } else {\n                quote!(&#self_var.#member)\n            }\n        }\n        (true, None) => {\n            let inner = if params.is_packed {\n                quote!(&{#self_var.#member})\n            } else {\n                quote!(&#self_var.#member)\n            };\n            let ty = field.ty;\n            quote!(_serde::#private::ser::constrain::<#ty>(#inner))\n        }\n        (true, Some(getter)) => {\n            let ty = field.ty;\n            quote!(_serde::#private::ser::constrain::<#ty>(&#getter(#self_var)))\n        }\n        (false, Some(_)) => {\n            unreachable!(\"getter is only allowed for remote impls\");\n        }\n    }\n}\n\nfn effective_style(variant: &Variant) -> Style {\n    match variant.style {\n        Style::Newtype if variant.fields[0].attrs.skip_serializing() => Style::Unit,\n        other => other,\n    }\n}\n\nenum StructTrait {\n    SerializeMap,\n    SerializeStruct,\n    SerializeStructVariant,\n}\n\nimpl StructTrait {\n    fn serialize_field(&self, span: Span) -> TokenStream {\n        match *self {\n            StructTrait::SerializeMap => {\n                quote_spanned!(span=> _serde::ser::SerializeMap::serialize_entry)\n            }\n            StructTrait::SerializeStruct => {\n                quote_spanned!(span=> _serde::ser::SerializeStruct::serialize_field)\n            }\n            StructTrait::SerializeStructVariant => {\n                quote_spanned!(span=> _serde::ser::SerializeStructVariant::serialize_field)\n            }\n        }\n    }\n\n    fn skip_field(&self, span: Span) -> Option<TokenStream> {\n        match *self {\n            StructTrait::SerializeMap => None,\n            StructTrait::SerializeStruct => {\n                Some(quote_spanned!(span=> _serde::ser::SerializeStruct::skip_field))\n            }\n            StructTrait::SerializeStructVariant => {\n                Some(quote_spanned!(span=> _serde::ser::SerializeStructVariant::skip_field))\n            }\n        }\n    }\n}\n\nenum TupleTrait {\n    SerializeTuple,\n    SerializeTupleStruct,\n    SerializeTupleVariant,\n}\n\nimpl TupleTrait {\n    fn serialize_element(&self, span: Span) -> TokenStream {\n        match *self {\n            TupleTrait::SerializeTuple => {\n                quote_spanned!(span=> _serde::ser::SerializeTuple::serialize_element)\n            }\n            TupleTrait::SerializeTupleStruct => {\n                quote_spanned!(span=> _serde::ser::SerializeTupleStruct::serialize_field)\n            }\n            TupleTrait::SerializeTupleVariant => {\n                quote_spanned!(span=> _serde::ser::SerializeTupleVariant::serialize_field)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "serde_derive/src/this.rs",
    "content": "use crate::internals::ast::Container;\nuse syn::{Path, PathArguments, Token};\n\npub fn this_type(cont: &Container) -> Path {\n    if let Some(remote) = cont.attrs.remote() {\n        let mut this = remote.clone();\n        for segment in &mut this.segments {\n            if let PathArguments::AngleBracketed(arguments) = &mut segment.arguments {\n                arguments.colon2_token = None;\n            }\n        }\n        this\n    } else {\n        Path::from(cont.ident.clone())\n    }\n}\n\npub fn this_value(cont: &Container) -> Path {\n    if let Some(remote) = cont.attrs.remote() {\n        let mut this = remote.clone();\n        for segment in &mut this.segments {\n            if let PathArguments::AngleBracketed(arguments) = &mut segment.arguments {\n                if arguments.colon2_token.is_none() {\n                    arguments.colon2_token = Some(Token![::](arguments.lt_token.span));\n                }\n            }\n        }\n        this\n    } else {\n        Path::from(cont.ident.clone())\n    }\n}\n"
  },
  {
    "path": "serde_derive_internals/Cargo.toml",
    "content": "[package]\nname = \"serde_derive_internals\"\nversion = \"0.29.1\"\nauthors = [\"Erick Tryzelaar <erick.tryzelaar@gmail.com>\", \"David Tolnay <dtolnay@gmail.com>\"]\ndescription = \"AST representation used by Serde derive macros. Unstable.\"\ndocumentation = \"https://docs.rs/serde_derive_internals\"\nedition = \"2021\"\nexclude = [\"build.rs\"]\nhomepage = \"https://serde.rs\"\nkeywords = [\"serde\", \"serialization\"]\nlicense = \"MIT OR Apache-2.0\"\nrepository = \"https://github.com/serde-rs/serde\"\nrust-version = \"1.71\"\n\n[lib]\npath = \"lib.rs\"\n\n[dependencies]\nproc-macro2 = { workspace = true }\nquote = { workspace = true }\nsyn = { workspace = true, features = [\"clone-impls\", \"derive\", \"parsing\", \"printing\"] }\n\n[package.metadata.docs.rs]\ntargets = [\"x86_64-unknown-linux-gnu\"]\nrustdoc-args = [\n    \"--generate-link-to-definition\",\n    \"--generate-macro-expansion\",\n    \"--extern-html-root-url=core=https://doc.rust-lang.org\",\n    \"--extern-html-root-url=alloc=https://doc.rust-lang.org\",\n    \"--extern-html-root-url=std=https://doc.rust-lang.org\",\n    \"--extern-html-root-url=proc_macro=https://doc.rust-lang.org\",\n]\n"
  },
  {
    "path": "serde_derive_internals/build.rs",
    "content": "use std::path::Path;\n\nfn main() {\n    // Warning: build.rs is not published to crates.io.\n\n    println!(\"cargo:rerun-if-changed=build.rs\");\n    println!(\"cargo:rerun-if-changed=src/mod.rs\");\n\n    println!(\"cargo:rustc-cfg=check_cfg\");\n    println!(\"cargo:rustc-check-cfg=cfg(check_cfg)\");\n    println!(\"cargo:rustc-check-cfg=cfg(exhaustive)\");\n    println!(\"cargo:rustc-check-cfg=cfg(serde_build_from_git)\");\n    println!(\"cargo:rustc-check-cfg=cfg(feature, values(\\\"deserialize_in_place\\\"))\");\n\n    // Sometimes on Windows the git checkout does not correctly wire up the\n    // symlink from serde_derive_internals/src to serde_derive/src/internals.\n    // When this happens we'll just build based on relative paths within the git\n    // repo.\n    let mod_behind_symlink = Path::new(\"src/mod.rs\");\n    if !mod_behind_symlink.exists() {\n        println!(\"cargo:rustc-cfg=serde_build_from_git\");\n    }\n}\n"
  },
  {
    "path": "serde_derive_internals/lib.rs",
    "content": "#![doc(html_root_url = \"https://docs.rs/serde_derive_internals/0.29.1\")]\n#![cfg_attr(not(check_cfg), allow(unexpected_cfgs))]\n// Ignored clippy lints\n#![allow(\n    clippy::cognitive_complexity,\n    // clippy bug: https://github.com/rust-lang/rust-clippy/issues/7575\n    clippy::collapsible_match,\n    clippy::derive_partial_eq_without_eq,\n    // clippy bug: https://github.com/rust-lang/rust-clippy/issues/6797\n    clippy::manual_map,\n    clippy::missing_panics_doc,\n    clippy::needless_lifetimes,\n    clippy::redundant_field_names,\n    clippy::result_unit_err,\n    clippy::should_implement_trait,\n    clippy::trivially_copy_pass_by_ref,\n    clippy::wildcard_in_or_patterns,\n    // clippy bug: https://github.com/rust-lang/rust-clippy/issues/5704\n    clippy::unnested_or_patterns,\n)]\n// Ignored clippy_pedantic lints\n#![allow(\n    clippy::doc_markdown,\n    clippy::elidable_lifetime_names,\n    clippy::enum_glob_use,\n    clippy::items_after_statements,\n    clippy::let_underscore_untyped,\n    clippy::manual_assert,\n    clippy::match_same_arms,\n    // clippy bug: https://github.com/rust-lang/rust-clippy/issues/6984\n    clippy::match_wildcard_for_single_variants,\n    clippy::missing_errors_doc,\n    clippy::module_name_repetitions,\n    clippy::must_use_candidate,\n    clippy::return_self_not_must_use,\n    clippy::similar_names,\n    clippy::single_match_else,\n    clippy::struct_excessive_bools,\n    clippy::too_many_lines,\n    clippy::uninlined_format_args,\n    clippy::unused_self,\n    clippy::wildcard_imports\n)]\n#![allow(unknown_lints, mismatched_lifetime_syntaxes)]\n\nextern crate proc_macro2;\nextern crate quote;\nextern crate syn;\n\n#[cfg_attr(serde_build_from_git, path = \"../serde_derive/src/internals/mod.rs\")]\n#[cfg_attr(not(serde_build_from_git), path = \"src/mod.rs\")]\nmod internals;\n\npub use internals::*;\n"
  },
  {
    "path": "test_suite/Cargo.toml",
    "content": "[package]\nname = \"serde_test_suite\"\nversion = \"0.0.0\"\nauthors = [\"Erick Tryzelaar <erick.tryzelaar@gmail.com>\", \"David Tolnay <dtolnay@gmail.com>\"]\nedition = \"2021\"\npublish = false\n\n[features]\nunstable = [\"serde/unstable\"]\n\n[dependencies]\nserde = { path = \"../serde\" }\n\n[dev-dependencies]\nautomod = \"1.0.1\"\nfoldhash = \"0.2\"\nrustversion = \"1.0\"\nserde = { path = \"../serde\", features = [\"rc\"] }\nserde_derive = { path = \"../serde_derive\", features = [\"deserialize_in_place\"] }\nserde_test = \"1.0.176\"\ntrybuild = { version = \"1.0.108\", features = [\"diff\"] }\n"
  },
  {
    "path": "test_suite/no_std/.gitignore",
    "content": "/target/\n/Cargo.lock\n"
  },
  {
    "path": "test_suite/no_std/Cargo.toml",
    "content": "[package]\nname = \"serde_derive_tests_no_std\"\nversion = \"0.0.0\"\nauthors = [\"David Tolnay <dtolnay@gmail.com>\"]\nedition = \"2021\"\npublish = false\n\n[dependencies]\nlibc = { version = \"0.2\", default-features = false }\nserde = { path = \"../../serde\", default-features = false }\nserde_derive = { path = \"../../serde_derive\" }\n\n[profile.dev]\npanic = \"abort\"\n\n[profile.release]\npanic = \"abort\"\n\n[workspace]\n"
  },
  {
    "path": "test_suite/no_std/src/main.rs",
    "content": "#![no_std]\n#![no_main]\n\nuse core::ffi::c_int;\n\n#[no_mangle]\nextern \"C\" fn main(_argc: c_int, _argv: *const *const u8) -> c_int {\n    0\n}\n\n#[panic_handler]\nfn panic(_info: &core::panic::PanicInfo) -> ! {\n    unsafe {\n        libc::abort();\n    }\n}\n\n//////////////////////////////////////////////////////////////////////////////\n\nuse serde_derive::{Deserialize, Serialize};\n\n#[derive(Serialize, Deserialize)]\npub struct Unit;\n\n#[derive(Serialize, Deserialize)]\npub struct Newtype(u8);\n\n#[derive(Serialize, Deserialize)]\npub struct Tuple(u8, u8);\n\n#[derive(Serialize, Deserialize)]\npub struct Struct {\n    f: u8,\n}\n\n#[derive(Serialize, Deserialize)]\npub enum Enum {\n    Unit,\n    Newtype(u8),\n    Tuple(u8, u8),\n    Struct { f: u8 },\n}\n"
  },
  {
    "path": "test_suite/tests/bytes/mod.rs",
    "content": "use serde::de::{Deserializer, Error, SeqAccess, Visitor};\nuse std::fmt;\n\npub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error>\nwhere\n    D: Deserializer<'de>,\n{\n    deserializer.deserialize_byte_buf(ByteBufVisitor)\n}\n\nstruct ByteBufVisitor;\n\nimpl<'de> Visitor<'de> for ByteBufVisitor {\n    type Value = Vec<u8>;\n\n    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n        formatter.write_str(\"byte array\")\n    }\n\n    fn visit_seq<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>\n    where\n        V: SeqAccess<'de>,\n    {\n        let mut values = Vec::new();\n        while let Some(value) = visitor.next_element()? {\n            values.push(value);\n        }\n        Ok(values)\n    }\n\n    fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        Ok(v.to_vec())\n    }\n\n    fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        Ok(v)\n    }\n\n    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        Ok(v.as_bytes().to_vec())\n    }\n\n    fn visit_string<E>(self, v: String) -> Result<Self::Value, E>\n    where\n        E: Error,\n    {\n        Ok(v.into_bytes())\n    }\n}\n"
  },
  {
    "path": "test_suite/tests/compiletest.rs",
    "content": "#[cfg_attr(target_os = \"emscripten\", ignore = \"disabled on Emscripten\")]\n#[rustversion::attr(not(nightly), ignore = \"requires nightly\")]\n#[cfg_attr(miri, ignore = \"incompatible with miri\")]\n#[allow(unused_attributes)]\n#[test]\nfn ui() {\n    let t = trybuild::TestCases::new();\n    t.compile_fail(\"tests/ui/**/*.rs\");\n}\n"
  },
  {
    "path": "test_suite/tests/macros/mod.rs",
    "content": "#![allow(unused_macro_rules)]\n\nuse serde_test::Token;\nuse std::iter;\n\nmacro_rules! btreeset {\n    () => {\n        BTreeSet::new()\n    };\n    ($($value:expr),+) => {{\n        let mut set = BTreeSet::new();\n        $(set.insert($value);)+\n        set\n    }};\n}\n\nmacro_rules! btreemap {\n    () => {\n        BTreeMap::new()\n    };\n    ($($key:expr => $value:expr),+) => {{\n        let mut map = BTreeMap::new();\n        $(map.insert($key, $value);)+\n        map\n    }};\n}\n\nmacro_rules! hashset {\n    () => {\n        HashSet::new()\n    };\n    ($($value:expr),+) => {{\n        let mut set = HashSet::new();\n        $(set.insert($value);)+\n        set\n    }};\n    ($hasher:ty; $($value:expr),+) => {{\n        let mut set = HashSet::<_, $hasher>::default();\n        $(set.insert($value);)+\n        set\n    }};\n}\n\nmacro_rules! hashmap {\n    () => {\n        HashMap::new()\n    };\n    ($($key:expr => $value:expr),+) => {{\n        let mut map = HashMap::new();\n        $(map.insert($key, $value);)+\n        map\n    }};\n    ($hasher:ty; $($key:expr => $value:expr),+) => {{\n        let mut map = HashMap::<_, _, $hasher>::default();\n        $(map.insert($key, $value);)+\n        map\n    }};\n}\n\npub trait SingleTokenIntoIterator {\n    fn into_iter(self) -> iter::Once<Token>;\n}\n\nimpl SingleTokenIntoIterator for Token {\n    fn into_iter(self) -> iter::Once<Token> {\n        iter::once(self)\n    }\n}\n\nmacro_rules! seq {\n    ($($elem:expr),* $(,)?) => {{\n        use crate::macros::SingleTokenIntoIterator;\n        let mut vec = Vec::new();\n        $(<Vec<Token> as Extend<Token>>::extend(&mut vec, $elem.into_iter());)*\n        vec\n    }};\n}\n"
  },
  {
    "path": "test_suite/tests/regression/issue1904.rs",
    "content": "#![allow(dead_code)] // we do not read enum fields\n\nuse serde_derive::Deserialize;\n\n#[derive(Deserialize)]\npub struct Nested;\n\n#[derive(Deserialize)]\npub enum ExternallyTagged1 {\n    Tuple(f64, String),\n    Flatten {\n        #[serde(flatten)]\n        nested: Nested,\n    },\n}\n\n#[derive(Deserialize)]\npub enum ExternallyTagged2 {\n    Flatten {\n        #[serde(flatten)]\n        nested: Nested,\n    },\n    Tuple(f64, String),\n}\n\n// Internally tagged enums cannot contain tuple variants so not tested here\n\n#[derive(Deserialize)]\n#[serde(tag = \"tag\", content = \"content\")]\npub enum AdjacentlyTagged1 {\n    Tuple(f64, String),\n    Flatten {\n        #[serde(flatten)]\n        nested: Nested,\n    },\n}\n\n#[derive(Deserialize)]\n#[serde(tag = \"tag\", content = \"content\")]\npub enum AdjacentlyTagged2 {\n    Flatten {\n        #[serde(flatten)]\n        nested: Nested,\n    },\n    Tuple(f64, String),\n}\n\n#[derive(Deserialize)]\n#[serde(untagged)]\npub enum Untagged1 {\n    Tuple(f64, String),\n    Flatten {\n        #[serde(flatten)]\n        nested: Nested,\n    },\n}\n\n#[derive(Deserialize)]\n#[serde(untagged)]\npub enum Untagged2 {\n    Flatten {\n        #[serde(flatten)]\n        nested: Nested,\n    },\n    Tuple(f64, String),\n}\n"
  },
  {
    "path": "test_suite/tests/regression/issue2371.rs",
    "content": "#![allow(dead_code)]\n\nuse serde_derive::Deserialize;\n\n#[derive(Deserialize)]\npub struct Nested;\n\n#[derive(Deserialize)]\npub enum ExternallyTagged {\n    Flatten {\n        #[serde(flatten)]\n        #[allow(dead_code)]\n        nested: Nested,\n        #[allow(dead_code)]\n        string: &'static str,\n    },\n}\n\n#[derive(Deserialize)]\n#[serde(tag = \"tag\")]\npub enum InternallyTagged {\n    Flatten {\n        #[serde(flatten)]\n        #[allow(dead_code)]\n        nested: Nested,\n        #[allow(dead_code)]\n        string: &'static str,\n    },\n}\n\n#[derive(Deserialize)]\n#[serde(tag = \"tag\", content = \"content\")]\npub enum AdjacentlyTagged {\n    Flatten {\n        #[serde(flatten)]\n        #[allow(dead_code)]\n        nested: Nested,\n        #[allow(dead_code)]\n        string: &'static str,\n    },\n}\n\n#[derive(Deserialize)]\n#[serde(untagged)]\npub enum UntaggedWorkaround {\n    Flatten {\n        #[serde(flatten)]\n        #[allow(dead_code)]\n        nested: Nested,\n        #[allow(dead_code)]\n        string: &'static str,\n    },\n}\n"
  },
  {
    "path": "test_suite/tests/regression/issue2409.rs",
    "content": "#![allow(dead_code)]\n\nuse serde_derive::Deserialize;\n\nmacro_rules! bug {\n    ($serde_path:literal) => {\n        #[derive(Deserialize)]\n        #[serde(crate = $serde_path)]\n        pub struct Struct;\n    };\n}\n\nbug!(\"serde\");\n"
  },
  {
    "path": "test_suite/tests/regression/issue2415.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\n#[serde()]\n#[allow(dead_code)]\npub struct S;\n"
  },
  {
    "path": "test_suite/tests/regression/issue2565.rs",
    "content": "use serde_derive::{Deserialize, Serialize};\nuse serde_test::{assert_tokens, Token};\n\n#[derive(Serialize, Deserialize, Debug, PartialEq)]\nenum Enum {\n    Simple {\n        a: i32,\n    },\n    Flatten {\n        #[serde(flatten)]\n        flatten: (),\n        a: i32,\n    },\n}\n\n#[test]\nfn simple_variant() {\n    assert_tokens(\n        &Enum::Simple { a: 42 },\n        &[\n            Token::StructVariant {\n                name: \"Enum\",\n                variant: \"Simple\",\n                len: 1,\n            },\n            Token::Str(\"a\"),\n            Token::I32(42),\n            Token::StructVariantEnd,\n        ],\n    );\n}\n\n#[test]\nfn flatten_variant() {\n    assert_tokens(\n        &Enum::Flatten { flatten: (), a: 42 },\n        &[\n            Token::NewtypeVariant {\n                name: \"Enum\",\n                variant: \"Flatten\",\n            },\n            Token::Map { len: None },\n            Token::Str(\"a\"),\n            Token::I32(42),\n            Token::MapEnd,\n        ],\n    );\n}\n"
  },
  {
    "path": "test_suite/tests/regression/issue2792.rs",
    "content": "#![allow(dead_code)] // we do not read enum fields\n\nuse serde_derive::Deserialize;\n\n#[derive(Deserialize)]\n#[serde(deny_unknown_fields)]\npub enum A {\n    B {\n        c: String,\n    },\n    D {\n        #[serde(flatten)]\n        e: E,\n    },\n}\n\n#[derive(Deserialize)]\npub struct E {}\n"
  },
  {
    "path": "test_suite/tests/regression/issue2844.rs",
    "content": "#![allow(clippy::trivially_copy_pass_by_ref, dead_code)]\n\nuse serde_derive::{Deserialize, Serialize};\n\nmacro_rules! declare_in_macro {\n    ($with:literal) => {\n        #[derive(Serialize, Deserialize)]\n        pub struct S {\n            #[serde(with = $with)]\n            f: i32,\n        }\n    };\n}\n\ndeclare_in_macro!(\"with\");\n\nmod with {\n    use serde::{Deserializer, Serializer};\n\n    pub fn serialize<S>(_: &i32, _: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        unimplemented!()\n    }\n\n    pub fn deserialize<'de, D>(_: D) -> Result<i32, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        unimplemented!()\n    }\n}\n"
  },
  {
    "path": "test_suite/tests/regression/issue2846.rs",
    "content": "#![allow(clippy::trivially_copy_pass_by_ref, dead_code)]\n\nuse serde_derive::Deserialize;\n\nmacro_rules! declare_in_macro {\n    ($with:literal) => {\n        #[derive(Deserialize)]\n        pub struct S(\n            #[serde(with = $with)]\n            #[allow(dead_code)]\n            i32,\n        );\n    };\n}\n\ndeclare_in_macro!(\"with\");\n\nmod with {\n    use serde::Deserializer;\n\n    pub fn deserialize<'de, D>(_: D) -> Result<i32, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        unimplemented!()\n    }\n}\n"
  },
  {
    "path": "test_suite/tests/regression.rs",
    "content": "mod regression {\n    automod::dir!(\"tests/regression\");\n}\n"
  },
  {
    "path": "test_suite/tests/test_annotations.rs",
    "content": "#![allow(\n    clippy::cast_lossless,\n    clippy::derive_partial_eq_without_eq,\n    clippy::from_over_into,\n    // Clippy bug: https://github.com/rust-lang/rust-clippy/issues/7422\n    clippy::nonstandard_macro_braces,\n    clippy::too_many_lines,\n    clippy::trivially_copy_pass_by_ref,\n    clippy::type_repetition_in_bounds,\n    clippy::uninlined_format_args,\n)]\n\nuse serde::de::{self, Deserialize, Deserializer, IgnoredAny, MapAccess, Unexpected, Visitor};\nuse serde::ser::{Serialize, Serializer};\nuse serde_derive::{Deserialize, Serialize};\nuse serde_test::{\n    assert_de_tokens, assert_de_tokens_error, assert_ser_tokens, assert_ser_tokens_error,\n    assert_tokens, Token,\n};\nuse std::collections::{BTreeMap, HashMap};\nuse std::convert::TryFrom;\nuse std::fmt;\nuse std::marker::PhantomData;\n\ntrait MyDefault: Sized {\n    fn my_default() -> Self;\n}\n\ntrait ShouldSkip: Sized {\n    fn should_skip(&self) -> bool;\n}\n\ntrait SerializeWith: Sized {\n    fn serialize_with<S>(&self, ser: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer;\n}\n\ntrait DeserializeWith: Sized {\n    fn deserialize_with<'de, D>(de: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>;\n}\n\nimpl MyDefault for i32 {\n    fn my_default() -> Self {\n        123\n    }\n}\n\nimpl ShouldSkip for i32 {\n    fn should_skip(&self) -> bool {\n        *self == 123\n    }\n}\n\nimpl SerializeWith for i32 {\n    fn serialize_with<S>(&self, ser: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        if *self == 123 {\n            true.serialize(ser)\n        } else {\n            false.serialize(ser)\n        }\n    }\n}\n\nimpl DeserializeWith for i32 {\n    fn deserialize_with<'de, D>(de: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        if Deserialize::deserialize(de)? {\n            Ok(123)\n        } else {\n            Ok(2)\n        }\n    }\n}\n\n#[derive(Debug, PartialEq, Serialize, Deserialize)]\nstruct DefaultStruct<A, B, C, D, E>\nwhere\n    C: MyDefault,\n    E: MyDefault,\n{\n    a1: A,\n    #[serde(default)]\n    a2: B,\n    #[serde(default = \"MyDefault::my_default\")]\n    a3: C,\n    #[serde(skip_deserializing)]\n    a4: D,\n    #[serde(skip_deserializing, default = \"MyDefault::my_default\")]\n    a5: E,\n}\n\n#[derive(Debug, PartialEq, Serialize, Deserialize)]\nstruct DefaultTupleStruct<A, B, C>(\n    A,\n    #[serde(default)] B,\n    #[serde(default = \"MyDefault::my_default\")] C,\n)\nwhere\n    C: MyDefault;\n\n#[derive(Debug, PartialEq, Serialize, Deserialize)]\nstruct CollectOther {\n    a: u32,\n    b: u32,\n    #[serde(flatten)]\n    extra: HashMap<String, u32>,\n}\n\n#[test]\nfn test_default_struct() {\n    assert_de_tokens(\n        &DefaultStruct {\n            a1: 1,\n            a2: 2,\n            a3: 3,\n            a4: 0,\n            a5: 123,\n        },\n        &[\n            Token::Struct {\n                name: \"DefaultStruct\",\n                len: 3,\n            },\n            Token::Str(\"a1\"),\n            Token::I32(1),\n            Token::Str(\"a2\"),\n            Token::I32(2),\n            Token::Str(\"a3\"),\n            Token::I32(3),\n            Token::Str(\"a4\"),\n            Token::I32(4),\n            Token::Str(\"a5\"),\n            Token::I32(5),\n            Token::StructEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &DefaultStruct {\n            a1: 1,\n            a2: 0,\n            a3: 123,\n            a4: 0,\n            a5: 123,\n        },\n        &[\n            Token::Struct {\n                name: \"DefaultStruct\",\n                len: 3,\n            },\n            Token::Str(\"a1\"),\n            Token::I32(1),\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_default_tuple() {\n    assert_de_tokens(\n        &DefaultTupleStruct(1, 2, 3),\n        &[\n            Token::TupleStruct {\n                name: \"DefaultTupleStruct\",\n                len: 3,\n            },\n            Token::I32(1),\n            Token::I32(2),\n            Token::I32(3),\n            Token::TupleStructEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &DefaultTupleStruct(1, 0, 123),\n        &[\n            Token::TupleStruct {\n                name: \"DefaultTupleStruct\",\n                len: 3,\n            },\n            Token::I32(1),\n            Token::TupleStructEnd,\n        ],\n    );\n}\n\n#[derive(Debug, PartialEq, Serialize, Deserialize)]\nenum DefaultStructVariant<A, B, C, D, E>\nwhere\n    C: MyDefault,\n    E: MyDefault,\n{\n    Struct {\n        a1: A,\n        #[serde(default)]\n        a2: B,\n        #[serde(default = \"MyDefault::my_default\")]\n        a3: C,\n        #[serde(skip_deserializing)]\n        a4: D,\n        #[serde(skip_deserializing, default = \"MyDefault::my_default\")]\n        a5: E,\n    },\n}\n\n#[derive(Debug, PartialEq, Serialize, Deserialize)]\nenum DefaultTupleVariant<A, B, C>\nwhere\n    C: MyDefault,\n{\n    Tuple(\n        A,\n        #[serde(default)] B,\n        #[serde(default = \"MyDefault::my_default\")] C,\n    ),\n}\n\n#[test]\nfn test_default_struct_variant() {\n    assert_de_tokens(\n        &DefaultStructVariant::Struct {\n            a1: 1,\n            a2: 2,\n            a3: 3,\n            a4: 0,\n            a5: 123,\n        },\n        &[\n            Token::StructVariant {\n                name: \"DefaultStructVariant\",\n                variant: \"Struct\",\n                len: 3,\n            },\n            Token::Str(\"a1\"),\n            Token::I32(1),\n            Token::Str(\"a2\"),\n            Token::I32(2),\n            Token::Str(\"a3\"),\n            Token::I32(3),\n            Token::Str(\"a4\"),\n            Token::I32(4),\n            Token::Str(\"a5\"),\n            Token::I32(5),\n            Token::StructVariantEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &DefaultStructVariant::Struct {\n            a1: 1,\n            a2: 0,\n            a3: 123,\n            a4: 0,\n            a5: 123,\n        },\n        &[\n            Token::StructVariant {\n                name: \"DefaultStructVariant\",\n                variant: \"Struct\",\n                len: 3,\n            },\n            Token::Str(\"a1\"),\n            Token::I32(1),\n            Token::StructVariantEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_default_tuple_variant() {\n    assert_de_tokens(\n        &DefaultTupleVariant::Tuple(1, 2, 3),\n        &[\n            Token::TupleVariant {\n                name: \"DefaultTupleVariant\",\n                variant: \"Tuple\",\n                len: 3,\n            },\n            Token::I32(1),\n            Token::I32(2),\n            Token::I32(3),\n            Token::TupleVariantEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &DefaultTupleVariant::Tuple(1, 0, 123),\n        &[\n            Token::TupleVariant {\n                name: \"DefaultTupleVariant\",\n                variant: \"Tuple\",\n                len: 3,\n            },\n            Token::I32(1),\n            Token::TupleVariantEnd,\n        ],\n    );\n}\n\n// Does not implement std::default::Default.\n#[derive(Debug, PartialEq, Deserialize)]\nstruct NoStdDefault(i8);\n\nimpl MyDefault for NoStdDefault {\n    fn my_default() -> Self {\n        NoStdDefault(123)\n    }\n}\n\n#[derive(Debug, PartialEq, Deserialize)]\nstruct ContainsNoStdDefault<A: MyDefault> {\n    #[serde(default = \"MyDefault::my_default\")]\n    a: A,\n}\n\n// Tests that a struct field does not need to implement std::default::Default if\n// it is annotated with `default=...`.\n#[test]\nfn test_no_std_default() {\n    assert_de_tokens(\n        &ContainsNoStdDefault {\n            a: NoStdDefault(123),\n        },\n        &[\n            Token::Struct {\n                name: \"ContainsNoStdDefault\",\n                len: 1,\n            },\n            Token::StructEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &ContainsNoStdDefault { a: NoStdDefault(8) },\n        &[\n            Token::Struct {\n                name: \"ContainsNoStdDefault\",\n                len: 1,\n            },\n            Token::Str(\"a\"),\n            Token::NewtypeStruct {\n                name: \"NoStdDefault\",\n            },\n            Token::I8(8),\n            Token::StructEnd,\n        ],\n    );\n}\n\n// Does not implement Deserialize.\n#[derive(Debug, PartialEq)]\nstruct NotDeserializeStruct(i8);\n\nimpl Default for NotDeserializeStruct {\n    fn default() -> Self {\n        NotDeserializeStruct(123)\n    }\n}\n\nimpl DeserializeWith for NotDeserializeStruct {\n    fn deserialize_with<'de, D>(_: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        panic!()\n    }\n}\n\n// Does not implement Deserialize.\n#[derive(Debug, PartialEq)]\nenum NotDeserializeEnum {\n    Trouble,\n}\n\nimpl MyDefault for NotDeserializeEnum {\n    fn my_default() -> Self {\n        NotDeserializeEnum::Trouble\n    }\n}\n\n#[derive(Debug, PartialEq, Deserialize)]\nstruct ContainsNotDeserialize<A, B, C: DeserializeWith, E: MyDefault> {\n    #[serde(skip_deserializing)]\n    a: A,\n    #[serde(skip_deserializing, default)]\n    b: B,\n    #[serde(deserialize_with = \"DeserializeWith::deserialize_with\", default)]\n    c: C,\n    #[serde(skip_deserializing, default = \"MyDefault::my_default\")]\n    e: E,\n}\n\n// Tests that a struct field does not need to implement Deserialize if it is\n// annotated with skip_deserializing, whether using the std Default or a\n// custom default.\n#[test]\nfn test_elt_not_deserialize() {\n    assert_de_tokens(\n        &ContainsNotDeserialize {\n            a: NotDeserializeStruct(123),\n            b: NotDeserializeStruct(123),\n            c: NotDeserializeStruct(123),\n            e: NotDeserializeEnum::Trouble,\n        },\n        &[\n            Token::Struct {\n                name: \"ContainsNotDeserialize\",\n                len: 1,\n            },\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[derive(Debug, PartialEq, Serialize, Deserialize)]\n#[serde(deny_unknown_fields)]\nstruct DenyUnknown {\n    a1: i32,\n}\n\n#[test]\nfn test_ignore_unknown() {\n    // 'Default' allows unknown. Basic smoke test of ignore...\n    assert_de_tokens(\n        &DefaultStruct {\n            a1: 1,\n            a2: 2,\n            a3: 3,\n            a4: 0,\n            a5: 123,\n        },\n        &[\n            Token::Struct {\n                name: \"DefaultStruct\",\n                len: 3,\n            },\n            Token::Str(\"whoops1\"),\n            Token::I32(2),\n            Token::Str(\"a1\"),\n            Token::I32(1),\n            Token::Str(\"whoops2\"),\n            Token::Seq { len: Some(1) },\n            Token::I32(2),\n            Token::SeqEnd,\n            Token::Str(\"a2\"),\n            Token::I32(2),\n            Token::Str(\"whoops3\"),\n            Token::I32(2),\n            Token::Str(\"a3\"),\n            Token::I32(3),\n            Token::StructEnd,\n        ],\n    );\n\n    assert_de_tokens_error::<DenyUnknown>(\n        &[\n            Token::Struct {\n                name: \"DenyUnknown\",\n                len: 1,\n            },\n            Token::Str(\"a1\"),\n            Token::I32(1),\n            Token::Str(\"whoops\"),\n        ],\n        \"unknown field `whoops`, expected `a1`\",\n    );\n}\n\n#[derive(Debug, PartialEq, Serialize, Deserialize)]\n#[serde(rename = \"Superhero\")]\nstruct RenameStruct {\n    a1: i32,\n    #[serde(rename = \"a3\")]\n    a2: i32,\n}\n\n#[derive(Debug, PartialEq, Serialize, Deserialize)]\n#[serde(rename(serialize = \"SuperheroSer\", deserialize = \"SuperheroDe\"))]\nstruct RenameStructSerializeDeserialize {\n    a1: i32,\n    #[serde(rename(serialize = \"a4\", deserialize = \"a5\"))]\n    a2: i32,\n}\n\n#[derive(Debug, PartialEq, Deserialize)]\n#[serde(deny_unknown_fields)]\nstruct AliasStruct {\n    a1: i32,\n    #[serde(alias = \"a3\")]\n    a2: i32,\n    #[serde(alias = \"a5\", rename = \"a6\")]\n    a4: i32,\n}\n\n#[test]\nfn test_rename_struct() {\n    assert_tokens(\n        &RenameStruct { a1: 1, a2: 2 },\n        &[\n            Token::Struct {\n                name: \"Superhero\",\n                len: 2,\n            },\n            Token::Str(\"a1\"),\n            Token::I32(1),\n            Token::Str(\"a3\"),\n            Token::I32(2),\n            Token::StructEnd,\n        ],\n    );\n\n    assert_ser_tokens(\n        &RenameStructSerializeDeserialize { a1: 1, a2: 2 },\n        &[\n            Token::Struct {\n                name: \"SuperheroSer\",\n                len: 2,\n            },\n            Token::Str(\"a1\"),\n            Token::I32(1),\n            Token::Str(\"a4\"),\n            Token::I32(2),\n            Token::StructEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &RenameStructSerializeDeserialize { a1: 1, a2: 2 },\n        &[\n            Token::Struct {\n                name: \"SuperheroDe\",\n                len: 2,\n            },\n            Token::Str(\"a1\"),\n            Token::I32(1),\n            Token::Str(\"a5\"),\n            Token::I32(2),\n            Token::StructEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &AliasStruct {\n            a1: 1,\n            a2: 2,\n            a4: 3,\n        },\n        &[\n            Token::Struct {\n                name: \"AliasStruct\",\n                len: 3,\n            },\n            Token::Str(\"a1\"),\n            Token::I32(1),\n            Token::Str(\"a2\"),\n            Token::I32(2),\n            Token::Str(\"a5\"),\n            Token::I32(3),\n            Token::StructEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &AliasStruct {\n            a1: 1,\n            a2: 2,\n            a4: 3,\n        },\n        &[\n            Token::Struct {\n                name: \"AliasStruct\",\n                len: 3,\n            },\n            Token::Str(\"a1\"),\n            Token::I32(1),\n            Token::Str(\"a3\"),\n            Token::I32(2),\n            Token::Str(\"a6\"),\n            Token::I32(3),\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_unknown_field_rename_struct() {\n    assert_de_tokens_error::<AliasStruct>(\n        &[\n            Token::Struct {\n                name: \"AliasStruct\",\n                len: 3,\n            },\n            Token::Str(\"a1\"),\n            Token::I32(1),\n            Token::Str(\"a3\"),\n            Token::I32(2),\n            Token::Str(\"a4\"),\n            Token::I32(3),\n        ],\n        \"unknown field `a4`, expected one of `a1`, `a2`, `a3`, `a5`, `a6`\",\n    );\n}\n\n#[derive(Debug, PartialEq, Serialize, Deserialize)]\n#[serde(rename = \"Superhero\")]\nenum RenameEnum {\n    #[serde(rename = \"bruce_wayne\")]\n    Batman,\n    #[serde(rename = \"clark_kent\")]\n    Superman(i8),\n    #[serde(rename = \"diana_prince\")]\n    WonderWoman(i8, i8),\n    #[serde(rename = \"barry_allan\")]\n    Flash {\n        #[serde(rename = \"b\")]\n        a: i32,\n    },\n}\n\n#[derive(Debug, PartialEq, Deserialize, Serialize)]\n#[serde(rename(serialize = \"SuperheroSer\", deserialize = \"SuperheroDe\"))]\nenum RenameEnumSerializeDeserialize<A> {\n    #[serde(rename(serialize = \"dick_grayson\", deserialize = \"jason_todd\"))]\n    Robin {\n        a: i8,\n        #[serde(rename(serialize = \"c\"))]\n        #[serde(rename(deserialize = \"d\"))]\n        b: A,\n    },\n}\n\n#[derive(Debug, PartialEq, Deserialize)]\n#[serde(deny_unknown_fields)]\nenum AliasEnum {\n    #[serde(rename = \"sailor_moon\", alias = \"usagi_tsukino\")]\n    SailorMoon {\n        a: i8,\n        #[serde(alias = \"c\")]\n        b: i8,\n        #[serde(alias = \"e\", rename = \"f\")]\n        d: i8,\n    },\n}\n\n#[test]\nfn test_rename_enum() {\n    assert_tokens(\n        &RenameEnum::Batman,\n        &[Token::UnitVariant {\n            name: \"Superhero\",\n            variant: \"bruce_wayne\",\n        }],\n    );\n\n    assert_tokens(\n        &RenameEnum::Superman(0),\n        &[\n            Token::NewtypeVariant {\n                name: \"Superhero\",\n                variant: \"clark_kent\",\n            },\n            Token::I8(0),\n        ],\n    );\n\n    assert_tokens(\n        &RenameEnum::WonderWoman(0, 1),\n        &[\n            Token::TupleVariant {\n                name: \"Superhero\",\n                variant: \"diana_prince\",\n                len: 2,\n            },\n            Token::I8(0),\n            Token::I8(1),\n            Token::TupleVariantEnd,\n        ],\n    );\n\n    assert_tokens(\n        &RenameEnum::Flash { a: 1 },\n        &[\n            Token::StructVariant {\n                name: \"Superhero\",\n                variant: \"barry_allan\",\n                len: 1,\n            },\n            Token::Str(\"b\"),\n            Token::I32(1),\n            Token::StructVariantEnd,\n        ],\n    );\n\n    assert_ser_tokens(\n        &RenameEnumSerializeDeserialize::Robin {\n            a: 0,\n            b: String::new(),\n        },\n        &[\n            Token::StructVariant {\n                name: \"SuperheroSer\",\n                variant: \"dick_grayson\",\n                len: 2,\n            },\n            Token::Str(\"a\"),\n            Token::I8(0),\n            Token::Str(\"c\"),\n            Token::Str(\"\"),\n            Token::StructVariantEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &RenameEnumSerializeDeserialize::Robin {\n            a: 0,\n            b: String::new(),\n        },\n        &[\n            Token::StructVariant {\n                name: \"SuperheroDe\",\n                variant: \"jason_todd\",\n                len: 2,\n            },\n            Token::Str(\"a\"),\n            Token::I8(0),\n            Token::Str(\"d\"),\n            Token::Str(\"\"),\n            Token::StructVariantEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &AliasEnum::SailorMoon { a: 0, b: 1, d: 2 },\n        &[\n            Token::StructVariant {\n                name: \"AliasEnum\",\n                variant: \"sailor_moon\",\n                len: 5,\n            },\n            Token::Str(\"a\"),\n            Token::I8(0),\n            Token::Str(\"b\"),\n            Token::I8(1),\n            Token::Str(\"e\"),\n            Token::I8(2),\n            Token::StructVariantEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &AliasEnum::SailorMoon { a: 0, b: 1, d: 2 },\n        &[\n            Token::StructVariant {\n                name: \"AliasEnum\",\n                variant: \"usagi_tsukino\",\n                len: 5,\n            },\n            Token::Str(\"a\"),\n            Token::I8(0),\n            Token::Str(\"c\"),\n            Token::I8(1),\n            Token::Str(\"f\"),\n            Token::I8(2),\n            Token::StructVariantEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_unknown_field_rename_enum() {\n    assert_de_tokens_error::<AliasEnum>(\n        &[Token::StructVariant {\n            name: \"AliasEnum\",\n            variant: \"SailorMoon\",\n            len: 3,\n        }],\n        \"unknown variant `SailorMoon`, expected `sailor_moon` or `usagi_tsukino`\",\n    );\n\n    assert_de_tokens_error::<AliasEnum>(\n        &[\n            Token::StructVariant {\n                name: \"AliasEnum\",\n                variant: \"usagi_tsukino\",\n                len: 5,\n            },\n            Token::Str(\"a\"),\n            Token::I8(0),\n            Token::Str(\"c\"),\n            Token::I8(1),\n            Token::Str(\"d\"),\n            Token::I8(2),\n        ],\n        \"unknown field `d`, expected one of `a`, `b`, `c`, `e`, `f`\",\n    );\n}\n\n#[derive(Debug, PartialEq, Serialize)]\nstruct SkipSerializingStruct<'a, B, C>\nwhere\n    C: ShouldSkip,\n{\n    a: &'a i8,\n    #[serde(skip_serializing)]\n    b: B,\n    #[serde(skip_serializing_if = \"ShouldSkip::should_skip\")]\n    c: C,\n}\n\n#[test]\nfn test_skip_serializing_struct() {\n    let a = 1;\n    assert_ser_tokens(\n        &SkipSerializingStruct { a: &a, b: 2, c: 3 },\n        &[\n            Token::Struct {\n                name: \"SkipSerializingStruct\",\n                len: 2,\n            },\n            Token::Str(\"a\"),\n            Token::I8(1),\n            Token::Str(\"c\"),\n            Token::I32(3),\n            Token::StructEnd,\n        ],\n    );\n\n    assert_ser_tokens(\n        &SkipSerializingStruct {\n            a: &a,\n            b: 2,\n            c: 123,\n        },\n        &[\n            Token::Struct {\n                name: \"SkipSerializingStruct\",\n                len: 1,\n            },\n            Token::Str(\"a\"),\n            Token::I8(1),\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[derive(Debug, PartialEq, Serialize)]\nstruct SkipSerializingTupleStruct<'a, B, C>(\n    &'a i8,\n    #[serde(skip_serializing)] B,\n    #[serde(skip_serializing_if = \"ShouldSkip::should_skip\")] C,\n)\nwhere\n    C: ShouldSkip;\n\n#[test]\nfn test_skip_serializing_tuple_struct() {\n    let a = 1;\n    assert_ser_tokens(\n        &SkipSerializingTupleStruct(&a, 2, 3),\n        &[\n            Token::TupleStruct {\n                name: \"SkipSerializingTupleStruct\",\n                len: 2,\n            },\n            Token::I8(1),\n            Token::I32(3),\n            Token::TupleStructEnd,\n        ],\n    );\n\n    assert_ser_tokens(\n        &SkipSerializingTupleStruct(&a, 2, 123),\n        &[\n            Token::TupleStruct {\n                name: \"SkipSerializingTupleStruct\",\n                len: 1,\n            },\n            Token::I8(1),\n            Token::TupleStructEnd,\n        ],\n    );\n}\n\n#[derive(Debug, PartialEq, Serialize, Deserialize)]\nstruct SkipStruct<B> {\n    a: i8,\n    #[serde(skip)]\n    b: B,\n}\n\n#[test]\nfn test_skip_struct() {\n    assert_ser_tokens(\n        &SkipStruct { a: 1, b: 2 },\n        &[\n            Token::Struct {\n                name: \"SkipStruct\",\n                len: 1,\n            },\n            Token::Str(\"a\"),\n            Token::I8(1),\n            Token::StructEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &SkipStruct { a: 1, b: 0 },\n        &[\n            Token::Struct {\n                name: \"SkipStruct\",\n                len: 1,\n            },\n            Token::Str(\"a\"),\n            Token::I8(1),\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[derive(Debug, PartialEq, Serialize)]\nenum SkipSerializingEnum<'a, B, C>\nwhere\n    C: ShouldSkip,\n{\n    Struct {\n        a: &'a i8,\n        #[serde(skip_serializing)]\n        _b: B,\n        #[serde(skip_serializing_if = \"ShouldSkip::should_skip\")]\n        c: C,\n    },\n    Tuple(\n        &'a i8,\n        #[serde(skip_serializing)] B,\n        #[serde(skip_serializing_if = \"ShouldSkip::should_skip\")] C,\n    ),\n}\n\n#[test]\nfn test_skip_serializing_enum() {\n    let a = 1;\n    assert_ser_tokens(\n        &SkipSerializingEnum::Struct { a: &a, _b: 2, c: 3 },\n        &[\n            Token::StructVariant {\n                name: \"SkipSerializingEnum\",\n                variant: \"Struct\",\n                len: 2,\n            },\n            Token::Str(\"a\"),\n            Token::I8(1),\n            Token::Str(\"c\"),\n            Token::I32(3),\n            Token::StructVariantEnd,\n        ],\n    );\n\n    assert_ser_tokens(\n        &SkipSerializingEnum::Struct {\n            a: &a,\n            _b: 2,\n            c: 123,\n        },\n        &[\n            Token::StructVariant {\n                name: \"SkipSerializingEnum\",\n                variant: \"Struct\",\n                len: 1,\n            },\n            Token::Str(\"a\"),\n            Token::I8(1),\n            Token::StructVariantEnd,\n        ],\n    );\n\n    assert_ser_tokens(\n        &SkipSerializingEnum::Tuple(&a, 2, 3),\n        &[\n            Token::TupleVariant {\n                name: \"SkipSerializingEnum\",\n                variant: \"Tuple\",\n                len: 2,\n            },\n            Token::I8(1),\n            Token::I32(3),\n            Token::TupleVariantEnd,\n        ],\n    );\n\n    assert_ser_tokens(\n        &SkipSerializingEnum::Tuple(&a, 2, 123),\n        &[\n            Token::TupleVariant {\n                name: \"SkipSerializingEnum\",\n                variant: \"Tuple\",\n                len: 1,\n            },\n            Token::I8(1),\n            Token::TupleVariantEnd,\n        ],\n    );\n}\n\n#[derive(Debug, PartialEq)]\nstruct NotSerializeStruct(i8);\n\n#[derive(Debug, PartialEq)]\nenum NotSerializeEnum {\n    Trouble,\n}\n\nimpl SerializeWith for NotSerializeEnum {\n    fn serialize_with<S>(&self, ser: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        \"trouble\".serialize(ser)\n    }\n}\n\n#[derive(Debug, PartialEq, Serialize)]\nstruct ContainsNotSerialize<'a, B, C, D>\nwhere\n    B: 'a,\n    D: SerializeWith,\n{\n    a: &'a Option<i8>,\n    #[serde(skip_serializing)]\n    b: &'a B,\n    #[serde(skip_serializing)]\n    c: Option<C>,\n    #[serde(serialize_with = \"SerializeWith::serialize_with\")]\n    d: D,\n}\n\n#[test]\nfn test_elt_not_serialize() {\n    let a = 1;\n    assert_ser_tokens(\n        &ContainsNotSerialize {\n            a: &Some(a),\n            b: &NotSerializeStruct(2),\n            c: Some(NotSerializeEnum::Trouble),\n            d: NotSerializeEnum::Trouble,\n        },\n        &[\n            Token::Struct {\n                name: \"ContainsNotSerialize\",\n                len: 2,\n            },\n            Token::Str(\"a\"),\n            Token::Some,\n            Token::I8(1),\n            Token::Str(\"d\"),\n            Token::Str(\"trouble\"),\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[derive(Debug, PartialEq, Serialize)]\nstruct SerializeWithStruct<'a, B>\nwhere\n    B: SerializeWith,\n{\n    a: &'a i8,\n    #[serde(serialize_with = \"SerializeWith::serialize_with\")]\n    b: B,\n}\n\n#[test]\nfn test_serialize_with_struct() {\n    let a = 1;\n    assert_ser_tokens(\n        &SerializeWithStruct { a: &a, b: 2 },\n        &[\n            Token::Struct {\n                name: \"SerializeWithStruct\",\n                len: 2,\n            },\n            Token::Str(\"a\"),\n            Token::I8(1),\n            Token::Str(\"b\"),\n            Token::Bool(false),\n            Token::StructEnd,\n        ],\n    );\n\n    assert_ser_tokens(\n        &SerializeWithStruct { a: &a, b: 123 },\n        &[\n            Token::Struct {\n                name: \"SerializeWithStruct\",\n                len: 2,\n            },\n            Token::Str(\"a\"),\n            Token::I8(1),\n            Token::Str(\"b\"),\n            Token::Bool(true),\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[derive(Debug, PartialEq, Serialize)]\nenum SerializeWithEnum<'a, B>\nwhere\n    B: SerializeWith,\n{\n    Struct {\n        a: &'a i8,\n        #[serde(serialize_with = \"SerializeWith::serialize_with\")]\n        b: B,\n    },\n}\n\n#[test]\nfn test_serialize_with_enum() {\n    let a = 1;\n    assert_ser_tokens(\n        &SerializeWithEnum::Struct { a: &a, b: 2 },\n        &[\n            Token::StructVariant {\n                name: \"SerializeWithEnum\",\n                variant: \"Struct\",\n                len: 2,\n            },\n            Token::Str(\"a\"),\n            Token::I8(1),\n            Token::Str(\"b\"),\n            Token::Bool(false),\n            Token::StructVariantEnd,\n        ],\n    );\n\n    assert_ser_tokens(\n        &SerializeWithEnum::Struct { a: &a, b: 123 },\n        &[\n            Token::StructVariant {\n                name: \"SerializeWithEnum\",\n                variant: \"Struct\",\n                len: 2,\n            },\n            Token::Str(\"a\"),\n            Token::I8(1),\n            Token::Str(\"b\"),\n            Token::Bool(true),\n            Token::StructVariantEnd,\n        ],\n    );\n}\n\n#[derive(Debug, PartialEq, Serialize, Deserialize)]\nenum WithVariant {\n    #[serde(serialize_with = \"serialize_unit_variant_as_i8\")]\n    #[serde(deserialize_with = \"deserialize_i8_as_unit_variant\")]\n    Unit,\n\n    #[serde(serialize_with = \"SerializeWith::serialize_with\")]\n    #[serde(deserialize_with = \"DeserializeWith::deserialize_with\")]\n    Newtype(i32),\n\n    #[serde(serialize_with = \"serialize_variant_as_string\")]\n    #[serde(deserialize_with = \"deserialize_string_as_variant\")]\n    Tuple(String, u8),\n\n    #[serde(serialize_with = \"serialize_variant_as_string\")]\n    #[serde(deserialize_with = \"deserialize_string_as_variant\")]\n    Struct { f1: String, f2: u8 },\n}\n\nfn serialize_unit_variant_as_i8<S>(serializer: S) -> Result<S::Ok, S::Error>\nwhere\n    S: Serializer,\n{\n    serializer.serialize_i8(0)\n}\n\nfn deserialize_i8_as_unit_variant<'de, D>(deserializer: D) -> Result<(), D::Error>\nwhere\n    D: Deserializer<'de>,\n{\n    let n = i8::deserialize(deserializer)?;\n    match n {\n        0 => Ok(()),\n        _ => Err(de::Error::invalid_value(Unexpected::Signed(n as i64), &\"0\")),\n    }\n}\n\nfn serialize_variant_as_string<S>(f1: &str, f2: &u8, serializer: S) -> Result<S::Ok, S::Error>\nwhere\n    S: Serializer,\n{\n    serializer.collect_str(&format_args!(\"{};{:?}\", f1, f2))\n}\n\nfn deserialize_string_as_variant<'de, D>(deserializer: D) -> Result<(String, u8), D::Error>\nwhere\n    D: Deserializer<'de>,\n{\n    let s = String::deserialize(deserializer)?;\n    let mut pieces = s.split(';');\n    let Some(f1) = pieces.next() else {\n        return Err(de::Error::invalid_length(0, &\"2\"));\n    };\n    let Some(f2) = pieces.next() else {\n        return Err(de::Error::invalid_length(1, &\"2\"));\n    };\n    let Ok(f2) = f2.parse() else {\n        return Err(de::Error::invalid_value(\n            Unexpected::Str(f2),\n            &\"an 8-bit signed integer\",\n        ));\n    };\n    Ok((f1.into(), f2))\n}\n\n#[test]\nfn test_serialize_with_variant() {\n    assert_ser_tokens(\n        &WithVariant::Unit,\n        &[\n            Token::NewtypeVariant {\n                name: \"WithVariant\",\n                variant: \"Unit\",\n            },\n            Token::I8(0),\n        ],\n    );\n\n    assert_ser_tokens(\n        &WithVariant::Newtype(123),\n        &[\n            Token::NewtypeVariant {\n                name: \"WithVariant\",\n                variant: \"Newtype\",\n            },\n            Token::Bool(true),\n        ],\n    );\n\n    assert_ser_tokens(\n        &WithVariant::Tuple(\"hello\".into(), 0),\n        &[\n            Token::NewtypeVariant {\n                name: \"WithVariant\",\n                variant: \"Tuple\",\n            },\n            Token::Str(\"hello;0\"),\n        ],\n    );\n\n    assert_ser_tokens(\n        &WithVariant::Struct {\n            f1: \"world\".into(),\n            f2: 1,\n        },\n        &[\n            Token::NewtypeVariant {\n                name: \"WithVariant\",\n                variant: \"Struct\",\n            },\n            Token::Str(\"world;1\"),\n        ],\n    );\n}\n\n#[test]\nfn test_deserialize_with_variant() {\n    assert_de_tokens(\n        &WithVariant::Unit,\n        &[\n            Token::NewtypeVariant {\n                name: \"WithVariant\",\n                variant: \"Unit\",\n            },\n            Token::I8(0),\n        ],\n    );\n\n    assert_de_tokens(\n        &WithVariant::Newtype(123),\n        &[\n            Token::NewtypeVariant {\n                name: \"WithVariant\",\n                variant: \"Newtype\",\n            },\n            Token::Bool(true),\n        ],\n    );\n\n    assert_de_tokens(\n        &WithVariant::Tuple(\"hello\".into(), 0),\n        &[\n            Token::NewtypeVariant {\n                name: \"WithVariant\",\n                variant: \"Tuple\",\n            },\n            Token::Str(\"hello;0\"),\n        ],\n    );\n\n    assert_de_tokens(\n        &WithVariant::Struct {\n            f1: \"world\".into(),\n            f2: 1,\n        },\n        &[\n            Token::NewtypeVariant {\n                name: \"WithVariant\",\n                variant: \"Struct\",\n            },\n            Token::Str(\"world;1\"),\n        ],\n    );\n}\n\n#[derive(Debug, PartialEq, Deserialize)]\nstruct DeserializeWithStruct<B>\nwhere\n    B: DeserializeWith,\n{\n    a: i8,\n    #[serde(deserialize_with = \"DeserializeWith::deserialize_with\")]\n    b: B,\n}\n\n#[test]\nfn test_deserialize_with_struct() {\n    assert_de_tokens(\n        &DeserializeWithStruct { a: 1, b: 2 },\n        &[\n            Token::Struct {\n                name: \"DeserializeWithStruct\",\n                len: 2,\n            },\n            Token::Str(\"a\"),\n            Token::I8(1),\n            Token::Str(\"b\"),\n            Token::Bool(false),\n            Token::StructEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &DeserializeWithStruct { a: 1, b: 123 },\n        &[\n            Token::Struct {\n                name: \"DeserializeWithStruct\",\n                len: 2,\n            },\n            Token::Str(\"a\"),\n            Token::I8(1),\n            Token::Str(\"b\"),\n            Token::Bool(true),\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[derive(Debug, PartialEq, Deserialize)]\nenum DeserializeWithEnum<B>\nwhere\n    B: DeserializeWith,\n{\n    Struct {\n        a: i8,\n        #[serde(deserialize_with = \"DeserializeWith::deserialize_with\")]\n        b: B,\n    },\n}\n\n#[test]\nfn test_deserialize_with_enum() {\n    assert_de_tokens(\n        &DeserializeWithEnum::Struct { a: 1, b: 2 },\n        &[\n            Token::StructVariant {\n                name: \"DeserializeWithEnum\",\n                variant: \"Struct\",\n                len: 2,\n            },\n            Token::Str(\"a\"),\n            Token::I8(1),\n            Token::Str(\"b\"),\n            Token::Bool(false),\n            Token::StructVariantEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &DeserializeWithEnum::Struct { a: 1, b: 123 },\n        &[\n            Token::StructVariant {\n                name: \"DeserializeWithEnum\",\n                variant: \"Struct\",\n                len: 2,\n            },\n            Token::Str(\"a\"),\n            Token::I8(1),\n            Token::Str(\"b\"),\n            Token::Bool(true),\n            Token::StructVariantEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_missing_renamed_field_struct() {\n    assert_de_tokens_error::<RenameStruct>(\n        &[\n            Token::Struct {\n                name: \"Superhero\",\n                len: 2,\n            },\n            Token::Str(\"a1\"),\n            Token::I32(1),\n            Token::StructEnd,\n        ],\n        \"missing field `a3`\",\n    );\n\n    assert_de_tokens_error::<RenameStructSerializeDeserialize>(\n        &[\n            Token::Struct {\n                name: \"SuperheroDe\",\n                len: 2,\n            },\n            Token::Str(\"a1\"),\n            Token::I32(1),\n            Token::StructEnd,\n        ],\n        \"missing field `a5`\",\n    );\n}\n\n#[test]\nfn test_missing_renamed_field_enum() {\n    assert_de_tokens_error::<RenameEnum>(\n        &[\n            Token::StructVariant {\n                name: \"Superhero\",\n                variant: \"barry_allan\",\n                len: 1,\n            },\n            Token::StructVariantEnd,\n        ],\n        \"missing field `b`\",\n    );\n\n    assert_de_tokens_error::<RenameEnumSerializeDeserialize<i8>>(\n        &[\n            Token::StructVariant {\n                name: \"SuperheroDe\",\n                variant: \"jason_todd\",\n                len: 2,\n            },\n            Token::Str(\"a\"),\n            Token::I8(0),\n            Token::StructVariantEnd,\n        ],\n        \"missing field `d`\",\n    );\n}\n\n#[derive(Debug, PartialEq, Deserialize)]\nenum InvalidLengthEnum {\n    A(i32, i32, i32),\n    B(#[serde(skip_deserializing)] i32, i32, i32),\n}\n\n#[test]\nfn test_invalid_length_enum() {\n    assert_de_tokens_error::<InvalidLengthEnum>(\n        &[\n            Token::TupleVariant {\n                name: \"InvalidLengthEnum\",\n                variant: \"A\",\n                len: 3,\n            },\n            Token::I32(1),\n            Token::TupleVariantEnd,\n        ],\n        \"invalid length 1, expected tuple variant InvalidLengthEnum::A with 3 elements\",\n    );\n    assert_de_tokens_error::<InvalidLengthEnum>(\n        &[\n            Token::TupleVariant {\n                name: \"InvalidLengthEnum\",\n                variant: \"B\",\n                len: 2,\n            },\n            Token::I32(1),\n            Token::TupleVariantEnd,\n        ],\n        \"invalid length 1, expected tuple variant InvalidLengthEnum::B with 2 elements\",\n    );\n}\n\n#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]\n#[serde(into = \"EnumToU32\", from = \"EnumToU32\")]\nstruct StructFromEnum(Option<u32>);\n\nimpl Into<EnumToU32> for StructFromEnum {\n    fn into(self) -> EnumToU32 {\n        match self {\n            StructFromEnum(v) => v.into(),\n        }\n    }\n}\n\nimpl From<EnumToU32> for StructFromEnum {\n    fn from(v: EnumToU32) -> Self {\n        StructFromEnum(v.into())\n    }\n}\n\n#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]\n#[serde(into = \"Option<u32>\", from = \"Option<u32>\")]\nenum EnumToU32 {\n    One,\n    Two,\n    Three,\n    Four,\n    Nothing,\n}\n\nimpl Into<Option<u32>> for EnumToU32 {\n    fn into(self) -> Option<u32> {\n        match self {\n            EnumToU32::One => Some(1),\n            EnumToU32::Two => Some(2),\n            EnumToU32::Three => Some(3),\n            EnumToU32::Four => Some(4),\n            EnumToU32::Nothing => None,\n        }\n    }\n}\n\nimpl From<Option<u32>> for EnumToU32 {\n    fn from(v: Option<u32>) -> Self {\n        match v {\n            Some(1) => EnumToU32::One,\n            Some(2) => EnumToU32::Two,\n            Some(3) => EnumToU32::Three,\n            Some(4) => EnumToU32::Four,\n            _ => EnumToU32::Nothing,\n        }\n    }\n}\n\n#[derive(Clone, Deserialize, PartialEq, Debug)]\n#[serde(try_from = \"u32\")]\nenum TryFromU32 {\n    One,\n    Two,\n}\n\nimpl TryFrom<u32> for TryFromU32 {\n    type Error = String;\n\n    fn try_from(value: u32) -> Result<Self, Self::Error> {\n        match value {\n            1 => Ok(TryFromU32::One),\n            2 => Ok(TryFromU32::Two),\n            _ => Err(\"out of range\".to_owned()),\n        }\n    }\n}\n\n#[test]\nfn test_from_into_traits() {\n    assert_ser_tokens(&EnumToU32::One, &[Token::Some, Token::U32(1)]);\n    assert_ser_tokens(&EnumToU32::Nothing, &[Token::None]);\n    assert_de_tokens(&EnumToU32::Two, &[Token::Some, Token::U32(2)]);\n    assert_ser_tokens(&StructFromEnum(Some(5)), &[Token::None]);\n    assert_ser_tokens(&StructFromEnum(None), &[Token::None]);\n    assert_de_tokens(&StructFromEnum(Some(2)), &[Token::Some, Token::U32(2)]);\n    assert_de_tokens(&TryFromU32::Two, &[Token::U32(2)]);\n    assert_de_tokens_error::<TryFromU32>(&[Token::U32(5)], \"out of range\");\n}\n\n#[test]\nfn test_collect_other() {\n    let mut extra = HashMap::new();\n    extra.insert(\"c\".into(), 3);\n    assert_tokens(\n        &CollectOther { a: 1, b: 2, extra },\n        &[\n            Token::Map { len: None },\n            Token::Str(\"a\"),\n            Token::U32(1),\n            Token::Str(\"b\"),\n            Token::U32(2),\n            Token::Str(\"c\"),\n            Token::U32(3),\n            Token::MapEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_partially_untagged_enum() {\n    #[derive(Serialize, Deserialize, PartialEq, Debug)]\n    enum Exp {\n        Lambda(u32, Box<Exp>),\n        #[serde(untagged)]\n        App(Box<Exp>, Box<Exp>),\n        #[serde(untagged)]\n        Var(u32),\n    }\n    use Exp::*;\n\n    let data = Lambda(0, Box::new(App(Box::new(Var(0)), Box::new(Var(0)))));\n    assert_tokens(\n        &data,\n        &[\n            Token::TupleVariant {\n                name: \"Exp\",\n                variant: \"Lambda\",\n                len: 2,\n            },\n            Token::U32(0),\n            Token::Tuple { len: 2 },\n            Token::U32(0),\n            Token::U32(0),\n            Token::TupleEnd,\n            Token::TupleVariantEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_partially_untagged_enum_generic() {\n    trait Trait<T> {\n        type Assoc;\n        type Assoc2;\n    }\n\n    #[derive(Serialize, Deserialize, PartialEq, Debug)]\n    enum E<A, B, C>\n    where\n        A: Trait<C, Assoc2 = B>,\n    {\n        A(A::Assoc),\n        #[serde(untagged)]\n        B(A::Assoc2),\n    }\n\n    impl<T> Trait<T> for () {\n        type Assoc = T;\n        type Assoc2 = bool;\n    }\n\n    type MyE = E<(), bool, u32>;\n    use E::*;\n\n    assert_tokens::<MyE>(&B(true), &[Token::Bool(true)]);\n\n    assert_tokens::<MyE>(\n        &A(5),\n        &[\n            Token::NewtypeVariant {\n                name: \"E\",\n                variant: \"A\",\n            },\n            Token::U32(5),\n        ],\n    );\n}\n\n#[test]\nfn test_partially_untagged_enum_desugared() {\n    #[derive(Serialize, Deserialize, PartialEq, Debug)]\n    enum Test {\n        A(u32, u32),\n        B(u32),\n        #[serde(untagged)]\n        C(u32),\n        #[serde(untagged)]\n        D(u32, u32),\n    }\n    use Test::*;\n\n    mod desugared {\n        use super::*;\n        #[derive(Serialize, Deserialize, PartialEq, Debug)]\n        pub(super) enum Test {\n            A(u32, u32),\n            B(u32),\n        }\n    }\n    use desugared::Test as TestTagged;\n\n    #[derive(Serialize, Deserialize, PartialEq, Debug)]\n    #[serde(untagged)]\n    enum TestUntagged {\n        Tagged(TestTagged),\n        C(u32),\n        D(u32, u32),\n    }\n\n    impl From<Test> for TestUntagged {\n        fn from(test: Test) -> Self {\n            match test {\n                A(x, y) => TestUntagged::Tagged(TestTagged::A(x, y)),\n                B(x) => TestUntagged::Tagged(TestTagged::B(x)),\n                C(x) => TestUntagged::C(x),\n                D(x, y) => TestUntagged::D(x, y),\n            }\n        }\n    }\n\n    fn assert_tokens_desugared(value: Test, tokens: &[Token]) {\n        assert_tokens(&value, tokens);\n        let desugared: TestUntagged = value.into();\n        assert_tokens(&desugared, tokens);\n    }\n\n    assert_tokens_desugared(\n        A(0, 1),\n        &[\n            Token::TupleVariant {\n                name: \"Test\",\n                variant: \"A\",\n                len: 2,\n            },\n            Token::U32(0),\n            Token::U32(1),\n            Token::TupleVariantEnd,\n        ],\n    );\n\n    assert_tokens_desugared(\n        B(1),\n        &[\n            Token::NewtypeVariant {\n                name: \"Test\",\n                variant: \"B\",\n            },\n            Token::U32(1),\n        ],\n    );\n\n    assert_tokens_desugared(C(2), &[Token::U32(2)]);\n\n    assert_tokens_desugared(\n        D(3, 5),\n        &[\n            Token::Tuple { len: 2 },\n            Token::U32(3),\n            Token::U32(5),\n            Token::TupleEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_partially_untagged_internally_tagged_enum() {\n    #[derive(Serialize, Deserialize, PartialEq, Debug)]\n    #[serde(tag = \"t\")]\n    enum Data {\n        A,\n        B,\n        #[serde(untagged)]\n        Var(u32),\n    }\n\n    let data = Data::A;\n\n    assert_de_tokens(\n        &data,\n        &[\n            Token::Map { len: None },\n            Token::Str(\"t\"),\n            Token::Str(\"A\"),\n            Token::MapEnd,\n        ],\n    );\n\n    let data = Data::Var(42);\n\n    assert_de_tokens(&data, &[Token::U32(42)]);\n\n    // TODO test error output\n}\n\n#[test]\nfn test_transparent_struct() {\n    #[derive(Serialize, Deserialize, PartialEq, Debug)]\n    #[serde(transparent)]\n    struct Transparent {\n        #[serde(skip)]\n        a: bool,\n        b: u32,\n        #[serde(skip)]\n        c: bool,\n        d: PhantomData<()>,\n    }\n\n    assert_tokens(\n        &Transparent {\n            a: false,\n            b: 1,\n            c: false,\n            d: PhantomData,\n        },\n        &[Token::U32(1)],\n    );\n}\n\n#[test]\nfn test_transparent_tuple_struct() {\n    #[derive(Serialize, Deserialize, PartialEq, Debug)]\n    #[serde(transparent)]\n    struct Transparent(\n        #[serde(skip)] bool,\n        u32,\n        #[serde(skip)] bool,\n        PhantomData<()>,\n    );\n\n    assert_tokens(&Transparent(false, 1, false, PhantomData), &[Token::U32(1)]);\n}\n\n#[test]\nfn test_expecting_message() {\n    #[derive(Deserialize, PartialEq, Debug)]\n    #[serde(expecting = \"something strange...\")]\n    struct Unit;\n\n    #[derive(Deserialize)]\n    #[serde(expecting = \"something strange...\")]\n    struct Newtype(bool);\n\n    #[derive(Deserialize)]\n    #[serde(expecting = \"something strange...\")]\n    struct Tuple(u32, bool);\n\n    #[derive(Deserialize)]\n    #[serde(expecting = \"something strange...\")]\n    struct Struct {\n        #[allow(dead_code)]\n        question: String,\n        #[allow(dead_code)]\n        answer: u32,\n    }\n\n    assert_de_tokens_error::<Unit>(\n        &[Token::Str(\"Unit\")],\n        r#\"invalid type: string \"Unit\", expected something strange...\"#,\n    );\n\n    assert_de_tokens_error::<Newtype>(\n        &[Token::Str(\"Newtype\")],\n        r#\"invalid type: string \"Newtype\", expected something strange...\"#,\n    );\n\n    assert_de_tokens_error::<Tuple>(\n        &[Token::Str(\"Tuple\")],\n        r#\"invalid type: string \"Tuple\", expected something strange...\"#,\n    );\n\n    assert_de_tokens_error::<Struct>(\n        &[Token::Str(\"Struct\")],\n        r#\"invalid type: string \"Struct\", expected something strange...\"#,\n    );\n}\n\n#[test]\nfn test_expecting_message_externally_tagged_enum() {\n    #[derive(Deserialize)]\n    #[serde(expecting = \"something strange...\")]\n    enum Enum {\n        ExternallyTagged,\n    }\n\n    assert_de_tokens_error::<Enum>(\n        &[Token::Str(\"ExternallyTagged\")],\n        r#\"invalid type: string \"ExternallyTagged\", expected something strange...\"#,\n    );\n\n    // Check that #[serde(expecting = \"...\")] doesn't affect variant identifier error message\n    assert_de_tokens_error::<Enum>(\n        &[Token::Enum { name: \"Enum\" }, Token::Unit],\n        \"invalid type: unit value, expected variant identifier\",\n    );\n}\n\n#[test]\nfn test_expecting_message_identifier_enum() {\n    #[derive(Deserialize)]\n    #[serde(field_identifier)]\n    #[serde(expecting = \"something strange...\")]\n    enum FieldEnum {\n        Field,\n    }\n\n    #[derive(Deserialize)]\n    #[serde(variant_identifier)]\n    #[serde(expecting = \"something strange...\")]\n    enum VariantEnum {\n        Variant,\n    }\n\n    assert_de_tokens_error::<FieldEnum>(\n        &[Token::Unit],\n        \"invalid type: unit value, expected something strange...\",\n    );\n\n    assert_de_tokens_error::<FieldEnum>(\n        &[\n            Token::Enum { name: \"FieldEnum\" },\n            Token::Str(\"Unknown\"),\n            Token::None,\n        ],\n        \"invalid type: map, expected something strange...\",\n    );\n\n    assert_de_tokens_error::<VariantEnum>(\n        &[Token::Unit],\n        \"invalid type: unit value, expected something strange...\",\n    );\n\n    assert_de_tokens_error::<VariantEnum>(\n        &[\n            Token::Enum {\n                name: \"VariantEnum\",\n            },\n            Token::Str(\"Unknown\"),\n            Token::None,\n        ],\n        \"invalid type: map, expected something strange...\",\n    );\n}\n\nmod flatten {\n    use super::*;\n\n    #[test]\n    fn complex() {\n        #[derive(Debug, PartialEq, Serialize, Deserialize)]\n        struct Outer {\n            y: u32,\n            #[serde(flatten)]\n            first: First,\n            #[serde(flatten)]\n            second: Second,\n            z: u32,\n        }\n\n        #[derive(Debug, PartialEq, Serialize, Deserialize)]\n        struct First {\n            a: u32,\n            b: bool,\n            c: Vec<String>,\n            d: String,\n            e: Option<u64>,\n        }\n\n        #[derive(Debug, PartialEq, Serialize, Deserialize)]\n        struct Second {\n            f: u32,\n        }\n\n        assert_de_tokens(\n            &Outer {\n                y: 0,\n                first: First {\n                    a: 1,\n                    b: true,\n                    c: vec![\"a\".into(), \"b\".into()],\n                    d: \"c\".into(),\n                    e: Some(2),\n                },\n                second: Second { f: 3 },\n                z: 4,\n            },\n            &[\n                Token::Map { len: None },\n                Token::Str(\"y\"),\n                Token::U32(0),\n                Token::Str(\"a\"),\n                Token::U32(1),\n                Token::Str(\"b\"),\n                Token::Bool(true),\n                Token::Str(\"c\"),\n                Token::Seq { len: Some(2) },\n                Token::Str(\"a\"),\n                Token::Str(\"b\"),\n                Token::SeqEnd,\n                Token::Str(\"d\"),\n                Token::Str(\"c\"),\n                Token::Str(\"e\"),\n                Token::U64(2),\n                Token::Str(\"f\"),\n                Token::U32(3),\n                Token::Str(\"z\"),\n                Token::U32(4),\n                Token::MapEnd,\n            ],\n        );\n\n        assert_ser_tokens(\n            &Outer {\n                y: 0,\n                first: First {\n                    a: 1,\n                    b: true,\n                    c: vec![\"a\".into(), \"b\".into()],\n                    d: \"c\".into(),\n                    e: Some(2),\n                },\n                second: Second { f: 3 },\n                z: 4,\n            },\n            &[\n                Token::Map { len: None },\n                Token::Str(\"y\"),\n                Token::U32(0),\n                Token::Str(\"a\"),\n                Token::U32(1),\n                Token::Str(\"b\"),\n                Token::Bool(true),\n                Token::Str(\"c\"),\n                Token::Seq { len: Some(2) },\n                Token::Str(\"a\"),\n                Token::Str(\"b\"),\n                Token::SeqEnd,\n                Token::Str(\"d\"),\n                Token::Str(\"c\"),\n                Token::Str(\"e\"),\n                Token::Some,\n                Token::U64(2),\n                Token::Str(\"f\"),\n                Token::U32(3),\n                Token::Str(\"z\"),\n                Token::U32(4),\n                Token::MapEnd,\n            ],\n        );\n    }\n\n    #[test]\n    fn map_twice() {\n        #[derive(Debug, PartialEq, Deserialize)]\n        struct Outer {\n            #[serde(flatten)]\n            first: BTreeMap<String, String>,\n            #[serde(flatten)]\n            between: Inner,\n            #[serde(flatten)]\n            second: BTreeMap<String, String>,\n        }\n\n        #[derive(Debug, PartialEq, Deserialize)]\n        struct Inner {\n            y: String,\n        }\n\n        assert_de_tokens(\n            &Outer {\n                first: {\n                    let mut first = BTreeMap::new();\n                    first.insert(\"x\".to_owned(), \"X\".to_owned());\n                    first.insert(\"y\".to_owned(), \"Y\".to_owned());\n                    first\n                },\n                between: Inner { y: \"Y\".to_owned() },\n                second: {\n                    let mut second = BTreeMap::new();\n                    second.insert(\"x\".to_owned(), \"X\".to_owned());\n                    second\n                },\n            },\n            &[\n                Token::Map { len: None },\n                Token::Str(\"x\"),\n                Token::Str(\"X\"),\n                Token::Str(\"y\"),\n                Token::Str(\"Y\"),\n                Token::MapEnd,\n            ],\n        );\n    }\n\n    #[test]\n    fn unsupported_type() {\n        #[derive(Debug, PartialEq, Serialize, Deserialize)]\n        struct Outer {\n            outer: String,\n            #[serde(flatten)]\n            inner: String,\n        }\n\n        assert_ser_tokens_error(\n            &Outer {\n                outer: \"foo\".into(),\n                inner: \"bar\".into(),\n            },\n            &[\n                Token::Map { len: None },\n                Token::Str(\"outer\"),\n                Token::Str(\"foo\"),\n            ],\n            \"can only flatten structs and maps (got a string)\",\n        );\n        assert_de_tokens_error::<Outer>(\n            &[\n                Token::Map { len: None },\n                Token::Str(\"outer\"),\n                Token::Str(\"foo\"),\n                Token::Str(\"a\"),\n                Token::Str(\"b\"),\n                Token::MapEnd,\n            ],\n            \"can only flatten structs and maps\",\n        );\n    }\n\n    #[test]\n    fn unknown_field() {\n        #[derive(Debug, PartialEq, Serialize, Deserialize)]\n        #[serde(deny_unknown_fields)]\n        struct Outer {\n            dummy: String,\n            #[serde(flatten)]\n            inner: Inner,\n        }\n\n        #[derive(Debug, PartialEq, Serialize, Deserialize)]\n        struct Inner {\n            foo: HashMap<String, u32>,\n        }\n\n        assert_de_tokens_error::<Outer>(\n            &[\n                Token::Struct {\n                    name: \"Outer\",\n                    len: 1,\n                },\n                Token::Str(\"dummy\"),\n                Token::Str(\"23\"),\n                Token::Str(\"foo\"),\n                Token::Map { len: None },\n                Token::Str(\"a\"),\n                Token::U32(1),\n                Token::Str(\"b\"),\n                Token::U32(2),\n                Token::MapEnd,\n                Token::Str(\"bar\"),\n                Token::U32(23),\n                Token::StructEnd,\n            ],\n            \"unknown field `bar`\",\n        );\n    }\n\n    #[test]\n    fn non_string_keys() {\n        #[derive(Debug, PartialEq, Serialize, Deserialize)]\n        struct TestStruct {\n            name: String,\n            age: u32,\n            #[serde(flatten)]\n            mapping: HashMap<u32, u32>,\n        }\n\n        let mut mapping = HashMap::new();\n        mapping.insert(0, 42);\n        assert_tokens(\n            &TestStruct {\n                name: \"peter\".into(),\n                age: 3,\n                mapping,\n            },\n            &[\n                Token::Map { len: None },\n                Token::Str(\"name\"),\n                Token::Str(\"peter\"),\n                Token::Str(\"age\"),\n                Token::U32(3),\n                Token::U32(0),\n                Token::U32(42),\n                Token::MapEnd,\n            ],\n        );\n    }\n\n    #[test]\n    fn lifetime_propagation() {\n        #[derive(Deserialize, Serialize, Debug, PartialEq)]\n        struct A<T> {\n            #[serde(flatten)]\n            t: T,\n        }\n\n        #[derive(Deserialize, Serialize, Debug, PartialEq)]\n        struct B<'a> {\n            #[serde(flatten, borrow)]\n            t: HashMap<&'a str, u32>,\n        }\n\n        #[derive(Deserialize, Serialize, Debug, PartialEq)]\n        struct C<'a> {\n            #[serde(flatten, borrow)]\n            t: HashMap<&'a [u8], u32>,\n        }\n\n        let mut owned_map = HashMap::new();\n        owned_map.insert(\"x\".to_string(), 42u32);\n        assert_tokens(\n            &A { t: owned_map },\n            &[\n                Token::Map { len: None },\n                Token::Str(\"x\"),\n                Token::U32(42),\n                Token::MapEnd,\n            ],\n        );\n\n        let mut borrowed_map = HashMap::new();\n        borrowed_map.insert(\"x\", 42u32);\n        assert_ser_tokens(\n            &B {\n                t: borrowed_map.clone(),\n            },\n            &[\n                Token::Map { len: None },\n                Token::BorrowedStr(\"x\"),\n                Token::U32(42),\n                Token::MapEnd,\n            ],\n        );\n\n        assert_de_tokens(\n            &B { t: borrowed_map },\n            &[\n                Token::Map { len: None },\n                Token::BorrowedStr(\"x\"),\n                Token::U32(42),\n                Token::MapEnd,\n            ],\n        );\n\n        let mut borrowed_map = HashMap::new();\n        borrowed_map.insert(&b\"x\"[..], 42u32);\n        assert_ser_tokens(\n            &C {\n                t: borrowed_map.clone(),\n            },\n            &[\n                Token::Map { len: None },\n                Token::Seq { len: Some(1) },\n                Token::U8(120),\n                Token::SeqEnd,\n                Token::U32(42),\n                Token::MapEnd,\n            ],\n        );\n\n        assert_de_tokens(\n            &C { t: borrowed_map },\n            &[\n                Token::Map { len: None },\n                Token::BorrowedBytes(b\"x\"),\n                Token::U32(42),\n                Token::MapEnd,\n            ],\n        );\n    }\n\n    // Regression test for https://github.com/serde-rs/serde/issues/1904\n    #[test]\n    fn enum_tuple_and_struct() {\n        #[derive(Serialize, Deserialize, PartialEq, Debug)]\n        enum Outer {\n            Tuple(f64, i32),\n            Flatten {\n                #[serde(flatten)]\n                nested: Nested,\n            },\n        }\n\n        #[derive(Serialize, Deserialize, PartialEq, Debug)]\n        struct Nested {\n            a: i32,\n            b: i32,\n        }\n\n        assert_tokens(\n            &Outer::Tuple(1.2, 3),\n            &[\n                Token::TupleVariant {\n                    name: \"Outer\",\n                    variant: \"Tuple\",\n                    len: 2,\n                },\n                Token::F64(1.2),\n                Token::I32(3),\n                Token::TupleVariantEnd,\n            ],\n        );\n        assert_tokens(\n            &Outer::Flatten {\n                nested: Nested { a: 1, b: 2 },\n            },\n            &[\n                Token::NewtypeVariant {\n                    name: \"Outer\",\n                    variant: \"Flatten\",\n                },\n                Token::Map { len: None },\n                Token::Str(\"a\"),\n                Token::I32(1),\n                Token::Str(\"b\"),\n                Token::I32(2),\n                Token::MapEnd,\n            ],\n        );\n    }\n\n    #[test]\n    fn option() {\n        #[derive(Serialize, Deserialize, PartialEq, Debug)]\n        struct Outer {\n            #[serde(flatten)]\n            inner1: Option<Inner1>,\n            #[serde(flatten)]\n            inner2: Option<Inner2>,\n        }\n\n        #[derive(Serialize, Deserialize, PartialEq, Debug)]\n        struct Inner1 {\n            inner1: i32,\n        }\n\n        #[derive(Serialize, Deserialize, PartialEq, Debug)]\n        struct Inner2 {\n            inner2: i32,\n        }\n\n        assert_tokens(\n            &Outer {\n                inner1: Some(Inner1 { inner1: 1 }),\n                inner2: Some(Inner2 { inner2: 2 }),\n            },\n            &[\n                Token::Map { len: None },\n                Token::Str(\"inner1\"),\n                Token::I32(1),\n                Token::Str(\"inner2\"),\n                Token::I32(2),\n                Token::MapEnd,\n            ],\n        );\n\n        assert_tokens(\n            &Outer {\n                inner1: Some(Inner1 { inner1: 1 }),\n                inner2: None,\n            },\n            &[\n                Token::Map { len: None },\n                Token::Str(\"inner1\"),\n                Token::I32(1),\n                Token::MapEnd,\n            ],\n        );\n\n        assert_tokens(\n            &Outer {\n                inner1: None,\n                inner2: Some(Inner2 { inner2: 2 }),\n            },\n            &[\n                Token::Map { len: None },\n                Token::Str(\"inner2\"),\n                Token::I32(2),\n                Token::MapEnd,\n            ],\n        );\n\n        assert_tokens(\n            &Outer {\n                inner1: None,\n                inner2: None,\n            },\n            &[Token::Map { len: None }, Token::MapEnd],\n        );\n    }\n\n    #[test]\n    fn ignored_any() {\n        #[derive(Deserialize, PartialEq, Debug)]\n        struct Outer {\n            #[serde(flatten)]\n            inner: IgnoredAny,\n        }\n\n        assert_de_tokens(\n            &Outer { inner: IgnoredAny },\n            &[Token::Map { len: None }, Token::MapEnd],\n        );\n\n        assert_de_tokens(\n            &Outer { inner: IgnoredAny },\n            &[\n                Token::Struct {\n                    name: \"DoNotMatter\",\n                    len: 0,\n                },\n                Token::StructEnd,\n            ],\n        );\n    }\n\n    #[test]\n    fn flatten_any_after_flatten_struct() {\n        #[derive(PartialEq, Debug)]\n        struct Any;\n\n        impl<'de> Deserialize<'de> for Any {\n            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n            where\n                D: Deserializer<'de>,\n            {\n                struct AnyVisitor;\n\n                impl<'de> Visitor<'de> for AnyVisitor {\n                    type Value = Any;\n\n                    fn expecting(&self, _formatter: &mut fmt::Formatter) -> fmt::Result {\n                        unimplemented!()\n                    }\n\n                    fn visit_map<M>(self, mut map: M) -> Result<Self::Value, M::Error>\n                    where\n                        M: MapAccess<'de>,\n                    {\n                        while let Some((Any, Any)) = map.next_entry()? {}\n                        Ok(Any)\n                    }\n                }\n\n                deserializer.deserialize_any(AnyVisitor)\n            }\n        }\n\n        #[derive(Deserialize, PartialEq, Debug)]\n        struct Outer {\n            #[serde(flatten)]\n            inner: Inner,\n            #[serde(flatten)]\n            extra: Any,\n        }\n\n        #[derive(Deserialize, PartialEq, Debug)]\n        struct Inner {\n            inner: i32,\n        }\n\n        let s = Outer {\n            inner: Inner { inner: 0 },\n            extra: Any,\n        };\n\n        assert_de_tokens(\n            &s,\n            &[\n                Token::Map { len: None },\n                Token::Str(\"inner\"),\n                Token::I32(0),\n                Token::MapEnd,\n            ],\n        );\n    }\n\n    #[test]\n    fn alias() {\n        #[derive(Debug, PartialEq, Deserialize)]\n        struct Outer {\n            #[serde(flatten)]\n            a: AliasStruct,\n            b: i32,\n        }\n\n        assert_de_tokens(\n            &Outer {\n                a: AliasStruct {\n                    a1: 1,\n                    a2: 2,\n                    a4: 4,\n                },\n                b: 7,\n            },\n            &[\n                Token::Struct {\n                    name: \"Outer\",\n                    len: 4,\n                },\n                Token::Str(\"a1\"),\n                Token::I32(1),\n                Token::Str(\"a2\"),\n                Token::I32(2),\n                Token::Str(\"a5\"),\n                Token::I32(4),\n                Token::Str(\"b\"),\n                Token::I32(7),\n                Token::StructEnd,\n            ],\n        );\n\n        assert_de_tokens(\n            &Outer {\n                a: AliasStruct {\n                    a1: 1,\n                    a2: 2,\n                    a4: 4,\n                },\n                b: 7,\n            },\n            &[\n                Token::Struct {\n                    name: \"Outer\",\n                    len: 4,\n                },\n                Token::Str(\"a1\"),\n                Token::I32(1),\n                Token::Str(\"a2\"),\n                Token::I32(2),\n                Token::Str(\"a6\"),\n                Token::I32(4),\n                Token::Str(\"b\"),\n                Token::I32(7),\n                Token::StructEnd,\n            ],\n        );\n    }\n\n    mod unit {\n        use super::*;\n\n        #[test]\n        fn unit() {\n            #[derive(Debug, PartialEq, Serialize, Deserialize)]\n            struct Response<T> {\n                #[serde(flatten)]\n                data: T,\n                status: usize,\n            }\n\n            assert_tokens(\n                &Response {\n                    data: (),\n                    status: 0,\n                },\n                &[\n                    Token::Map { len: None },\n                    Token::Str(\"status\"),\n                    Token::U64(0),\n                    Token::MapEnd,\n                ],\n            );\n        }\n\n        #[test]\n        fn unit_struct() {\n            #[derive(Debug, PartialEq, Serialize, Deserialize)]\n            struct Response<T> {\n                #[serde(flatten)]\n                data: T,\n                status: usize,\n            }\n\n            #[derive(Debug, PartialEq, Serialize, Deserialize)]\n            struct Unit;\n\n            assert_tokens(\n                &Response {\n                    data: Unit,\n                    status: 0,\n                },\n                &[\n                    Token::Map { len: None },\n                    Token::Str(\"status\"),\n                    Token::U64(0),\n                    Token::MapEnd,\n                ],\n            );\n        }\n    }\n\n    mod enum_ {\n        use super::*;\n\n        mod externally_tagged {\n            use super::*;\n            use std::iter::FromIterator;\n\n            #[test]\n            fn straightforward() {\n                #[derive(Serialize, Deserialize, PartialEq, Debug)]\n                enum Data {\n                    A {\n                        a: i32,\n                        #[serde(flatten)]\n                        flat: Flat,\n                    },\n                }\n\n                #[derive(Serialize, Deserialize, PartialEq, Debug)]\n                struct Flat {\n                    b: i32,\n                }\n\n                let data = Data::A {\n                    a: 0,\n                    flat: Flat { b: 0 },\n                };\n\n                assert_tokens(\n                    &data,\n                    &[\n                        Token::NewtypeVariant {\n                            name: \"Data\",\n                            variant: \"A\",\n                        },\n                        Token::Map { len: None },\n                        Token::Str(\"a\"),\n                        Token::I32(0),\n                        Token::Str(\"b\"),\n                        Token::I32(0),\n                        Token::MapEnd,\n                    ],\n                );\n            }\n\n            #[derive(Debug, PartialEq, Serialize, Deserialize)]\n            struct Flatten {\n                #[serde(flatten)]\n                data: Enum,\n\n                #[serde(flatten)]\n                extra: HashMap<String, String>,\n            }\n\n            #[derive(Debug, PartialEq, Serialize, Deserialize)]\n            enum Enum {\n                Unit,\n                Newtype(HashMap<String, String>),\n                Tuple(u32, u32),\n                Struct { index: u32, value: u32 },\n            }\n\n            #[test]\n            fn unit() {\n                let value = Flatten {\n                    data: Enum::Unit,\n                    extra: HashMap::from_iter([(\"extra_key\".into(), \"extra value\".into())]),\n                };\n                assert_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // data\n                        Token::Str(\"Unit\"), // variant\n                        Token::Unit,\n                        // extra\n                        Token::Str(\"extra_key\"),\n                        Token::Str(\"extra value\"),\n                        Token::MapEnd,\n                    ],\n                );\n                assert_de_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // extra\n                        Token::Str(\"extra_key\"),\n                        Token::Str(\"extra value\"),\n                        // data\n                        Token::Str(\"Unit\"), // variant\n                        Token::Unit,\n                        Token::MapEnd,\n                    ],\n                );\n            }\n\n            #[test]\n            fn newtype() {\n                let value = Flatten {\n                    data: Enum::Newtype(HashMap::from_iter([(\"key\".into(), \"value\".into())])),\n                    extra: HashMap::from_iter([(\"extra_key\".into(), \"extra value\".into())]),\n                };\n                assert_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // data\n                        Token::Str(\"Newtype\"), // variant\n                        Token::Map { len: Some(1) },\n                        Token::Str(\"key\"),\n                        Token::Str(\"value\"),\n                        Token::MapEnd,\n                        // extra\n                        Token::Str(\"extra_key\"),\n                        Token::Str(\"extra value\"),\n                        Token::MapEnd,\n                    ],\n                );\n                assert_de_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // extra\n                        Token::Str(\"extra_key\"),\n                        Token::Str(\"extra value\"),\n                        // data\n                        Token::Str(\"Newtype\"), // variant\n                        Token::Map { len: Some(1) },\n                        Token::Str(\"key\"),\n                        Token::Str(\"value\"),\n                        Token::MapEnd,\n                        Token::MapEnd,\n                    ],\n                );\n            }\n\n            // Reaches crate::private::de::content::VariantDeserializer::tuple_variant\n            // Content::Seq case\n            // via FlatMapDeserializer::deserialize_enum\n            #[test]\n            fn tuple() {\n                let value = Flatten {\n                    data: Enum::Tuple(0, 42),\n                    extra: HashMap::from_iter([(\"extra_key\".into(), \"extra value\".into())]),\n                };\n                assert_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // data\n                        Token::Str(\"Tuple\"), // variant\n                        Token::Seq { len: Some(2) },\n                        Token::U32(0),\n                        Token::U32(42),\n                        Token::SeqEnd,\n                        // extra\n                        Token::Str(\"extra_key\"),\n                        Token::Str(\"extra value\"),\n                        Token::MapEnd,\n                    ],\n                );\n                assert_de_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // extra\n                        Token::Str(\"extra_key\"),\n                        Token::Str(\"extra value\"),\n                        // data\n                        Token::Str(\"Tuple\"), // variant\n                        Token::Seq { len: Some(2) },\n                        Token::U32(0),\n                        Token::U32(42),\n                        Token::SeqEnd,\n                        Token::MapEnd,\n                    ],\n                );\n            }\n\n            // Reaches crate::private::de::content::VariantDeserializer::struct_variant\n            // Content::Seq case\n            // via FlatMapDeserializer::deserialize_enum\n            #[test]\n            fn struct_from_seq() {\n                let value = Flatten {\n                    data: Enum::Struct {\n                        index: 0,\n                        value: 42,\n                    },\n                    extra: HashMap::from_iter([(\"extra_key\".into(), \"extra value\".into())]),\n                };\n                assert_de_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // data\n                        Token::Str(\"Struct\"), // variant\n                        Token::Seq { len: Some(2) },\n                        Token::U32(0),  // index\n                        Token::U32(42), // value\n                        Token::SeqEnd,\n                        // extra\n                        Token::Str(\"extra_key\"),\n                        Token::Str(\"extra value\"),\n                        Token::MapEnd,\n                    ],\n                );\n                assert_de_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // extra\n                        Token::Str(\"extra_key\"),\n                        Token::Str(\"extra value\"),\n                        // data\n                        Token::Str(\"Struct\"), // variant\n                        Token::Seq { len: Some(2) },\n                        Token::U32(0),  // index\n                        Token::U32(42), // value\n                        Token::SeqEnd,\n                        Token::MapEnd,\n                    ],\n                );\n            }\n\n            // Reaches crate::private::de::content::VariantDeserializer::struct_variant\n            // Content::Map case\n            // via FlatMapDeserializer::deserialize_enum\n            #[test]\n            fn struct_from_map() {\n                let value = Flatten {\n                    data: Enum::Struct {\n                        index: 0,\n                        value: 42,\n                    },\n                    extra: HashMap::from_iter([(\"extra_key\".into(), \"extra value\".into())]),\n                };\n                assert_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // data\n                        Token::Str(\"Struct\"), // variant\n                        Token::Struct {\n                            len: 2,\n                            name: \"Struct\",\n                        },\n                        Token::Str(\"index\"),\n                        Token::U32(0),\n                        Token::Str(\"value\"),\n                        Token::U32(42),\n                        Token::StructEnd,\n                        // extra\n                        Token::Str(\"extra_key\"),\n                        Token::Str(\"extra value\"),\n                        Token::MapEnd,\n                    ],\n                );\n                assert_de_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // extra\n                        Token::Str(\"extra_key\"),\n                        Token::Str(\"extra value\"),\n                        // data\n                        Token::Str(\"Struct\"), // variant\n                        Token::Struct {\n                            len: 2,\n                            name: \"Struct\",\n                        },\n                        Token::Str(\"index\"),\n                        Token::U32(0),\n                        Token::Str(\"value\"),\n                        Token::U32(42),\n                        Token::StructEnd,\n                        Token::MapEnd,\n                    ],\n                );\n            }\n        }\n\n        mod adjacently_tagged {\n            use super::*;\n\n            #[derive(Debug, PartialEq, Serialize, Deserialize)]\n            struct Flatten {\n                outer: u32,\n\n                #[serde(flatten)]\n                data: NewtypeWrapper,\n            }\n\n            #[derive(Debug, PartialEq, Serialize, Deserialize)]\n            struct NewtypeWrapper(pub Enum);\n\n            #[derive(Debug, PartialEq, Serialize, Deserialize)]\n            #[serde(tag = \"tag\", content = \"content\")]\n            enum Enum {\n                Unit,\n                Newtype(NewtypeVariant),\n                Struct { index: u32, value: u32 },\n            }\n\n            #[derive(Debug, PartialEq, Serialize, Deserialize)]\n            struct NewtypeVariant {\n                value: u32,\n            }\n\n            #[test]\n            fn unit() {\n                let value = Flatten {\n                    outer: 42,\n                    data: NewtypeWrapper(Enum::Unit),\n                };\n                // Field order: outer, [tag]\n                assert_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // outer\n                        Token::Str(\"outer\"),\n                        Token::U32(42),\n                        // tag\n                        Token::Str(\"tag\"),\n                        Token::UnitVariant {\n                            name: \"Enum\",\n                            variant: \"Unit\",\n                        },\n                        // content missing\n                        Token::MapEnd,\n                    ],\n                );\n                // Field order: [tag], outer\n                assert_de_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // tag\n                        Token::Str(\"tag\"),\n                        Token::UnitVariant {\n                            name: \"Enum\",\n                            variant: \"Unit\",\n                        },\n                        // content missing\n                        // outer\n                        Token::Str(\"outer\"),\n                        Token::U32(42),\n                        Token::MapEnd,\n                    ],\n                );\n                // Field order: outer, [tag, content]\n                assert_de_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // outer\n                        Token::Str(\"outer\"),\n                        Token::U32(42),\n                        // tag\n                        Token::Str(\"tag\"),\n                        Token::UnitVariant {\n                            name: \"Enum\",\n                            variant: \"Unit\",\n                        },\n                        // content\n                        Token::Str(\"content\"),\n                        Token::Unit,\n                        Token::MapEnd,\n                    ],\n                );\n                // Field order: outer, [content, tag]\n                assert_de_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // outer\n                        Token::Str(\"outer\"),\n                        Token::U32(42),\n                        // content\n                        Token::Str(\"content\"),\n                        Token::Unit,\n                        // tag\n                        Token::Str(\"tag\"),\n                        Token::UnitVariant {\n                            name: \"Enum\",\n                            variant: \"Unit\",\n                        },\n                        Token::MapEnd,\n                    ],\n                );\n                // Field order: [tag, content], outer\n                assert_de_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // tag\n                        Token::Str(\"tag\"),\n                        Token::UnitVariant {\n                            name: \"Enum\",\n                            variant: \"Unit\",\n                        },\n                        // content\n                        Token::Str(\"content\"),\n                        Token::Unit,\n                        // outer\n                        Token::Str(\"outer\"),\n                        Token::U32(42),\n                        Token::MapEnd,\n                    ],\n                );\n                // Field order: [content, tag], outer\n                assert_de_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // content\n                        Token::Str(\"content\"),\n                        Token::Unit,\n                        // tag\n                        Token::Str(\"tag\"),\n                        Token::UnitVariant {\n                            name: \"Enum\",\n                            variant: \"Unit\",\n                        },\n                        // outer\n                        Token::Str(\"outer\"),\n                        Token::U32(42),\n                        Token::MapEnd,\n                    ],\n                );\n                // Field order: [tag], outer, [content]\n                assert_de_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // tag\n                        Token::Str(\"tag\"),\n                        Token::UnitVariant {\n                            name: \"Enum\",\n                            variant: \"Unit\",\n                        },\n                        // outer\n                        Token::Str(\"outer\"),\n                        Token::U32(42),\n                        // content\n                        Token::Str(\"content\"),\n                        Token::Unit,\n                        Token::MapEnd,\n                    ],\n                );\n                // Field order: [content], outer, [tag]\n                assert_de_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // content\n                        Token::Str(\"content\"),\n                        Token::Unit,\n                        // outer\n                        Token::Str(\"outer\"),\n                        Token::U32(42),\n                        // tag\n                        Token::Str(\"tag\"),\n                        Token::UnitVariant {\n                            name: \"Enum\",\n                            variant: \"Unit\",\n                        },\n                        Token::MapEnd,\n                    ],\n                );\n            }\n\n            #[test]\n            fn newtype() {\n                let value = Flatten {\n                    outer: 42,\n                    data: NewtypeWrapper(Enum::Newtype(NewtypeVariant { value: 23 })),\n                };\n                // Field order: outer, [tag, content]\n                assert_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // outer\n                        Token::Str(\"outer\"),\n                        Token::U32(42),\n                        // tag\n                        Token::Str(\"tag\"),\n                        Token::UnitVariant {\n                            name: \"Enum\",\n                            variant: \"Newtype\",\n                        },\n                        // content\n                        Token::Str(\"content\"),\n                        Token::Struct {\n                            len: 1,\n                            name: \"NewtypeVariant\",\n                        },\n                        Token::Str(\"value\"),\n                        Token::U32(23),\n                        Token::StructEnd,\n                        Token::MapEnd,\n                    ],\n                );\n                // Field order: outer, [content, tag]\n                assert_de_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // outer\n                        Token::Str(\"outer\"),\n                        Token::U32(42),\n                        // content\n                        Token::Str(\"content\"),\n                        Token::Struct {\n                            len: 1,\n                            name: \"NewtypeVariant\",\n                        },\n                        Token::Str(\"value\"),\n                        Token::U32(23),\n                        Token::StructEnd,\n                        // tag\n                        Token::Str(\"tag\"),\n                        Token::UnitVariant {\n                            name: \"Enum\",\n                            variant: \"Newtype\",\n                        },\n                        Token::MapEnd,\n                    ],\n                );\n                // Field order: [tag, content], outer\n                assert_de_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // tag\n                        Token::Str(\"tag\"),\n                        Token::UnitVariant {\n                            name: \"Enum\",\n                            variant: \"Newtype\",\n                        },\n                        // content\n                        Token::Str(\"content\"),\n                        Token::Struct {\n                            len: 1,\n                            name: \"NewtypeVariant\",\n                        },\n                        Token::Str(\"value\"),\n                        Token::U32(23),\n                        Token::StructEnd,\n                        // outer\n                        Token::Str(\"outer\"),\n                        Token::U32(42),\n                        Token::MapEnd,\n                    ],\n                );\n                // Field order: [content, tag], outer\n                assert_de_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // content\n                        Token::Str(\"content\"),\n                        Token::Struct {\n                            len: 1,\n                            name: \"NewtypeVariant\",\n                        },\n                        Token::Str(\"value\"),\n                        Token::U32(23),\n                        Token::StructEnd,\n                        // tag\n                        Token::Str(\"tag\"),\n                        Token::UnitVariant {\n                            name: \"Enum\",\n                            variant: \"Newtype\",\n                        },\n                        // outer\n                        Token::Str(\"outer\"),\n                        Token::U32(42),\n                        Token::MapEnd,\n                    ],\n                );\n                // Field order: [tag], outer, [content]\n                assert_de_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // tag\n                        Token::Str(\"tag\"),\n                        Token::UnitVariant {\n                            name: \"Enum\",\n                            variant: \"Newtype\",\n                        },\n                        // outer\n                        Token::Str(\"outer\"),\n                        Token::U32(42),\n                        // content\n                        Token::Str(\"content\"),\n                        Token::Struct {\n                            len: 1,\n                            name: \"NewtypeVariant\",\n                        },\n                        Token::Str(\"value\"),\n                        Token::U32(23),\n                        Token::StructEnd,\n                        Token::MapEnd,\n                    ],\n                );\n                // Field order: [content], outer, [tag]\n                assert_de_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // content\n                        Token::Str(\"content\"),\n                        Token::Struct {\n                            len: 1,\n                            name: \"NewtypeVariant\",\n                        },\n                        Token::Str(\"value\"),\n                        Token::U32(23),\n                        Token::StructEnd,\n                        // outer\n                        Token::Str(\"outer\"),\n                        Token::U32(42),\n                        // tag\n                        Token::Str(\"tag\"),\n                        Token::UnitVariant {\n                            name: \"Enum\",\n                            variant: \"Newtype\",\n                        },\n                        Token::MapEnd,\n                    ],\n                );\n            }\n\n            #[test]\n            fn struct_() {\n                let value = Flatten {\n                    outer: 42,\n                    data: NewtypeWrapper(Enum::Struct {\n                        index: 0,\n                        value: 42,\n                    }),\n                };\n                // Field order: outer, [tag, content]\n                assert_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // outer\n                        Token::Str(\"outer\"),\n                        Token::U32(42),\n                        // tag\n                        Token::Str(\"tag\"),\n                        Token::UnitVariant {\n                            name: \"Enum\",\n                            variant: \"Struct\",\n                        },\n                        // content\n                        Token::Str(\"content\"),\n                        Token::Struct {\n                            len: 2,\n                            name: \"Struct\",\n                        },\n                        Token::Str(\"index\"),\n                        Token::U32(0),\n                        Token::Str(\"value\"),\n                        Token::U32(42),\n                        Token::StructEnd,\n                        Token::MapEnd,\n                    ],\n                );\n                // Field order: outer, [content, tag]\n                assert_de_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // outer\n                        Token::Str(\"outer\"),\n                        Token::U32(42),\n                        // content\n                        Token::Str(\"content\"),\n                        Token::Struct {\n                            len: 2,\n                            name: \"Struct\",\n                        },\n                        Token::Str(\"index\"),\n                        Token::U32(0),\n                        Token::Str(\"value\"),\n                        Token::U32(42),\n                        Token::StructEnd,\n                        // tag\n                        Token::Str(\"tag\"),\n                        Token::UnitVariant {\n                            name: \"Enum\",\n                            variant: \"Struct\",\n                        },\n                        Token::MapEnd,\n                    ],\n                );\n                // Field order: [tag, content], outer\n                assert_de_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // tag\n                        Token::Str(\"tag\"),\n                        Token::UnitVariant {\n                            name: \"Enum\",\n                            variant: \"Struct\",\n                        },\n                        // content\n                        Token::Str(\"content\"),\n                        Token::Struct {\n                            len: 2,\n                            name: \"Struct\",\n                        },\n                        Token::Str(\"index\"),\n                        Token::U32(0),\n                        Token::Str(\"value\"),\n                        Token::U32(42),\n                        Token::StructEnd,\n                        // outer\n                        Token::Str(\"outer\"),\n                        Token::U32(42),\n                        Token::MapEnd,\n                    ],\n                );\n                // Field order: [content, tag], outer\n                assert_de_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // content\n                        Token::Str(\"content\"),\n                        Token::Struct {\n                            len: 2,\n                            name: \"Struct\",\n                        },\n                        Token::Str(\"index\"),\n                        Token::U32(0),\n                        Token::Str(\"value\"),\n                        Token::U32(42),\n                        Token::StructEnd,\n                        // tag\n                        Token::Str(\"tag\"),\n                        Token::UnitVariant {\n                            name: \"Enum\",\n                            variant: \"Struct\",\n                        },\n                        // outer\n                        Token::Str(\"outer\"),\n                        Token::U32(42),\n                        Token::MapEnd,\n                    ],\n                );\n                // Field order: [tag], outer, [content]\n                assert_de_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // tag\n                        Token::Str(\"tag\"),\n                        Token::UnitVariant {\n                            name: \"Enum\",\n                            variant: \"Struct\",\n                        },\n                        // outer\n                        Token::Str(\"outer\"),\n                        Token::U32(42),\n                        // content\n                        Token::Str(\"content\"),\n                        Token::Struct {\n                            len: 2,\n                            name: \"Struct\",\n                        },\n                        Token::Str(\"index\"),\n                        Token::U32(0),\n                        Token::Str(\"value\"),\n                        Token::U32(42),\n                        Token::StructEnd,\n                        Token::MapEnd,\n                    ],\n                );\n                // Field order: [content], outer, [tag]\n                assert_de_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // content\n                        Token::Str(\"content\"),\n                        Token::Struct {\n                            len: 2,\n                            name: \"Struct\",\n                        },\n                        Token::Str(\"index\"),\n                        Token::U32(0),\n                        Token::Str(\"value\"),\n                        Token::U32(42),\n                        Token::StructEnd,\n                        // outer\n                        Token::Str(\"outer\"),\n                        Token::U32(42),\n                        // tag\n                        Token::Str(\"tag\"),\n                        Token::UnitVariant {\n                            name: \"Enum\",\n                            variant: \"Struct\",\n                        },\n                        Token::MapEnd,\n                    ],\n                );\n            }\n        }\n\n        mod internally_tagged {\n            use super::*;\n\n            #[test]\n            fn structs() {\n                #[derive(Debug, PartialEq, Serialize, Deserialize)]\n                struct Flatten {\n                    #[serde(flatten)]\n                    x: X,\n                    #[serde(flatten)]\n                    y: Y,\n                }\n\n                #[derive(Debug, PartialEq, Serialize, Deserialize)]\n                #[serde(tag = \"typeX\")]\n                enum X {\n                    A { a: i32 },\n                    B { b: i32 },\n                }\n\n                #[derive(Debug, PartialEq, Serialize, Deserialize)]\n                #[serde(tag = \"typeY\")]\n                enum Y {\n                    C { c: i32 },\n                    D { d: i32 },\n                }\n\n                let value = Flatten {\n                    x: X::B { b: 1 },\n                    y: Y::D { d: 2 },\n                };\n                assert_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // x\n                        Token::Str(\"typeX\"),\n                        Token::Str(\"B\"),\n                        Token::Str(\"b\"),\n                        Token::I32(1),\n                        // y\n                        Token::Str(\"typeY\"),\n                        Token::Str(\"D\"),\n                        Token::Str(\"d\"),\n                        Token::I32(2),\n                        Token::MapEnd,\n                    ],\n                );\n                assert_de_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // y\n                        Token::Str(\"typeY\"),\n                        Token::Str(\"D\"),\n                        Token::Str(\"d\"),\n                        Token::I32(2),\n                        // x\n                        Token::Str(\"typeX\"),\n                        Token::Str(\"B\"),\n                        Token::Str(\"b\"),\n                        Token::I32(1),\n                        Token::MapEnd,\n                    ],\n                );\n            }\n\n            #[test]\n            fn unit_enum_with_unknown_fields() {\n                #[derive(Debug, PartialEq, Serialize, Deserialize)]\n                struct Flatten {\n                    #[serde(flatten)]\n                    x: X,\n                    #[serde(flatten)]\n                    y: Y,\n                }\n\n                #[derive(Debug, PartialEq, Serialize, Deserialize)]\n                #[serde(tag = \"typeX\")]\n                enum X {\n                    A,\n                }\n\n                #[derive(Debug, PartialEq, Serialize, Deserialize)]\n                #[serde(tag = \"typeY\")]\n                enum Y {\n                    B { c: u32 },\n                }\n\n                let value = Flatten {\n                    x: X::A,\n                    y: Y::B { c: 0 },\n                };\n                assert_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // x\n                        Token::Str(\"typeX\"),\n                        Token::Str(\"A\"),\n                        // y\n                        Token::Str(\"typeY\"),\n                        Token::Str(\"B\"),\n                        Token::Str(\"c\"),\n                        Token::U32(0),\n                        Token::MapEnd,\n                    ],\n                );\n                assert_de_tokens(\n                    &value,\n                    &[\n                        Token::Map { len: None },\n                        // y\n                        Token::Str(\"typeY\"),\n                        Token::Str(\"B\"),\n                        Token::Str(\"c\"),\n                        Token::U32(0),\n                        // x\n                        Token::Str(\"typeX\"),\n                        Token::Str(\"A\"),\n                        Token::MapEnd,\n                    ],\n                );\n            }\n        }\n\n        mod untagged {\n            use super::*;\n\n            #[derive(Debug, PartialEq, Serialize, Deserialize)]\n            struct Flatten {\n                #[serde(flatten)]\n                data: Enum,\n            }\n\n            #[derive(Debug, PartialEq, Serialize, Deserialize)]\n            #[serde(untagged)]\n            enum Enum {\n                Struct { a: i32 },\n            }\n\n            #[test]\n            fn struct_() {\n                assert_tokens(\n                    &Flatten {\n                        data: Enum::Struct { a: 0 },\n                    },\n                    &[\n                        Token::Map { len: None },\n                        Token::Str(\"a\"),\n                        Token::I32(0),\n                        Token::MapEnd,\n                    ],\n                );\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "test_suite/tests/test_borrow.rs",
    "content": "#![allow(\n    clippy::derive_partial_eq_without_eq,\n    clippy::items_after_statements,\n    clippy::used_underscore_binding,\n    // We use lots of declarations inside function bodies to avoid conflicts,\n    // but they aren't used. We just want to make sure they compile.\n    dead_code,\n)]\n\nuse serde::de::value::{BorrowedStrDeserializer, MapDeserializer};\nuse serde::de::{Deserialize, Deserializer, IntoDeserializer};\nuse serde_derive::Deserialize;\nuse serde_test::{assert_de_tokens, assert_de_tokens_error, Token};\nuse std::borrow::Cow;\n\n#[test]\nfn test_borrowed_str() {\n    assert_de_tokens(&\"borrowed\", &[Token::BorrowedStr(\"borrowed\")]);\n}\n\n#[test]\nfn test_borrowed_str_from_string() {\n    assert_de_tokens_error::<&str>(\n        &[Token::String(\"borrowed\")],\n        \"invalid type: string \\\"borrowed\\\", expected a borrowed string\",\n    );\n}\n\n#[test]\nfn test_borrowed_str_from_str() {\n    assert_de_tokens_error::<&str>(\n        &[Token::Str(\"borrowed\")],\n        \"invalid type: string \\\"borrowed\\\", expected a borrowed string\",\n    );\n}\n\n#[test]\nfn test_string_from_borrowed_str() {\n    assert_de_tokens(&\"owned\".to_owned(), &[Token::BorrowedStr(\"owned\")]);\n}\n\n#[test]\nfn test_borrowed_bytes() {\n    assert_de_tokens(&&b\"borrowed\"[..], &[Token::BorrowedBytes(b\"borrowed\")]);\n}\n\n#[test]\nfn test_borrowed_bytes_from_bytebuf() {\n    assert_de_tokens_error::<&[u8]>(\n        &[Token::ByteBuf(b\"borrowed\")],\n        \"invalid type: byte array, expected a borrowed byte array\",\n    );\n}\n\n#[test]\nfn test_borrowed_bytes_from_bytes() {\n    assert_de_tokens_error::<&[u8]>(\n        &[Token::Bytes(b\"borrowed\")],\n        \"invalid type: byte array, expected a borrowed byte array\",\n    );\n}\n\n#[test]\nfn test_tuple() {\n    assert_de_tokens(\n        &(\"str\", &b\"bytes\"[..]),\n        &[\n            Token::Tuple { len: 2 },\n            Token::BorrowedStr(\"str\"),\n            Token::BorrowedBytes(b\"bytes\"),\n            Token::TupleEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_struct() {\n    #[derive(Deserialize, Debug, PartialEq)]\n    struct Borrowing<'a, 'b> {\n        bs: &'a str,\n        bb: &'b [u8],\n    }\n\n    assert_de_tokens(\n        &Borrowing {\n            bs: \"str\",\n            bb: b\"bytes\",\n        },\n        &[\n            Token::Struct {\n                name: \"Borrowing\",\n                len: 2,\n            },\n            Token::BorrowedStr(\"bs\"),\n            Token::BorrowedStr(\"str\"),\n            Token::BorrowedStr(\"bb\"),\n            Token::BorrowedBytes(b\"bytes\"),\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_field_identifier() {\n    #[derive(Deserialize, Debug, PartialEq)]\n    #[serde(field_identifier)]\n    enum FieldStr<'a> {\n        #[serde(borrow)]\n        Str(&'a str),\n    }\n\n    assert_de_tokens(&FieldStr::Str(\"value\"), &[Token::BorrowedStr(\"value\")]);\n\n    #[derive(Deserialize, Debug, PartialEq)]\n    #[serde(field_identifier)]\n    enum FieldBytes<'a> {\n        #[serde(borrow)]\n        Bytes(&'a [u8]),\n    }\n\n    assert_de_tokens(\n        &FieldBytes::Bytes(b\"value\"),\n        &[Token::BorrowedBytes(b\"value\")],\n    );\n}\n\n#[test]\nfn test_cow() {\n    #[derive(Deserialize)]\n    struct Cows<'a, 'b> {\n        copied: Cow<'a, str>,\n\n        #[serde(borrow)]\n        borrowed: Cow<'b, str>,\n    }\n\n    struct BorrowedStr(&'static str);\n\n    impl<'de> IntoDeserializer<'de> for BorrowedStr {\n        type Deserializer = BorrowedStrDeserializer<'de, serde::de::value::Error>;\n\n        fn into_deserializer(self) -> Self::Deserializer {\n            BorrowedStrDeserializer::new(self.0)\n        }\n    }\n\n    let de = MapDeserializer::new(IntoIterator::into_iter([\n        (\"copied\", BorrowedStr(\"copied\")),\n        (\"borrowed\", BorrowedStr(\"borrowed\")),\n    ]));\n\n    let cows = Cows::deserialize(de).unwrap();\n\n    match cows.copied {\n        Cow::Owned(ref s) if s == \"copied\" => {}\n        _ => panic!(\"expected a copied string\"),\n    }\n\n    match cows.borrowed {\n        Cow::Borrowed(\"borrowed\") => {}\n        _ => panic!(\"expected a borrowed string\"),\n    }\n}\n\n#[test]\nfn test_lifetimes() {\n    #[derive(Deserialize)]\n    pub struct Cows<'a, 'b> {\n        _copied: Cow<'a, str>,\n\n        #[serde(borrow)]\n        _borrowed: Cow<'b, str>,\n    }\n\n    // Tests that `'de: 'a` is not required by the Deserialize impl.\n    fn _cows_lifetimes<'de: 'b, 'a, 'b, D>(deserializer: D) -> Cows<'a, 'b>\n    where\n        D: Deserializer<'de>,\n    {\n        Deserialize::deserialize(deserializer).unwrap()\n    }\n\n    #[derive(Deserialize)]\n    pub struct Wrap<'a, 'b> {\n        #[serde(borrow = \"'b\")]\n        _cows: Cows<'a, 'b>,\n    }\n\n    // Tests that `'de: 'a` is not required by the Deserialize impl.\n    fn _wrap_lifetimes<'de: 'b, 'a, 'b, D>(deserializer: D) -> Wrap<'a, 'b>\n    where\n        D: Deserializer<'de>,\n    {\n        Deserialize::deserialize(deserializer).unwrap()\n    }\n}\n"
  },
  {
    "path": "test_suite/tests/test_de.rs",
    "content": "#![allow(\n    clippy::cast_lossless,\n    clippy::decimal_literal_representation,\n    clippy::derive_partial_eq_without_eq,\n    clippy::empty_enums,\n    clippy::manual_assert,\n    clippy::needless_pass_by_value,\n    clippy::uninlined_format_args,\n    clippy::unreadable_literal\n)]\n#![cfg_attr(feature = \"unstable\", feature(never_type))]\n\nuse serde::de::value::{F32Deserializer, F64Deserializer};\nuse serde::de::{Deserialize, DeserializeOwned, Deserializer, IntoDeserializer};\nuse serde_derive::Deserialize;\nuse serde_test::{assert_de_tokens, Configure, Token};\nuse std::collections::{BTreeMap, BTreeSet, HashMap, HashSet};\nuse std::default::Default;\nuse std::ffi::{CStr, CString, OsString};\nuse std::fmt::Debug;\nuse std::iter;\nuse std::net;\nuse std::num::{\n    NonZeroI128, NonZeroI16, NonZeroI32, NonZeroI64, NonZeroI8, NonZeroIsize, NonZeroU128,\n    NonZeroU16, NonZeroU32, NonZeroU64, NonZeroU8, NonZeroUsize, Saturating, Wrapping,\n};\nuse std::ops::Bound;\nuse std::path::{Path, PathBuf};\nuse std::rc::{Rc, Weak as RcWeak};\nuse std::sync::atomic::{\n    AtomicBool, AtomicI16, AtomicI32, AtomicI8, AtomicIsize, AtomicU16, AtomicU32, AtomicU8,\n    AtomicUsize, Ordering,\n};\n#[cfg(target_arch = \"x86_64\")]\nuse std::sync::atomic::{AtomicI64, AtomicU64};\nuse std::sync::{Arc, Weak as ArcWeak};\nuse std::time::{Duration, UNIX_EPOCH};\n\n#[macro_use]\nmod macros;\n\n//////////////////////////////////////////////////////////////////////////\n\n#[derive(Copy, Clone, PartialEq, Debug, Deserialize)]\nstruct UnitStruct;\n\n#[derive(Copy, Clone, PartialEq, Debug, Deserialize)]\nstruct GenericUnitStruct<const N: u8>;\n\n#[derive(PartialEq, Debug, Deserialize)]\nstruct NewtypeStruct(i32);\n\n#[derive(PartialEq, Debug, Deserialize)]\nstruct TupleStruct(i32, i32, i32);\n\n#[derive(PartialEq, Debug, Deserialize)]\nstruct Struct {\n    a: i32,\n    b: i32,\n    #[serde(skip_deserializing)]\n    c: i32,\n}\n\n#[derive(PartialEq, Debug, Deserialize)]\n#[serde(default)]\nstruct StructDefault<T> {\n    a: i32,\n    b: T,\n}\n\nimpl Default for StructDefault<String> {\n    fn default() -> Self {\n        StructDefault {\n            a: 100,\n            b: \"default\".to_string(),\n        }\n    }\n}\n\n#[derive(PartialEq, Debug, Deserialize)]\nstruct StructSkipAll {\n    #[serde(skip_deserializing)]\n    a: i32,\n}\n\n#[derive(PartialEq, Debug, Deserialize)]\n#[serde(default)]\nstruct StructSkipDefault {\n    #[serde(skip_deserializing)]\n    a: i32,\n}\n\n#[derive(PartialEq, Debug, Deserialize)]\n#[serde(default)]\npub struct StructSkipDefaultGeneric<T> {\n    #[serde(skip_deserializing)]\n    t: T,\n}\n\nimpl Default for StructSkipDefault {\n    fn default() -> Self {\n        StructSkipDefault { a: 16 }\n    }\n}\n\n#[derive(PartialEq, Debug, Deserialize)]\n#[serde(deny_unknown_fields)]\nstruct StructSkipAllDenyUnknown {\n    #[serde(skip_deserializing)]\n    a: i32,\n}\n\n#[derive(Default, PartialEq, Debug)]\nstruct NotDeserializable;\n\n#[derive(PartialEq, Debug, Deserialize)]\nenum Enum {\n    #[allow(dead_code)]\n    #[serde(skip_deserializing)]\n    Skipped,\n    Unit,\n    Simple(i32),\n    Seq(i32, i32, i32),\n    Map {\n        a: i32,\n        b: i32,\n        c: i32,\n    },\n    SimpleWithSkipped(#[serde(skip_deserializing)] NotDeserializable),\n}\n\n#[derive(PartialEq, Debug, Deserialize)]\nenum EnumOther {\n    Unit,\n    #[serde(other)]\n    Other,\n}\n\n#[derive(PartialEq, Debug)]\nstruct IgnoredAny;\n\nimpl<'de> Deserialize<'de> for IgnoredAny {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        serde::de::IgnoredAny::deserialize(deserializer)?;\n        Ok(IgnoredAny)\n    }\n}\n\n//////////////////////////////////////////////////////////////////////////\n\n#[track_caller]\nfn test<'de, T>(value: T, tokens: &'de [Token])\nwhere\n    T: Deserialize<'de> + PartialEq + Debug,\n{\n    // Test ser/de roundtripping\n    assert_de_tokens(&value, tokens);\n\n    // Test that the tokens are ignorable\n    assert_de_tokens_ignore(tokens);\n}\n\n#[derive(Debug)]\nstruct SkipPartialEq<T>(T);\n\nimpl<'de, T> Deserialize<'de> for SkipPartialEq<T>\nwhere\n    T: Deserialize<'de>,\n{\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        T::deserialize(deserializer).map(SkipPartialEq)\n    }\n}\n\nimpl<T> PartialEq for SkipPartialEq<T> {\n    fn eq(&self, _other: &Self) -> bool {\n        true\n    }\n}\n\n#[track_caller]\nfn assert_de_tokens_ignore(ignorable_tokens: &[Token]) {\n    #[derive(PartialEq, Debug, Deserialize)]\n    struct IgnoreBase {\n        a: i32,\n    }\n\n    // Embed the tokens to be ignored in the normal token\n    // stream for an IgnoreBase type\n    let concated_tokens: Vec<Token> = vec![\n        Token::Map { len: Some(2) },\n        Token::Str(\"a\"),\n        Token::I32(1),\n        Token::Str(\"ignored\"),\n    ]\n    .into_iter()\n    .chain(ignorable_tokens.iter().copied())\n    .chain(iter::once(Token::MapEnd))\n    .collect();\n\n    let expected = IgnoreBase { a: 1 };\n    assert_de_tokens(&expected, &concated_tokens);\n}\n\n//////////////////////////////////////////////////////////////////////////\n\n#[test]\nfn test_bool() {\n    test(true, &[Token::Bool(true)]);\n    test(false, &[Token::Bool(false)]);\n}\n\n#[test]\nfn test_i8() {\n    let test = test::<i8>;\n\n    // from signed\n    test(-128, &[Token::I8(-128)]);\n    test(-128, &[Token::I16(-128)]);\n    test(-128, &[Token::I32(-128)]);\n    test(-128, &[Token::I64(-128)]);\n    test(127, &[Token::I8(127)]);\n    test(127, &[Token::I16(127)]);\n    test(127, &[Token::I32(127)]);\n    test(127, &[Token::I64(127)]);\n\n    // from unsigned\n    test(0, &[Token::U8(0)]);\n    test(0, &[Token::U16(0)]);\n    test(0, &[Token::U32(0)]);\n    test(0, &[Token::U64(0)]);\n    test(127, &[Token::U8(127)]);\n    test(127, &[Token::U16(127)]);\n    test(127, &[Token::U32(127)]);\n    test(127, &[Token::U64(127)]);\n}\n\n#[test]\nfn test_i16() {\n    let test = test::<i16>;\n\n    // from signed\n    test(-128, &[Token::I8(-128)]);\n    test(-32768, &[Token::I16(-32768)]);\n    test(-32768, &[Token::I32(-32768)]);\n    test(-32768, &[Token::I64(-32768)]);\n    test(127, &[Token::I8(127)]);\n    test(32767, &[Token::I16(32767)]);\n    test(32767, &[Token::I32(32767)]);\n    test(32767, &[Token::I64(32767)]);\n\n    // from unsigned\n    test(0, &[Token::U8(0)]);\n    test(0, &[Token::U16(0)]);\n    test(0, &[Token::U32(0)]);\n    test(0, &[Token::U64(0)]);\n    test(255, &[Token::U8(255)]);\n    test(32767, &[Token::U16(32767)]);\n    test(32767, &[Token::U32(32767)]);\n    test(32767, &[Token::U64(32767)]);\n}\n\n#[test]\nfn test_i32() {\n    let test = test::<i32>;\n\n    // from signed\n    test(-128, &[Token::I8(-128)]);\n    test(-32768, &[Token::I16(-32768)]);\n    test(-2147483648, &[Token::I32(-2147483648)]);\n    test(-2147483648, &[Token::I64(-2147483648)]);\n    test(127, &[Token::I8(127)]);\n    test(32767, &[Token::I16(32767)]);\n    test(2147483647, &[Token::I32(2147483647)]);\n    test(2147483647, &[Token::I64(2147483647)]);\n\n    // from unsigned\n    test(0, &[Token::U8(0)]);\n    test(0, &[Token::U16(0)]);\n    test(0, &[Token::U32(0)]);\n    test(0, &[Token::U64(0)]);\n    test(255, &[Token::U8(255)]);\n    test(65535, &[Token::U16(65535)]);\n    test(2147483647, &[Token::U32(2147483647)]);\n    test(2147483647, &[Token::U64(2147483647)]);\n}\n\n#[test]\nfn test_i64() {\n    let test = test::<i64>;\n\n    // from signed\n    test(-128, &[Token::I8(-128)]);\n    test(-32768, &[Token::I16(-32768)]);\n    test(-2147483648, &[Token::I32(-2147483648)]);\n    test(-9223372036854775808, &[Token::I64(-9223372036854775808)]);\n    test(127, &[Token::I8(127)]);\n    test(32767, &[Token::I16(32767)]);\n    test(2147483647, &[Token::I32(2147483647)]);\n    test(9223372036854775807, &[Token::I64(9223372036854775807)]);\n\n    // from unsigned\n    test(0, &[Token::U8(0)]);\n    test(0, &[Token::U16(0)]);\n    test(0, &[Token::U32(0)]);\n    test(0, &[Token::U64(0)]);\n    test(255, &[Token::U8(255)]);\n    test(65535, &[Token::U16(65535)]);\n    test(4294967295, &[Token::U32(4294967295)]);\n    test(9223372036854775807, &[Token::U64(9223372036854775807)]);\n}\n\n#[test]\nfn test_i128() {\n    let test = test::<i128>;\n\n    // from signed\n    test(-128, &[Token::I8(-128)]);\n    test(-32768, &[Token::I16(-32768)]);\n    test(-2147483648, &[Token::I32(-2147483648)]);\n    test(-9223372036854775808, &[Token::I64(-9223372036854775808)]);\n    test(127, &[Token::I8(127)]);\n    test(32767, &[Token::I16(32767)]);\n    test(2147483647, &[Token::I32(2147483647)]);\n    test(9223372036854775807, &[Token::I64(9223372036854775807)]);\n\n    // from unsigned\n    test(0, &[Token::U8(0)]);\n    test(0, &[Token::U16(0)]);\n    test(0, &[Token::U32(0)]);\n    test(0, &[Token::U64(0)]);\n    test(255, &[Token::U8(255)]);\n    test(65535, &[Token::U16(65535)]);\n    test(4294967295, &[Token::U32(4294967295)]);\n    test(18446744073709551615, &[Token::U64(18446744073709551615)]);\n}\n\n#[test]\nfn test_isize() {\n    let test = test::<isize>;\n\n    // from signed\n    test(-10, &[Token::I8(-10)]);\n    test(-10, &[Token::I16(-10)]);\n    test(-10, &[Token::I32(-10)]);\n    test(-10, &[Token::I64(-10)]);\n    test(10, &[Token::I8(10)]);\n    test(10, &[Token::I16(10)]);\n    test(10, &[Token::I32(10)]);\n    test(10, &[Token::I64(10)]);\n\n    // from unsigned\n    test(0, &[Token::U8(0)]);\n    test(0, &[Token::U16(0)]);\n    test(0, &[Token::U32(0)]);\n    test(0, &[Token::U64(0)]);\n    test(10, &[Token::U8(10)]);\n    test(10, &[Token::U16(10)]);\n    test(10, &[Token::U32(10)]);\n    test(10, &[Token::U64(10)]);\n}\n\n#[test]\nfn test_u8() {\n    let test = test::<u8>;\n\n    // from signed\n    test(0, &[Token::I8(0)]);\n    test(0, &[Token::I16(0)]);\n    test(0, &[Token::I32(0)]);\n    test(0, &[Token::I64(0)]);\n    test(127, &[Token::I8(127)]);\n    test(255, &[Token::I16(255)]);\n    test(255, &[Token::I32(255)]);\n    test(255, &[Token::I64(255)]);\n\n    // from unsigned\n    test(0, &[Token::U8(0)]);\n    test(0, &[Token::U16(0)]);\n    test(0, &[Token::U32(0)]);\n    test(0, &[Token::U64(0)]);\n    test(255, &[Token::U8(255)]);\n    test(255, &[Token::U16(255)]);\n    test(255, &[Token::U32(255)]);\n    test(255, &[Token::U64(255)]);\n}\n\n#[test]\nfn test_u16() {\n    let test = test::<u16>;\n\n    // from signed\n    test(0, &[Token::I8(0)]);\n    test(0, &[Token::I16(0)]);\n    test(0, &[Token::I32(0)]);\n    test(0, &[Token::I64(0)]);\n    test(127, &[Token::I8(127)]);\n    test(32767, &[Token::I16(32767)]);\n    test(65535, &[Token::I32(65535)]);\n    test(65535, &[Token::I64(65535)]);\n\n    // from unsigned\n    test(0, &[Token::U8(0)]);\n    test(0, &[Token::U16(0)]);\n    test(0, &[Token::U32(0)]);\n    test(0, &[Token::U64(0)]);\n    test(255, &[Token::U8(255)]);\n    test(65535, &[Token::U16(65535)]);\n    test(65535, &[Token::U32(65535)]);\n    test(65535, &[Token::U64(65535)]);\n}\n\n#[test]\nfn test_u32() {\n    let test = test::<u32>;\n\n    // from signed\n    test(0, &[Token::I8(0)]);\n    test(0, &[Token::I16(0)]);\n    test(0, &[Token::I32(0)]);\n    test(0, &[Token::I64(0)]);\n    test(127, &[Token::I8(127)]);\n    test(32767, &[Token::I16(32767)]);\n    test(2147483647, &[Token::I32(2147483647)]);\n    test(4294967295, &[Token::I64(4294967295)]);\n\n    // from unsigned\n    test(0, &[Token::U8(0)]);\n    test(0, &[Token::U16(0)]);\n    test(0, &[Token::U32(0)]);\n    test(0, &[Token::U64(0)]);\n    test(255, &[Token::U8(255)]);\n    test(65535, &[Token::U16(65535)]);\n    test(4294967295, &[Token::U32(4294967295)]);\n    test(4294967295, &[Token::U64(4294967295)]);\n}\n\n#[test]\nfn test_u64() {\n    let test = test::<u64>;\n\n    // from signed\n    test(0, &[Token::I8(0)]);\n    test(0, &[Token::I16(0)]);\n    test(0, &[Token::I32(0)]);\n    test(0, &[Token::I64(0)]);\n    test(127, &[Token::I8(127)]);\n    test(32767, &[Token::I16(32767)]);\n    test(2147483647, &[Token::I32(2147483647)]);\n    test(9223372036854775807, &[Token::I64(9223372036854775807)]);\n\n    // from unsigned\n    test(0, &[Token::U8(0)]);\n    test(0, &[Token::U16(0)]);\n    test(0, &[Token::U32(0)]);\n    test(0, &[Token::U64(0)]);\n    test(255, &[Token::U8(255)]);\n    test(65535, &[Token::U16(65535)]);\n    test(4294967295, &[Token::U32(4294967295)]);\n    test(18446744073709551615, &[Token::U64(18446744073709551615)]);\n}\n\n#[test]\nfn test_u128() {\n    let test = test::<u128>;\n\n    // from signed\n    test(0, &[Token::I8(0)]);\n    test(0, &[Token::I16(0)]);\n    test(0, &[Token::I32(0)]);\n    test(0, &[Token::I64(0)]);\n    test(127, &[Token::I8(127)]);\n    test(32767, &[Token::I16(32767)]);\n    test(2147483647, &[Token::I32(2147483647)]);\n    test(9223372036854775807, &[Token::I64(9223372036854775807)]);\n\n    // from unsigned\n    test(0, &[Token::U8(0)]);\n    test(0, &[Token::U16(0)]);\n    test(0, &[Token::U32(0)]);\n    test(0, &[Token::U64(0)]);\n    test(255, &[Token::U8(255)]);\n    test(65535, &[Token::U16(65535)]);\n    test(4294967295, &[Token::U32(4294967295)]);\n    test(18446744073709551615, &[Token::U64(18446744073709551615)]);\n}\n\n#[test]\nfn test_usize() {\n    let test = test::<usize>;\n\n    // from signed\n    test(0, &[Token::I8(0)]);\n    test(0, &[Token::I16(0)]);\n    test(0, &[Token::I32(0)]);\n    test(0, &[Token::I64(0)]);\n    test(10, &[Token::I8(10)]);\n    test(10, &[Token::I16(10)]);\n    test(10, &[Token::I32(10)]);\n    test(10, &[Token::I64(10)]);\n\n    // from unsigned\n    test(0, &[Token::U8(0)]);\n    test(0, &[Token::U16(0)]);\n    test(0, &[Token::U32(0)]);\n    test(0, &[Token::U64(0)]);\n    test(10, &[Token::U8(10)]);\n    test(10, &[Token::U16(10)]);\n    test(10, &[Token::U32(10)]);\n    test(10, &[Token::U64(10)]);\n}\n\n#[test]\nfn test_nonzero_i8() {\n    let test = |value, tokens| test(NonZeroI8::new(value).unwrap(), tokens);\n\n    // from signed\n    test(-128, &[Token::I8(-128)]);\n    test(-128, &[Token::I16(-128)]);\n    test(-128, &[Token::I32(-128)]);\n    test(-128, &[Token::I64(-128)]);\n    test(127, &[Token::I8(127)]);\n    test(127, &[Token::I16(127)]);\n    test(127, &[Token::I32(127)]);\n    test(127, &[Token::I64(127)]);\n\n    // from unsigned\n    test(1, &[Token::U8(1)]);\n    test(1, &[Token::U16(1)]);\n    test(1, &[Token::U32(1)]);\n    test(1, &[Token::U64(1)]);\n    test(127, &[Token::U8(127)]);\n    test(127, &[Token::U16(127)]);\n    test(127, &[Token::U32(127)]);\n    test(127, &[Token::U64(127)]);\n}\n\n#[test]\nfn test_nonzero_i16() {\n    let test = |value, tokens| test(NonZeroI16::new(value).unwrap(), tokens);\n\n    // from signed\n    test(-128, &[Token::I8(-128)]);\n    test(-32768, &[Token::I16(-32768)]);\n    test(-32768, &[Token::I32(-32768)]);\n    test(-32768, &[Token::I64(-32768)]);\n    test(127, &[Token::I8(127)]);\n    test(32767, &[Token::I16(32767)]);\n    test(32767, &[Token::I32(32767)]);\n    test(32767, &[Token::I64(32767)]);\n\n    // from unsigned\n    test(1, &[Token::U8(1)]);\n    test(1, &[Token::U16(1)]);\n    test(1, &[Token::U32(1)]);\n    test(1, &[Token::U64(1)]);\n    test(255, &[Token::U8(255)]);\n    test(32767, &[Token::U16(32767)]);\n    test(32767, &[Token::U32(32767)]);\n    test(32767, &[Token::U64(32767)]);\n}\n\n#[test]\nfn test_nonzero_i32() {\n    let test = |value, tokens| test(NonZeroI32::new(value).unwrap(), tokens);\n\n    // from signed\n    test(-128, &[Token::I8(-128)]);\n    test(-32768, &[Token::I16(-32768)]);\n    test(-2147483648, &[Token::I32(-2147483648)]);\n    test(-2147483648, &[Token::I64(-2147483648)]);\n    test(127, &[Token::I8(127)]);\n    test(32767, &[Token::I16(32767)]);\n    test(2147483647, &[Token::I32(2147483647)]);\n    test(2147483647, &[Token::I64(2147483647)]);\n\n    // from unsigned\n    test(1, &[Token::U8(1)]);\n    test(1, &[Token::U16(1)]);\n    test(1, &[Token::U32(1)]);\n    test(1, &[Token::U64(1)]);\n    test(255, &[Token::U8(255)]);\n    test(65535, &[Token::U16(65535)]);\n    test(2147483647, &[Token::U32(2147483647)]);\n    test(2147483647, &[Token::U64(2147483647)]);\n}\n\n#[test]\nfn test_nonzero_i64() {\n    let test = |value, tokens| test(NonZeroI64::new(value).unwrap(), tokens);\n\n    // from signed\n    test(-128, &[Token::I8(-128)]);\n    test(-32768, &[Token::I16(-32768)]);\n    test(-2147483648, &[Token::I32(-2147483648)]);\n    test(-9223372036854775808, &[Token::I64(-9223372036854775808)]);\n    test(127, &[Token::I8(127)]);\n    test(32767, &[Token::I16(32767)]);\n    test(2147483647, &[Token::I32(2147483647)]);\n    test(9223372036854775807, &[Token::I64(9223372036854775807)]);\n\n    // from unsigned\n    test(1, &[Token::U8(1)]);\n    test(1, &[Token::U16(1)]);\n    test(1, &[Token::U32(1)]);\n    test(1, &[Token::U64(1)]);\n    test(255, &[Token::U8(255)]);\n    test(65535, &[Token::U16(65535)]);\n    test(4294967295, &[Token::U32(4294967295)]);\n    test(9223372036854775807, &[Token::U64(9223372036854775807)]);\n}\n\n#[test]\nfn test_nonzero_i128() {\n    let test = |value, tokens| test(NonZeroI128::new(value).unwrap(), tokens);\n\n    // from signed\n    test(-128, &[Token::I8(-128)]);\n    test(-32768, &[Token::I16(-32768)]);\n    test(-2147483648, &[Token::I32(-2147483648)]);\n    test(-9223372036854775808, &[Token::I64(-9223372036854775808)]);\n    test(127, &[Token::I8(127)]);\n    test(32767, &[Token::I16(32767)]);\n    test(2147483647, &[Token::I32(2147483647)]);\n    test(9223372036854775807, &[Token::I64(9223372036854775807)]);\n\n    // from unsigned\n    test(1, &[Token::U8(1)]);\n    test(1, &[Token::U16(1)]);\n    test(1, &[Token::U32(1)]);\n    test(1, &[Token::U64(1)]);\n    test(255, &[Token::U8(255)]);\n    test(65535, &[Token::U16(65535)]);\n    test(4294967295, &[Token::U32(4294967295)]);\n    test(18446744073709551615, &[Token::U64(18446744073709551615)]);\n}\n\n#[test]\nfn test_nonzero_isize() {\n    let test = |value, tokens| test(NonZeroIsize::new(value).unwrap(), tokens);\n\n    // from signed\n    test(-10, &[Token::I8(-10)]);\n    test(-10, &[Token::I16(-10)]);\n    test(-10, &[Token::I32(-10)]);\n    test(-10, &[Token::I64(-10)]);\n    test(10, &[Token::I8(10)]);\n    test(10, &[Token::I16(10)]);\n    test(10, &[Token::I32(10)]);\n    test(10, &[Token::I64(10)]);\n\n    // from unsigned\n    test(1, &[Token::U8(1)]);\n    test(1, &[Token::U16(1)]);\n    test(1, &[Token::U32(1)]);\n    test(1, &[Token::U64(1)]);\n    test(10, &[Token::U8(10)]);\n    test(10, &[Token::U16(10)]);\n    test(10, &[Token::U32(10)]);\n    test(10, &[Token::U64(10)]);\n}\n\n#[test]\nfn test_nonzero_u8() {\n    let test = |value, tokens| test(NonZeroU8::new(value).unwrap(), tokens);\n\n    // from signed\n    test(1, &[Token::I8(1)]);\n    test(1, &[Token::I16(1)]);\n    test(1, &[Token::I32(1)]);\n    test(1, &[Token::I64(1)]);\n    test(127, &[Token::I8(127)]);\n    test(255, &[Token::I16(255)]);\n    test(255, &[Token::I32(255)]);\n    test(255, &[Token::I64(255)]);\n\n    // from unsigned\n    test(1, &[Token::U8(1)]);\n    test(1, &[Token::U16(1)]);\n    test(1, &[Token::U32(1)]);\n    test(1, &[Token::U64(1)]);\n    test(255, &[Token::U8(255)]);\n    test(255, &[Token::U16(255)]);\n    test(255, &[Token::U32(255)]);\n    test(255, &[Token::U64(255)]);\n}\n\n#[test]\nfn test_nonzero_u16() {\n    let test = |value, tokens| test(NonZeroU16::new(value).unwrap(), tokens);\n\n    // from signed\n    test(1, &[Token::I8(1)]);\n    test(1, &[Token::I16(1)]);\n    test(1, &[Token::I32(1)]);\n    test(1, &[Token::I64(1)]);\n    test(127, &[Token::I8(127)]);\n    test(32767, &[Token::I16(32767)]);\n    test(65535, &[Token::I32(65535)]);\n    test(65535, &[Token::I64(65535)]);\n\n    // from unsigned\n    test(1, &[Token::U8(1)]);\n    test(1, &[Token::U16(1)]);\n    test(1, &[Token::U32(1)]);\n    test(1, &[Token::U64(1)]);\n    test(255, &[Token::U8(255)]);\n    test(65535, &[Token::U16(65535)]);\n    test(65535, &[Token::U32(65535)]);\n    test(65535, &[Token::U64(65535)]);\n}\n\n#[test]\nfn test_nonzero_u32() {\n    let test = |value, tokens| test(NonZeroU32::new(value).unwrap(), tokens);\n\n    // from signed\n    test(1, &[Token::I8(1)]);\n    test(1, &[Token::I16(1)]);\n    test(1, &[Token::I32(1)]);\n    test(1, &[Token::I64(1)]);\n    test(127, &[Token::I8(127)]);\n    test(32767, &[Token::I16(32767)]);\n    test(2147483647, &[Token::I32(2147483647)]);\n    test(4294967295, &[Token::I64(4294967295)]);\n\n    // from unsigned\n    test(1, &[Token::U8(1)]);\n    test(1, &[Token::U16(1)]);\n    test(1, &[Token::U32(1)]);\n    test(1, &[Token::U64(1)]);\n    test(255, &[Token::U8(255)]);\n    test(65535, &[Token::U16(65535)]);\n    test(4294967295, &[Token::U32(4294967295)]);\n    test(4294967295, &[Token::U64(4294967295)]);\n}\n\n#[test]\nfn test_nonzero_u64() {\n    let test = |value, tokens| test(NonZeroU64::new(value).unwrap(), tokens);\n\n    // from signed\n    test(1, &[Token::I8(1)]);\n    test(1, &[Token::I16(1)]);\n    test(1, &[Token::I32(1)]);\n    test(1, &[Token::I64(1)]);\n    test(127, &[Token::I8(127)]);\n    test(32767, &[Token::I16(32767)]);\n    test(2147483647, &[Token::I32(2147483647)]);\n    test(9223372036854775807, &[Token::I64(9223372036854775807)]);\n\n    // from unsigned\n    test(1, &[Token::U8(1)]);\n    test(1, &[Token::U16(1)]);\n    test(1, &[Token::U32(1)]);\n    test(1, &[Token::U64(1)]);\n    test(255, &[Token::U8(255)]);\n    test(65535, &[Token::U16(65535)]);\n    test(4294967295, &[Token::U32(4294967295)]);\n    test(18446744073709551615, &[Token::U64(18446744073709551615)]);\n}\n\n#[test]\nfn test_nonzero_u128() {\n    let test = |value, tokens| test(NonZeroU128::new(value).unwrap(), tokens);\n\n    // from signed\n    test(1, &[Token::I8(1)]);\n    test(1, &[Token::I16(1)]);\n    test(1, &[Token::I32(1)]);\n    test(1, &[Token::I64(1)]);\n    test(127, &[Token::I8(127)]);\n    test(32767, &[Token::I16(32767)]);\n    test(2147483647, &[Token::I32(2147483647)]);\n    test(9223372036854775807, &[Token::I64(9223372036854775807)]);\n\n    // from unsigned\n    test(1, &[Token::U8(1)]);\n    test(1, &[Token::U16(1)]);\n    test(1, &[Token::U32(1)]);\n    test(1, &[Token::U64(1)]);\n    test(255, &[Token::U8(255)]);\n    test(65535, &[Token::U16(65535)]);\n    test(4294967295, &[Token::U32(4294967295)]);\n    test(18446744073709551615, &[Token::U64(18446744073709551615)]);\n}\n\n#[test]\nfn test_nonzero_usize() {\n    let test = |value, tokens| test(NonZeroUsize::new(value).unwrap(), tokens);\n\n    // from signed\n    test(1, &[Token::I8(1)]);\n    test(1, &[Token::I16(1)]);\n    test(1, &[Token::I32(1)]);\n    test(1, &[Token::I64(1)]);\n    test(10, &[Token::I8(10)]);\n    test(10, &[Token::I16(10)]);\n    test(10, &[Token::I32(10)]);\n    test(10, &[Token::I64(10)]);\n\n    // from unsigned\n    test(1, &[Token::U8(1)]);\n    test(1, &[Token::U16(1)]);\n    test(1, &[Token::U32(1)]);\n    test(1, &[Token::U64(1)]);\n    test(10, &[Token::U8(10)]);\n    test(10, &[Token::U16(10)]);\n    test(10, &[Token::U32(10)]);\n    test(10, &[Token::U64(10)]);\n}\n\n#[test]\nfn test_f32() {\n    let test = test::<f32>;\n\n    test(1.11, &[Token::F32(1.11)]);\n    test(1.11, &[Token::F64(1.11)]);\n}\n\n#[test]\nfn test_f64() {\n    let test = test::<f64>;\n\n    test(1.11f32 as f64, &[Token::F32(1.11)]);\n    test(1.11, &[Token::F64(1.11)]);\n}\n\n#[test]\nfn test_nan() {\n    let f32_deserializer = F32Deserializer::<serde::de::value::Error>::new;\n    let f64_deserializer = F64Deserializer::<serde::de::value::Error>::new;\n\n    let pos_f32_nan = f32_deserializer(f32::NAN.copysign(1.0));\n    let pos_f64_nan = f64_deserializer(f64::NAN.copysign(1.0));\n    assert!(f32::deserialize(pos_f32_nan).unwrap().is_sign_positive());\n    assert!(f32::deserialize(pos_f64_nan).unwrap().is_sign_positive());\n    assert!(f64::deserialize(pos_f32_nan).unwrap().is_sign_positive());\n    assert!(f64::deserialize(pos_f64_nan).unwrap().is_sign_positive());\n\n    let neg_f32_nan = f32_deserializer(f32::NAN.copysign(-1.0));\n    let neg_f64_nan = f64_deserializer(f64::NAN.copysign(-1.0));\n    assert!(f32::deserialize(neg_f32_nan).unwrap().is_sign_negative());\n    assert!(f32::deserialize(neg_f64_nan).unwrap().is_sign_negative());\n    assert!(f64::deserialize(neg_f32_nan).unwrap().is_sign_negative());\n    assert!(f64::deserialize(neg_f64_nan).unwrap().is_sign_negative());\n}\n\n#[test]\nfn test_char() {\n    test('a', &[Token::Char('a')]);\n    test('a', &[Token::Str(\"a\")]);\n    test('a', &[Token::String(\"a\")]);\n}\n\n#[test]\nfn test_string() {\n    test(\"abc\".to_owned(), &[Token::Str(\"abc\")]);\n    test(\"abc\".to_owned(), &[Token::String(\"abc\")]);\n    test(\"a\".to_owned(), &[Token::Char('a')]);\n}\n\n#[test]\nfn test_option() {\n    test(None::<i32>, &[Token::Unit]);\n    test(None::<i32>, &[Token::None]);\n    test(Some(1), &[Token::Some, Token::I32(1)]);\n}\n\n#[test]\nfn test_result() {\n    test(\n        Ok::<i32, i32>(0),\n        &[\n            Token::Enum { name: \"Result\" },\n            Token::Str(\"Ok\"),\n            Token::I32(0),\n        ],\n    );\n    test(\n        Err::<i32, i32>(1),\n        &[\n            Token::Enum { name: \"Result\" },\n            Token::Str(\"Err\"),\n            Token::I32(1),\n        ],\n    );\n}\n\n#[test]\nfn test_unit() {\n    test((), &[Token::Unit]);\n}\n\n#[test]\nfn test_unit_struct() {\n    test(UnitStruct, &[Token::Unit]);\n    test(UnitStruct, &[Token::UnitStruct { name: \"UnitStruct\" }]);\n}\n\n#[test]\nfn test_generic_unit_struct() {\n    test(GenericUnitStruct::<8>, &[Token::Unit]);\n    test(\n        GenericUnitStruct::<8>,\n        &[Token::UnitStruct {\n            name: \"GenericUnitStruct\",\n        }],\n    );\n}\n\n#[test]\nfn test_newtype_struct() {\n    test(\n        NewtypeStruct(1),\n        &[\n            Token::NewtypeStruct {\n                name: \"NewtypeStruct\",\n            },\n            Token::I32(1),\n        ],\n    );\n}\n\n#[test]\nfn test_tuple_struct() {\n    test(\n        TupleStruct(1, 2, 3),\n        &[\n            Token::Seq { len: Some(3) },\n            Token::I32(1),\n            Token::I32(2),\n            Token::I32(3),\n            Token::SeqEnd,\n        ],\n    );\n    test(\n        TupleStruct(1, 2, 3),\n        &[\n            Token::Seq { len: None },\n            Token::I32(1),\n            Token::I32(2),\n            Token::I32(3),\n            Token::SeqEnd,\n        ],\n    );\n    test(\n        TupleStruct(1, 2, 3),\n        &[\n            Token::TupleStruct {\n                name: \"TupleStruct\",\n                len: 3,\n            },\n            Token::I32(1),\n            Token::I32(2),\n            Token::I32(3),\n            Token::TupleStructEnd,\n        ],\n    );\n    test(\n        TupleStruct(1, 2, 3),\n        &[\n            Token::TupleStruct {\n                name: \"TupleStruct\",\n                len: 3,\n            },\n            Token::I32(1),\n            Token::I32(2),\n            Token::I32(3),\n            Token::TupleStructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_btreeset() {\n    test(\n        BTreeSet::<isize>::new(),\n        &[Token::Seq { len: Some(0) }, Token::SeqEnd],\n    );\n    test(\n        btreeset![btreeset![], btreeset![1], btreeset![2, 3]],\n        &[\n            Token::Seq { len: Some(3) },\n            Token::Seq { len: Some(0) },\n            Token::SeqEnd,\n            Token::Seq { len: Some(1) },\n            Token::I32(1),\n            Token::SeqEnd,\n            Token::Seq { len: Some(2) },\n            Token::I32(2),\n            Token::I32(3),\n            Token::SeqEnd,\n            Token::SeqEnd,\n        ],\n    );\n    test(\n        BTreeSet::<isize>::new(),\n        &[\n            Token::TupleStruct {\n                name: \"Anything\",\n                len: 0,\n            },\n            Token::TupleStructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_hashset() {\n    test(\n        HashSet::<isize>::new(),\n        &[Token::Seq { len: Some(0) }, Token::SeqEnd],\n    );\n    test(\n        hashset![1, 2, 3],\n        &[\n            Token::Seq { len: Some(3) },\n            Token::I32(1),\n            Token::I32(2),\n            Token::I32(3),\n            Token::SeqEnd,\n        ],\n    );\n    test(\n        HashSet::<isize>::new(),\n        &[\n            Token::TupleStruct {\n                name: \"Anything\",\n                len: 0,\n            },\n            Token::TupleStructEnd,\n        ],\n    );\n    test(\n        hashset![foldhash::fast::FixedState; 1, 2, 3],\n        &[\n            Token::Seq { len: Some(3) },\n            Token::I32(1),\n            Token::I32(2),\n            Token::I32(3),\n            Token::SeqEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_vec() {\n    test(\n        Vec::<isize>::new(),\n        &[Token::Seq { len: Some(0) }, Token::SeqEnd],\n    );\n\n    test(\n        vec![vec![], vec![1], vec![2, 3]],\n        &[\n            Token::Seq { len: Some(3) },\n            Token::Seq { len: Some(0) },\n            Token::SeqEnd,\n            Token::Seq { len: Some(1) },\n            Token::I32(1),\n            Token::SeqEnd,\n            Token::Seq { len: Some(2) },\n            Token::I32(2),\n            Token::I32(3),\n            Token::SeqEnd,\n            Token::SeqEnd,\n        ],\n    );\n    test(\n        Vec::<isize>::new(),\n        &[\n            Token::TupleStruct {\n                name: \"Anything\",\n                len: 0,\n            },\n            Token::TupleStructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_array() {\n    test([0; 0], &[Token::Seq { len: Some(0) }, Token::SeqEnd]);\n    test([0; 0], &[Token::Tuple { len: 0 }, Token::TupleEnd]);\n    test(\n        ([0; 0], [1], [2, 3]),\n        &[\n            Token::Seq { len: Some(3) },\n            Token::Seq { len: Some(0) },\n            Token::SeqEnd,\n            Token::Seq { len: Some(1) },\n            Token::I32(1),\n            Token::SeqEnd,\n            Token::Seq { len: Some(2) },\n            Token::I32(2),\n            Token::I32(3),\n            Token::SeqEnd,\n            Token::SeqEnd,\n        ],\n    );\n    test(\n        ([0; 0], [1], [2, 3]),\n        &[\n            Token::Tuple { len: 3 },\n            Token::Tuple { len: 0 },\n            Token::TupleEnd,\n            Token::Tuple { len: 1 },\n            Token::I32(1),\n            Token::TupleEnd,\n            Token::Tuple { len: 2 },\n            Token::I32(2),\n            Token::I32(3),\n            Token::TupleEnd,\n            Token::TupleEnd,\n        ],\n    );\n    test(\n        [0; 0],\n        &[\n            Token::TupleStruct {\n                name: \"Anything\",\n                len: 0,\n            },\n            Token::TupleStructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_tuple() {\n    test(\n        (1,),\n        &[Token::Seq { len: Some(1) }, Token::I32(1), Token::SeqEnd],\n    );\n    test(\n        (1, 2, 3),\n        &[\n            Token::Seq { len: Some(3) },\n            Token::I32(1),\n            Token::I32(2),\n            Token::I32(3),\n            Token::SeqEnd,\n        ],\n    );\n    test(\n        (1,),\n        &[Token::Tuple { len: 1 }, Token::I32(1), Token::TupleEnd],\n    );\n    test(\n        (1, 2, 3),\n        &[\n            Token::Tuple { len: 3 },\n            Token::I32(1),\n            Token::I32(2),\n            Token::I32(3),\n            Token::TupleEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_btreemap() {\n    test(\n        BTreeMap::<isize, isize>::new(),\n        &[Token::Map { len: Some(0) }, Token::MapEnd],\n    );\n    test(\n        btreemap![1 => 2],\n        &[\n            Token::Map { len: Some(1) },\n            Token::I32(1),\n            Token::I32(2),\n            Token::MapEnd,\n        ],\n    );\n    test(\n        btreemap![1 => 2, 3 => 4],\n        &[\n            Token::Map { len: Some(2) },\n            Token::I32(1),\n            Token::I32(2),\n            Token::I32(3),\n            Token::I32(4),\n            Token::MapEnd,\n        ],\n    );\n    test(\n        btreemap![1 => btreemap![], 2 => btreemap![3 => 4, 5 => 6]],\n        &[\n            Token::Map { len: Some(2) },\n            Token::I32(1),\n            Token::Map { len: Some(0) },\n            Token::MapEnd,\n            Token::I32(2),\n            Token::Map { len: Some(2) },\n            Token::I32(3),\n            Token::I32(4),\n            Token::I32(5),\n            Token::I32(6),\n            Token::MapEnd,\n            Token::MapEnd,\n        ],\n    );\n    test(\n        BTreeMap::<isize, isize>::new(),\n        &[\n            Token::Struct {\n                name: \"Anything\",\n                len: 0,\n            },\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_hashmap() {\n    test(\n        HashMap::<isize, isize>::new(),\n        &[Token::Map { len: Some(0) }, Token::MapEnd],\n    );\n    test(\n        hashmap![1 => 2],\n        &[\n            Token::Map { len: Some(1) },\n            Token::I32(1),\n            Token::I32(2),\n            Token::MapEnd,\n        ],\n    );\n    test(\n        hashmap![1 => 2, 3 => 4],\n        &[\n            Token::Map { len: Some(2) },\n            Token::I32(1),\n            Token::I32(2),\n            Token::I32(3),\n            Token::I32(4),\n            Token::MapEnd,\n        ],\n    );\n    test(\n        hashmap![1 => hashmap![], 2 => hashmap![3 => 4, 5 => 6]],\n        &[\n            Token::Map { len: Some(2) },\n            Token::I32(1),\n            Token::Map { len: Some(0) },\n            Token::MapEnd,\n            Token::I32(2),\n            Token::Map { len: Some(2) },\n            Token::I32(3),\n            Token::I32(4),\n            Token::I32(5),\n            Token::I32(6),\n            Token::MapEnd,\n            Token::MapEnd,\n        ],\n    );\n    test(\n        HashMap::<isize, isize>::new(),\n        &[\n            Token::Struct {\n                name: \"Anything\",\n                len: 0,\n            },\n            Token::StructEnd,\n        ],\n    );\n    test(\n        hashmap![foldhash::fast::FixedState; 1 => 2, 3 => 4],\n        &[\n            Token::Map { len: Some(2) },\n            Token::I32(1),\n            Token::I32(2),\n            Token::I32(3),\n            Token::I32(4),\n            Token::MapEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_struct() {\n    test(\n        Struct { a: 1, b: 2, c: 0 },\n        &[\n            Token::Map { len: Some(3) },\n            Token::Str(\"a\"),\n            Token::I32(1),\n            Token::Str(\"b\"),\n            Token::I32(2),\n            Token::MapEnd,\n        ],\n    );\n    test(\n        Struct { a: 1, b: 2, c: 0 },\n        &[\n            Token::Map { len: Some(3) },\n            Token::U8(0),\n            Token::I32(1),\n            Token::U8(1),\n            Token::I32(2),\n            Token::MapEnd,\n        ],\n    );\n    test(\n        Struct { a: 1, b: 2, c: 0 },\n        &[\n            Token::Map { len: Some(3) },\n            Token::U16(0),\n            Token::I32(1),\n            Token::U16(1),\n            Token::I32(2),\n            Token::MapEnd,\n        ],\n    );\n    test(\n        Struct { a: 1, b: 2, c: 0 },\n        &[\n            Token::Map { len: Some(3) },\n            Token::U32(0),\n            Token::I32(1),\n            Token::U32(1),\n            Token::I32(2),\n            Token::MapEnd,\n        ],\n    );\n    test(\n        Struct { a: 1, b: 2, c: 0 },\n        &[\n            Token::Map { len: Some(3) },\n            Token::U64(0),\n            Token::I32(1),\n            Token::U64(1),\n            Token::I32(2),\n            Token::MapEnd,\n        ],\n    );\n    // Mixed key types\n    test(\n        Struct { a: 1, b: 2, c: 0 },\n        &[\n            Token::Map { len: Some(3) },\n            Token::U8(0),\n            Token::I32(1),\n            Token::U64(1),\n            Token::I32(2),\n            Token::MapEnd,\n        ],\n    );\n    test(\n        Struct { a: 1, b: 2, c: 0 },\n        &[\n            Token::Map { len: Some(3) },\n            Token::U8(0),\n            Token::I32(1),\n            Token::Str(\"b\"),\n            Token::I32(2),\n            Token::MapEnd,\n        ],\n    );\n    test(\n        Struct { a: 1, b: 2, c: 0 },\n        &[\n            Token::Struct {\n                name: \"Struct\",\n                len: 2,\n            },\n            Token::Str(\"a\"),\n            Token::I32(1),\n            Token::Str(\"b\"),\n            Token::I32(2),\n            Token::StructEnd,\n        ],\n    );\n    test(\n        Struct { a: 1, b: 2, c: 0 },\n        &[\n            Token::Seq { len: Some(3) },\n            Token::I32(1),\n            Token::I32(2),\n            Token::SeqEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_struct_borrowed_keys() {\n    test(\n        Struct { a: 1, b: 2, c: 0 },\n        &[\n            Token::Map { len: Some(3) },\n            Token::BorrowedStr(\"a\"),\n            Token::I32(1),\n            Token::BorrowedStr(\"b\"),\n            Token::I32(2),\n            Token::MapEnd,\n        ],\n    );\n    test(\n        Struct { a: 1, b: 2, c: 0 },\n        &[\n            Token::Struct {\n                name: \"Struct\",\n                len: 2,\n            },\n            Token::BorrowedStr(\"a\"),\n            Token::I32(1),\n            Token::BorrowedStr(\"b\"),\n            Token::I32(2),\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_struct_owned_keys() {\n    test(\n        Struct { a: 1, b: 2, c: 0 },\n        &[\n            Token::Map { len: Some(3) },\n            Token::String(\"a\"),\n            Token::I32(1),\n            Token::String(\"b\"),\n            Token::I32(2),\n            Token::MapEnd,\n        ],\n    );\n    test(\n        Struct { a: 1, b: 2, c: 0 },\n        &[\n            Token::Struct {\n                name: \"Struct\",\n                len: 2,\n            },\n            Token::String(\"a\"),\n            Token::I32(1),\n            Token::String(\"b\"),\n            Token::I32(2),\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_struct_with_skip() {\n    test(\n        Struct { a: 1, b: 2, c: 0 },\n        &[\n            Token::Map { len: Some(3) },\n            Token::Str(\"a\"),\n            Token::I32(1),\n            Token::Str(\"b\"),\n            Token::I32(2),\n            Token::Str(\"c\"),\n            Token::I32(3),\n            Token::Str(\"d\"),\n            Token::I32(4),\n            Token::MapEnd,\n        ],\n    );\n    test(\n        Struct { a: 1, b: 2, c: 0 },\n        &[\n            Token::Map { len: Some(3) },\n            Token::U8(0),\n            Token::I32(1),\n            Token::U16(1),\n            Token::I32(2),\n            Token::U32(2),\n            Token::I32(3),\n            Token::U64(3),\n            Token::I32(4),\n            Token::MapEnd,\n        ],\n    );\n    test(\n        Struct { a: 1, b: 2, c: 0 },\n        &[\n            Token::Struct {\n                name: \"Struct\",\n                len: 2,\n            },\n            Token::Str(\"a\"),\n            Token::I32(1),\n            Token::Str(\"b\"),\n            Token::I32(2),\n            Token::Str(\"c\"),\n            Token::I32(3),\n            Token::Str(\"d\"),\n            Token::I32(4),\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_struct_skip_all() {\n    test(\n        StructSkipAll { a: 0 },\n        &[\n            Token::Struct {\n                name: \"StructSkipAll\",\n                len: 0,\n            },\n            Token::StructEnd,\n        ],\n    );\n    test(\n        StructSkipAll { a: 0 },\n        &[\n            Token::Struct {\n                name: \"StructSkipAll\",\n                len: 0,\n            },\n            Token::Str(\"a\"),\n            Token::I32(1),\n            Token::Str(\"b\"),\n            Token::I32(2),\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_struct_skip_default() {\n    test(\n        StructSkipDefault { a: 16 },\n        &[\n            Token::Struct {\n                name: \"StructSkipDefault\",\n                len: 0,\n            },\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_struct_skip_all_deny_unknown() {\n    test(\n        StructSkipAllDenyUnknown { a: 0 },\n        &[\n            Token::Struct {\n                name: \"StructSkipAllDenyUnknown\",\n                len: 0,\n            },\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_struct_default() {\n    test(\n        StructDefault {\n            a: 50,\n            b: \"overwritten\".to_string(),\n        },\n        &[\n            Token::Struct {\n                name: \"StructDefault\",\n                len: 2,\n            },\n            Token::Str(\"a\"),\n            Token::I32(50),\n            Token::Str(\"b\"),\n            Token::String(\"overwritten\"),\n            Token::StructEnd,\n        ],\n    );\n    test(\n        StructDefault {\n            a: 100,\n            b: \"default\".to_string(),\n        },\n        &[\n            Token::Struct {\n                name: \"StructDefault\",\n                len: 2,\n            },\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_enum_unit() {\n    test(\n        Enum::Unit,\n        &[Token::UnitVariant {\n            name: \"Enum\",\n            variant: \"Unit\",\n        }],\n    );\n}\n\n#[test]\nfn test_enum_simple() {\n    test(\n        Enum::Simple(1),\n        &[\n            Token::NewtypeVariant {\n                name: \"Enum\",\n                variant: \"Simple\",\n            },\n            Token::I32(1),\n        ],\n    );\n}\n\n#[test]\nfn test_enum_simple_with_skipped() {\n    test(\n        Enum::SimpleWithSkipped(NotDeserializable),\n        &[Token::UnitVariant {\n            name: \"Enum\",\n            variant: \"SimpleWithSkipped\",\n        }],\n    );\n}\n\n#[test]\nfn test_enum_seq() {\n    test(\n        Enum::Seq(1, 2, 3),\n        &[\n            Token::TupleVariant {\n                name: \"Enum\",\n                variant: \"Seq\",\n                len: 3,\n            },\n            Token::I32(1),\n            Token::I32(2),\n            Token::I32(3),\n            Token::TupleVariantEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_enum_map() {\n    test(\n        Enum::Map { a: 1, b: 2, c: 3 },\n        &[\n            Token::StructVariant {\n                name: \"Enum\",\n                variant: \"Map\",\n                len: 3,\n            },\n            Token::Str(\"a\"),\n            Token::I32(1),\n            Token::Str(\"b\"),\n            Token::I32(2),\n            Token::Str(\"c\"),\n            Token::I32(3),\n            Token::StructVariantEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_enum_unit_usize() {\n    test(\n        Enum::Unit,\n        &[Token::Enum { name: \"Enum\" }, Token::U32(0), Token::Unit],\n    );\n}\n\n#[test]\nfn test_enum_unit_bytes() {\n    test(\n        Enum::Unit,\n        &[\n            Token::Enum { name: \"Enum\" },\n            Token::Bytes(b\"Unit\"),\n            Token::Unit,\n        ],\n    );\n}\n\n#[test]\nfn test_enum_other_unit() {\n    test(\n        EnumOther::Unit,\n        &[\n            Token::Enum { name: \"EnumOther\" },\n            Token::Str(\"Unit\"),\n            Token::Unit,\n        ],\n    );\n    test(\n        EnumOther::Unit,\n        &[Token::Enum { name: \"EnumOther\" }, Token::U8(0), Token::Unit],\n    );\n    test(\n        EnumOther::Unit,\n        &[\n            Token::Enum { name: \"EnumOther\" },\n            Token::U16(0),\n            Token::Unit,\n        ],\n    );\n    test(\n        EnumOther::Unit,\n        &[\n            Token::Enum { name: \"EnumOther\" },\n            Token::U32(0),\n            Token::Unit,\n        ],\n    );\n    test(\n        EnumOther::Unit,\n        &[\n            Token::Enum { name: \"EnumOther\" },\n            Token::U64(0),\n            Token::Unit,\n        ],\n    );\n}\n\n#[test]\nfn test_enum_other() {\n    test(\n        EnumOther::Other,\n        &[\n            Token::Enum { name: \"EnumOther\" },\n            Token::Str(\"Foo\"),\n            Token::Unit,\n        ],\n    );\n    test(\n        EnumOther::Other,\n        &[\n            Token::Enum { name: \"EnumOther\" },\n            Token::U8(42),\n            Token::Unit,\n        ],\n    );\n    test(\n        EnumOther::Other,\n        &[\n            Token::Enum { name: \"EnumOther\" },\n            Token::U16(42),\n            Token::Unit,\n        ],\n    );\n    test(\n        EnumOther::Other,\n        &[\n            Token::Enum { name: \"EnumOther\" },\n            Token::U32(42),\n            Token::Unit,\n        ],\n    );\n    test(\n        EnumOther::Other,\n        &[\n            Token::Enum { name: \"EnumOther\" },\n            Token::U64(42),\n            Token::Unit,\n        ],\n    );\n}\n\n#[test]\nfn test_box() {\n    test(Box::new(0i32), &[Token::I32(0)]);\n}\n\n#[test]\nfn test_boxed_slice() {\n    test(\n        Box::new([0, 1, 2]),\n        &[\n            Token::Seq { len: Some(3) },\n            Token::I32(0),\n            Token::I32(1),\n            Token::I32(2),\n            Token::SeqEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_duration() {\n    test(\n        Duration::new(1, 2),\n        &[\n            Token::Struct {\n                name: \"Duration\",\n                len: 2,\n            },\n            Token::Str(\"secs\"),\n            Token::U64(1),\n            Token::Str(\"nanos\"),\n            Token::U32(2),\n            Token::StructEnd,\n        ],\n    );\n    test(\n        Duration::new(1, 2),\n        &[\n            Token::Seq { len: Some(2) },\n            Token::I64(1),\n            Token::I64(2),\n            Token::SeqEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_system_time() {\n    test(\n        UNIX_EPOCH + Duration::new(1, 2),\n        &[\n            Token::Struct {\n                name: \"SystemTime\",\n                len: 2,\n            },\n            Token::Str(\"secs_since_epoch\"),\n            Token::U64(1),\n            Token::Str(\"nanos_since_epoch\"),\n            Token::U32(2),\n            Token::StructEnd,\n        ],\n    );\n    test(\n        UNIX_EPOCH + Duration::new(1, 2),\n        &[\n            Token::Seq { len: Some(2) },\n            Token::I64(1),\n            Token::I64(2),\n            Token::SeqEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_range() {\n    test(\n        1u32..2u32,\n        &[\n            Token::Struct {\n                name: \"Range\",\n                len: 2,\n            },\n            Token::Str(\"start\"),\n            Token::U32(1),\n            Token::Str(\"end\"),\n            Token::U32(2),\n            Token::StructEnd,\n        ],\n    );\n    test(\n        1u32..2u32,\n        &[\n            Token::Seq { len: Some(2) },\n            Token::U64(1),\n            Token::U64(2),\n            Token::SeqEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_range_inclusive() {\n    test(\n        1u32..=2u32,\n        &[\n            Token::Struct {\n                name: \"RangeInclusive\",\n                len: 2,\n            },\n            Token::Str(\"start\"),\n            Token::U32(1),\n            Token::Str(\"end\"),\n            Token::U32(2),\n            Token::StructEnd,\n        ],\n    );\n    test(\n        1u32..=2u32,\n        &[\n            Token::Seq { len: Some(2) },\n            Token::U64(1),\n            Token::U64(2),\n            Token::SeqEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_range_from() {\n    test(\n        1u32..,\n        &[\n            Token::Struct {\n                name: \"RangeFrom\",\n                len: 1,\n            },\n            Token::Str(\"start\"),\n            Token::U32(1),\n            Token::StructEnd,\n        ],\n    );\n    test(\n        1u32..,\n        &[Token::Seq { len: Some(1) }, Token::U32(1), Token::SeqEnd],\n    );\n}\n\n#[test]\nfn test_range_to() {\n    test(\n        ..2u32,\n        &[\n            Token::Struct {\n                name: \"RangeTo\",\n                len: 1,\n            },\n            Token::Str(\"end\"),\n            Token::U32(2),\n            Token::StructEnd,\n        ],\n    );\n    test(\n        ..2u32,\n        &[Token::Seq { len: Some(1) }, Token::U32(2), Token::SeqEnd],\n    );\n}\n\n#[test]\nfn test_bound() {\n    test(\n        Bound::Unbounded::<()>,\n        &[\n            Token::Enum { name: \"Bound\" },\n            Token::Str(\"Unbounded\"),\n            Token::Unit,\n        ],\n    );\n    test(\n        Bound::Included(0),\n        &[\n            Token::Enum { name: \"Bound\" },\n            Token::Str(\"Included\"),\n            Token::U8(0),\n        ],\n    );\n    test(\n        Bound::Excluded(0),\n        &[\n            Token::Enum { name: \"Bound\" },\n            Token::Str(\"Excluded\"),\n            Token::U8(0),\n        ],\n    );\n}\n\n#[test]\nfn test_path() {\n    test(\n        Path::new(\"/usr/local/lib\"),\n        &[Token::BorrowedStr(\"/usr/local/lib\")],\n    );\n    test(\n        Path::new(\"/usr/local/lib\"),\n        &[Token::BorrowedBytes(b\"/usr/local/lib\")],\n    );\n}\n\n#[test]\nfn test_path_buf() {\n    test(\n        PathBuf::from(\"/usr/local/lib\"),\n        &[Token::Str(\"/usr/local/lib\")],\n    );\n    test(\n        PathBuf::from(\"/usr/local/lib\"),\n        &[Token::String(\"/usr/local/lib\")],\n    );\n    test(\n        PathBuf::from(\"/usr/local/lib\"),\n        &[Token::Bytes(b\"/usr/local/lib\")],\n    );\n    test(\n        PathBuf::from(\"/usr/local/lib\"),\n        &[Token::ByteBuf(b\"/usr/local/lib\")],\n    );\n}\n\n#[test]\nfn test_boxed_path() {\n    test(\n        PathBuf::from(\"/usr/local/lib\").into_boxed_path(),\n        &[Token::Str(\"/usr/local/lib\")],\n    );\n    test(\n        PathBuf::from(\"/usr/local/lib\").into_boxed_path(),\n        &[Token::String(\"/usr/local/lib\")],\n    );\n    test(\n        PathBuf::from(\"/usr/local/lib\").into_boxed_path(),\n        &[Token::Bytes(b\"/usr/local/lib\")],\n    );\n    test(\n        PathBuf::from(\"/usr/local/lib\").into_boxed_path(),\n        &[Token::ByteBuf(b\"/usr/local/lib\")],\n    );\n}\n\n#[test]\nfn test_cstring() {\n    test(CString::new(\"abc\").unwrap(), &[Token::Bytes(b\"abc\")]);\n}\n\n#[test]\nfn test_rc() {\n    test(Rc::new(true), &[Token::Bool(true)]);\n}\n\n#[test]\nfn test_rc_weak_some() {\n    test(\n        SkipPartialEq(RcWeak::<bool>::new()),\n        &[Token::Some, Token::Bool(true)],\n    );\n}\n\n#[test]\nfn test_rc_weak_none() {\n    test(SkipPartialEq(RcWeak::<bool>::new()), &[Token::None]);\n}\n\n#[test]\nfn test_arc() {\n    test(Arc::new(true), &[Token::Bool(true)]);\n}\n\n#[test]\nfn test_arc_weak_some() {\n    test(\n        SkipPartialEq(ArcWeak::<bool>::new()),\n        &[Token::Some, Token::Bool(true)],\n    );\n}\n\n#[test]\nfn test_arc_weak_none() {\n    test(SkipPartialEq(ArcWeak::<bool>::new()), &[Token::None]);\n}\n\n#[test]\nfn test_wrapping() {\n    test(Wrapping(1usize), &[Token::U32(1)]);\n    test(Wrapping(1usize), &[Token::U64(1)]);\n}\n\n#[test]\nfn test_saturating() {\n    test(Saturating(1usize), &[Token::U32(1)]);\n    test(Saturating(1usize), &[Token::U64(1)]);\n    test(Saturating(0u8), &[Token::I8(0)]);\n    test(Saturating(0u16), &[Token::I16(0)]);\n\n    // saturate input values at the minimum or maximum value\n    test(Saturating(u8::MAX), &[Token::U16(u16::MAX)]);\n    test(Saturating(u8::MAX), &[Token::U16(u8::MAX as u16 + 1)]);\n    test(Saturating(u16::MAX), &[Token::U32(u32::MAX)]);\n    test(Saturating(u32::MAX), &[Token::U64(u64::MAX)]);\n    test(Saturating(u8::MIN), &[Token::I8(i8::MIN)]);\n    test(Saturating(u16::MIN), &[Token::I16(i16::MIN)]);\n    test(Saturating(u32::MIN), &[Token::I32(i32::MIN)]);\n    test(Saturating(i8::MIN), &[Token::I16(i16::MIN)]);\n    test(Saturating(i16::MIN), &[Token::I32(i32::MIN)]);\n    test(Saturating(i32::MIN), &[Token::I64(i64::MIN)]);\n\n    test(Saturating(u8::MIN), &[Token::I8(-1)]);\n    test(Saturating(u16::MIN), &[Token::I16(-1)]);\n\n    #[cfg(target_pointer_width = \"64\")]\n    {\n        test(Saturating(usize::MIN), &[Token::U64(u64::MIN)]);\n        test(Saturating(usize::MAX), &[Token::U64(u64::MAX)]);\n        test(Saturating(isize::MIN), &[Token::I64(i64::MIN)]);\n        test(Saturating(isize::MAX), &[Token::I64(i64::MAX)]);\n        test(Saturating(0usize), &[Token::I64(i64::MIN)]);\n\n        test(\n            Saturating(9_223_372_036_854_775_807usize),\n            &[Token::I64(i64::MAX)],\n        );\n    }\n}\n\n#[test]\nfn test_rc_dst() {\n    test(Rc::<str>::from(\"s\"), &[Token::Str(\"s\")]);\n    test(\n        Rc::<[bool]>::from(&[true][..]),\n        &[\n            Token::Seq { len: Some(1) },\n            Token::Bool(true),\n            Token::SeqEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_arc_dst() {\n    test(Arc::<str>::from(\"s\"), &[Token::Str(\"s\")]);\n    test(\n        Arc::<[bool]>::from(&[true][..]),\n        &[\n            Token::Seq { len: Some(1) },\n            Token::Bool(true),\n            Token::SeqEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_ignored_any() {\n    test(IgnoredAny, &[Token::Str(\"s\")]);\n    test(\n        IgnoredAny,\n        &[\n            Token::Seq { len: Some(1) },\n            Token::Bool(true),\n            Token::SeqEnd,\n        ],\n    );\n    test(\n        IgnoredAny,\n        &[Token::Enum { name: \"E\" }, Token::Str(\"Rust\"), Token::Unit],\n    );\n}\n\n#[test]\nfn test_net_ipv4addr_readable() {\n    test(\n        \"1.2.3.4\".parse::<net::Ipv4Addr>().unwrap().readable(),\n        &[Token::Str(\"1.2.3.4\")],\n    );\n}\n\n#[test]\nfn test_net_ipv6addr_readable() {\n    test(\n        \"::1\".parse::<net::Ipv6Addr>().unwrap().readable(),\n        &[Token::Str(\"::1\")],\n    );\n}\n\n#[test]\nfn test_net_ipaddr_readable() {\n    test(\n        \"1.2.3.4\".parse::<net::IpAddr>().unwrap().readable(),\n        &[Token::Str(\"1.2.3.4\")],\n    );\n}\n\n#[test]\nfn test_net_socketaddr_readable() {\n    test(\n        \"1.2.3.4:1234\"\n            .parse::<net::SocketAddr>()\n            .unwrap()\n            .readable(),\n        &[Token::Str(\"1.2.3.4:1234\")],\n    );\n    test(\n        \"1.2.3.4:1234\"\n            .parse::<net::SocketAddrV4>()\n            .unwrap()\n            .readable(),\n        &[Token::Str(\"1.2.3.4:1234\")],\n    );\n    test(\n        \"[::1]:1234\"\n            .parse::<net::SocketAddrV6>()\n            .unwrap()\n            .readable(),\n        &[Token::Str(\"[::1]:1234\")],\n    );\n}\n\n#[test]\nfn test_net_ipv4addr_compact() {\n    test(\n        net::Ipv4Addr::from(*b\"1234\").compact(),\n        &seq![\n            Token::Tuple { len: 4 },\n            b\"1234\".iter().copied().map(Token::U8),\n            Token::TupleEnd\n        ],\n    );\n}\n\n#[test]\nfn test_net_ipv6addr_compact() {\n    test(\n        net::Ipv6Addr::from(*b\"1234567890123456\").compact(),\n        &seq![\n            Token::Tuple { len: 4 },\n            b\"1234567890123456\".iter().copied().map(Token::U8),\n            Token::TupleEnd\n        ],\n    );\n}\n\n#[test]\nfn test_net_ipaddr_compact() {\n    test(\n        net::IpAddr::from(*b\"1234\").compact(),\n        &seq![\n            Token::NewtypeVariant {\n                name: \"IpAddr\",\n                variant: \"V4\"\n            },\n            Token::Tuple { len: 4 },\n            b\"1234\".iter().copied().map(Token::U8),\n            Token::TupleEnd\n        ],\n    );\n}\n\n#[test]\nfn test_net_socketaddr_compact() {\n    test(\n        net::SocketAddr::from((*b\"1234567890123456\", 1234)).compact(),\n        &seq![\n            Token::NewtypeVariant {\n                name: \"SocketAddr\",\n                variant: \"V6\"\n            },\n            Token::Tuple { len: 2 },\n            Token::Tuple { len: 16 },\n            b\"1234567890123456\".iter().copied().map(Token::U8),\n            Token::TupleEnd,\n            Token::U16(1234),\n            Token::TupleEnd\n        ],\n    );\n    test(\n        net::SocketAddr::from((*b\"1234\", 1234)).compact(),\n        &seq![\n            Token::NewtypeVariant {\n                name: \"SocketAddr\",\n                variant: \"V4\"\n            },\n            Token::Tuple { len: 2 },\n            Token::Tuple { len: 4 },\n            b\"1234\".iter().copied().map(Token::U8),\n            Token::TupleEnd,\n            Token::U16(1234),\n            Token::TupleEnd\n        ],\n    );\n    test(\n        net::SocketAddrV4::new(net::Ipv4Addr::from(*b\"1234\"), 1234).compact(),\n        &seq![\n            Token::Tuple { len: 2 },\n            Token::Tuple { len: 4 },\n            b\"1234\".iter().copied().map(Token::U8),\n            Token::TupleEnd,\n            Token::U16(1234),\n            Token::TupleEnd\n        ],\n    );\n    test(\n        net::SocketAddrV6::new(net::Ipv6Addr::from(*b\"1234567890123456\"), 1234, 0, 0).compact(),\n        &seq![\n            Token::Tuple { len: 2 },\n            Token::Tuple { len: 16 },\n            b\"1234567890123456\".iter().copied().map(Token::U8),\n            Token::TupleEnd,\n            Token::U16(1234),\n            Token::TupleEnd\n        ],\n    );\n}\n\n#[cfg(feature = \"unstable\")]\n#[test]\nfn test_never_result() {\n    test(\n        Ok::<u8, !>(0),\n        &[\n            Token::NewtypeVariant {\n                name: \"Result\",\n                variant: \"Ok\",\n            },\n            Token::U8(0),\n        ],\n    );\n}\n\n#[cfg(unix)]\n#[test]\nfn test_osstring() {\n    use std::os::unix::ffi::OsStringExt;\n\n    let value = OsString::from_vec(vec![1, 2, 3]);\n    let tokens = [\n        Token::Enum { name: \"OsString\" },\n        Token::Str(\"Unix\"),\n        Token::Seq { len: Some(2) },\n        Token::U8(1),\n        Token::U8(2),\n        Token::U8(3),\n        Token::SeqEnd,\n    ];\n\n    assert_de_tokens(&value, &tokens);\n    assert_de_tokens_ignore(&tokens);\n}\n\n#[cfg(windows)]\n#[test]\nfn test_osstring() {\n    use std::os::windows::ffi::OsStringExt;\n\n    let value = OsString::from_wide(&[1, 2, 3]);\n    let tokens = [\n        Token::Enum { name: \"OsString\" },\n        Token::Str(\"Windows\"),\n        Token::Seq { len: Some(2) },\n        Token::U16(1),\n        Token::U16(2),\n        Token::U16(3),\n        Token::SeqEnd,\n    ];\n\n    assert_de_tokens(&value, &tokens);\n    assert_de_tokens_ignore(&tokens);\n}\n\n#[test]\nfn test_cstr() {\n    assert_de_tokens::<Box<CStr>>(\n        &CString::new(\"abc\").unwrap().into_boxed_c_str(),\n        &[Token::Bytes(b\"abc\")],\n    );\n}\n\n#[test]\nfn test_atomics() {\n    fn test<L, A, T>(load: L, val: T)\n    where\n        L: Fn(&A, Ordering) -> T,\n        A: DeserializeOwned,\n        T: PartialEq + Debug + Copy + for<'de> IntoDeserializer<'de>,\n    {\n        match A::deserialize(val.into_deserializer()) {\n            Ok(v) => {\n                let loaded = load(&v, Ordering::Relaxed);\n                assert_eq!(val, loaded);\n            }\n            Err(e) => panic!(\"tokens failed to deserialize: {}\", e),\n        }\n    }\n\n    test(AtomicBool::load, true);\n    test(AtomicI8::load, -127i8);\n    test(AtomicI16::load, -510i16);\n    test(AtomicI32::load, -131072i32);\n    test(AtomicIsize::load, -131072isize);\n    test(AtomicU8::load, 127u8);\n    test(AtomicU16::load, 510u16);\n    test(AtomicU32::load, 131072u32);\n    test(AtomicUsize::load, 131072usize);\n\n    #[cfg(target_arch = \"x86_64\")]\n    {\n        test(AtomicI64::load, -8589934592i64);\n        test(AtomicU64::load, 8589934592u64);\n    }\n}\n"
  },
  {
    "path": "test_suite/tests/test_de_error.rs",
    "content": "#![allow(\n    clippy::derive_partial_eq_without_eq,\n    clippy::empty_enums,\n    clippy::unreadable_literal\n)]\n#![cfg_attr(feature = \"unstable\", feature(never_type))]\n\nuse serde::de::{Deserialize, IntoDeserializer};\nuse serde_derive::Deserialize;\nuse serde_test::{assert_de_tokens_error, Token};\nuse std::collections::{BTreeMap, BTreeSet, HashMap, HashSet};\nuse std::ffi::{CStr, CString};\nuse std::num::{\n    NonZeroI128, NonZeroI16, NonZeroI32, NonZeroI64, NonZeroI8, NonZeroIsize, NonZeroU128,\n    NonZeroU16, NonZeroU32, NonZeroU64, NonZeroU8, NonZeroUsize, Wrapping,\n};\nuse std::time::{Duration, SystemTime};\n\n#[derive(Copy, Clone, PartialEq, Debug, Deserialize)]\nstruct UnitStruct;\n\n#[derive(PartialEq, Debug, Deserialize)]\nstruct Struct {\n    a: i32,\n    b: i32,\n    #[serde(skip_deserializing)]\n    c: i32,\n}\n\n#[derive(PartialEq, Debug, Deserialize)]\n#[serde(deny_unknown_fields)]\nstruct StructDenyUnknown {\n    a: i32,\n    #[serde(skip_deserializing)]\n    b: i32,\n}\n\n#[derive(PartialEq, Debug, Deserialize)]\n#[serde(deny_unknown_fields)]\nstruct StructSkipAllDenyUnknown {\n    #[serde(skip_deserializing)]\n    a: i32,\n}\n\n#[derive(Default, PartialEq, Debug)]\nstruct NotDeserializable;\n\n#[derive(PartialEq, Debug, Deserialize)]\nenum Enum {\n    #[allow(dead_code)]\n    #[serde(skip_deserializing)]\n    Skipped,\n    Unit,\n    Simple(i32),\n    Seq(i32, i32, i32),\n    Map {\n        a: i32,\n        b: i32,\n        c: i32,\n    },\n    SimpleWithSkipped(#[serde(skip_deserializing)] NotDeserializable),\n}\n\n#[derive(PartialEq, Debug, Deserialize)]\nenum EnumSkipAll {\n    #[allow(dead_code)]\n    #[serde(skip_deserializing)]\n    Skipped,\n}\n\n#[test]\nfn test_i8() {\n    let test = assert_de_tokens_error::<i8>;\n\n    // from signed\n    test(\n        &[Token::I16(-129)],\n        \"invalid value: integer `-129`, expected i8\",\n    );\n    test(\n        &[Token::I32(-129)],\n        \"invalid value: integer `-129`, expected i8\",\n    );\n    test(\n        &[Token::I64(-129)],\n        \"invalid value: integer `-129`, expected i8\",\n    );\n    test(\n        &[Token::I16(128)],\n        \"invalid value: integer `128`, expected i8\",\n    );\n    test(\n        &[Token::I32(128)],\n        \"invalid value: integer `128`, expected i8\",\n    );\n    test(\n        &[Token::I64(128)],\n        \"invalid value: integer `128`, expected i8\",\n    );\n\n    // from unsigned\n    test(\n        &[Token::U8(128)],\n        \"invalid value: integer `128`, expected i8\",\n    );\n    test(\n        &[Token::U16(128)],\n        \"invalid value: integer `128`, expected i8\",\n    );\n    test(\n        &[Token::U32(128)],\n        \"invalid value: integer `128`, expected i8\",\n    );\n    test(\n        &[Token::U64(128)],\n        \"invalid value: integer `128`, expected i8\",\n    );\n}\n\n#[test]\nfn test_i16() {\n    let test = assert_de_tokens_error::<i16>;\n\n    // from signed\n    test(\n        &[Token::I32(-32769)],\n        \"invalid value: integer `-32769`, expected i16\",\n    );\n    test(\n        &[Token::I64(-32769)],\n        \"invalid value: integer `-32769`, expected i16\",\n    );\n    test(\n        &[Token::I32(32768)],\n        \"invalid value: integer `32768`, expected i16\",\n    );\n    test(\n        &[Token::I64(32768)],\n        \"invalid value: integer `32768`, expected i16\",\n    );\n\n    // from unsigned\n    test(\n        &[Token::U16(32768)],\n        \"invalid value: integer `32768`, expected i16\",\n    );\n    test(\n        &[Token::U32(32768)],\n        \"invalid value: integer `32768`, expected i16\",\n    );\n    test(\n        &[Token::U64(32768)],\n        \"invalid value: integer `32768`, expected i16\",\n    );\n}\n\n#[test]\nfn test_i32() {\n    let test = assert_de_tokens_error::<i32>;\n\n    // from signed\n    test(\n        &[Token::I64(-2147483649)],\n        \"invalid value: integer `-2147483649`, expected i32\",\n    );\n    test(\n        &[Token::I64(2147483648)],\n        \"invalid value: integer `2147483648`, expected i32\",\n    );\n\n    // from unsigned\n    test(\n        &[Token::U32(2147483648)],\n        \"invalid value: integer `2147483648`, expected i32\",\n    );\n    test(\n        &[Token::U64(2147483648)],\n        \"invalid value: integer `2147483648`, expected i32\",\n    );\n}\n\n#[test]\nfn test_i64() {\n    let test = assert_de_tokens_error::<i64>;\n\n    // from unsigned\n    test(\n        &[Token::U64(9223372036854775808)],\n        \"invalid value: integer `9223372036854775808`, expected i64\",\n    );\n}\n\n#[test]\nfn test_i128() {\n    let deserializer = <i128 as IntoDeserializer>::into_deserializer(1);\n    let error = <&str>::deserialize(deserializer).unwrap_err();\n    assert_eq!(\n        error.to_string(),\n        \"invalid type: integer `1` as i128, expected a borrowed string\",\n    );\n}\n\n#[test]\nfn test_u8() {\n    let test = assert_de_tokens_error::<u8>;\n\n    // from signed\n    test(&[Token::I8(-1)], \"invalid value: integer `-1`, expected u8\");\n    test(\n        &[Token::I16(-1)],\n        \"invalid value: integer `-1`, expected u8\",\n    );\n    test(\n        &[Token::I32(-1)],\n        \"invalid value: integer `-1`, expected u8\",\n    );\n    test(\n        &[Token::I64(-1)],\n        \"invalid value: integer `-1`, expected u8\",\n    );\n    test(\n        &[Token::I16(256)],\n        \"invalid value: integer `256`, expected u8\",\n    );\n    test(\n        &[Token::I32(256)],\n        \"invalid value: integer `256`, expected u8\",\n    );\n    test(\n        &[Token::I64(256)],\n        \"invalid value: integer `256`, expected u8\",\n    );\n\n    // from unsigned\n    test(\n        &[Token::U16(256)],\n        \"invalid value: integer `256`, expected u8\",\n    );\n    test(\n        &[Token::U32(256)],\n        \"invalid value: integer `256`, expected u8\",\n    );\n    test(\n        &[Token::U64(256)],\n        \"invalid value: integer `256`, expected u8\",\n    );\n}\n\n#[test]\nfn test_u16() {\n    let test = assert_de_tokens_error::<u16>;\n\n    // from signed\n    test(\n        &[Token::I8(-1)],\n        \"invalid value: integer `-1`, expected u16\",\n    );\n    test(\n        &[Token::I16(-1)],\n        \"invalid value: integer `-1`, expected u16\",\n    );\n    test(\n        &[Token::I32(-1)],\n        \"invalid value: integer `-1`, expected u16\",\n    );\n    test(\n        &[Token::I64(-1)],\n        \"invalid value: integer `-1`, expected u16\",\n    );\n    test(\n        &[Token::I32(65536)],\n        \"invalid value: integer `65536`, expected u16\",\n    );\n    test(\n        &[Token::I64(65536)],\n        \"invalid value: integer `65536`, expected u16\",\n    );\n\n    // from unsigned\n    test(\n        &[Token::U32(65536)],\n        \"invalid value: integer `65536`, expected u16\",\n    );\n    test(\n        &[Token::U64(65536)],\n        \"invalid value: integer `65536`, expected u16\",\n    );\n}\n\n#[test]\nfn test_u32() {\n    let test = assert_de_tokens_error::<u32>;\n\n    // from signed\n    test(\n        &[Token::I8(-1)],\n        \"invalid value: integer `-1`, expected u32\",\n    );\n    test(\n        &[Token::I16(-1)],\n        \"invalid value: integer `-1`, expected u32\",\n    );\n    test(\n        &[Token::I32(-1)],\n        \"invalid value: integer `-1`, expected u32\",\n    );\n    test(\n        &[Token::I64(-1)],\n        \"invalid value: integer `-1`, expected u32\",\n    );\n    test(\n        &[Token::I64(4294967296)],\n        \"invalid value: integer `4294967296`, expected u32\",\n    );\n\n    // from unsigned\n    test(\n        &[Token::U64(4294967296)],\n        \"invalid value: integer `4294967296`, expected u32\",\n    );\n}\n\n#[test]\nfn test_u64() {\n    let test = assert_de_tokens_error::<u64>;\n\n    // from signed\n    test(\n        &[Token::I8(-1)],\n        \"invalid value: integer `-1`, expected u64\",\n    );\n    test(\n        &[Token::I16(-1)],\n        \"invalid value: integer `-1`, expected u64\",\n    );\n    test(\n        &[Token::I32(-1)],\n        \"invalid value: integer `-1`, expected u64\",\n    );\n    test(\n        &[Token::I64(-1)],\n        \"invalid value: integer `-1`, expected u64\",\n    );\n\n    let deserializer = <u64 as IntoDeserializer>::into_deserializer(1);\n    let error = <&str>::deserialize(deserializer).unwrap_err();\n    assert_eq!(\n        error.to_string(),\n        \"invalid type: integer `1`, expected a borrowed string\",\n    );\n}\n\n#[test]\nfn test_u128() {\n    let test = assert_de_tokens_error::<u128>;\n\n    // from signed\n    test(\n        &[Token::I8(-1)],\n        \"invalid value: integer `-1`, expected u128\",\n    );\n    test(\n        &[Token::I16(-1)],\n        \"invalid value: integer `-1`, expected u128\",\n    );\n    test(\n        &[Token::I32(-1)],\n        \"invalid value: integer `-1`, expected u128\",\n    );\n    test(\n        &[Token::I64(-1)],\n        \"invalid value: integer `-1`, expected u128\",\n    );\n\n    let deserializer = <u128 as IntoDeserializer>::into_deserializer(1);\n    let error = <&str>::deserialize(deserializer).unwrap_err();\n    assert_eq!(\n        error.to_string(),\n        \"invalid type: integer `1` as u128, expected a borrowed string\",\n    );\n}\n\n#[test]\nfn test_usize() {\n    let test = assert_de_tokens_error::<usize>;\n\n    // from signed\n    test(\n        &[Token::I8(-1)],\n        \"invalid value: integer `-1`, expected usize\",\n    );\n    test(\n        &[Token::I16(-1)],\n        \"invalid value: integer `-1`, expected usize\",\n    );\n    test(\n        &[Token::I32(-1)],\n        \"invalid value: integer `-1`, expected usize\",\n    );\n    test(\n        &[Token::I64(-1)],\n        \"invalid value: integer `-1`, expected usize\",\n    );\n}\n\n#[test]\nfn test_nonzero_i8() {\n    let test = assert_de_tokens_error::<NonZeroI8>;\n\n    // from zero\n    test(\n        &[Token::I8(0)],\n        \"invalid value: integer `0`, expected a nonzero i8\",\n    );\n    test(\n        &[Token::I16(0)],\n        \"invalid value: integer `0`, expected a nonzero i8\",\n    );\n    test(\n        &[Token::I32(0)],\n        \"invalid value: integer `0`, expected a nonzero i8\",\n    );\n    test(\n        &[Token::I64(0)],\n        \"invalid value: integer `0`, expected a nonzero i8\",\n    );\n    test(\n        &[Token::U8(0)],\n        \"invalid value: integer `0`, expected a nonzero i8\",\n    );\n    test(\n        &[Token::U16(0)],\n        \"invalid value: integer `0`, expected a nonzero i8\",\n    );\n    test(\n        &[Token::U32(0)],\n        \"invalid value: integer `0`, expected a nonzero i8\",\n    );\n    test(\n        &[Token::U64(0)],\n        \"invalid value: integer `0`, expected a nonzero i8\",\n    );\n\n    // from signed\n    test(\n        &[Token::I16(-129)],\n        \"invalid value: integer `-129`, expected a nonzero i8\",\n    );\n    test(\n        &[Token::I32(-129)],\n        \"invalid value: integer `-129`, expected a nonzero i8\",\n    );\n    test(\n        &[Token::I64(-129)],\n        \"invalid value: integer `-129`, expected a nonzero i8\",\n    );\n    test(\n        &[Token::I16(128)],\n        \"invalid value: integer `128`, expected a nonzero i8\",\n    );\n    test(\n        &[Token::I32(128)],\n        \"invalid value: integer `128`, expected a nonzero i8\",\n    );\n    test(\n        &[Token::I64(128)],\n        \"invalid value: integer `128`, expected a nonzero i8\",\n    );\n\n    // from unsigned\n    test(\n        &[Token::U8(128)],\n        \"invalid value: integer `128`, expected a nonzero i8\",\n    );\n    test(\n        &[Token::U16(128)],\n        \"invalid value: integer `128`, expected a nonzero i8\",\n    );\n    test(\n        &[Token::U32(128)],\n        \"invalid value: integer `128`, expected a nonzero i8\",\n    );\n    test(\n        &[Token::U64(128)],\n        \"invalid value: integer `128`, expected a nonzero i8\",\n    );\n}\n\n#[test]\nfn test_nonzero_i16() {\n    let test = assert_de_tokens_error::<NonZeroI16>;\n\n    // from zero\n    test(\n        &[Token::I8(0)],\n        \"invalid value: integer `0`, expected a nonzero i16\",\n    );\n    test(\n        &[Token::I16(0)],\n        \"invalid value: integer `0`, expected a nonzero i16\",\n    );\n    test(\n        &[Token::I32(0)],\n        \"invalid value: integer `0`, expected a nonzero i16\",\n    );\n    test(\n        &[Token::I64(0)],\n        \"invalid value: integer `0`, expected a nonzero i16\",\n    );\n    test(\n        &[Token::U8(0)],\n        \"invalid value: integer `0`, expected a nonzero i16\",\n    );\n    test(\n        &[Token::U16(0)],\n        \"invalid value: integer `0`, expected a nonzero i16\",\n    );\n    test(\n        &[Token::U32(0)],\n        \"invalid value: integer `0`, expected a nonzero i16\",\n    );\n    test(\n        &[Token::U64(0)],\n        \"invalid value: integer `0`, expected a nonzero i16\",\n    );\n\n    // from signed\n    test(\n        &[Token::I32(-32769)],\n        \"invalid value: integer `-32769`, expected a nonzero i16\",\n    );\n    test(\n        &[Token::I64(-32769)],\n        \"invalid value: integer `-32769`, expected a nonzero i16\",\n    );\n    test(\n        &[Token::I32(32768)],\n        \"invalid value: integer `32768`, expected a nonzero i16\",\n    );\n    test(\n        &[Token::I64(32768)],\n        \"invalid value: integer `32768`, expected a nonzero i16\",\n    );\n\n    // from unsigned\n    test(\n        &[Token::U16(32768)],\n        \"invalid value: integer `32768`, expected a nonzero i16\",\n    );\n    test(\n        &[Token::U32(32768)],\n        \"invalid value: integer `32768`, expected a nonzero i16\",\n    );\n    test(\n        &[Token::U64(32768)],\n        \"invalid value: integer `32768`, expected a nonzero i16\",\n    );\n}\n\n#[test]\nfn test_nonzero_i32() {\n    let test = assert_de_tokens_error::<NonZeroI32>;\n\n    // from zero\n    test(\n        &[Token::I8(0)],\n        \"invalid value: integer `0`, expected a nonzero i32\",\n    );\n    test(\n        &[Token::I16(0)],\n        \"invalid value: integer `0`, expected a nonzero i32\",\n    );\n    test(\n        &[Token::I32(0)],\n        \"invalid value: integer `0`, expected a nonzero i32\",\n    );\n    test(\n        &[Token::I64(0)],\n        \"invalid value: integer `0`, expected a nonzero i32\",\n    );\n    test(\n        &[Token::U8(0)],\n        \"invalid value: integer `0`, expected a nonzero i32\",\n    );\n    test(\n        &[Token::U16(0)],\n        \"invalid value: integer `0`, expected a nonzero i32\",\n    );\n    test(\n        &[Token::U32(0)],\n        \"invalid value: integer `0`, expected a nonzero i32\",\n    );\n    test(\n        &[Token::U64(0)],\n        \"invalid value: integer `0`, expected a nonzero i32\",\n    );\n\n    // from signed\n    test(\n        &[Token::I64(-2147483649)],\n        \"invalid value: integer `-2147483649`, expected a nonzero i32\",\n    );\n    test(\n        &[Token::I64(2147483648)],\n        \"invalid value: integer `2147483648`, expected a nonzero i32\",\n    );\n\n    // from unsigned\n    test(\n        &[Token::U32(2147483648)],\n        \"invalid value: integer `2147483648`, expected a nonzero i32\",\n    );\n    test(\n        &[Token::U64(2147483648)],\n        \"invalid value: integer `2147483648`, expected a nonzero i32\",\n    );\n}\n\n#[test]\nfn test_nonzero_i64() {\n    let test = assert_de_tokens_error::<NonZeroI64>;\n\n    // from zero\n    test(\n        &[Token::I8(0)],\n        \"invalid value: integer `0`, expected a nonzero i64\",\n    );\n    test(\n        &[Token::I16(0)],\n        \"invalid value: integer `0`, expected a nonzero i64\",\n    );\n    test(\n        &[Token::I32(0)],\n        \"invalid value: integer `0`, expected a nonzero i64\",\n    );\n    test(\n        &[Token::I64(0)],\n        \"invalid value: integer `0`, expected a nonzero i64\",\n    );\n    test(\n        &[Token::U8(0)],\n        \"invalid value: integer `0`, expected a nonzero i64\",\n    );\n    test(\n        &[Token::U16(0)],\n        \"invalid value: integer `0`, expected a nonzero i64\",\n    );\n    test(\n        &[Token::U32(0)],\n        \"invalid value: integer `0`, expected a nonzero i64\",\n    );\n    test(\n        &[Token::U64(0)],\n        \"invalid value: integer `0`, expected a nonzero i64\",\n    );\n\n    // from unsigned\n    test(\n        &[Token::U64(9223372036854775808)],\n        \"invalid value: integer `9223372036854775808`, expected a nonzero i64\",\n    );\n}\n\n#[test]\nfn test_nonzero_i128() {\n    let test = assert_de_tokens_error::<NonZeroI128>;\n\n    // from zero\n    test(\n        &[Token::I8(0)],\n        \"invalid value: integer `0`, expected a nonzero i128\",\n    );\n    test(\n        &[Token::I16(0)],\n        \"invalid value: integer `0`, expected a nonzero i128\",\n    );\n    test(\n        &[Token::I32(0)],\n        \"invalid value: integer `0`, expected a nonzero i128\",\n    );\n    test(\n        &[Token::I64(0)],\n        \"invalid value: integer `0`, expected a nonzero i128\",\n    );\n    test(\n        &[Token::U8(0)],\n        \"invalid value: integer `0`, expected a nonzero i128\",\n    );\n    test(\n        &[Token::U16(0)],\n        \"invalid value: integer `0`, expected a nonzero i128\",\n    );\n    test(\n        &[Token::U32(0)],\n        \"invalid value: integer `0`, expected a nonzero i128\",\n    );\n    test(\n        &[Token::U64(0)],\n        \"invalid value: integer `0`, expected a nonzero i128\",\n    );\n}\n\n#[test]\nfn test_nonzero_isize() {\n    let test = assert_de_tokens_error::<NonZeroIsize>;\n\n    // from zero\n    test(\n        &[Token::I8(0)],\n        \"invalid value: integer `0`, expected a nonzero isize\",\n    );\n    test(\n        &[Token::I16(0)],\n        \"invalid value: integer `0`, expected a nonzero isize\",\n    );\n    test(\n        &[Token::I32(0)],\n        \"invalid value: integer `0`, expected a nonzero isize\",\n    );\n    test(\n        &[Token::I64(0)],\n        \"invalid value: integer `0`, expected a nonzero isize\",\n    );\n    test(\n        &[Token::U8(0)],\n        \"invalid value: integer `0`, expected a nonzero isize\",\n    );\n    test(\n        &[Token::U16(0)],\n        \"invalid value: integer `0`, expected a nonzero isize\",\n    );\n    test(\n        &[Token::U32(0)],\n        \"invalid value: integer `0`, expected a nonzero isize\",\n    );\n    test(\n        &[Token::U64(0)],\n        \"invalid value: integer `0`, expected a nonzero isize\",\n    );\n}\n\n#[test]\nfn test_nonzero_u8() {\n    let test = assert_de_tokens_error::<NonZeroU8>;\n\n    // from zero\n    test(\n        &[Token::I8(0)],\n        \"invalid value: integer `0`, expected a nonzero u8\",\n    );\n    test(\n        &[Token::I16(0)],\n        \"invalid value: integer `0`, expected a nonzero u8\",\n    );\n    test(\n        &[Token::I32(0)],\n        \"invalid value: integer `0`, expected a nonzero u8\",\n    );\n    test(\n        &[Token::I64(0)],\n        \"invalid value: integer `0`, expected a nonzero u8\",\n    );\n    test(\n        &[Token::U8(0)],\n        \"invalid value: integer `0`, expected a nonzero u8\",\n    );\n    test(\n        &[Token::U16(0)],\n        \"invalid value: integer `0`, expected a nonzero u8\",\n    );\n    test(\n        &[Token::U32(0)],\n        \"invalid value: integer `0`, expected a nonzero u8\",\n    );\n    test(\n        &[Token::U64(0)],\n        \"invalid value: integer `0`, expected a nonzero u8\",\n    );\n\n    // from signed\n    test(\n        &[Token::I8(-1)],\n        \"invalid value: integer `-1`, expected a nonzero u8\",\n    );\n    test(\n        &[Token::I16(-1)],\n        \"invalid value: integer `-1`, expected a nonzero u8\",\n    );\n    test(\n        &[Token::I32(-1)],\n        \"invalid value: integer `-1`, expected a nonzero u8\",\n    );\n    test(\n        &[Token::I64(-1)],\n        \"invalid value: integer `-1`, expected a nonzero u8\",\n    );\n    test(\n        &[Token::I16(256)],\n        \"invalid value: integer `256`, expected a nonzero u8\",\n    );\n    test(\n        &[Token::I32(256)],\n        \"invalid value: integer `256`, expected a nonzero u8\",\n    );\n    test(\n        &[Token::I64(256)],\n        \"invalid value: integer `256`, expected a nonzero u8\",\n    );\n\n    // from unsigned\n    test(\n        &[Token::U16(256)],\n        \"invalid value: integer `256`, expected a nonzero u8\",\n    );\n    test(\n        &[Token::U32(256)],\n        \"invalid value: integer `256`, expected a nonzero u8\",\n    );\n    test(\n        &[Token::U64(256)],\n        \"invalid value: integer `256`, expected a nonzero u8\",\n    );\n}\n\n#[test]\nfn test_nonzero_u16() {\n    let test = assert_de_tokens_error::<NonZeroU16>;\n\n    // from zero\n    test(\n        &[Token::I8(0)],\n        \"invalid value: integer `0`, expected a nonzero u16\",\n    );\n    test(\n        &[Token::I16(0)],\n        \"invalid value: integer `0`, expected a nonzero u16\",\n    );\n    test(\n        &[Token::I32(0)],\n        \"invalid value: integer `0`, expected a nonzero u16\",\n    );\n    test(\n        &[Token::I64(0)],\n        \"invalid value: integer `0`, expected a nonzero u16\",\n    );\n    test(\n        &[Token::U8(0)],\n        \"invalid value: integer `0`, expected a nonzero u16\",\n    );\n    test(\n        &[Token::U16(0)],\n        \"invalid value: integer `0`, expected a nonzero u16\",\n    );\n    test(\n        &[Token::U32(0)],\n        \"invalid value: integer `0`, expected a nonzero u16\",\n    );\n    test(\n        &[Token::U64(0)],\n        \"invalid value: integer `0`, expected a nonzero u16\",\n    );\n\n    // from signed\n    test(\n        &[Token::I8(-1)],\n        \"invalid value: integer `-1`, expected a nonzero u16\",\n    );\n    test(\n        &[Token::I16(-1)],\n        \"invalid value: integer `-1`, expected a nonzero u16\",\n    );\n    test(\n        &[Token::I32(-1)],\n        \"invalid value: integer `-1`, expected a nonzero u16\",\n    );\n    test(\n        &[Token::I64(-1)],\n        \"invalid value: integer `-1`, expected a nonzero u16\",\n    );\n    test(\n        &[Token::I32(65536)],\n        \"invalid value: integer `65536`, expected a nonzero u16\",\n    );\n    test(\n        &[Token::I64(65536)],\n        \"invalid value: integer `65536`, expected a nonzero u16\",\n    );\n\n    // from unsigned\n    test(\n        &[Token::U32(65536)],\n        \"invalid value: integer `65536`, expected a nonzero u16\",\n    );\n    test(\n        &[Token::U64(65536)],\n        \"invalid value: integer `65536`, expected a nonzero u16\",\n    );\n}\n\n#[test]\nfn test_nonzero_u32() {\n    let test = assert_de_tokens_error::<NonZeroU32>;\n\n    // from zero\n    test(\n        &[Token::I8(0)],\n        \"invalid value: integer `0`, expected a nonzero u32\",\n    );\n    test(\n        &[Token::I16(0)],\n        \"invalid value: integer `0`, expected a nonzero u32\",\n    );\n    test(\n        &[Token::I32(0)],\n        \"invalid value: integer `0`, expected a nonzero u32\",\n    );\n    test(\n        &[Token::I64(0)],\n        \"invalid value: integer `0`, expected a nonzero u32\",\n    );\n    test(\n        &[Token::U8(0)],\n        \"invalid value: integer `0`, expected a nonzero u32\",\n    );\n    test(\n        &[Token::U16(0)],\n        \"invalid value: integer `0`, expected a nonzero u32\",\n    );\n    test(\n        &[Token::U32(0)],\n        \"invalid value: integer `0`, expected a nonzero u32\",\n    );\n    test(\n        &[Token::U64(0)],\n        \"invalid value: integer `0`, expected a nonzero u32\",\n    );\n\n    // from signed\n    test(\n        &[Token::I8(-1)],\n        \"invalid value: integer `-1`, expected a nonzero u32\",\n    );\n    test(\n        &[Token::I16(-1)],\n        \"invalid value: integer `-1`, expected a nonzero u32\",\n    );\n    test(\n        &[Token::I32(-1)],\n        \"invalid value: integer `-1`, expected a nonzero u32\",\n    );\n    test(\n        &[Token::I64(-1)],\n        \"invalid value: integer `-1`, expected a nonzero u32\",\n    );\n    test(\n        &[Token::I64(4294967296)],\n        \"invalid value: integer `4294967296`, expected a nonzero u32\",\n    );\n\n    // from unsigned\n    test(\n        &[Token::U64(4294967296)],\n        \"invalid value: integer `4294967296`, expected a nonzero u32\",\n    );\n}\n\n#[test]\nfn test_nonzero_u64() {\n    let test = assert_de_tokens_error::<NonZeroU64>;\n\n    // from zero\n    test(\n        &[Token::I8(0)],\n        \"invalid value: integer `0`, expected a nonzero u64\",\n    );\n    test(\n        &[Token::I16(0)],\n        \"invalid value: integer `0`, expected a nonzero u64\",\n    );\n    test(\n        &[Token::I32(0)],\n        \"invalid value: integer `0`, expected a nonzero u64\",\n    );\n    test(\n        &[Token::I64(0)],\n        \"invalid value: integer `0`, expected a nonzero u64\",\n    );\n    test(\n        &[Token::U8(0)],\n        \"invalid value: integer `0`, expected a nonzero u64\",\n    );\n    test(\n        &[Token::U16(0)],\n        \"invalid value: integer `0`, expected a nonzero u64\",\n    );\n    test(\n        &[Token::U32(0)],\n        \"invalid value: integer `0`, expected a nonzero u64\",\n    );\n    test(\n        &[Token::U64(0)],\n        \"invalid value: integer `0`, expected a nonzero u64\",\n    );\n\n    // from signed\n    test(\n        &[Token::I8(-1)],\n        \"invalid value: integer `-1`, expected a nonzero u64\",\n    );\n    test(\n        &[Token::I16(-1)],\n        \"invalid value: integer `-1`, expected a nonzero u64\",\n    );\n    test(\n        &[Token::I32(-1)],\n        \"invalid value: integer `-1`, expected a nonzero u64\",\n    );\n    test(\n        &[Token::I64(-1)],\n        \"invalid value: integer `-1`, expected a nonzero u64\",\n    );\n}\n\n#[test]\nfn test_nonzero_u128() {\n    let test = assert_de_tokens_error::<NonZeroU128>;\n\n    // from zero\n    test(\n        &[Token::I8(0)],\n        \"invalid value: integer `0`, expected a nonzero u128\",\n    );\n    test(\n        &[Token::I16(0)],\n        \"invalid value: integer `0`, expected a nonzero u128\",\n    );\n    test(\n        &[Token::I32(0)],\n        \"invalid value: integer `0`, expected a nonzero u128\",\n    );\n    test(\n        &[Token::I64(0)],\n        \"invalid value: integer `0`, expected a nonzero u128\",\n    );\n    test(\n        &[Token::U8(0)],\n        \"invalid value: integer `0`, expected a nonzero u128\",\n    );\n    test(\n        &[Token::U16(0)],\n        \"invalid value: integer `0`, expected a nonzero u128\",\n    );\n    test(\n        &[Token::U32(0)],\n        \"invalid value: integer `0`, expected a nonzero u128\",\n    );\n    test(\n        &[Token::U64(0)],\n        \"invalid value: integer `0`, expected a nonzero u128\",\n    );\n\n    // from signed\n    test(\n        &[Token::I8(-1)],\n        \"invalid value: integer `-1`, expected a nonzero u128\",\n    );\n    test(\n        &[Token::I16(-1)],\n        \"invalid value: integer `-1`, expected a nonzero u128\",\n    );\n    test(\n        &[Token::I32(-1)],\n        \"invalid value: integer `-1`, expected a nonzero u128\",\n    );\n    test(\n        &[Token::I64(-1)],\n        \"invalid value: integer `-1`, expected a nonzero u128\",\n    );\n}\n\n#[test]\nfn test_nonzero_usize() {\n    let test = assert_de_tokens_error::<NonZeroUsize>;\n\n    // from zero\n    test(\n        &[Token::I8(0)],\n        \"invalid value: integer `0`, expected a nonzero usize\",\n    );\n    test(\n        &[Token::I16(0)],\n        \"invalid value: integer `0`, expected a nonzero usize\",\n    );\n    test(\n        &[Token::I32(0)],\n        \"invalid value: integer `0`, expected a nonzero usize\",\n    );\n    test(\n        &[Token::I64(0)],\n        \"invalid value: integer `0`, expected a nonzero usize\",\n    );\n    test(\n        &[Token::U8(0)],\n        \"invalid value: integer `0`, expected a nonzero usize\",\n    );\n    test(\n        &[Token::U16(0)],\n        \"invalid value: integer `0`, expected a nonzero usize\",\n    );\n    test(\n        &[Token::U32(0)],\n        \"invalid value: integer `0`, expected a nonzero usize\",\n    );\n    test(\n        &[Token::U64(0)],\n        \"invalid value: integer `0`, expected a nonzero usize\",\n    );\n\n    // from signed\n    test(\n        &[Token::I8(-1)],\n        \"invalid value: integer `-1`, expected a nonzero usize\",\n    );\n    test(\n        &[Token::I16(-1)],\n        \"invalid value: integer `-1`, expected a nonzero usize\",\n    );\n    test(\n        &[Token::I32(-1)],\n        \"invalid value: integer `-1`, expected a nonzero usize\",\n    );\n    test(\n        &[Token::I64(-1)],\n        \"invalid value: integer `-1`, expected a nonzero usize\",\n    );\n}\n\n#[test]\nfn test_unknown_field() {\n    assert_de_tokens_error::<StructDenyUnknown>(\n        &[\n            Token::Struct {\n                name: \"StructDenyUnknown\",\n                len: 1,\n            },\n            Token::Str(\"a\"),\n            Token::I32(0),\n            Token::Str(\"d\"),\n        ],\n        \"unknown field `d`, expected `a`\",\n    );\n}\n\n#[test]\nfn test_skipped_field_is_unknown() {\n    assert_de_tokens_error::<StructDenyUnknown>(\n        &[\n            Token::Struct {\n                name: \"StructDenyUnknown\",\n                len: 1,\n            },\n            Token::Str(\"b\"),\n        ],\n        \"unknown field `b`, expected `a`\",\n    );\n}\n\n#[test]\nfn test_skip_all_deny_unknown() {\n    assert_de_tokens_error::<StructSkipAllDenyUnknown>(\n        &[\n            Token::Struct {\n                name: \"StructSkipAllDenyUnknown\",\n                len: 0,\n            },\n            Token::Str(\"a\"),\n        ],\n        \"unknown field `a`, there are no fields\",\n    );\n}\n\n#[test]\nfn test_unknown_variant() {\n    assert_de_tokens_error::<Enum>(\n    &[\n        Token::UnitVariant { name: \"Enum\", variant: \"Foo\" },\n    ],\n    \"unknown variant `Foo`, expected one of `Unit`, `Simple`, `Seq`, `Map`, `SimpleWithSkipped`\",\n    );\n}\n\n#[test]\nfn test_enum_skipped_variant() {\n    assert_de_tokens_error::<Enum>(\n    &[\n        Token::UnitVariant { name: \"Enum\", variant: \"Skipped\" },\n    ],\n    \"unknown variant `Skipped`, expected one of `Unit`, `Simple`, `Seq`, `Map`, `SimpleWithSkipped`\",\n    );\n}\n\n#[test]\nfn test_enum_skip_all() {\n    assert_de_tokens_error::<EnumSkipAll>(\n        &[Token::UnitVariant {\n            name: \"EnumSkipAll\",\n            variant: \"Skipped\",\n        }],\n        \"unknown variant `Skipped`, there are no variants\",\n    );\n}\n\n#[test]\nfn test_duplicate_field_struct() {\n    assert_de_tokens_error::<Struct>(\n        &[\n            Token::Map { len: Some(3) },\n            Token::Str(\"a\"),\n            Token::I32(1),\n            Token::Str(\"a\"),\n        ],\n        \"duplicate field `a`\",\n    );\n}\n\n#[test]\nfn test_duplicate_field_enum() {\n    assert_de_tokens_error::<Enum>(\n        &[\n            Token::StructVariant {\n                name: \"Enum\",\n                variant: \"Map\",\n                len: 3,\n            },\n            Token::Str(\"a\"),\n            Token::I32(1),\n            Token::Str(\"a\"),\n        ],\n        \"duplicate field `a`\",\n    );\n}\n\n#[test]\nfn test_enum_out_of_range() {\n    assert_de_tokens_error::<Enum>(\n        &[Token::Enum { name: \"Enum\" }, Token::U32(5), Token::Unit],\n        \"invalid value: integer `5`, expected variant index 0 <= i < 5\",\n    );\n}\n\n#[test]\nfn test_short_tuple() {\n    assert_de_tokens_error::<(u8, u8, u8)>(\n        &[Token::Tuple { len: 1 }, Token::U8(1), Token::TupleEnd],\n        \"invalid length 1, expected a tuple of size 3\",\n    );\n}\n\n#[test]\nfn test_short_array() {\n    assert_de_tokens_error::<[u8; 3]>(\n        &[Token::Seq { len: Some(1) }, Token::U8(1), Token::SeqEnd],\n        \"invalid length 1, expected an array of length 3\",\n    );\n}\n\n#[test]\nfn test_cstring_internal_null() {\n    assert_de_tokens_error::<CString>(\n        &[Token::Bytes(b\"a\\0c\")],\n        \"nul byte found in provided data at position: 1\",\n    );\n}\n\n#[test]\nfn test_cstring_internal_null_end() {\n    assert_de_tokens_error::<CString>(\n        &[Token::Bytes(b\"ac\\0\")],\n        \"nul byte found in provided data at position: 2\",\n    );\n}\n\n#[test]\nfn test_unit_from_empty_seq() {\n    assert_de_tokens_error::<()>(\n        &[Token::Seq { len: Some(0) }, Token::SeqEnd],\n        \"invalid type: sequence, expected unit\",\n    );\n}\n\n#[test]\nfn test_unit_from_empty_seq_without_len() {\n    assert_de_tokens_error::<()>(\n        &[Token::Seq { len: None }, Token::SeqEnd],\n        \"invalid type: sequence, expected unit\",\n    );\n}\n\n#[test]\nfn test_unit_from_tuple_struct() {\n    assert_de_tokens_error::<()>(\n        &[\n            Token::TupleStruct {\n                name: \"Anything\",\n                len: 0,\n            },\n            Token::TupleStructEnd,\n        ],\n        \"invalid type: sequence, expected unit\",\n    );\n}\n\n#[test]\nfn test_string_from_unit() {\n    assert_de_tokens_error::<String>(\n        &[Token::Unit],\n        \"invalid type: unit value, expected a string\",\n    );\n}\n\n#[test]\nfn test_btreeset_from_unit() {\n    assert_de_tokens_error::<BTreeSet<isize>>(\n        &[Token::Unit],\n        \"invalid type: unit value, expected a sequence\",\n    );\n}\n\n#[test]\nfn test_btreeset_from_unit_struct() {\n    assert_de_tokens_error::<BTreeSet<isize>>(\n        &[Token::UnitStruct { name: \"Anything\" }],\n        \"invalid type: unit value, expected a sequence\",\n    );\n}\n\n#[test]\nfn test_hashset_from_unit() {\n    assert_de_tokens_error::<HashSet<isize>>(\n        &[Token::Unit],\n        \"invalid type: unit value, expected a sequence\",\n    );\n}\n\n#[test]\nfn test_hashset_from_unit_struct() {\n    assert_de_tokens_error::<HashSet<isize>>(\n        &[Token::UnitStruct { name: \"Anything\" }],\n        \"invalid type: unit value, expected a sequence\",\n    );\n}\n\n#[test]\nfn test_vec_from_unit() {\n    assert_de_tokens_error::<Vec<isize>>(\n        &[Token::Unit],\n        \"invalid type: unit value, expected a sequence\",\n    );\n}\n\n#[test]\nfn test_vec_from_unit_struct() {\n    assert_de_tokens_error::<Vec<isize>>(\n        &[Token::UnitStruct { name: \"Anything\" }],\n        \"invalid type: unit value, expected a sequence\",\n    );\n}\n\n#[test]\nfn test_zero_array_from_unit() {\n    assert_de_tokens_error::<[isize; 0]>(\n        &[Token::Unit],\n        \"invalid type: unit value, expected an empty array\",\n    );\n}\n\n#[test]\nfn test_zero_array_from_unit_struct() {\n    assert_de_tokens_error::<[isize; 0]>(\n        &[Token::UnitStruct { name: \"Anything\" }],\n        \"invalid type: unit value, expected an empty array\",\n    );\n}\n\n#[test]\nfn test_btreemap_from_unit() {\n    assert_de_tokens_error::<BTreeMap<isize, isize>>(\n        &[Token::Unit],\n        \"invalid type: unit value, expected a map\",\n    );\n}\n\n#[test]\nfn test_btreemap_from_unit_struct() {\n    assert_de_tokens_error::<BTreeMap<isize, isize>>(\n        &[Token::UnitStruct { name: \"Anything\" }],\n        \"invalid type: unit value, expected a map\",\n    );\n}\n\n#[test]\nfn test_hashmap_from_unit() {\n    assert_de_tokens_error::<HashMap<isize, isize>>(\n        &[Token::Unit],\n        \"invalid type: unit value, expected a map\",\n    );\n}\n\n#[test]\nfn test_hashmap_from_unit_struct() {\n    assert_de_tokens_error::<HashMap<isize, isize>>(\n        &[Token::UnitStruct { name: \"Anything\" }],\n        \"invalid type: unit value, expected a map\",\n    );\n}\n\n#[test]\nfn test_bool_from_string() {\n    assert_de_tokens_error::<bool>(\n        &[Token::Str(\"false\")],\n        \"invalid type: string \\\"false\\\", expected a boolean\",\n    );\n}\n\n#[test]\nfn test_number_from_string() {\n    assert_de_tokens_error::<isize>(\n        &[Token::Str(\"1\")],\n        \"invalid type: string \\\"1\\\", expected isize\",\n    );\n}\n\n#[test]\nfn test_integer_from_float() {\n    assert_de_tokens_error::<isize>(\n        &[Token::F32(0.0)],\n        \"invalid type: floating point `0.0`, expected isize\",\n    );\n}\n\n#[test]\nfn test_nan_no_decimal_point() {\n    assert_de_tokens_error::<isize>(\n        &[Token::F32(f32::NAN)],\n        \"invalid type: floating point `NaN`, expected isize\",\n    );\n}\n\n#[test]\nfn test_unit_struct_from_seq() {\n    assert_de_tokens_error::<UnitStruct>(\n        &[Token::Seq { len: Some(0) }, Token::SeqEnd],\n        \"invalid type: sequence, expected unit struct UnitStruct\",\n    );\n}\n\n#[test]\nfn test_wrapping_overflow() {\n    assert_de_tokens_error::<Wrapping<u16>>(\n        &[Token::U32(65_536)],\n        \"invalid value: integer `65536`, expected u16\",\n    );\n}\n\n#[test]\nfn test_duration_overflow_seq() {\n    assert_de_tokens_error::<Duration>(\n        &[\n            Token::Seq { len: Some(2) },\n            Token::U64(u64::MAX),\n            Token::U32(1_000_000_000),\n            Token::SeqEnd,\n        ],\n        \"overflow deserializing Duration\",\n    );\n}\n\n#[test]\nfn test_duration_overflow_struct() {\n    assert_de_tokens_error::<Duration>(\n        &[\n            Token::Struct {\n                name: \"Duration\",\n                len: 2,\n            },\n            Token::Str(\"secs\"),\n            Token::U64(u64::MAX),\n            Token::Str(\"nanos\"),\n            Token::U32(1_000_000_000),\n            Token::StructEnd,\n        ],\n        \"overflow deserializing Duration\",\n    );\n}\n\n#[test]\nfn test_systemtime_overflow_seq() {\n    assert_de_tokens_error::<SystemTime>(\n        &[\n            Token::Seq { len: Some(2) },\n            Token::U64(u64::MAX),\n            Token::U32(1_000_000_000),\n            Token::SeqEnd,\n        ],\n        \"overflow deserializing SystemTime epoch offset\",\n    );\n}\n\n#[test]\nfn test_systemtime_overflow_struct() {\n    assert_de_tokens_error::<SystemTime>(\n        &[\n            Token::Struct {\n                name: \"SystemTime\",\n                len: 2,\n            },\n            Token::Str(\"secs_since_epoch\"),\n            Token::U64(u64::MAX),\n            Token::Str(\"nanos_since_epoch\"),\n            Token::U32(1_000_000_000),\n            Token::StructEnd,\n        ],\n        \"overflow deserializing SystemTime epoch offset\",\n    );\n}\n\n#[test]\nfn test_systemtime_overflow() {\n    assert_de_tokens_error::<SystemTime>(\n        &[\n            Token::Seq { len: Some(2) },\n            Token::U64(u64::MAX),\n            Token::U32(0),\n            Token::SeqEnd,\n        ],\n        \"overflow deserializing SystemTime\",\n    );\n}\n\n#[test]\nfn test_cstr_internal_null() {\n    assert_de_tokens_error::<Box<CStr>>(\n        &[Token::Bytes(b\"a\\0c\")],\n        \"nul byte found in provided data at position: 1\",\n    );\n}\n\n#[test]\nfn test_cstr_internal_null_end() {\n    assert_de_tokens_error::<Box<CStr>>(\n        &[Token::Bytes(b\"ac\\0\")],\n        \"nul byte found in provided data at position: 2\",\n    );\n}\n\n#[cfg(feature = \"unstable\")]\n#[test]\nfn test_never_type() {\n    assert_de_tokens_error::<!>(&[], \"cannot deserialize `!`\");\n\n    assert_de_tokens_error::<Result<u8, !>>(\n        &[Token::NewtypeVariant {\n            name: \"Result\",\n            variant: \"Err\",\n        }],\n        \"cannot deserialize `!`\",\n    );\n}\n"
  },
  {
    "path": "test_suite/tests/test_deprecated.rs",
    "content": "#![deny(deprecated)]\n#![allow(dead_code)]\n\nuse serde_derive::{Deserialize, Serialize};\n\n#[derive(Serialize, Deserialize)]\n#[deprecated]\nenum DeprecatedEnum {\n    A,\n    B,\n}\n\n#[derive(Serialize, Deserialize)]\n#[deprecated]\nstruct DeprecatedStruct {\n    a: bool,\n}\n\n#[derive(Serialize, Deserialize)]\nenum DeprecatedVariant {\n    A,\n    #[deprecated]\n    B,\n}\n\n#[derive(Serialize, Deserialize)]\nstruct DeprecatedField {\n    #[deprecated]\n    a: bool,\n}\n"
  },
  {
    "path": "test_suite/tests/test_enum_adjacently_tagged.rs",
    "content": "#![deny(trivial_numeric_casts)]\n#![allow(\n    clippy::derive_partial_eq_without_eq,\n    clippy::enum_variant_names,\n    clippy::redundant_field_names,\n    clippy::too_many_lines\n)]\n\nuse serde_derive::{Deserialize, Serialize};\nuse serde_test::{assert_de_tokens, assert_de_tokens_error, assert_tokens, Token};\n\n#[derive(Debug, PartialEq, Serialize, Deserialize)]\n#[serde(tag = \"t\", content = \"c\")]\nenum AdjacentlyTagged<T> {\n    Unit,\n    Newtype(T),\n    Tuple(u8, u8),\n    Struct { f: u8 },\n}\n\nmod unit {\n    use super::*;\n\n    #[test]\n    fn map_str_tag_only() {\n        // Map: tag only\n        assert_tokens(\n            &AdjacentlyTagged::Unit::<u8>,\n            &[\n                Token::Struct {\n                    name: \"AdjacentlyTagged\",\n                    len: 1,\n                },\n                Token::Str(\"t\"),\n                Token::UnitVariant {\n                    name: \"AdjacentlyTagged\",\n                    variant: \"Unit\",\n                },\n                Token::StructEnd,\n            ],\n        );\n\n        // Map: tag only and incorrect hint for number of elements\n        assert_de_tokens(\n            &AdjacentlyTagged::Unit::<u8>,\n            &[\n                Token::Struct {\n                    name: \"AdjacentlyTagged\",\n                    len: 2,\n                },\n                Token::Str(\"t\"),\n                Token::UnitVariant {\n                    name: \"AdjacentlyTagged\",\n                    variant: \"Unit\",\n                },\n                Token::StructEnd,\n            ],\n        );\n    }\n\n    #[test]\n    fn map_int_tag_only() {\n        // Map: tag (as number) only\n        assert_de_tokens(\n            &AdjacentlyTagged::Unit::<u8>,\n            &[\n                Token::Struct {\n                    name: \"AdjacentlyTagged\",\n                    len: 1,\n                },\n                Token::U16(0),\n                Token::UnitVariant {\n                    name: \"AdjacentlyTagged\",\n                    variant: \"Unit\",\n                },\n                Token::StructEnd,\n            ],\n        );\n    }\n\n    #[test]\n    fn map_bytes_tag_only() {\n        // Map: tag only\n        assert_de_tokens(\n            &AdjacentlyTagged::Unit::<u8>,\n            &[\n                Token::Struct {\n                    name: \"AdjacentlyTagged\",\n                    len: 1,\n                },\n                Token::Bytes(b\"t\"),\n                Token::UnitVariant {\n                    name: \"AdjacentlyTagged\",\n                    variant: \"Unit\",\n                },\n                Token::StructEnd,\n            ],\n        );\n\n        // Map: tag only\n        assert_de_tokens(\n            &AdjacentlyTagged::Unit::<u8>,\n            &[\n                Token::Struct {\n                    name: \"AdjacentlyTagged\",\n                    len: 1,\n                },\n                Token::BorrowedBytes(b\"t\"),\n                Token::UnitVariant {\n                    name: \"AdjacentlyTagged\",\n                    variant: \"Unit\",\n                },\n                Token::StructEnd,\n            ],\n        );\n    }\n\n    #[test]\n    fn map_str_tag_content() {\n        // Map: tag + content\n        assert_de_tokens(\n            &AdjacentlyTagged::Unit::<u8>,\n            &[\n                Token::Struct {\n                    name: \"AdjacentlyTagged\",\n                    len: 2,\n                },\n                Token::Str(\"t\"),\n                Token::UnitVariant {\n                    name: \"AdjacentlyTagged\",\n                    variant: \"Unit\",\n                },\n                Token::Str(\"c\"),\n                Token::Unit,\n                Token::StructEnd,\n            ],\n        );\n        // Map: content + tag\n        assert_de_tokens(\n            &AdjacentlyTagged::Unit::<u8>,\n            &[\n                Token::Struct {\n                    name: \"AdjacentlyTagged\",\n                    len: 2,\n                },\n                Token::Str(\"c\"),\n                Token::Unit,\n                Token::Str(\"t\"),\n                Token::UnitVariant {\n                    name: \"AdjacentlyTagged\",\n                    variant: \"Unit\",\n                },\n                Token::StructEnd,\n            ],\n        );\n\n        // Map: tag + content + excess fields (f, g, h)\n        assert_de_tokens(\n            &AdjacentlyTagged::Unit::<u8>,\n            &[\n                Token::Struct {\n                    name: \"AdjacentlyTagged\",\n                    len: 2,\n                },\n                Token::Str(\"f\"),\n                Token::Unit,\n                Token::Str(\"t\"),\n                Token::UnitVariant {\n                    name: \"AdjacentlyTagged\",\n                    variant: \"Unit\",\n                },\n                Token::Str(\"g\"),\n                Token::Unit,\n                Token::Str(\"c\"),\n                Token::Unit,\n                Token::Str(\"h\"),\n                Token::Unit,\n                Token::StructEnd,\n            ],\n        );\n    }\n\n    #[test]\n    fn map_int_tag_content() {\n        // Map: tag (as number) + content (as number)\n        assert_de_tokens(\n            &AdjacentlyTagged::Unit::<u8>,\n            &[\n                Token::Struct {\n                    name: \"AdjacentlyTagged\",\n                    len: 2,\n                },\n                Token::U8(0),\n                Token::UnitVariant {\n                    name: \"AdjacentlyTagged\",\n                    variant: \"Unit\",\n                },\n                Token::U8(1),\n                Token::Unit,\n                Token::StructEnd,\n            ],\n        );\n\n        // Map: content (as number) + tag (as number)\n        assert_de_tokens(\n            &AdjacentlyTagged::Unit::<u8>,\n            &[\n                Token::Struct {\n                    name: \"AdjacentlyTagged\",\n                    len: 2,\n                },\n                Token::U64(1),\n                Token::Unit,\n                Token::U64(0),\n                Token::UnitVariant {\n                    name: \"AdjacentlyTagged\",\n                    variant: \"Unit\",\n                },\n                Token::StructEnd,\n            ],\n        );\n    }\n\n    #[test]\n    fn map_bytes_tag_content() {\n        // Map: tag + content\n        assert_de_tokens(\n            &AdjacentlyTagged::Unit::<u8>,\n            &[\n                Token::Struct {\n                    name: \"AdjacentlyTagged\",\n                    len: 2,\n                },\n                Token::BorrowedBytes(b\"t\"),\n                Token::UnitVariant {\n                    name: \"AdjacentlyTagged\",\n                    variant: \"Unit\",\n                },\n                Token::BorrowedBytes(b\"c\"),\n                Token::Unit,\n                Token::StructEnd,\n            ],\n        );\n\n        // Map: content + tag\n        assert_de_tokens(\n            &AdjacentlyTagged::Unit::<u8>,\n            &[\n                Token::Struct {\n                    name: \"AdjacentlyTagged\",\n                    len: 2,\n                },\n                Token::Bytes(b\"c\"),\n                Token::Unit,\n                Token::Bytes(b\"t\"),\n                Token::UnitVariant {\n                    name: \"AdjacentlyTagged\",\n                    variant: \"Unit\",\n                },\n                Token::StructEnd,\n            ],\n        );\n    }\n\n    #[test]\n    fn seq_tag_content() {\n        // Seq: tag and content\n        assert_de_tokens(\n            &AdjacentlyTagged::Unit::<u8>,\n            &[\n                Token::Seq { len: Some(2) },\n                Token::UnitVariant {\n                    name: \"AdjacentlyTagged\",\n                    variant: \"Unit\",\n                },\n                Token::Unit,\n                Token::SeqEnd,\n            ],\n        );\n\n        // Seq: tag (as string) and content\n        assert_de_tokens(\n            &AdjacentlyTagged::Unit::<u8>,\n            &[\n                Token::Seq { len: None },\n                Token::Str(\"Unit\"), // tag\n                Token::Unit,        // content\n                Token::SeqEnd,\n            ],\n        );\n\n        // Seq: tag (as borrowed string) and content\n        assert_de_tokens(\n            &AdjacentlyTagged::Unit::<u8>,\n            &[\n                Token::Seq { len: None },\n                Token::BorrowedStr(\"Unit\"), // tag\n                Token::Unit,                // content\n                Token::SeqEnd,\n            ],\n        );\n    }\n}\n\nmod newtype {\n    use super::*;\n\n    #[test]\n    fn map_tag_only() {\n        // optional newtype with no content field\n        assert_de_tokens(\n            &AdjacentlyTagged::Newtype::<Option<u8>>(None),\n            &[\n                Token::Struct {\n                    name: \"AdjacentlyTagged\",\n                    len: 1,\n                },\n                Token::Str(\"t\"),\n                Token::UnitVariant {\n                    name: \"AdjacentlyTagged\",\n                    variant: \"Newtype\",\n                },\n                Token::StructEnd,\n            ],\n        );\n    }\n\n    #[test]\n    fn map_tag_content() {\n        let value = AdjacentlyTagged::Newtype::<u8>(1);\n\n        // Map: tag + content\n        assert_tokens(\n            &value,\n            &[\n                Token::Struct {\n                    name: \"AdjacentlyTagged\",\n                    len: 2,\n                },\n                Token::Str(\"t\"),\n                Token::UnitVariant {\n                    name: \"AdjacentlyTagged\",\n                    variant: \"Newtype\",\n                },\n                Token::Str(\"c\"),\n                Token::U8(1),\n                Token::StructEnd,\n            ],\n        );\n\n        // Map: content + tag\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Struct {\n                    name: \"AdjacentlyTagged\",\n                    len: 2,\n                },\n                Token::Str(\"c\"),\n                Token::U8(1),\n                Token::Str(\"t\"),\n                Token::UnitVariant {\n                    name: \"AdjacentlyTagged\",\n                    variant: \"Newtype\",\n                },\n                Token::StructEnd,\n            ],\n        );\n    }\n\n    #[test]\n    fn seq() {\n        let value = AdjacentlyTagged::Newtype::<u8>(1);\n\n        // Seq: tag and content\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Seq { len: Some(2) },\n                Token::UnitVariant {\n                    name: \"AdjacentlyTagged\",\n                    variant: \"Newtype\",\n                },\n                Token::U8(1),\n                Token::SeqEnd,\n            ],\n        );\n\n        // Seq: tag (as string) and content\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Seq { len: None },\n                Token::Str(\"Newtype\"), // tag\n                Token::U8(1),          // content\n                Token::SeqEnd,\n            ],\n        );\n\n        // Seq: tag (as borrowed string) and content\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Seq { len: None },\n                Token::BorrowedStr(\"Newtype\"), // tag\n                Token::U8(1),                  // content\n                Token::SeqEnd,\n            ],\n        );\n    }\n}\n\n#[test]\nfn newtype_with_newtype() {\n    #[derive(Debug, PartialEq, Serialize, Deserialize)]\n    struct NewtypeStruct(u32);\n\n    assert_de_tokens(\n        &AdjacentlyTagged::Newtype(NewtypeStruct(5)),\n        &[\n            Token::Struct {\n                name: \"AdjacentlyTagged\",\n                len: 2,\n            },\n            Token::Str(\"c\"),\n            Token::NewtypeStruct {\n                name: \"NewtypeStruct\",\n            },\n            Token::U32(5),\n            Token::Str(\"t\"),\n            Token::UnitVariant {\n                name: \"AdjacentlyTagged\",\n                variant: \"Newtype\",\n            },\n            Token::StructEnd,\n        ],\n    );\n}\n\nmod tuple {\n    use super::*;\n\n    #[test]\n    fn map() {\n        let value = AdjacentlyTagged::Tuple::<u8>(1, 1);\n\n        // Map: tag + content\n        assert_tokens(\n            &value,\n            &[\n                Token::Struct {\n                    name: \"AdjacentlyTagged\",\n                    len: 2,\n                },\n                Token::Str(\"t\"),\n                Token::UnitVariant {\n                    name: \"AdjacentlyTagged\",\n                    variant: \"Tuple\",\n                },\n                Token::Str(\"c\"),\n                Token::Tuple { len: 2 },\n                Token::U8(1),\n                Token::U8(1),\n                Token::TupleEnd,\n                Token::StructEnd,\n            ],\n        );\n\n        // Map: content + tag\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Struct {\n                    name: \"AdjacentlyTagged\",\n                    len: 2,\n                },\n                Token::Str(\"c\"),\n                Token::Tuple { len: 2 },\n                Token::U8(1),\n                Token::U8(1),\n                Token::TupleEnd,\n                Token::Str(\"t\"),\n                Token::UnitVariant {\n                    name: \"AdjacentlyTagged\",\n                    variant: \"Tuple\",\n                },\n                Token::StructEnd,\n            ],\n        );\n    }\n\n    #[test]\n    fn seq() {\n        let value = AdjacentlyTagged::Tuple::<u8>(1, 1);\n\n        // Seq: tag + content\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Seq { len: Some(2) },\n                Token::UnitVariant {\n                    name: \"AdjacentlyTagged\",\n                    variant: \"Tuple\",\n                },\n                Token::Tuple { len: 2 },\n                Token::U8(1),\n                Token::U8(1),\n                Token::TupleEnd,\n                Token::SeqEnd,\n            ],\n        );\n    }\n}\n\nmod struct_ {\n    use super::*;\n\n    #[test]\n    fn map() {\n        let value = AdjacentlyTagged::Struct::<u8> { f: 1 };\n\n        // Map: tag + content\n        assert_tokens(\n            &value,\n            &[\n                Token::Struct {\n                    name: \"AdjacentlyTagged\",\n                    len: 2,\n                },\n                Token::Str(\"t\"),\n                Token::UnitVariant {\n                    name: \"AdjacentlyTagged\",\n                    variant: \"Struct\",\n                },\n                Token::Str(\"c\"),\n                Token::Struct {\n                    name: \"Struct\",\n                    len: 1,\n                },\n                Token::Str(\"f\"),\n                Token::U8(1),\n                Token::StructEnd,\n                Token::StructEnd,\n            ],\n        );\n\n        // Map: content + tag\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Struct {\n                    name: \"AdjacentlyTagged\",\n                    len: 2,\n                },\n                Token::Str(\"c\"),\n                Token::Struct {\n                    name: \"Struct\",\n                    len: 1,\n                },\n                Token::Str(\"f\"),\n                Token::U8(1),\n                Token::StructEnd,\n                Token::Str(\"t\"),\n                Token::UnitVariant {\n                    name: \"AdjacentlyTagged\",\n                    variant: \"Struct\",\n                },\n                Token::StructEnd,\n            ],\n        );\n    }\n\n    #[test]\n    fn seq() {\n        let value = AdjacentlyTagged::Struct::<u8> { f: 1 };\n\n        // Seq: tag + content\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Seq { len: Some(2) },\n                Token::UnitVariant {\n                    name: \"AdjacentlyTagged\",\n                    variant: \"Struct\",\n                },\n                Token::Struct {\n                    name: \"Struct\",\n                    len: 1,\n                },\n                Token::Str(\"f\"),\n                Token::U8(1),\n                Token::StructEnd,\n                Token::SeqEnd,\n            ],\n        );\n    }\n}\n\n#[test]\nfn struct_with_flatten() {\n    #[derive(Serialize, Deserialize, PartialEq, Debug)]\n    #[serde(tag = \"t\", content = \"c\")]\n    enum Data {\n        A {\n            a: i32,\n            #[serde(flatten)]\n            flat: Flat,\n        },\n    }\n\n    #[derive(Serialize, Deserialize, PartialEq, Debug)]\n    struct Flat {\n        b: i32,\n    }\n\n    let data = Data::A {\n        a: 0,\n        flat: Flat { b: 0 },\n    };\n\n    assert_tokens(\n        &data,\n        &[\n            Token::Struct {\n                name: \"Data\",\n                len: 2,\n            },\n            Token::Str(\"t\"),\n            Token::UnitVariant {\n                name: \"Data\",\n                variant: \"A\",\n            },\n            Token::Str(\"c\"),\n            Token::Map { len: None },\n            Token::Str(\"a\"),\n            Token::I32(0),\n            Token::Str(\"b\"),\n            Token::I32(0),\n            Token::MapEnd,\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn expecting_message() {\n    #[derive(Deserialize)]\n    #[serde(tag = \"tag\", content = \"content\")]\n    #[serde(expecting = \"something strange...\")]\n    enum Enum {\n        AdjacentlyTagged,\n    }\n\n    assert_de_tokens_error::<Enum>(\n        &[Token::Str(\"AdjacentlyTagged\")],\n        r#\"invalid type: string \"AdjacentlyTagged\", expected something strange...\"#,\n    );\n\n    assert_de_tokens_error::<Enum>(\n        &[Token::Map { len: None }, Token::Unit],\n        r#\"invalid type: unit value, expected \"tag\", \"content\", or other ignored fields\"#,\n    );\n\n    // Check that #[serde(expecting = \"...\")] doesn't affect variant identifier error message\n    assert_de_tokens_error::<Enum>(\n        &[Token::Map { len: None }, Token::Str(\"tag\"), Token::Unit],\n        \"invalid type: unit value, expected variant of enum Enum\",\n    );\n}\n\n#[test]\nfn partially_untagged() {\n    #[derive(Serialize, Deserialize, PartialEq, Debug)]\n    #[serde(tag = \"t\", content = \"c\")]\n    enum Data {\n        A(u32),\n        B,\n        #[serde(untagged)]\n        Var(u32),\n    }\n\n    let data = Data::A(7);\n\n    assert_de_tokens(\n        &data,\n        &[\n            Token::Map { len: None },\n            Token::Str(\"t\"),\n            Token::Str(\"A\"),\n            Token::Str(\"c\"),\n            Token::U32(7),\n            Token::MapEnd,\n        ],\n    );\n\n    let data = Data::Var(42);\n\n    assert_de_tokens(&data, &[Token::U32(42)]);\n\n    // TODO test error output\n}\n\n#[test]\nfn deny_unknown_fields() {\n    #[derive(Debug, PartialEq, Deserialize)]\n    #[serde(tag = \"t\", content = \"c\", deny_unknown_fields)]\n    enum AdjacentlyTagged {\n        Unit,\n    }\n\n    assert_de_tokens(\n        &AdjacentlyTagged::Unit,\n        &[\n            Token::Struct {\n                name: \"AdjacentlyTagged\",\n                len: 2,\n            },\n            Token::Str(\"t\"),\n            Token::UnitVariant {\n                name: \"AdjacentlyTagged\",\n                variant: \"Unit\",\n            },\n            Token::Str(\"c\"),\n            Token::Unit,\n            Token::StructEnd,\n        ],\n    );\n\n    assert_de_tokens_error::<AdjacentlyTagged>(\n        &[\n            Token::Struct {\n                name: \"AdjacentlyTagged\",\n                len: 2,\n            },\n            Token::Str(\"t\"),\n            Token::UnitVariant {\n                name: \"AdjacentlyTagged\",\n                variant: \"Unit\",\n            },\n            Token::Str(\"c\"),\n            Token::Unit,\n            Token::Str(\"h\"),\n        ],\n        r#\"invalid value: string \"h\", expected \"t\" or \"c\"\"#,\n    );\n\n    assert_de_tokens_error::<AdjacentlyTagged>(\n        &[\n            Token::Struct {\n                name: \"AdjacentlyTagged\",\n                len: 2,\n            },\n            Token::Str(\"h\"),\n        ],\n        r#\"invalid value: string \"h\", expected \"t\" or \"c\"\"#,\n    );\n\n    assert_de_tokens_error::<AdjacentlyTagged>(\n        &[\n            Token::Struct {\n                name: \"AdjacentlyTagged\",\n                len: 2,\n            },\n            Token::Str(\"c\"),\n            Token::Unit,\n            Token::Str(\"h\"),\n        ],\n        r#\"invalid value: string \"h\", expected \"t\" or \"c\"\"#,\n    );\n\n    assert_de_tokens_error::<AdjacentlyTagged>(\n        &[\n            Token::Struct {\n                name: \"AdjacentlyTagged\",\n                len: 2,\n            },\n            Token::U64(0), // tag field\n            Token::UnitVariant {\n                name: \"AdjacentlyTagged\",\n                variant: \"Unit\",\n            },\n            Token::U64(3),\n        ],\n        r#\"invalid value: integer `3`, expected \"t\" or \"c\"\"#,\n    );\n\n    assert_de_tokens_error::<AdjacentlyTagged>(\n        &[\n            Token::Struct {\n                name: \"AdjacentlyTagged\",\n                len: 2,\n            },\n            Token::Bytes(b\"c\"),\n            Token::Unit,\n            Token::Bytes(b\"h\"),\n        ],\n        r#\"invalid value: byte array, expected \"t\" or \"c\"\"#,\n    );\n}\n"
  },
  {
    "path": "test_suite/tests/test_enum_internally_tagged.rs",
    "content": "#![deny(trivial_numeric_casts)]\n#![allow(\n    clippy::derive_partial_eq_without_eq,\n    clippy::enum_variant_names,\n    clippy::redundant_field_names,\n    clippy::too_many_lines\n)]\n\nmod bytes;\n\nuse serde_derive::{Deserialize, Serialize};\nuse serde_test::{assert_de_tokens, assert_de_tokens_error, assert_tokens, Token};\nuse std::collections::BTreeMap;\nuse std::iter::FromIterator;\n\n#[derive(Debug, PartialEq, Serialize, Deserialize)]\nstruct Unit;\n\n#[derive(Debug, PartialEq, Serialize, Deserialize)]\nstruct Newtype(BTreeMap<String, String>);\n\n#[derive(Debug, PartialEq, Serialize, Deserialize)]\nstruct Struct {\n    f: u8,\n}\n\n#[derive(Debug, PartialEq, Serialize, Deserialize)]\nenum Enum {\n    Unit,\n    Newtype(u8),\n    Tuple(u8, u8),\n    Struct { f: u8 },\n}\n\n#[derive(Debug, PartialEq, Serialize, Deserialize)]\n#[serde(tag = \"tag\")]\nenum InternallyTagged {\n    Unit,\n    NewtypeUnit(()),\n    NewtypeUnitStruct(Unit),\n    NewtypeNewtype(Newtype),\n    NewtypeMap(BTreeMap<String, String>),\n    NewtypeStruct(Struct),\n    NewtypeEnum(Enum),\n    Struct { a: u8 },\n    StructEnum { enum_: Enum },\n}\n\n#[test]\nfn unit() {\n    assert_tokens(\n        &InternallyTagged::Unit,\n        &[\n            Token::Struct {\n                name: \"InternallyTagged\",\n                len: 1,\n            },\n            Token::Str(\"tag\"),\n            Token::Str(\"Unit\"),\n            Token::StructEnd,\n        ],\n    );\n    assert_de_tokens(\n        &InternallyTagged::Unit,\n        &[\n            Token::Struct {\n                name: \"InternallyTagged\",\n                len: 1,\n            },\n            Token::BorrowedStr(\"tag\"),\n            Token::BorrowedStr(\"Unit\"),\n            Token::StructEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &InternallyTagged::Unit,\n        &[\n            Token::Map { len: Some(1) },\n            Token::Str(\"tag\"),\n            Token::Str(\"Unit\"),\n            Token::MapEnd,\n        ],\n    );\n    assert_de_tokens(\n        &InternallyTagged::Unit,\n        &[\n            Token::Map { len: Some(1) },\n            Token::BorrowedStr(\"tag\"),\n            Token::BorrowedStr(\"Unit\"),\n            Token::MapEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &InternallyTagged::Unit,\n        &[\n            Token::Seq { len: Some(1) },\n            Token::Str(\"Unit\"), // tag\n            Token::SeqEnd,\n        ],\n    );\n    assert_de_tokens(\n        &InternallyTagged::Unit,\n        &[\n            Token::Seq { len: Some(1) },\n            Token::BorrowedStr(\"Unit\"), // tag\n            Token::SeqEnd,\n        ],\n    );\n}\n\n#[test]\nfn newtype_unit() {\n    let value = InternallyTagged::NewtypeUnit(());\n\n    assert_tokens(\n        &value,\n        &[\n            Token::Map { len: Some(1) },\n            Token::Str(\"tag\"),\n            Token::Str(\"NewtypeUnit\"),\n            Token::MapEnd,\n        ],\n    );\n    assert_de_tokens(\n        &value,\n        &[\n            Token::Map { len: Some(1) },\n            Token::BorrowedStr(\"tag\"),\n            Token::BorrowedStr(\"NewtypeUnit\"),\n            Token::MapEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &value,\n        &[\n            Token::Struct {\n                name: \"InternallyTagged\",\n                len: 1,\n            },\n            Token::Str(\"tag\"),\n            Token::Str(\"NewtypeUnit\"),\n            Token::StructEnd,\n        ],\n    );\n    assert_de_tokens(\n        &value,\n        &[\n            Token::Struct {\n                name: \"InternallyTagged\",\n                len: 1,\n            },\n            Token::BorrowedStr(\"tag\"),\n            Token::BorrowedStr(\"NewtypeUnit\"),\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn newtype_unit_struct() {\n    let value = InternallyTagged::NewtypeUnitStruct(Unit);\n\n    assert_tokens(\n        &value,\n        &[\n            Token::Map { len: Some(1) },\n            Token::Str(\"tag\"),\n            Token::Str(\"NewtypeUnitStruct\"),\n            Token::MapEnd,\n        ],\n    );\n    assert_de_tokens(\n        &value,\n        &[\n            Token::Map { len: Some(1) },\n            Token::BorrowedStr(\"tag\"),\n            Token::BorrowedStr(\"NewtypeUnitStruct\"),\n            Token::MapEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &value,\n        &[\n            Token::Struct {\n                name: \"InternallyTagged\",\n                len: 1,\n            },\n            Token::Str(\"tag\"),\n            Token::Str(\"NewtypeUnitStruct\"),\n            Token::StructEnd,\n        ],\n    );\n    assert_de_tokens(\n        &value,\n        &[\n            Token::Struct {\n                name: \"InternallyTagged\",\n                len: 1,\n            },\n            Token::BorrowedStr(\"tag\"),\n            Token::BorrowedStr(\"NewtypeUnitStruct\"),\n            Token::StructEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &value,\n        &[\n            Token::Seq { len: Some(1) },\n            Token::Str(\"NewtypeUnitStruct\"), // tag\n            Token::SeqEnd,\n        ],\n    );\n    assert_de_tokens(\n        &value,\n        &[\n            Token::Seq { len: Some(1) },\n            Token::BorrowedStr(\"NewtypeUnitStruct\"), // tag\n            Token::SeqEnd,\n        ],\n    );\n}\n\n#[test]\nfn newtype_newtype() {\n    assert_tokens(\n        &InternallyTagged::NewtypeNewtype(Newtype(BTreeMap::new())),\n        &[\n            Token::Map { len: Some(1) },\n            Token::Str(\"tag\"),\n            Token::Str(\"NewtypeNewtype\"),\n            Token::MapEnd,\n        ],\n    );\n}\n\n#[test]\nfn newtype_map() {\n    let value = InternallyTagged::NewtypeMap(BTreeMap::new());\n\n    // Special case: empty map\n    assert_tokens(\n        &value,\n        &[\n            Token::Map { len: Some(1) },\n            Token::Str(\"tag\"),\n            Token::Str(\"NewtypeMap\"),\n            Token::MapEnd,\n        ],\n    );\n    assert_de_tokens(\n        &value,\n        &[\n            Token::Map { len: Some(1) },\n            Token::BorrowedStr(\"tag\"),\n            Token::BorrowedStr(\"NewtypeMap\"),\n            Token::MapEnd,\n        ],\n    );\n\n    let value = InternallyTagged::NewtypeMap(BTreeMap::from_iter([(\n        \"field\".to_string(),\n        \"value\".to_string(),\n    )]));\n\n    // Special case: tag field (\"tag\") is the first field\n    assert_tokens(\n        &value,\n        &[\n            Token::Map { len: Some(2) },\n            Token::Str(\"tag\"),\n            Token::Str(\"NewtypeMap\"),\n            Token::Str(\"field\"),\n            Token::Str(\"value\"),\n            Token::MapEnd,\n        ],\n    );\n    assert_de_tokens(\n        &value,\n        &[\n            Token::Map { len: Some(2) },\n            Token::BorrowedStr(\"tag\"),\n            Token::BorrowedStr(\"NewtypeMap\"),\n            Token::BorrowedStr(\"field\"),\n            Token::BorrowedStr(\"value\"),\n            Token::MapEnd,\n        ],\n    );\n\n    // General case: tag field (\"tag\") is not the first field\n    assert_de_tokens(\n        &value,\n        &[\n            Token::Map { len: Some(2) },\n            Token::Str(\"field\"),\n            Token::Str(\"value\"),\n            Token::Str(\"tag\"),\n            Token::Str(\"NewtypeMap\"),\n            Token::MapEnd,\n        ],\n    );\n    assert_de_tokens(\n        &value,\n        &[\n            Token::Map { len: Some(2) },\n            Token::BorrowedStr(\"field\"),\n            Token::BorrowedStr(\"value\"),\n            Token::BorrowedStr(\"tag\"),\n            Token::BorrowedStr(\"NewtypeMap\"),\n            Token::MapEnd,\n        ],\n    );\n\n    assert_de_tokens_error::<InternallyTagged>(\n        &[\n            Token::Seq { len: Some(2) },\n            Token::Str(\"NewtypeMap\"), // tag\n            Token::Map { len: Some(0) },\n            Token::MapEnd,\n            Token::SeqEnd,\n        ],\n        \"invalid type: sequence, expected a map\",\n    );\n}\n\n#[test]\nfn newtype_struct() {\n    let value = InternallyTagged::NewtypeStruct(Struct { f: 6 });\n\n    // Special case: tag field (\"tag\") is the first field\n    assert_tokens(\n        &value,\n        &[\n            Token::Struct {\n                name: \"Struct\",\n                len: 2,\n            },\n            Token::Str(\"tag\"),\n            Token::Str(\"NewtypeStruct\"),\n            Token::Str(\"f\"),\n            Token::U8(6),\n            Token::StructEnd,\n        ],\n    );\n    assert_de_tokens(\n        &value,\n        &[\n            Token::Struct {\n                name: \"Struct\",\n                len: 2,\n            },\n            Token::BorrowedStr(\"tag\"),\n            Token::BorrowedStr(\"NewtypeStruct\"),\n            Token::BorrowedStr(\"f\"),\n            Token::U8(6),\n            Token::StructEnd,\n        ],\n    );\n\n    // General case: tag field (\"tag\") is not the first field\n    assert_de_tokens(\n        &value,\n        &[\n            Token::Struct {\n                name: \"Struct\",\n                len: 2,\n            },\n            Token::Str(\"f\"),\n            Token::U8(6),\n            Token::Str(\"tag\"),\n            Token::Str(\"NewtypeStruct\"),\n            Token::StructEnd,\n        ],\n    );\n    assert_de_tokens(\n        &value,\n        &[\n            Token::Struct {\n                name: \"Struct\",\n                len: 2,\n            },\n            Token::BorrowedStr(\"f\"),\n            Token::U8(6),\n            Token::BorrowedStr(\"tag\"),\n            Token::BorrowedStr(\"NewtypeStruct\"),\n            Token::StructEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &value,\n        &[\n            Token::Seq { len: Some(2) },\n            Token::Str(\"NewtypeStruct\"), // tag\n            Token::U8(6),\n            Token::SeqEnd,\n        ],\n    );\n    assert_de_tokens(\n        &value,\n        &[\n            Token::Seq { len: Some(2) },\n            Token::BorrowedStr(\"NewtypeStruct\"), // tag\n            Token::U8(6),\n            Token::SeqEnd,\n        ],\n    );\n}\n\nmod newtype_enum {\n    use super::*;\n\n    #[test]\n    fn unit() {\n        let value = InternallyTagged::NewtypeEnum(Enum::Unit);\n\n        // Special case: tag field (\"tag\") is the first field\n        assert_tokens(\n            &value,\n            &[\n                Token::Map { len: Some(2) },\n                Token::Str(\"tag\"),\n                Token::Str(\"NewtypeEnum\"),\n                Token::Str(\"Unit\"),\n                Token::Unit,\n                Token::MapEnd,\n            ],\n        );\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Map { len: Some(2) },\n                Token::BorrowedStr(\"tag\"),\n                Token::BorrowedStr(\"NewtypeEnum\"),\n                Token::BorrowedStr(\"Unit\"),\n                Token::Unit,\n                Token::MapEnd,\n            ],\n        );\n\n        // General case: tag field (\"tag\") is not the first field\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Map { len: Some(2) },\n                Token::Str(\"Unit\"),\n                Token::Unit,\n                Token::Str(\"tag\"),\n                Token::Str(\"NewtypeEnum\"),\n                Token::MapEnd,\n            ],\n        );\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Map { len: Some(2) },\n                Token::BorrowedStr(\"Unit\"),\n                Token::Unit,\n                Token::BorrowedStr(\"tag\"),\n                Token::BorrowedStr(\"NewtypeEnum\"),\n                Token::MapEnd,\n            ],\n        );\n    }\n\n    #[test]\n    fn newtype() {\n        let value = InternallyTagged::NewtypeEnum(Enum::Newtype(1));\n\n        // Special case: tag field (\"tag\") is the first field\n        assert_tokens(\n            &value,\n            &[\n                Token::Map { len: Some(2) },\n                Token::Str(\"tag\"),\n                Token::Str(\"NewtypeEnum\"),\n                Token::Str(\"Newtype\"),\n                Token::U8(1),\n                Token::MapEnd,\n            ],\n        );\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Map { len: Some(2) },\n                Token::BorrowedStr(\"tag\"),\n                Token::BorrowedStr(\"NewtypeEnum\"),\n                Token::BorrowedStr(\"Newtype\"),\n                Token::U8(1),\n                Token::MapEnd,\n            ],\n        );\n\n        // General case: tag field (\"tag\") is not the first field\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Map { len: Some(2) },\n                Token::Str(\"Newtype\"),\n                Token::U8(1),\n                Token::Str(\"tag\"),\n                Token::Str(\"NewtypeEnum\"),\n                Token::MapEnd,\n            ],\n        );\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Map { len: Some(2) },\n                Token::BorrowedStr(\"Newtype\"),\n                Token::U8(1),\n                Token::BorrowedStr(\"tag\"),\n                Token::BorrowedStr(\"NewtypeEnum\"),\n                Token::MapEnd,\n            ],\n        );\n    }\n\n    #[test]\n    fn tuple() {\n        let value = InternallyTagged::NewtypeEnum(Enum::Tuple(1, 1));\n\n        // Special case: tag field (\"tag\") is the first field\n        assert_tokens(\n            &value,\n            &[\n                Token::Map { len: Some(2) },\n                Token::Str(\"tag\"),\n                Token::Str(\"NewtypeEnum\"),\n                Token::Str(\"Tuple\"),\n                Token::TupleStruct {\n                    name: \"Tuple\",\n                    len: 2,\n                },\n                Token::U8(1),\n                Token::U8(1),\n                Token::TupleStructEnd,\n                Token::MapEnd,\n            ],\n        );\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Map { len: Some(2) },\n                Token::BorrowedStr(\"tag\"),\n                Token::BorrowedStr(\"NewtypeEnum\"),\n                Token::BorrowedStr(\"Tuple\"),\n                Token::TupleStruct {\n                    name: \"Tuple\",\n                    len: 2,\n                },\n                Token::U8(1),\n                Token::U8(1),\n                Token::TupleStructEnd,\n                Token::MapEnd,\n            ],\n        );\n\n        // Special case: tag field (\"tag\") is not the first field\n        // Reaches crate::private::de::content::VariantDeserializer::tuple_variant\n        // Content::Seq case\n        // via ContentDeserializer::deserialize_enum\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Map { len: Some(2) },\n                Token::Str(\"Tuple\"),\n                Token::TupleStruct {\n                    name: \"Tuple\",\n                    len: 2,\n                },\n                Token::U8(1),\n                Token::U8(1),\n                Token::TupleStructEnd,\n                Token::Str(\"tag\"),\n                Token::Str(\"NewtypeEnum\"),\n                Token::MapEnd,\n            ],\n        );\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Map { len: Some(2) },\n                Token::BorrowedStr(\"Tuple\"),\n                Token::TupleStruct {\n                    name: \"Tuple\",\n                    len: 2,\n                },\n                Token::U8(1),\n                Token::U8(1),\n                Token::TupleStructEnd,\n                Token::BorrowedStr(\"tag\"),\n                Token::BorrowedStr(\"NewtypeEnum\"),\n                Token::MapEnd,\n            ],\n        );\n    }\n\n    #[test]\n    fn struct_() {\n        let value = InternallyTagged::NewtypeEnum(Enum::Struct { f: 1 });\n\n        // Special case: tag field (\"tag\") is the first field\n        assert_tokens(\n            &value,\n            &[\n                Token::Map { len: Some(2) },\n                Token::Str(\"tag\"),\n                Token::Str(\"NewtypeEnum\"),\n                Token::Str(\"Struct\"),\n                Token::Struct {\n                    name: \"Struct\",\n                    len: 1,\n                },\n                Token::Str(\"f\"),\n                Token::U8(1),\n                Token::StructEnd,\n                Token::MapEnd,\n            ],\n        );\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Map { len: Some(2) },\n                Token::BorrowedStr(\"tag\"),\n                Token::BorrowedStr(\"NewtypeEnum\"),\n                Token::BorrowedStr(\"Struct\"),\n                Token::Struct {\n                    name: \"Struct\",\n                    len: 1,\n                },\n                Token::BorrowedStr(\"f\"),\n                Token::U8(1),\n                Token::StructEnd,\n                Token::MapEnd,\n            ],\n        );\n\n        // General case: tag field (\"tag\") is not the first field\n        // Reaches crate::private::de::content::VariantDeserializer::struct_variant\n        // Content::Map case\n        // via ContentDeserializer::deserialize_enum\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Map { len: Some(2) },\n                Token::Str(\"Struct\"),\n                Token::Struct {\n                    name: \"Struct\",\n                    len: 1,\n                },\n                Token::Str(\"f\"),\n                Token::U8(1),\n                Token::StructEnd,\n                Token::Str(\"tag\"),\n                Token::Str(\"NewtypeEnum\"),\n                Token::MapEnd,\n            ],\n        );\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Map { len: Some(2) },\n                Token::BorrowedStr(\"Struct\"),\n                Token::Struct {\n                    name: \"Struct\",\n                    len: 1,\n                },\n                Token::BorrowedStr(\"f\"),\n                Token::U8(1),\n                Token::StructEnd,\n                Token::BorrowedStr(\"tag\"),\n                Token::BorrowedStr(\"NewtypeEnum\"),\n                Token::MapEnd,\n            ],\n        );\n\n        // Special case: tag field (\"tag\") is the first field\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Map { len: Some(2) },\n                Token::Str(\"tag\"),\n                Token::Str(\"NewtypeEnum\"),\n                Token::Str(\"Struct\"),\n                Token::Seq { len: Some(1) },\n                Token::U8(1), // f\n                Token::SeqEnd,\n                Token::MapEnd,\n            ],\n        );\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Map { len: Some(2) },\n                Token::BorrowedStr(\"tag\"),\n                Token::BorrowedStr(\"NewtypeEnum\"),\n                Token::BorrowedStr(\"Struct\"),\n                Token::Seq { len: Some(1) },\n                Token::U8(1), // f\n                Token::SeqEnd,\n                Token::MapEnd,\n            ],\n        );\n\n        // General case: tag field (\"tag\") is not the first field\n        // Reaches crate::private::de::content::VariantDeserializer::struct_variant\n        // Content::Seq case\n        // via ContentDeserializer::deserialize_enum\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Map { len: Some(2) },\n                Token::Str(\"Struct\"),\n                Token::Seq { len: Some(1) },\n                Token::U8(1), // f\n                Token::SeqEnd,\n                Token::Str(\"tag\"),\n                Token::Str(\"NewtypeEnum\"),\n                Token::MapEnd,\n            ],\n        );\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Map { len: Some(2) },\n                Token::BorrowedStr(\"Struct\"),\n                Token::Seq { len: Some(1) },\n                Token::U8(1), // f\n                Token::SeqEnd,\n                Token::BorrowedStr(\"tag\"),\n                Token::BorrowedStr(\"NewtypeEnum\"),\n                Token::MapEnd,\n            ],\n        );\n    }\n}\n\n#[test]\nfn struct_() {\n    let value = InternallyTagged::Struct { a: 1 };\n\n    // Special case: tag field (\"tag\") is the first field\n    assert_tokens(\n        &value,\n        &[\n            Token::Struct {\n                name: \"InternallyTagged\",\n                len: 2,\n            },\n            Token::Str(\"tag\"),\n            Token::Str(\"Struct\"),\n            Token::Str(\"a\"),\n            Token::U8(1),\n            Token::StructEnd,\n        ],\n    );\n    assert_de_tokens(\n        &value,\n        &[\n            Token::Struct {\n                name: \"InternallyTagged\",\n                len: 2,\n            },\n            Token::BorrowedStr(\"tag\"),\n            Token::BorrowedStr(\"Struct\"),\n            Token::BorrowedStr(\"a\"),\n            Token::U8(1),\n            Token::StructEnd,\n        ],\n    );\n\n    // General case: tag field (\"tag\") is not the first field\n    assert_de_tokens(\n        &value,\n        &[\n            Token::Struct {\n                name: \"InternallyTagged\",\n                len: 2,\n            },\n            Token::Str(\"a\"),\n            Token::U8(1),\n            Token::Str(\"tag\"),\n            Token::Str(\"Struct\"),\n            Token::StructEnd,\n        ],\n    );\n    assert_de_tokens(\n        &value,\n        &[\n            Token::Struct {\n                name: \"InternallyTagged\",\n                len: 2,\n            },\n            Token::BorrowedStr(\"a\"),\n            Token::U8(1),\n            Token::BorrowedStr(\"tag\"),\n            Token::BorrowedStr(\"Struct\"),\n            Token::StructEnd,\n        ],\n    );\n\n    // Special case: tag field (\"tag\") is the first field\n    assert_de_tokens(\n        &value,\n        &[\n            Token::Map { len: Some(2) },\n            Token::Str(\"tag\"),\n            Token::Str(\"Struct\"),\n            Token::Str(\"a\"),\n            Token::U8(1),\n            Token::MapEnd,\n        ],\n    );\n    assert_de_tokens(\n        &value,\n        &[\n            Token::Map { len: Some(2) },\n            Token::BorrowedStr(\"tag\"),\n            Token::BorrowedStr(\"Struct\"),\n            Token::BorrowedStr(\"a\"),\n            Token::U8(1),\n            Token::MapEnd,\n        ],\n    );\n\n    // General case: tag field (\"tag\") is not the first field\n    assert_de_tokens(\n        &value,\n        &[\n            Token::Map { len: Some(2) },\n            Token::Str(\"a\"),\n            Token::U8(1),\n            Token::Str(\"tag\"),\n            Token::Str(\"Struct\"),\n            Token::MapEnd,\n        ],\n    );\n    assert_de_tokens(\n        &value,\n        &[\n            Token::Map { len: Some(2) },\n            Token::BorrowedStr(\"a\"),\n            Token::U8(1),\n            Token::BorrowedStr(\"tag\"),\n            Token::BorrowedStr(\"Struct\"),\n            Token::MapEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &value,\n        &[\n            Token::Seq { len: Some(2) },\n            Token::Str(\"Struct\"), // tag\n            Token::U8(1),\n            Token::SeqEnd,\n        ],\n    );\n    assert_de_tokens(\n        &value,\n        &[\n            Token::Seq { len: Some(2) },\n            Token::BorrowedStr(\"Struct\"), // tag\n            Token::U8(1),\n            Token::SeqEnd,\n        ],\n    );\n}\n\nmod struct_enum {\n    use super::*;\n\n    #[test]\n    fn unit() {\n        assert_de_tokens(\n            &Enum::Unit,\n            &[\n                Token::Enum { name: \"Enum\" },\n                Token::BorrowedStr(\"Unit\"),\n                Token::Unit,\n            ],\n        );\n\n        let value = InternallyTagged::StructEnum { enum_: Enum::Unit };\n\n        // Special case: tag field (\"tag\") is the first field\n        assert_tokens(\n            &value,\n            &[\n                Token::Struct {\n                    name: \"InternallyTagged\",\n                    len: 2,\n                },\n                Token::Str(\"tag\"),\n                Token::Str(\"StructEnum\"),\n                Token::Str(\"enum_\"),\n                Token::Enum { name: \"Enum\" },\n                Token::Str(\"Unit\"),\n                Token::Unit,\n                Token::StructEnd,\n            ],\n        );\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Struct {\n                    name: \"InternallyTagged\",\n                    len: 2,\n                },\n                Token::BorrowedStr(\"tag\"),\n                Token::BorrowedStr(\"StructEnum\"),\n                Token::BorrowedStr(\"enum_\"),\n                Token::Enum { name: \"Enum\" },\n                Token::BorrowedStr(\"Unit\"),\n                Token::Unit,\n                Token::StructEnd,\n            ],\n        );\n\n        // General case: tag field (\"tag\") is not the first field\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Struct {\n                    name: \"InternallyTagged\",\n                    len: 2,\n                },\n                Token::Str(\"enum_\"),\n                Token::Enum { name: \"Enum\" },\n                Token::Str(\"Unit\"),\n                Token::Unit,\n                Token::Str(\"tag\"),\n                Token::Str(\"StructEnum\"),\n                Token::StructEnd,\n            ],\n        );\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Struct {\n                    name: \"InternallyTagged\",\n                    len: 2,\n                },\n                Token::BorrowedStr(\"enum_\"),\n                Token::Enum { name: \"Enum\" },\n                Token::BorrowedStr(\"Unit\"),\n                Token::Unit,\n                Token::BorrowedStr(\"tag\"),\n                Token::BorrowedStr(\"StructEnum\"),\n                Token::StructEnd,\n            ],\n        );\n\n        // Special case: tag field (\"tag\") is the first field\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Map { len: Some(2) },\n                Token::Str(\"tag\"),\n                Token::Str(\"StructEnum\"),\n                Token::Str(\"enum_\"),\n                Token::Enum { name: \"Enum\" },\n                Token::Str(\"Unit\"),\n                Token::Unit,\n                Token::MapEnd,\n            ],\n        );\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Map { len: Some(2) },\n                Token::BorrowedStr(\"tag\"),\n                Token::BorrowedStr(\"StructEnum\"),\n                Token::BorrowedStr(\"enum_\"),\n                Token::Enum { name: \"Enum\" },\n                Token::BorrowedStr(\"Unit\"),\n                Token::Unit,\n                Token::MapEnd,\n            ],\n        );\n\n        // General case: tag field (\"tag\") is not the first field\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Map { len: Some(2) },\n                Token::Str(\"enum_\"),\n                Token::Enum { name: \"Enum\" },\n                Token::Str(\"Unit\"),\n                Token::Unit,\n                Token::Str(\"tag\"),\n                Token::Str(\"StructEnum\"),\n                Token::MapEnd,\n            ],\n        );\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Map { len: Some(2) },\n                Token::BorrowedStr(\"enum_\"),\n                Token::Enum { name: \"Enum\" },\n                Token::BorrowedStr(\"Unit\"),\n                Token::Unit,\n                Token::BorrowedStr(\"tag\"),\n                Token::BorrowedStr(\"StructEnum\"),\n                Token::MapEnd,\n            ],\n        );\n\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Seq { len: Some(2) },\n                Token::Str(\"StructEnum\"),     // tag\n                Token::Enum { name: \"Enum\" }, // enum_\n                Token::Str(\"Unit\"),\n                Token::Unit,\n                Token::SeqEnd,\n            ],\n        );\n        assert_de_tokens(\n            &value,\n            &[\n                Token::Seq { len: Some(2) },\n                Token::BorrowedStr(\"StructEnum\"), // tag\n                Token::Enum { name: \"Enum\" },     // enum_\n                Token::BorrowedStr(\"Unit\"),\n                Token::Unit,\n                Token::SeqEnd,\n            ],\n        );\n    }\n}\n\n#[test]\nfn wrong_tag() {\n    assert_de_tokens_error::<InternallyTagged>(\n        &[Token::Map { len: Some(0) }, Token::MapEnd],\n        \"missing field `tag`\",\n    );\n\n    assert_de_tokens_error::<InternallyTagged>(\n        &[\n            Token::Map { len: Some(1) },\n            Token::Str(\"tag\"),\n            Token::Str(\"Z\"),\n            Token::MapEnd,\n        ],\n        \"unknown variant `Z`, expected one of \\\n        `Unit`, \\\n        `NewtypeUnit`, \\\n        `NewtypeUnitStruct`, \\\n        `NewtypeNewtype`, \\\n        `NewtypeMap`, \\\n        `NewtypeStruct`, \\\n        `NewtypeEnum`, \\\n        `Struct`, \\\n        `StructEnum`\",\n    );\n}\n\n#[test]\nfn untagged_variant() {\n    #[derive(Debug, PartialEq, Serialize, Deserialize)]\n    #[serde(tag = \"tag\")]\n    enum InternallyTagged {\n        Tagged {\n            a: u8,\n        },\n        #[serde(untagged)]\n        Untagged {\n            tag: String,\n            b: u8,\n        },\n    }\n\n    assert_de_tokens(\n        &InternallyTagged::Tagged { a: 1 },\n        &[\n            Token::Map { len: Some(2) },\n            Token::Str(\"tag\"),\n            Token::Str(\"Tagged\"),\n            Token::Str(\"a\"),\n            Token::U8(1),\n            Token::MapEnd,\n        ],\n    );\n\n    assert_tokens(\n        &InternallyTagged::Tagged { a: 1 },\n        &[\n            Token::Struct {\n                name: \"InternallyTagged\",\n                len: 2,\n            },\n            Token::Str(\"tag\"),\n            Token::Str(\"Tagged\"),\n            Token::Str(\"a\"),\n            Token::U8(1),\n            Token::StructEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &InternallyTagged::Untagged {\n            tag: \"Foo\".to_owned(),\n            b: 2,\n        },\n        &[\n            Token::Map { len: Some(2) },\n            Token::Str(\"tag\"),\n            Token::Str(\"Foo\"),\n            Token::Str(\"b\"),\n            Token::U8(2),\n            Token::MapEnd,\n        ],\n    );\n\n    assert_tokens(\n        &InternallyTagged::Untagged {\n            tag: \"Foo\".to_owned(),\n            b: 2,\n        },\n        &[\n            Token::Struct {\n                name: \"InternallyTagged\",\n                len: 2,\n            },\n            Token::Str(\"tag\"),\n            Token::Str(\"Foo\"),\n            Token::Str(\"b\"),\n            Token::U8(2),\n            Token::StructEnd,\n        ],\n    );\n\n    assert_tokens(\n        &InternallyTagged::Untagged {\n            tag: \"Tagged\".to_owned(),\n            b: 2,\n        },\n        &[\n            Token::Struct {\n                name: \"InternallyTagged\",\n                len: 2,\n            },\n            Token::Str(\"tag\"),\n            Token::Str(\"Tagged\"),\n            Token::Str(\"b\"),\n            Token::U8(2),\n            Token::StructEnd,\n        ],\n    );\n}\n\nmod string_and_bytes {\n    use super::*;\n\n    #[derive(Debug, PartialEq, Deserialize)]\n    #[serde(tag = \"tag\")]\n    enum InternallyTagged {\n        String {\n            string: String,\n        },\n        Bytes {\n            #[serde(with = \"bytes\")]\n            bytes: Vec<u8>,\n        },\n    }\n\n    #[test]\n    fn string_from_string() {\n        assert_de_tokens(\n            &InternallyTagged::String {\n                string: \"\\0\".to_owned(),\n            },\n            &[\n                Token::Struct {\n                    name: \"String\",\n                    len: 2,\n                },\n                Token::Str(\"tag\"),\n                Token::Str(\"String\"),\n                Token::Str(\"string\"),\n                Token::Str(\"\\0\"),\n                Token::StructEnd,\n            ],\n        );\n\n        assert_de_tokens(\n            &InternallyTagged::String {\n                string: \"\\0\".to_owned(),\n            },\n            &[\n                Token::Struct {\n                    name: \"String\",\n                    len: 2,\n                },\n                Token::Str(\"tag\"),\n                Token::Str(\"String\"),\n                Token::Str(\"string\"),\n                Token::String(\"\\0\"),\n                Token::StructEnd,\n            ],\n        );\n    }\n\n    #[test]\n    fn string_from_bytes() {\n        assert_de_tokens(\n            &InternallyTagged::String {\n                string: \"\\0\".to_owned(),\n            },\n            &[\n                Token::Struct {\n                    name: \"String\",\n                    len: 2,\n                },\n                Token::Str(\"tag\"),\n                Token::Str(\"String\"),\n                Token::Str(\"string\"),\n                Token::Bytes(b\"\\0\"),\n                Token::StructEnd,\n            ],\n        );\n\n        assert_de_tokens(\n            &InternallyTagged::String {\n                string: \"\\0\".to_owned(),\n            },\n            &[\n                Token::Struct {\n                    name: \"String\",\n                    len: 2,\n                },\n                Token::Str(\"tag\"),\n                Token::Str(\"String\"),\n                Token::Str(\"string\"),\n                Token::ByteBuf(b\"\\0\"),\n                Token::StructEnd,\n            ],\n        );\n    }\n\n    #[test]\n    fn bytes_from_string() {\n        assert_de_tokens(\n            &InternallyTagged::Bytes { bytes: vec![0] },\n            &[\n                Token::Struct {\n                    name: \"Bytes\",\n                    len: 2,\n                },\n                Token::Str(\"tag\"),\n                Token::Str(\"Bytes\"),\n                Token::Str(\"bytes\"),\n                Token::Str(\"\\0\"),\n                Token::StructEnd,\n            ],\n        );\n\n        assert_de_tokens(\n            &InternallyTagged::Bytes { bytes: vec![0] },\n            &[\n                Token::Struct {\n                    name: \"Bytes\",\n                    len: 2,\n                },\n                Token::Str(\"tag\"),\n                Token::Str(\"Bytes\"),\n                Token::Str(\"bytes\"),\n                Token::String(\"\\0\"),\n                Token::StructEnd,\n            ],\n        );\n    }\n\n    #[test]\n    fn bytes_from_bytes() {\n        assert_de_tokens(\n            &InternallyTagged::Bytes { bytes: vec![0] },\n            &[\n                Token::Struct {\n                    name: \"Bytes\",\n                    len: 2,\n                },\n                Token::Str(\"tag\"),\n                Token::Str(\"Bytes\"),\n                Token::Str(\"bytes\"),\n                Token::Bytes(b\"\\0\"),\n                Token::StructEnd,\n            ],\n        );\n\n        assert_de_tokens(\n            &InternallyTagged::Bytes { bytes: vec![0] },\n            &[\n                Token::Struct {\n                    name: \"Bytes\",\n                    len: 2,\n                },\n                Token::Str(\"tag\"),\n                Token::Str(\"Bytes\"),\n                Token::Str(\"bytes\"),\n                Token::ByteBuf(b\"\\0\"),\n                Token::StructEnd,\n            ],\n        );\n    }\n\n    #[test]\n    fn bytes_from_seq() {\n        assert_de_tokens(\n            &InternallyTagged::Bytes { bytes: vec![0] },\n            &[\n                Token::Struct {\n                    name: \"Bytes\",\n                    len: 2,\n                },\n                Token::Str(\"tag\"),\n                Token::Str(\"Bytes\"),\n                Token::Str(\"bytes\"),\n                Token::Seq { len: Some(1) },\n                Token::U8(0),\n                Token::SeqEnd,\n                Token::StructEnd,\n            ],\n        );\n    }\n}\n\n#[test]\nfn borrow() {\n    #[derive(Debug, PartialEq, Serialize, Deserialize)]\n    #[serde(tag = \"tag\")]\n    enum Input<'a> {\n        Package { name: &'a str },\n    }\n\n    assert_tokens(\n        &Input::Package { name: \"borrowed\" },\n        &[\n            Token::Struct {\n                name: \"Input\",\n                len: 2,\n            },\n            Token::BorrowedStr(\"tag\"),\n            Token::BorrowedStr(\"Package\"),\n            Token::BorrowedStr(\"name\"),\n            Token::BorrowedStr(\"borrowed\"),\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn with_skipped_conflict() {\n    #[derive(Debug, PartialEq, Serialize, Deserialize)]\n    #[serde(tag = \"tag\")]\n    enum Data {\n        A,\n        #[serde(skip)]\n        #[allow(dead_code)]\n        B {\n            t: String,\n        },\n        C {\n            #[serde(default, skip)]\n            t: String,\n        },\n    }\n\n    let data = Data::C { t: String::new() };\n\n    assert_tokens(\n        &data,\n        &[\n            Token::Struct {\n                name: \"Data\",\n                len: 1,\n            },\n            Token::Str(\"tag\"),\n            Token::Str(\"C\"),\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn containing_flatten() {\n    #[derive(Debug, PartialEq, Serialize, Deserialize)]\n    #[serde(tag = \"tag\")]\n    enum Data {\n        A {\n            a: i32,\n            #[serde(flatten)]\n            flat: Flat,\n        },\n    }\n\n    #[derive(Debug, PartialEq, Serialize, Deserialize)]\n    struct Flat {\n        b: i32,\n    }\n\n    let data = Data::A {\n        a: 0,\n        flat: Flat { b: 0 },\n    };\n\n    assert_tokens(\n        &data,\n        &[\n            Token::Map { len: None },\n            Token::Str(\"tag\"),\n            Token::Str(\"A\"),\n            Token::Str(\"a\"),\n            Token::I32(0),\n            Token::Str(\"b\"),\n            Token::I32(0),\n            Token::MapEnd,\n        ],\n    );\n}\n\n#[test]\nfn unit_variant_with_unknown_fields() {\n    let value = InternallyTagged::Unit;\n\n    assert_de_tokens(\n        &value,\n        &[\n            Token::Map { len: None },\n            Token::Str(\"tag\"),\n            Token::Str(\"Unit\"),\n            Token::Str(\"b\"),\n            Token::I32(0),\n            Token::MapEnd,\n        ],\n    );\n\n    // Unknown elements are not allowed in sequences\n    assert_de_tokens_error::<InternallyTagged>(\n        &[\n            Token::Seq { len: None },\n            Token::Str(\"Unit\"), // tag\n            Token::I32(0),\n            Token::SeqEnd,\n        ],\n        \"invalid length 1, expected 0 elements in sequence\",\n    );\n}\n\n#[test]\nfn expecting_message() {\n    #[derive(Deserialize)]\n    #[serde(tag = \"tag\")]\n    #[serde(expecting = \"something strange...\")]\n    enum Enum {\n        InternallyTagged,\n    }\n\n    assert_de_tokens_error::<Enum>(\n        &[Token::Str(\"InternallyTagged\")],\n        r#\"invalid type: string \"InternallyTagged\", expected something strange...\"#,\n    );\n\n    // Check that #[serde(expecting = \"...\")] doesn't affect variant identifier error message\n    assert_de_tokens_error::<Enum>(\n        &[Token::Map { len: None }, Token::Str(\"tag\"), Token::Unit],\n        \"invalid type: unit value, expected variant identifier\",\n    );\n}\n"
  },
  {
    "path": "test_suite/tests/test_enum_untagged.rs",
    "content": "#![deny(trivial_numeric_casts)]\n#![allow(\n    clippy::derive_partial_eq_without_eq,\n    clippy::enum_variant_names,\n    clippy::redundant_field_names,\n    clippy::too_many_lines\n)]\n\nmod bytes;\n\nuse serde_derive::{Deserialize, Serialize};\nuse serde_test::{assert_de_tokens, assert_de_tokens_error, assert_tokens, Token};\nuse std::collections::BTreeMap;\n\n#[test]\nfn complex() {\n    #[derive(Debug, PartialEq, Serialize, Deserialize)]\n    #[serde(untagged)]\n    enum Untagged {\n        A { a: u8 },\n        B { b: u8 },\n        C,\n        D(u8),\n        E(String),\n        F(u8, u8),\n    }\n\n    assert_tokens(\n        &Untagged::A { a: 1 },\n        &[\n            Token::Struct {\n                name: \"Untagged\",\n                len: 1,\n            },\n            Token::Str(\"a\"),\n            Token::U8(1),\n            Token::StructEnd,\n        ],\n    );\n\n    assert_tokens(\n        &Untagged::B { b: 2 },\n        &[\n            Token::Struct {\n                name: \"Untagged\",\n                len: 1,\n            },\n            Token::Str(\"b\"),\n            Token::U8(2),\n            Token::StructEnd,\n        ],\n    );\n\n    // Serializes to unit, deserializes from either depending on format's\n    // preference.\n    assert_tokens(&Untagged::C, &[Token::Unit]);\n    assert_de_tokens(&Untagged::C, &[Token::None]);\n\n    assert_tokens(&Untagged::D(4), &[Token::U8(4)]);\n    assert_tokens(&Untagged::E(\"e\".to_owned()), &[Token::Str(\"e\")]);\n\n    assert_tokens(\n        &Untagged::F(1, 2),\n        &[\n            Token::Tuple { len: 2 },\n            Token::U8(1),\n            Token::U8(2),\n            Token::TupleEnd,\n        ],\n    );\n\n    assert_de_tokens_error::<Untagged>(\n        &[Token::Tuple { len: 1 }, Token::U8(1), Token::TupleEnd],\n        \"data did not match any variant of untagged enum Untagged\",\n    );\n\n    assert_de_tokens_error::<Untagged>(\n        &[\n            Token::Tuple { len: 3 },\n            Token::U8(1),\n            Token::U8(2),\n            Token::U8(3),\n            Token::TupleEnd,\n        ],\n        \"data did not match any variant of untagged enum Untagged\",\n    );\n}\n\n#[test]\nfn newtype_unit_and_empty_map() {\n    #[derive(Debug, PartialEq, Serialize, Deserialize)]\n    struct Unit;\n\n    #[derive(Debug, PartialEq, Serialize, Deserialize)]\n    #[serde(untagged)]\n    enum Message {\n        Unit(Unit),\n        Map(BTreeMap<String, String>),\n    }\n\n    assert_tokens(\n        &Message::Map(BTreeMap::new()),\n        &[Token::Map { len: Some(0) }, Token::MapEnd],\n    );\n}\n\n// Reaches crate::private::de::content::ContentRefDeserializer::deserialize_newtype_struct\n#[test]\nfn newtype_struct() {\n    #[derive(Debug, PartialEq, Serialize, Deserialize)]\n    struct NewtypeStruct(u32);\n\n    #[derive(Debug, PartialEq, Serialize, Deserialize)]\n    #[serde(untagged)]\n    enum E {\n        Newtype(NewtypeStruct),\n        Null,\n    }\n\n    let value = E::Newtype(NewtypeStruct(5));\n\n    // Content::Newtype case\n    assert_tokens(\n        &value,\n        &[\n            Token::NewtypeStruct {\n                name: \"NewtypeStruct\",\n            },\n            Token::U32(5),\n        ],\n    );\n\n    // _ case\n    assert_de_tokens(&value, &[Token::U32(5)]);\n}\n\nmod newtype_enum {\n    use super::*;\n\n    #[derive(Debug, PartialEq, Serialize, Deserialize)]\n    #[serde(untagged)]\n    enum Outer {\n        Inner(Inner),\n    }\n\n    #[derive(Debug, PartialEq, Serialize, Deserialize)]\n    enum Inner {\n        Unit,\n        Newtype(u8),\n        Tuple0(),\n        Tuple2(u8, u8),\n        Struct { f: u8 },\n        EmptyStruct {},\n    }\n\n    // Reaches crate::private::de::content::VariantRefDeserializer::unit_variant\n    #[test]\n    fn unit() {\n        assert_tokens(\n            &Outer::Inner(Inner::Unit),\n            &[Token::UnitVariant {\n                name: \"Inner\",\n                variant: \"Unit\",\n            }],\n        );\n    }\n\n    // Reaches crate::private::de::content::VariantRefDeserializer::newtype_variant_seed\n    #[test]\n    fn newtype() {\n        assert_tokens(\n            &Outer::Inner(Inner::Newtype(1)),\n            &[\n                Token::NewtypeVariant {\n                    name: \"Inner\",\n                    variant: \"Newtype\",\n                },\n                Token::U8(1),\n            ],\n        );\n    }\n\n    // Reaches crate::private::de::content::VariantRefDeserializer::tuple_variant\n    #[test]\n    fn tuple0() {\n        assert_tokens(\n            &Outer::Inner(Inner::Tuple0()),\n            &[\n                Token::TupleVariant {\n                    name: \"Inner\",\n                    variant: \"Tuple0\",\n                    len: 0,\n                },\n                Token::TupleVariantEnd,\n            ],\n        );\n    }\n\n    // Reaches crate::private::de::content::VariantRefDeserializer::tuple_variant\n    #[test]\n    fn tuple2() {\n        assert_tokens(\n            &Outer::Inner(Inner::Tuple2(1, 1)),\n            &[\n                Token::TupleVariant {\n                    name: \"Inner\",\n                    variant: \"Tuple2\",\n                    len: 2,\n                },\n                Token::U8(1),\n                Token::U8(1),\n                Token::TupleVariantEnd,\n            ],\n        );\n    }\n\n    // Reaches crate::private::de::content::VariantRefDeserializer::struct_variant\n    // Content::Map case\n    #[test]\n    fn struct_from_map() {\n        assert_tokens(\n            &Outer::Inner(Inner::Struct { f: 1 }),\n            &[\n                Token::StructVariant {\n                    name: \"Inner\",\n                    variant: \"Struct\",\n                    len: 1,\n                },\n                Token::Str(\"f\"),\n                Token::U8(1),\n                Token::StructVariantEnd,\n            ],\n        );\n    }\n\n    // Reaches crate::private::de::content::VariantRefDeserializer::struct_variant\n    // Content::Seq case\n    #[test]\n    fn struct_from_seq() {\n        assert_de_tokens(\n            &Outer::Inner(Inner::Struct { f: 1 }),\n            &[\n                Token::Map { len: Some(1) },\n                // tag\n                Token::Str(\"Struct\"),\n                // content\n                Token::Seq { len: Some(1) },\n                Token::U8(1),\n                Token::SeqEnd,\n                Token::MapEnd,\n            ],\n        );\n    }\n\n    // Reaches crate::private::de::content::VariantRefDeserializer::struct_variant\n    // Content::Map case\n    // Special case - empty map\n    #[test]\n    fn empty_struct_from_map() {\n        assert_de_tokens(\n            &Outer::Inner(Inner::EmptyStruct {}),\n            &[\n                Token::Map { len: Some(1) },\n                // tag\n                Token::Str(\"EmptyStruct\"),\n                // content\n                Token::Map { len: Some(0) },\n                Token::MapEnd,\n                Token::MapEnd,\n            ],\n        );\n    }\n\n    // Reaches crate::private::de::content::VariantRefDeserializer::struct_variant\n    // Content::Seq case\n    // Special case - empty seq\n    #[test]\n    fn empty_struct_from_seq() {\n        assert_de_tokens(\n            &Outer::Inner(Inner::EmptyStruct {}),\n            &[\n                Token::Map { len: Some(1) },\n                // tag\n                Token::Str(\"EmptyStruct\"),\n                // content\n                Token::Seq { len: Some(0) },\n                Token::SeqEnd,\n                Token::MapEnd,\n            ],\n        );\n    }\n}\n\n// Reaches crate::private::de::content::ContentRefDeserializer::deserialize_option\nmod with_optional_field {\n    use super::*;\n\n    #[derive(Debug, PartialEq, Serialize, Deserialize)]\n    #[serde(untagged)]\n    enum Enum {\n        Struct { optional: Option<u32> },\n        Null,\n    }\n\n    #[test]\n    fn some() {\n        assert_tokens(\n            &Enum::Struct { optional: Some(42) },\n            &[\n                Token::Struct {\n                    name: \"Enum\",\n                    len: 1,\n                },\n                Token::Str(\"optional\"),\n                Token::Some,\n                Token::U32(42),\n                Token::StructEnd,\n            ],\n        );\n    }\n\n    #[test]\n    fn some_without_marker() {\n        assert_de_tokens(\n            &Enum::Struct { optional: Some(42) },\n            &[\n                Token::Struct {\n                    name: \"Enum\",\n                    len: 1,\n                },\n                Token::Str(\"optional\"),\n                Token::U32(42),\n                Token::StructEnd,\n            ],\n        );\n    }\n\n    #[test]\n    fn none() {\n        assert_tokens(\n            &Enum::Struct { optional: None },\n            &[\n                Token::Struct {\n                    name: \"Enum\",\n                    len: 1,\n                },\n                Token::Str(\"optional\"),\n                Token::None,\n                Token::StructEnd,\n            ],\n        );\n    }\n\n    #[test]\n    fn unit() {\n        assert_de_tokens(\n            &Enum::Struct { optional: None },\n            &[\n                Token::Map { len: None },\n                Token::Str(\"optional\"),\n                Token::Unit,\n                Token::MapEnd,\n            ],\n        );\n    }\n}\n\n#[test]\nfn string_and_bytes() {\n    #[derive(Debug, PartialEq, Deserialize)]\n    #[serde(untagged)]\n    enum Untagged {\n        String {\n            string: String,\n        },\n        Bytes {\n            #[serde(with = \"bytes\")]\n            bytes: Vec<u8>,\n        },\n    }\n\n    assert_de_tokens(\n        &Untagged::String {\n            string: \"\\0\".to_owned(),\n        },\n        &[\n            Token::Struct {\n                name: \"Untagged\",\n                len: 1,\n            },\n            Token::Str(\"string\"),\n            Token::Str(\"\\0\"),\n            Token::StructEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &Untagged::String {\n            string: \"\\0\".to_owned(),\n        },\n        &[\n            Token::Struct {\n                name: \"Untagged\",\n                len: 1,\n            },\n            Token::Str(\"string\"),\n            Token::String(\"\\0\"),\n            Token::StructEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &Untagged::String {\n            string: \"\\0\".to_owned(),\n        },\n        &[\n            Token::Struct {\n                name: \"Untagged\",\n                len: 1,\n            },\n            Token::Str(\"string\"),\n            Token::Bytes(b\"\\0\"),\n            Token::StructEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &Untagged::String {\n            string: \"\\0\".to_owned(),\n        },\n        &[\n            Token::Struct {\n                name: \"Untagged\",\n                len: 1,\n            },\n            Token::Str(\"string\"),\n            Token::ByteBuf(b\"\\0\"),\n            Token::StructEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &Untagged::Bytes { bytes: vec![0] },\n        &[\n            Token::Struct {\n                name: \"Untagged\",\n                len: 1,\n            },\n            Token::Str(\"bytes\"),\n            Token::Str(\"\\0\"),\n            Token::StructEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &Untagged::Bytes { bytes: vec![0] },\n        &[\n            Token::Struct {\n                name: \"Untagged\",\n                len: 1,\n            },\n            Token::Str(\"bytes\"),\n            Token::String(\"\\0\"),\n            Token::StructEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &Untagged::Bytes { bytes: vec![0] },\n        &[\n            Token::Struct {\n                name: \"Untagged\",\n                len: 1,\n            },\n            Token::Str(\"bytes\"),\n            Token::Bytes(b\"\\0\"),\n            Token::StructEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &Untagged::Bytes { bytes: vec![0] },\n        &[\n            Token::Struct {\n                name: \"Untagged\",\n                len: 1,\n            },\n            Token::Str(\"bytes\"),\n            Token::ByteBuf(b\"\\0\"),\n            Token::StructEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &Untagged::Bytes { bytes: vec![0] },\n        &[\n            Token::Struct {\n                name: \"Untagged\",\n                len: 1,\n            },\n            Token::Str(\"bytes\"),\n            Token::Seq { len: Some(1) },\n            Token::U8(0),\n            Token::SeqEnd,\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn contains_flatten() {\n    #[derive(Serialize, Deserialize, PartialEq, Debug)]\n    #[serde(untagged)]\n    enum Data {\n        A {\n            a: i32,\n            #[serde(flatten)]\n            flat: Flat,\n        },\n    }\n\n    #[derive(Serialize, Deserialize, PartialEq, Debug)]\n    struct Flat {\n        b: i32,\n    }\n\n    let data = Data::A {\n        a: 0,\n        flat: Flat { b: 0 },\n    };\n\n    assert_tokens(\n        &data,\n        &[\n            Token::Map { len: None },\n            Token::Str(\"a\"),\n            Token::I32(0),\n            Token::Str(\"b\"),\n            Token::I32(0),\n            Token::MapEnd,\n        ],\n    );\n}\n\n#[test]\nfn contains_flatten_with_integer_key() {\n    #[derive(Debug, PartialEq, Serialize, Deserialize)]\n    #[serde(untagged)]\n    pub enum Untagged {\n        Variant {\n            #[serde(flatten)]\n            map: BTreeMap<u64, String>,\n        },\n    }\n\n    assert_tokens(\n        &Untagged::Variant {\n            map: {\n                let mut map = BTreeMap::new();\n                map.insert(100, \"BTreeMap\".to_owned());\n                map\n            },\n        },\n        &[\n            Token::Map { len: None },\n            Token::U64(100),\n            Token::Str(\"BTreeMap\"),\n            Token::MapEnd,\n        ],\n    );\n}\n\n#[test]\nfn expecting_message() {\n    #[derive(Deserialize)]\n    #[serde(untagged)]\n    #[serde(expecting = \"something strange...\")]\n    enum Enum {\n        Untagged,\n    }\n\n    assert_de_tokens_error::<Enum>(&[Token::Str(\"Untagged\")], \"something strange...\");\n}\n"
  },
  {
    "path": "test_suite/tests/test_gen.rs",
    "content": "// These just test that serde_derive is able to produce code that compiles\n// successfully when there are a variety of generics and non-(de)serializable\n// types involved.\n\n#![deny(warnings)]\n#![allow(\n    confusable_idents,\n    unknown_lints,\n    mixed_script_confusables,\n    clippy::derive_partial_eq_without_eq,\n    clippy::extra_unused_type_parameters,\n    clippy::items_after_statements,\n    clippy::missing_errors_doc,\n    clippy::missing_panics_doc,\n    clippy::must_use_candidate,\n    // Clippy bug: https://github.com/rust-lang/rust-clippy/issues/7422\n    clippy::nonstandard_macro_braces,\n    clippy::ptr_arg,\n    clippy::too_many_lines,\n    clippy::trivially_copy_pass_by_ref,\n    clippy::type_repetition_in_bounds,\n    // We use lots of declarations inside function bodies to avoid conflicts,\n    // but they aren't used. We just want to make sure they compile.\n    dead_code,\n)]\n#![deny(clippy::collection_is_never_read)]\n\nuse serde::de::{Deserialize, DeserializeOwned, Deserializer};\nuse serde::ser::{Serialize, Serializer};\nuse serde_derive::{Deserialize, Serialize};\nuse std::borrow::Cow;\nuse std::marker::PhantomData;\nuse std::option::Option as StdOption;\nuse std::result::Result as StdResult;\n\n// Try to trip up the generated code if it fails to use fully qualified paths.\n#[allow(dead_code)]\nstruct Result;\n#[allow(dead_code)]\nstruct Ok;\n#[allow(dead_code)]\nstruct Err;\n#[allow(dead_code)]\nstruct Option;\n#[allow(dead_code)]\nstruct Some;\n#[allow(dead_code)]\nstruct None;\n\n//////////////////////////////////////////////////////////////////////////\n\n#[test]\nfn test_gen() {\n    #[derive(Serialize, Deserialize)]\n    struct With<T> {\n        t: T,\n        #[serde(serialize_with = \"ser_x\", deserialize_with = \"de_x\")]\n        x: X,\n    }\n    assert::<With<i32>>();\n\n    #[derive(Serialize, Deserialize)]\n    struct WithTogether<T> {\n        t: T,\n        #[serde(with = \"both_x\")]\n        x: X,\n    }\n    assert::<WithTogether<i32>>();\n\n    #[derive(Serialize, Deserialize)]\n    struct WithRef<'a, T: 'a> {\n        #[serde(skip_deserializing)]\n        t: StdOption<&'a T>,\n        #[serde(serialize_with = \"ser_x\", deserialize_with = \"de_x\")]\n        x: X,\n    }\n    assert::<WithRef<i32>>();\n\n    #[derive(Serialize, Deserialize)]\n    struct PhantomX {\n        x: PhantomData<X>,\n    }\n    assert::<PhantomX>();\n\n    #[derive(Serialize, Deserialize)]\n    struct PhantomT<T> {\n        t: PhantomData<T>,\n    }\n    assert::<PhantomT<X>>();\n\n    #[derive(Serialize, Deserialize)]\n    struct NoBounds<T> {\n        t: T,\n        option: StdOption<T>,\n        boxed: Box<T>,\n        option_boxed: StdOption<Box<T>>,\n    }\n    assert::<NoBounds<i32>>();\n\n    #[derive(Serialize, Deserialize)]\n    enum EnumWith<T> {\n        Unit,\n        Newtype(#[serde(serialize_with = \"ser_x\", deserialize_with = \"de_x\")] X),\n        Tuple(\n            T,\n            #[serde(serialize_with = \"ser_x\", deserialize_with = \"de_x\")] X,\n        ),\n        Struct {\n            t: T,\n            #[serde(serialize_with = \"ser_x\", deserialize_with = \"de_x\")]\n            x: X,\n        },\n    }\n    assert::<EnumWith<i32>>();\n\n    #[derive(Serialize)]\n    struct MultipleRef<'a, 'b, 'c, T>\n    where\n        T: 'c,\n        'c: 'b,\n        'b: 'a,\n    {\n        t: T,\n        rrrt: &'a &'b &'c T,\n    }\n    assert_ser::<MultipleRef<i32>>();\n\n    #[derive(Serialize, Deserialize)]\n    struct Newtype(#[serde(serialize_with = \"ser_x\", deserialize_with = \"de_x\")] X);\n    assert::<Newtype>();\n\n    #[derive(Serialize, Deserialize)]\n    struct Tuple<T>(\n        T,\n        #[serde(serialize_with = \"ser_x\", deserialize_with = \"de_x\")] X,\n    );\n    assert::<Tuple<i32>>();\n\n    #[derive(Serialize, Deserialize)]\n    enum TreeNode<D> {\n        Split {\n            left: Box<TreeNode<D>>,\n            right: Box<TreeNode<D>>,\n        },\n        Leaf {\n            data: D,\n        },\n    }\n    assert::<TreeNode<i32>>();\n\n    #[derive(Serialize, Deserialize)]\n    struct ListNode<D> {\n        data: D,\n        next: Box<ListNode<D>>,\n    }\n    assert::<ListNode<i32>>();\n\n    #[derive(Serialize, Deserialize)]\n    struct RecursiveA {\n        b: Box<RecursiveB>,\n    }\n    assert::<RecursiveA>();\n\n    #[derive(Serialize, Deserialize)]\n    enum RecursiveB {\n        A(RecursiveA),\n    }\n    assert::<RecursiveB>();\n\n    #[derive(Serialize, Deserialize)]\n    struct RecursiveGenericA<T> {\n        t: T,\n        b: Box<RecursiveGenericB<T>>,\n    }\n    assert::<RecursiveGenericA<i32>>();\n\n    #[derive(Serialize, Deserialize)]\n    enum RecursiveGenericB<T> {\n        T(T),\n        A(RecursiveGenericA<T>),\n    }\n    assert::<RecursiveGenericB<i32>>();\n\n    #[derive(Serialize)]\n    struct OptionStatic<'a> {\n        a: StdOption<&'a str>,\n        b: StdOption<&'static str>,\n    }\n    assert_ser::<OptionStatic>();\n\n    #[derive(Serialize, Deserialize)]\n    #[serde(bound = \"D: SerializeWith + DeserializeWith\")]\n    struct WithTraits1<D, E> {\n        #[serde(\n            serialize_with = \"SerializeWith::serialize_with\",\n            deserialize_with = \"DeserializeWith::deserialize_with\"\n        )]\n        d: D,\n        #[serde(\n            serialize_with = \"SerializeWith::serialize_with\",\n            deserialize_with = \"DeserializeWith::deserialize_with\",\n            bound = \"E: SerializeWith + DeserializeWith\"\n        )]\n        e: E,\n    }\n    assert::<WithTraits1<X, X>>();\n\n    #[derive(Serialize, Deserialize)]\n    #[serde(bound(serialize = \"D: SerializeWith\", deserialize = \"D: DeserializeWith\"))]\n    struct WithTraits2<D, E> {\n        #[serde(\n            serialize_with = \"SerializeWith::serialize_with\",\n            deserialize_with = \"DeserializeWith::deserialize_with\"\n        )]\n        d: D,\n        #[serde(\n            serialize_with = \"SerializeWith::serialize_with\",\n            bound(serialize = \"E: SerializeWith\")\n        )]\n        #[serde(\n            deserialize_with = \"DeserializeWith::deserialize_with\",\n            bound(deserialize = \"E: DeserializeWith\")\n        )]\n        e: E,\n    }\n    assert::<WithTraits2<X, X>>();\n\n    #[derive(Serialize, Deserialize)]\n    #[serde(bound = \"D: SerializeWith + DeserializeWith\")]\n    enum VariantWithTraits1<D, E> {\n        #[serde(\n            serialize_with = \"SerializeWith::serialize_with\",\n            deserialize_with = \"DeserializeWith::deserialize_with\"\n        )]\n        D(D),\n        #[serde(\n            serialize_with = \"SerializeWith::serialize_with\",\n            deserialize_with = \"DeserializeWith::deserialize_with\",\n            bound = \"E: SerializeWith + DeserializeWith\"\n        )]\n        E(E),\n    }\n    assert::<VariantWithTraits1<X, X>>();\n\n    #[derive(Serialize, Deserialize)]\n    #[serde(bound(serialize = \"D: SerializeWith\", deserialize = \"D: DeserializeWith\"))]\n    enum VariantWithTraits2<D, E> {\n        #[serde(\n            serialize_with = \"SerializeWith::serialize_with\",\n            deserialize_with = \"DeserializeWith::deserialize_with\"\n        )]\n        D(D),\n        #[serde(\n            serialize_with = \"SerializeWith::serialize_with\",\n            bound(serialize = \"E: SerializeWith\")\n        )]\n        #[serde(\n            deserialize_with = \"DeserializeWith::deserialize_with\",\n            bound(deserialize = \"E: DeserializeWith\")\n        )]\n        E(E),\n    }\n    assert::<VariantWithTraits2<X, X>>();\n\n    type PhantomDataAlias<T> = PhantomData<T>;\n\n    #[derive(Serialize, Deserialize)]\n    #[serde(bound = \"\")]\n    struct PhantomDataWrapper<T> {\n        #[serde(default)]\n        field: PhantomDataAlias<T>,\n    }\n    assert::<PhantomDataWrapper<X>>();\n\n    #[derive(Serialize, Deserialize)]\n    struct CowStr<'a>(Cow<'a, str>);\n    assert::<CowStr>();\n\n    #[derive(Serialize, Deserialize)]\n    #[serde(bound(deserialize = \"T::Owned: DeserializeOwned\"))]\n    struct CowT<'a, T: ?Sized + 'a + ToOwned>(Cow<'a, T>);\n    assert::<CowT<str>>();\n\n    #[derive(Serialize, Deserialize)]\n    struct EmptyStruct {}\n    assert::<EmptyStruct>();\n\n    #[derive(Serialize, Deserialize)]\n    enum EmptyEnumVariant {\n        EmptyStruct {},\n    }\n    assert::<EmptyEnumVariant>();\n\n    #[derive(Serialize, Deserialize)]\n    pub struct NonAsciiIdents {\n        σ: f64,\n    }\n\n    #[derive(Serialize, Deserialize)]\n    pub struct EmptyBraced {}\n\n    #[derive(Serialize, Deserialize)]\n    #[serde(deny_unknown_fields)]\n    pub struct EmptyBracedDenyUnknown {}\n\n    #[derive(Serialize, Deserialize)]\n    pub struct BracedSkipAll {\n        #[serde(skip_deserializing)]\n        f: u8,\n    }\n\n    #[derive(Serialize, Deserialize)]\n    #[serde(deny_unknown_fields)]\n    pub struct BracedSkipAllDenyUnknown {\n        #[serde(skip_deserializing)]\n        f: u8,\n    }\n\n    #[derive(Serialize, Deserialize)]\n    pub struct EmptyTuple();\n\n    #[derive(Serialize, Deserialize)]\n    #[serde(deny_unknown_fields)]\n    pub struct EmptyTupleDenyUnknown();\n\n    #[derive(Serialize, Deserialize)]\n    pub struct TupleSkipAll(#[serde(skip_deserializing)] u8);\n\n    #[derive(Serialize, Deserialize)]\n    #[serde(deny_unknown_fields)]\n    pub struct TupleSkipAllDenyUnknown(#[serde(skip_deserializing)] u8);\n\n    #[derive(Serialize, Deserialize)]\n    pub enum EmptyEnum {}\n\n    #[derive(Serialize, Deserialize)]\n    #[serde(deny_unknown_fields)]\n    pub enum EmptyEnumDenyUnknown {}\n\n    #[derive(Serialize, Deserialize)]\n    pub enum EnumSkipAll {\n        #[serde(skip_deserializing)]\n        #[allow(dead_code)]\n        Variant,\n    }\n\n    #[derive(Serialize, Deserialize)]\n    pub enum EmptyVariants {\n        Braced {},\n        Tuple(),\n        BracedSkip {\n            #[serde(skip_deserializing)]\n            f: u8,\n        },\n        TupleSkip(#[serde(skip_deserializing)] u8),\n    }\n\n    #[derive(Serialize, Deserialize)]\n    #[serde(deny_unknown_fields)]\n    pub enum EmptyVariantsDenyUnknown {\n        Braced {},\n        Tuple(),\n        BracedSkip {\n            #[serde(skip_deserializing)]\n            f: u8,\n        },\n        TupleSkip(#[serde(skip_deserializing)] u8),\n    }\n\n    #[derive(Serialize, Deserialize)]\n    #[serde(deny_unknown_fields)]\n    pub struct UnitDenyUnknown;\n\n    #[derive(Serialize, Deserialize)]\n    pub struct EmptyArray {\n        empty: [X; 0],\n    }\n\n    pub enum Or<A, B> {\n        A(A),\n        B(B),\n    }\n\n    #[derive(Serialize, Deserialize)]\n    #[serde(untagged, remote = \"Or\")]\n    pub enum OrDef<A, B> {\n        A(A),\n        B(B),\n    }\n\n    struct Str<'a>(&'a str);\n\n    #[derive(Serialize, Deserialize)]\n    #[serde(remote = \"Str\")]\n    struct StrDef<'a>(&'a str);\n\n    #[derive(Serialize, Deserialize)]\n    pub struct Remote<'a> {\n        #[serde(with = \"OrDef\")]\n        or: Or<u8, bool>,\n        #[serde(borrow, with = \"StrDef\")]\n        s: Str<'a>,\n    }\n\n    #[derive(Serialize, Deserialize)]\n    pub enum BorrowVariant<'a> {\n        #[serde(borrow, with = \"StrDef\")]\n        S(Str<'a>),\n    }\n\n    mod vis {\n        use serde_derive::{Deserialize, Serialize};\n\n        pub struct S;\n\n        #[derive(Serialize, Deserialize)]\n        #[serde(remote = \"S\")]\n        pub struct SDef;\n    }\n\n    // This would not work if SDef::serialize / deserialize are private.\n    #[derive(Serialize, Deserialize)]\n    pub struct RemoteVisibility {\n        #[serde(with = \"vis::SDef\")]\n        s: vis::S,\n    }\n\n    #[derive(Serialize, Deserialize)]\n    #[serde(remote = \"Self\")]\n    pub struct RemoteSelf;\n\n    #[derive(Serialize, Deserialize)]\n    enum ExternallyTaggedVariantWith {\n        #[serde(serialize_with = \"ser_x\")]\n        #[serde(deserialize_with = \"de_x\")]\n        #[allow(dead_code)]\n        Newtype(X),\n\n        #[serde(serialize_with = \"serialize_some_other_variant\")]\n        #[serde(deserialize_with = \"deserialize_some_other_variant\")]\n        #[allow(dead_code)]\n        Tuple(String, u8),\n\n        #[serde(serialize_with = \"ser_x\")]\n        #[serde(deserialize_with = \"de_x\")]\n        #[allow(dead_code)]\n        Struct1 { x: X },\n\n        #[serde(serialize_with = \"serialize_some_other_variant\")]\n        #[serde(deserialize_with = \"deserialize_some_other_variant\")]\n        #[allow(dead_code)]\n        Struct { f1: String, f2: u8 },\n\n        #[serde(serialize_with = \"serialize_some_unit_variant\")]\n        #[serde(deserialize_with = \"deserialize_some_unit_variant\")]\n        #[allow(dead_code)]\n        Unit,\n    }\n    assert_ser::<ExternallyTaggedVariantWith>();\n\n    #[derive(Serialize, Deserialize)]\n    #[serde(tag = \"t\")]\n    enum InternallyTaggedVariantWith {\n        #[serde(serialize_with = \"ser_x\")]\n        #[serde(deserialize_with = \"de_x\")]\n        #[allow(dead_code)]\n        Newtype(X),\n\n        #[serde(serialize_with = \"ser_x\")]\n        #[serde(deserialize_with = \"de_x\")]\n        #[allow(dead_code)]\n        Struct1 { x: X },\n\n        #[serde(serialize_with = \"serialize_some_other_variant\")]\n        #[serde(deserialize_with = \"deserialize_some_other_variant\")]\n        #[allow(dead_code)]\n        Struct { f1: String, f2: u8 },\n\n        #[serde(serialize_with = \"serialize_some_unit_variant\")]\n        #[serde(deserialize_with = \"deserialize_some_unit_variant\")]\n        #[allow(dead_code)]\n        Unit,\n    }\n    assert_ser::<InternallyTaggedVariantWith>();\n\n    #[derive(Serialize, Deserialize)]\n    #[serde(tag = \"t\", content = \"c\")]\n    enum AdjacentlyTaggedVariantWith {\n        #[serde(serialize_with = \"ser_x\")]\n        #[serde(deserialize_with = \"de_x\")]\n        #[allow(dead_code)]\n        Newtype(X),\n\n        #[serde(serialize_with = \"serialize_some_other_variant\")]\n        #[serde(deserialize_with = \"deserialize_some_other_variant\")]\n        #[allow(dead_code)]\n        Tuple(String, u8),\n\n        #[serde(serialize_with = \"ser_x\")]\n        #[serde(deserialize_with = \"de_x\")]\n        #[allow(dead_code)]\n        Struct1 { x: X },\n\n        #[serde(serialize_with = \"serialize_some_other_variant\")]\n        #[serde(deserialize_with = \"deserialize_some_other_variant\")]\n        #[allow(dead_code)]\n        Struct { f1: String, f2: u8 },\n\n        #[serde(serialize_with = \"serialize_some_unit_variant\")]\n        #[serde(deserialize_with = \"deserialize_some_unit_variant\")]\n        #[allow(dead_code)]\n        Unit,\n    }\n    assert_ser::<AdjacentlyTaggedVariantWith>();\n\n    #[derive(Serialize, Deserialize)]\n    #[serde(untagged)]\n    enum UntaggedVariantWith {\n        #[serde(serialize_with = \"ser_x\")]\n        #[serde(deserialize_with = \"de_x\")]\n        #[allow(dead_code)]\n        Newtype(X),\n\n        #[serde(serialize_with = \"serialize_some_other_variant\")]\n        #[serde(deserialize_with = \"deserialize_some_other_variant\")]\n        #[allow(dead_code)]\n        Tuple(String, u8),\n\n        #[serde(serialize_with = \"ser_x\")]\n        #[serde(deserialize_with = \"de_x\")]\n        #[allow(dead_code)]\n        Struct1 { x: X },\n\n        #[serde(serialize_with = \"serialize_some_other_variant\")]\n        #[serde(deserialize_with = \"deserialize_some_other_variant\")]\n        #[allow(dead_code)]\n        Struct { f1: String, f2: u8 },\n\n        #[serde(serialize_with = \"serialize_some_unit_variant\")]\n        #[serde(deserialize_with = \"deserialize_some_unit_variant\")]\n        #[allow(dead_code)]\n        Unit,\n    }\n    assert_ser::<UntaggedVariantWith>();\n\n    #[derive(Serialize, Deserialize)]\n    struct FlattenWith {\n        #[serde(flatten, serialize_with = \"ser_x\", deserialize_with = \"de_x\")]\n        x: X,\n    }\n    assert::<FlattenWith>();\n\n    #[derive(Serialize, Deserialize)]\n    pub struct Flatten<T> {\n        #[serde(flatten)]\n        t: T,\n    }\n\n    #[derive(Serialize, Deserialize)]\n    #[serde(deny_unknown_fields)]\n    pub struct FlattenDenyUnknown<T> {\n        #[serde(flatten)]\n        t: T,\n    }\n\n    #[derive(Serialize, Deserialize)]\n    pub struct SkipDeserializing<T> {\n        #[serde(skip_deserializing)]\n        flat: T,\n    }\n\n    #[derive(Serialize, Deserialize)]\n    #[serde(deny_unknown_fields)]\n    pub struct SkipDeserializingDenyUnknown<T> {\n        #[serde(skip_deserializing)]\n        flat: T,\n    }\n\n    #[derive(Serialize, Deserialize)]\n    pub struct StaticStrStruct<'a> {\n        a: &'a str,\n        b: &'static str,\n    }\n\n    #[derive(Serialize, Deserialize)]\n    pub struct StaticStrTupleStruct<'a>(&'a str, &'static str);\n\n    #[derive(Serialize, Deserialize)]\n    pub struct StaticStrNewtypeStruct(&'static str);\n\n    #[derive(Serialize, Deserialize)]\n    pub enum StaticStrEnum<'a> {\n        Struct { a: &'a str, b: &'static str },\n        Tuple(&'a str, &'static str),\n        Newtype(&'static str),\n    }\n\n    #[derive(Serialize, Deserialize)]\n    struct SkippedStaticStr {\n        #[serde(skip_deserializing)]\n        skipped: &'static str,\n        other: isize,\n    }\n    assert::<SkippedStaticStr>();\n\n    macro_rules! T {\n        () => {\n            ()\n        };\n    }\n\n    #[derive(Serialize, Deserialize)]\n    struct TypeMacro<T> {\n        mac: T!(),\n        marker: PhantomData<T>,\n    }\n    assert::<TypeMacro<X>>();\n\n    #[derive(Serialize)]\n    struct BigArray {\n        #[serde(serialize_with = \"<[_]>::serialize\")]\n        array: [u8; 256],\n    }\n    assert_ser::<BigArray>();\n\n    trait AssocSerde {\n        type Assoc;\n    }\n\n    struct NoSerdeImpl;\n    impl AssocSerde for NoSerdeImpl {\n        type Assoc = u32;\n    }\n\n    #[derive(Serialize, Deserialize)]\n    struct AssocDerive<T: AssocSerde> {\n        assoc: T::Assoc,\n    }\n\n    assert::<AssocDerive<NoSerdeImpl>>();\n\n    #[derive(Serialize, Deserialize)]\n    struct AssocDeriveMulti<S, T: AssocSerde> {\n        s: S,\n        assoc: T::Assoc,\n    }\n\n    assert::<AssocDeriveMulti<i32, NoSerdeImpl>>();\n\n    #[derive(Serialize)]\n    #[serde(tag = \"t\", content = \"c\")]\n    enum EmptyAdjacentlyTagged {\n        #[allow(dead_code)]\n        Struct {},\n        #[allow(dead_code)]\n        Tuple(),\n    }\n\n    assert_ser::<EmptyAdjacentlyTagged>();\n\n    mod restricted {\n        mod inner {\n            use serde_derive::{Deserialize, Serialize};\n\n            #[derive(Serialize, Deserialize)]\n            #[allow(dead_code)]\n            struct Restricted {\n                pub(super) a: usize,\n                pub(in super::inner) b: usize,\n            }\n        }\n    }\n\n    #[derive(Deserialize)]\n    #[serde(tag = \"t\", content = \"c\")]\n    pub enum AdjacentlyTaggedVoid {}\n\n    #[derive(Serialize, Deserialize)]\n    enum SkippedVariant<T> {\n        #[serde(skip)]\n        #[allow(dead_code)]\n        T(T),\n        Unit,\n    }\n\n    assert::<SkippedVariant<X>>();\n\n    #[derive(Deserialize)]\n    pub struct ImplicitlyBorrowedOption<'a> {\n        option: std::option::Option<&'a str>,\n    }\n\n    #[derive(Serialize, Deserialize)]\n    #[serde(untagged)]\n    #[allow(dead_code)]\n    pub enum UntaggedNewtypeVariantWith {\n        Newtype(\n            #[serde(serialize_with = \"ser_x\")]\n            #[serde(deserialize_with = \"de_x\")]\n            X,\n        ),\n    }\n\n    #[derive(Serialize, Deserialize)]\n    #[serde(transparent)]\n    #[allow(dead_code)]\n    pub struct TransparentWith {\n        #[serde(serialize_with = \"ser_x\")]\n        #[serde(deserialize_with = \"de_x\")]\n        x: X,\n    }\n\n    #[derive(Deserialize)]\n    #[serde(untagged)]\n    #[allow(dead_code)]\n    pub enum UntaggedWithBorrow<'a> {\n        Single(\n            #[serde(borrow)]\n            #[allow(dead_code)]\n            RelObject<'a>,\n        ),\n        Many(\n            #[serde(borrow)]\n            #[allow(dead_code)]\n            Vec<RelObject<'a>>,\n        ),\n    }\n\n    #[derive(Deserialize)]\n    pub struct RelObject<'a> {\n        ty: &'a str,\n        id: String,\n    }\n\n    #[derive(Serialize, Deserialize)]\n    pub struct FlattenSkipSerializing<T> {\n        #[serde(flatten, skip_serializing)]\n        #[allow(dead_code)]\n        flat: T,\n    }\n\n    #[derive(Serialize, Deserialize)]\n    pub struct FlattenSkipSerializingIf<T> {\n        #[serde(flatten, skip_serializing_if = \"StdOption::is_none\")]\n        flat: StdOption<T>,\n    }\n\n    #[derive(Serialize, Deserialize)]\n    pub struct FlattenSkipDeserializing<T> {\n        #[serde(flatten, skip_deserializing)]\n        flat: T,\n    }\n\n    #[derive(Serialize, Deserialize)]\n    #[serde(untagged)]\n    pub enum Inner<T> {\n        Builder {\n            s: T,\n            #[serde(flatten)]\n            o: T,\n        },\n        Default {\n            s: T,\n        },\n    }\n\n    // https://github.com/serde-rs/serde/issues/1804\n    #[derive(Serialize, Deserialize)]\n    pub enum Message {\n        #[serde(skip)]\n        #[allow(dead_code)]\n        String(String),\n        #[serde(other)]\n        Unknown,\n    }\n\n    #[derive(Serialize)]\n    #[repr(C, packed)]\n    #[allow(dead_code)]\n    struct Packed {\n        x: u8,\n        y: u16,\n    }\n\n    macro_rules! deriving {\n        ($field:ty) => {\n            #[derive(Deserialize)]\n            pub struct MacroRules<'a> {\n                field: $field,\n            }\n        };\n    }\n\n    deriving!(&'a str);\n\n    macro_rules! mac {\n        ($($tt:tt)*) => {\n            $($tt)*\n        };\n    }\n\n    #[derive(Deserialize)]\n    pub struct BorrowLifetimeInsideMacro<'a> {\n        #[serde(borrow = \"'a\")]\n        pub f: mac!(Cow<'a, str>),\n    }\n\n    #[derive(Serialize)]\n    pub struct Struct {\n        #[serde(serialize_with = \"vec_first_element\")]\n        pub vec: Vec<Self>,\n    }\n\n    assert_ser::<Struct>();\n\n    #[derive(Deserialize)]\n    #[serde(bound(deserialize = \"[&'de str; N]: Copy\"))]\n    pub struct GenericUnitStruct<const N: usize>;\n}\n\n//////////////////////////////////////////////////////////////////////////\n\nfn assert<T: Serialize + DeserializeOwned>() {}\nfn assert_ser<T: Serialize>() {}\n\ntrait SerializeWith {\n    fn serialize_with<S: Serializer>(_: &Self, _: S) -> StdResult<S::Ok, S::Error>;\n}\n\ntrait DeserializeWith: Sized {\n    fn deserialize_with<'de, D: Deserializer<'de>>(_: D) -> StdResult<Self, D::Error>;\n}\n\n// Implements neither Serialize nor Deserialize\npub struct X;\n\npub fn ser_x<S: Serializer>(_: &X, _: S) -> StdResult<S::Ok, S::Error> {\n    unimplemented!()\n}\n\npub fn de_x<'de, D: Deserializer<'de>>(_: D) -> StdResult<X, D::Error> {\n    unimplemented!()\n}\n\nmod both_x {\n    pub use super::{de_x as deserialize, ser_x as serialize};\n}\n\nimpl SerializeWith for X {\n    fn serialize_with<S: Serializer>(_: &Self, _: S) -> StdResult<S::Ok, S::Error> {\n        unimplemented!()\n    }\n}\n\nimpl DeserializeWith for X {\n    fn deserialize_with<'de, D: Deserializer<'de>>(_: D) -> StdResult<Self, D::Error> {\n        unimplemented!()\n    }\n}\n\npub fn serialize_some_unit_variant<S>(_: S) -> StdResult<S::Ok, S::Error>\nwhere\n    S: Serializer,\n{\n    unimplemented!()\n}\n\npub fn deserialize_some_unit_variant<'de, D>(_: D) -> StdResult<(), D::Error>\nwhere\n    D: Deserializer<'de>,\n{\n    unimplemented!()\n}\n\npub fn serialize_some_other_variant<S>(_: &str, _: &u8, _: S) -> StdResult<S::Ok, S::Error>\nwhere\n    S: Serializer,\n{\n    unimplemented!()\n}\n\npub fn deserialize_some_other_variant<'de, D>(_: D) -> StdResult<(String, u8), D::Error>\nwhere\n    D: Deserializer<'de>,\n{\n    unimplemented!()\n}\n\npub fn is_zero(n: &u8) -> bool {\n    *n == 0\n}\n\nfn vec_first_element<T, S>(vec: &[T], serializer: S) -> StdResult<S::Ok, S::Error>\nwhere\n    T: Serialize,\n    S: Serializer,\n{\n    vec.first().serialize(serializer)\n}\n\n//////////////////////////////////////////////////////////////////////////\n\n#[derive(Debug, PartialEq, Deserialize)]\n#[serde(tag = \"tag\")]\npub enum InternallyTagged {\n    #[serde(deserialize_with = \"deserialize_generic\")]\n    Unit,\n\n    #[serde(deserialize_with = \"deserialize_generic\")]\n    Newtype(i32),\n\n    #[serde(deserialize_with = \"deserialize_generic\")]\n    Struct { f1: String, f2: u8 },\n}\n\nfn deserialize_generic<'de, T, D>(deserializer: D) -> StdResult<T, D::Error>\nwhere\n    T: Deserialize<'de>,\n    D: Deserializer<'de>,\n{\n    T::deserialize(deserializer)\n}\n\n//////////////////////////////////////////////////////////////////////////\n\n#[repr(C, packed)]\npub struct RemotePacked {\n    pub a: u16,\n    pub b: u32,\n}\n\n#[derive(Serialize)]\n#[repr(C, packed)]\n#[serde(remote = \"RemotePacked\")]\npub struct RemotePackedDef {\n    a: u16,\n    b: u32,\n}\n\nimpl Drop for RemotePackedDef {\n    fn drop(&mut self) {}\n}\n\n#[repr(C, packed)]\npub struct RemotePackedNonCopy {\n    pub a: u16,\n    pub b: String,\n}\n\n#[derive(Deserialize)]\n#[repr(C, packed)]\n#[serde(remote = \"RemotePackedNonCopy\")]\npub struct RemotePackedNonCopyDef {\n    a: u16,\n    b: String,\n}\n\nimpl Drop for RemotePackedNonCopyDef {\n    fn drop(&mut self) {}\n}\n"
  },
  {
    "path": "test_suite/tests/test_identifier.rs",
    "content": "//! Tests for `#[serde(field_identifier)]` and `#[serde(variant_identifier)]`\n\n#![allow(clippy::derive_partial_eq_without_eq)]\n\nuse serde_derive::Deserialize;\nuse serde_test::{assert_de_tokens, assert_de_tokens_error, Token};\n\nmod variant_identifier {\n    use super::*;\n\n    #[derive(Deserialize, Debug, PartialEq)]\n    #[serde(variant_identifier)]\n    enum V {\n        Aaa,\n        #[serde(alias = \"Ccc\", alias = \"Ddd\")]\n        Bbb,\n    }\n\n    #[test]\n    fn variant1() {\n        assert_de_tokens(&V::Aaa, &[Token::U8(0)]);\n        assert_de_tokens(&V::Aaa, &[Token::U16(0)]);\n        assert_de_tokens(&V::Aaa, &[Token::U32(0)]);\n        assert_de_tokens(&V::Aaa, &[Token::U64(0)]);\n        assert_de_tokens(&V::Aaa, &[Token::Str(\"Aaa\")]);\n        assert_de_tokens(&V::Aaa, &[Token::Bytes(b\"Aaa\")]);\n    }\n\n    #[test]\n    fn aliases() {\n        assert_de_tokens(&V::Bbb, &[Token::U8(1)]);\n        assert_de_tokens(&V::Bbb, &[Token::U16(1)]);\n        assert_de_tokens(&V::Bbb, &[Token::U32(1)]);\n        assert_de_tokens(&V::Bbb, &[Token::U64(1)]);\n\n        assert_de_tokens(&V::Bbb, &[Token::Str(\"Bbb\")]);\n        assert_de_tokens(&V::Bbb, &[Token::Bytes(b\"Bbb\")]);\n\n        assert_de_tokens(&V::Bbb, &[Token::Str(\"Ccc\")]);\n        assert_de_tokens(&V::Bbb, &[Token::Bytes(b\"Ccc\")]);\n\n        assert_de_tokens(&V::Bbb, &[Token::Str(\"Ddd\")]);\n        assert_de_tokens(&V::Bbb, &[Token::Bytes(b\"Ddd\")]);\n    }\n\n    #[test]\n    fn unknown() {\n        assert_de_tokens_error::<V>(\n            &[Token::U8(42)],\n            \"invalid value: integer `42`, expected variant index 0 <= i < 2\",\n        );\n        assert_de_tokens_error::<V>(\n            &[Token::U16(42)],\n            \"invalid value: integer `42`, expected variant index 0 <= i < 2\",\n        );\n        assert_de_tokens_error::<V>(\n            &[Token::U32(42)],\n            \"invalid value: integer `42`, expected variant index 0 <= i < 2\",\n        );\n        assert_de_tokens_error::<V>(\n            &[Token::U64(42)],\n            \"invalid value: integer `42`, expected variant index 0 <= i < 2\",\n        );\n        assert_de_tokens_error::<V>(\n            &[Token::Str(\"Unknown\")],\n            \"unknown variant `Unknown`, expected one of `Aaa`, `Bbb`, `Ccc`, `Ddd`\",\n        );\n        assert_de_tokens_error::<V>(\n            &[Token::Bytes(b\"Unknown\")],\n            \"unknown variant `Unknown`, expected one of `Aaa`, `Bbb`, `Ccc`, `Ddd`\",\n        );\n    }\n}\n\nmod field_identifier {\n    use super::*;\n\n    #[derive(Deserialize, Debug, PartialEq)]\n    #[serde(field_identifier, rename_all = \"snake_case\")]\n    enum F {\n        Aaa,\n        #[serde(alias = \"ccc\", alias = \"ddd\")]\n        Bbb,\n    }\n\n    #[test]\n    fn field1() {\n        assert_de_tokens(&F::Aaa, &[Token::U8(0)]);\n        assert_de_tokens(&F::Aaa, &[Token::U16(0)]);\n        assert_de_tokens(&F::Aaa, &[Token::U32(0)]);\n        assert_de_tokens(&F::Aaa, &[Token::U64(0)]);\n        assert_de_tokens(&F::Aaa, &[Token::Str(\"aaa\")]);\n        assert_de_tokens(&F::Aaa, &[Token::Bytes(b\"aaa\")]);\n    }\n\n    #[test]\n    fn aliases() {\n        assert_de_tokens(&F::Bbb, &[Token::U8(1)]);\n        assert_de_tokens(&F::Bbb, &[Token::U16(1)]);\n        assert_de_tokens(&F::Bbb, &[Token::U32(1)]);\n        assert_de_tokens(&F::Bbb, &[Token::U64(1)]);\n\n        assert_de_tokens(&F::Bbb, &[Token::Str(\"bbb\")]);\n        assert_de_tokens(&F::Bbb, &[Token::Bytes(b\"bbb\")]);\n\n        assert_de_tokens(&F::Bbb, &[Token::Str(\"ccc\")]);\n        assert_de_tokens(&F::Bbb, &[Token::Bytes(b\"ccc\")]);\n\n        assert_de_tokens(&F::Bbb, &[Token::Str(\"ddd\")]);\n        assert_de_tokens(&F::Bbb, &[Token::Bytes(b\"ddd\")]);\n    }\n\n    #[test]\n    fn unknown() {\n        assert_de_tokens_error::<F>(\n            &[Token::U8(42)],\n            \"invalid value: integer `42`, expected field index 0 <= i < 2\",\n        );\n        assert_de_tokens_error::<F>(\n            &[Token::U16(42)],\n            \"invalid value: integer `42`, expected field index 0 <= i < 2\",\n        );\n        assert_de_tokens_error::<F>(\n            &[Token::U32(42)],\n            \"invalid value: integer `42`, expected field index 0 <= i < 2\",\n        );\n        assert_de_tokens_error::<F>(\n            &[Token::U64(42)],\n            \"invalid value: integer `42`, expected field index 0 <= i < 2\",\n        );\n        assert_de_tokens_error::<F>(\n            &[Token::Str(\"unknown\")],\n            \"unknown field `unknown`, expected one of `aaa`, `bbb`, `ccc`, `ddd`\",\n        );\n        assert_de_tokens_error::<F>(\n            &[Token::Bytes(b\"unknown\")],\n            \"unknown field `unknown`, expected one of `aaa`, `bbb`, `ccc`, `ddd`\",\n        );\n    }\n\n    #[test]\n    fn unit_fallthrough() {\n        #[derive(Deserialize, Debug, PartialEq)]\n        #[serde(field_identifier, rename_all = \"snake_case\")]\n        enum F {\n            Aaa,\n            Bbb,\n            #[serde(other)]\n            Other,\n        }\n\n        assert_de_tokens(&F::Other, &[Token::U8(42)]);\n        assert_de_tokens(&F::Other, &[Token::U16(42)]);\n        assert_de_tokens(&F::Other, &[Token::U32(42)]);\n        assert_de_tokens(&F::Other, &[Token::U64(42)]);\n        assert_de_tokens(&F::Other, &[Token::Str(\"x\")]);\n    }\n\n    #[test]\n    fn newtype_fallthrough() {\n        #[derive(Deserialize, Debug, PartialEq)]\n        #[serde(field_identifier, rename_all = \"snake_case\")]\n        enum F {\n            Aaa,\n            Bbb,\n            Other(String),\n        }\n\n        assert_de_tokens(&F::Other(\"x\".to_owned()), &[Token::Str(\"x\")]);\n    }\n\n    #[test]\n    fn newtype_fallthrough_generic() {\n        #[derive(Deserialize, Debug, PartialEq)]\n        #[serde(field_identifier, rename_all = \"snake_case\")]\n        enum F<T> {\n            Aaa,\n            Bbb,\n            Other(T),\n        }\n\n        assert_de_tokens(&F::Other(42u8), &[Token::U8(42)]);\n        assert_de_tokens(&F::Other(42u16), &[Token::U16(42)]);\n        assert_de_tokens(&F::Other(42u32), &[Token::U32(42)]);\n        assert_de_tokens(&F::Other(42u64), &[Token::U64(42)]);\n        assert_de_tokens(&F::Other(\"x\".to_owned()), &[Token::Str(\"x\")]);\n    }\n}\n"
  },
  {
    "path": "test_suite/tests/test_ignored_any.rs",
    "content": "#![allow(clippy::derive_partial_eq_without_eq)]\n\nuse serde::de::value::{Error, MapDeserializer, SeqDeserializer};\nuse serde::de::{\n    Deserialize, DeserializeSeed, Deserializer, EnumAccess, IgnoredAny, IntoDeserializer,\n    VariantAccess, Visitor,\n};\nuse serde::forward_to_deserialize_any;\nuse serde_derive::Deserialize;\n\n#[derive(PartialEq, Debug, Deserialize)]\nenum Target {\n    Unit,\n    Newtype(i32),\n    Tuple(i32, i32),\n    Struct { a: i32 },\n}\n\nstruct Enum(&'static str);\n\nimpl<'de> Deserializer<'de> for Enum {\n    type Error = Error;\n\n    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>,\n    {\n        visitor.visit_enum(self)\n    }\n\n    forward_to_deserialize_any! {\n        bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string\n        bytes byte_buf option unit unit_struct newtype_struct seq tuple\n        tuple_struct map struct enum identifier ignored_any\n    }\n}\n\nimpl<'de> EnumAccess<'de> for Enum {\n    type Error = Error;\n    type Variant = Self;\n\n    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>\n    where\n        V: DeserializeSeed<'de>,\n    {\n        let v = seed.deserialize(self.0.into_deserializer())?;\n        Ok((v, self))\n    }\n}\n\nimpl<'de> VariantAccess<'de> for Enum {\n    type Error = Error;\n\n    fn unit_variant(self) -> Result<(), Self::Error> {\n        Ok(())\n    }\n\n    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>\n    where\n        T: DeserializeSeed<'de>,\n    {\n        seed.deserialize(10i32.into_deserializer())\n    }\n\n    fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>,\n    {\n        let seq = SeqDeserializer::new(vec![1i32, 2].into_iter());\n        visitor.visit_seq(seq)\n    }\n\n    fn struct_variant<V>(\n        self,\n        _fields: &'static [&'static str],\n        visitor: V,\n    ) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>,\n    {\n        let map = MapDeserializer::new(vec![(\"a\", 10i32)].into_iter());\n        visitor.visit_map(map)\n    }\n}\n\n#[test]\nfn test_deserialize_enum() {\n    // First just make sure the Deserializer impl works\n    assert_eq!(Target::Unit, Target::deserialize(Enum(\"Unit\")).unwrap());\n    assert_eq!(\n        Target::Newtype(10),\n        Target::deserialize(Enum(\"Newtype\")).unwrap()\n    );\n    assert_eq!(\n        Target::Tuple(1, 2),\n        Target::deserialize(Enum(\"Tuple\")).unwrap()\n    );\n    assert_eq!(\n        Target::Struct { a: 10 },\n        Target::deserialize(Enum(\"Struct\")).unwrap()\n    );\n\n    // Now try IgnoredAny\n    IgnoredAny::deserialize(Enum(\"Unit\")).unwrap();\n    IgnoredAny::deserialize(Enum(\"Newtype\")).unwrap();\n    IgnoredAny::deserialize(Enum(\"Tuple\")).unwrap();\n    IgnoredAny::deserialize(Enum(\"Struct\")).unwrap();\n}\n"
  },
  {
    "path": "test_suite/tests/test_macros.rs",
    "content": "#![deny(trivial_numeric_casts)]\n#![allow(\n    clippy::derive_partial_eq_without_eq,\n    clippy::enum_variant_names,\n    clippy::redundant_field_names,\n    clippy::too_many_lines\n)]\n\nuse serde_derive::{Deserialize, Serialize};\nuse serde_test::{assert_de_tokens, assert_ser_tokens, assert_tokens, Token};\nuse std::marker::PhantomData;\n\n// That tests that the derived Serialize implementation doesn't trigger\n// any warning about `serializer` not being used, in case of empty enums.\n#[derive(Serialize)]\n#[allow(dead_code)]\n#[deny(unused_variables)]\nenum Void {}\n\n#[derive(Debug, PartialEq, Serialize, Deserialize)]\nstruct NamedUnit;\n\n#[derive(Debug, PartialEq, Serialize)]\nstruct SerNamedTuple<'a, 'b, A: 'a, B: 'b, C>(&'a A, &'b mut B, C);\n\n#[derive(Debug, PartialEq, Deserialize)]\nstruct DeNamedTuple<A, B, C>(A, B, C);\n\n#[derive(Debug, PartialEq, Serialize)]\nstruct SerNamedMap<'a, 'b, A: 'a, B: 'b, C> {\n    a: &'a A,\n    b: &'b mut B,\n    c: C,\n}\n\n#[derive(Debug, PartialEq, Deserialize)]\nstruct DeNamedMap<A, B, C> {\n    a: A,\n    b: B,\n    c: C,\n}\n\n#[derive(Debug, PartialEq, Serialize)]\nenum SerEnum<'a, B: 'a, C: 'a, D>\nwhere\n    D: 'a,\n{\n    Unit,\n    Seq(i8, B, &'a C, &'a mut D),\n    Map { a: i8, b: B, c: &'a C, d: &'a mut D },\n\n    // Make sure we can support more than one variant.\n    _Unit2,\n    _Seq2(i8, B, &'a C, &'a mut D),\n    _Map2 { a: i8, b: B, c: &'a C, d: &'a mut D },\n}\n\n#[derive(Debug, PartialEq, Serialize, Deserialize)]\nenum DeEnum<B, C, D> {\n    Unit,\n    Seq(i8, B, C, D),\n    Map { a: i8, b: B, c: C, d: D },\n\n    // Make sure we can support more than one variant.\n    _Unit2,\n    _Seq2(i8, B, C, D),\n    _Map2 { a: i8, b: B, c: C, d: D },\n}\n\n#[derive(Serialize)]\nenum Lifetimes<'a> {\n    LifetimeSeq(&'a i32),\n    NoLifetimeSeq(i32),\n    LifetimeMap { a: &'a i32 },\n    NoLifetimeMap { a: i32 },\n}\n\n#[derive(Debug, PartialEq, Serialize, Deserialize)]\npub struct GenericStruct<T> {\n    x: T,\n}\n\n#[derive(Debug, PartialEq, Serialize, Deserialize)]\npub struct GenericNewTypeStruct<T>(T);\n\n#[derive(Debug, PartialEq, Serialize, Deserialize)]\npub struct GenericTupleStruct<T, U>(T, U);\n\n#[derive(Debug, PartialEq, Serialize, Deserialize)]\npub enum GenericEnum<T, U> {\n    Unit,\n    NewType(T),\n    Seq(T, U),\n    Map { x: T, y: U },\n}\n\ntrait AssociatedType {\n    type X;\n}\n\nimpl AssociatedType for i32 {\n    type X = i32;\n}\n\n#[derive(Debug, PartialEq, Serialize, Deserialize)]\nstruct DefaultTyParam<T: AssociatedType<X = i32> = i32> {\n    phantom: PhantomData<T>,\n}\n\n#[test]\nfn test_named_unit() {\n    assert_tokens(&NamedUnit, &[Token::UnitStruct { name: \"NamedUnit\" }]);\n}\n\n#[test]\nfn test_ser_named_tuple() {\n    let a = 5;\n    let mut b = 6;\n    let c = 7;\n    assert_ser_tokens(\n        &SerNamedTuple(&a, &mut b, c),\n        &[\n            Token::TupleStruct {\n                name: \"SerNamedTuple\",\n                len: 3,\n            },\n            Token::I32(5),\n            Token::I32(6),\n            Token::I32(7),\n            Token::TupleStructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_de_named_tuple() {\n    assert_de_tokens(\n        &DeNamedTuple(5, 6, 7),\n        &[\n            Token::Seq { len: Some(3) },\n            Token::I32(5),\n            Token::I32(6),\n            Token::I32(7),\n            Token::SeqEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &DeNamedTuple(5, 6, 7),\n        &[\n            Token::TupleStruct {\n                name: \"DeNamedTuple\",\n                len: 3,\n            },\n            Token::I32(5),\n            Token::I32(6),\n            Token::I32(7),\n            Token::TupleStructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_ser_named_map() {\n    let a = 5;\n    let mut b = 6;\n    let c = 7;\n\n    assert_ser_tokens(\n        &SerNamedMap {\n            a: &a,\n            b: &mut b,\n            c: c,\n        },\n        &[\n            Token::Struct {\n                name: \"SerNamedMap\",\n                len: 3,\n            },\n            Token::Str(\"a\"),\n            Token::I32(5),\n            Token::Str(\"b\"),\n            Token::I32(6),\n            Token::Str(\"c\"),\n            Token::I32(7),\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_de_named_map() {\n    assert_de_tokens(\n        &DeNamedMap { a: 5, b: 6, c: 7 },\n        &[\n            Token::Struct {\n                name: \"DeNamedMap\",\n                len: 3,\n            },\n            Token::Str(\"a\"),\n            Token::I32(5),\n            Token::Str(\"b\"),\n            Token::I32(6),\n            Token::Str(\"c\"),\n            Token::I32(7),\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_ser_enum_unit() {\n    assert_ser_tokens(\n        &SerEnum::Unit::<u32, u32, u32>,\n        &[Token::UnitVariant {\n            name: \"SerEnum\",\n            variant: \"Unit\",\n        }],\n    );\n}\n\n#[test]\nfn test_ser_enum_seq() {\n    let a = 1;\n    let b = 2;\n    let c = 3;\n    let mut d = 4;\n\n    assert_ser_tokens(\n        &SerEnum::Seq(a, b, &c, &mut d),\n        &[\n            Token::TupleVariant {\n                name: \"SerEnum\",\n                variant: \"Seq\",\n                len: 4,\n            },\n            Token::I8(1),\n            Token::I32(2),\n            Token::I32(3),\n            Token::I32(4),\n            Token::TupleVariantEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_ser_enum_map() {\n    let a = 1;\n    let b = 2;\n    let c = 3;\n    let mut d = 4;\n\n    assert_ser_tokens(\n        &SerEnum::Map {\n            a: a,\n            b: b,\n            c: &c,\n            d: &mut d,\n        },\n        &[\n            Token::StructVariant {\n                name: \"SerEnum\",\n                variant: \"Map\",\n                len: 4,\n            },\n            Token::Str(\"a\"),\n            Token::I8(1),\n            Token::Str(\"b\"),\n            Token::I32(2),\n            Token::Str(\"c\"),\n            Token::I32(3),\n            Token::Str(\"d\"),\n            Token::I32(4),\n            Token::StructVariantEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_de_enum_unit() {\n    assert_tokens(\n        &DeEnum::Unit::<u32, u32, u32>,\n        &[Token::UnitVariant {\n            name: \"DeEnum\",\n            variant: \"Unit\",\n        }],\n    );\n}\n\n#[test]\nfn test_de_enum_seq() {\n    let a = 1;\n    let b = 2;\n    let c = 3;\n    let d = 4;\n\n    assert_tokens(\n        &DeEnum::Seq(a, b, c, d),\n        &[\n            Token::TupleVariant {\n                name: \"DeEnum\",\n                variant: \"Seq\",\n                len: 4,\n            },\n            Token::I8(1),\n            Token::I32(2),\n            Token::I32(3),\n            Token::I32(4),\n            Token::TupleVariantEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_de_enum_map() {\n    let a = 1;\n    let b = 2;\n    let c = 3;\n    let d = 4;\n\n    assert_tokens(\n        &DeEnum::Map {\n            a: a,\n            b: b,\n            c: c,\n            d: d,\n        },\n        &[\n            Token::StructVariant {\n                name: \"DeEnum\",\n                variant: \"Map\",\n                len: 4,\n            },\n            Token::Str(\"a\"),\n            Token::I8(1),\n            Token::Str(\"b\"),\n            Token::I32(2),\n            Token::Str(\"c\"),\n            Token::I32(3),\n            Token::Str(\"d\"),\n            Token::I32(4),\n            Token::StructVariantEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_lifetimes() {\n    let value = 5;\n\n    assert_ser_tokens(\n        &Lifetimes::LifetimeSeq(&value),\n        &[\n            Token::NewtypeVariant {\n                name: \"Lifetimes\",\n                variant: \"LifetimeSeq\",\n            },\n            Token::I32(5),\n        ],\n    );\n\n    assert_ser_tokens(\n        &Lifetimes::NoLifetimeSeq(5),\n        &[\n            Token::NewtypeVariant {\n                name: \"Lifetimes\",\n                variant: \"NoLifetimeSeq\",\n            },\n            Token::I32(5),\n        ],\n    );\n\n    assert_ser_tokens(\n        &Lifetimes::LifetimeMap { a: &value },\n        &[\n            Token::StructVariant {\n                name: \"Lifetimes\",\n                variant: \"LifetimeMap\",\n                len: 1,\n            },\n            Token::Str(\"a\"),\n            Token::I32(5),\n            Token::StructVariantEnd,\n        ],\n    );\n\n    assert_ser_tokens(\n        &Lifetimes::NoLifetimeMap { a: 5 },\n        &[\n            Token::StructVariant {\n                name: \"Lifetimes\",\n                variant: \"NoLifetimeMap\",\n                len: 1,\n            },\n            Token::Str(\"a\"),\n            Token::I32(5),\n            Token::StructVariantEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_generic_struct() {\n    assert_tokens(\n        &GenericStruct { x: 5u32 },\n        &[\n            Token::Struct {\n                name: \"GenericStruct\",\n                len: 1,\n            },\n            Token::Str(\"x\"),\n            Token::U32(5),\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_generic_newtype_struct() {\n    assert_tokens(\n        &GenericNewTypeStruct(5u32),\n        &[\n            Token::NewtypeStruct {\n                name: \"GenericNewTypeStruct\",\n            },\n            Token::U32(5),\n        ],\n    );\n}\n\n#[test]\nfn test_generic_tuple_struct() {\n    assert_tokens(\n        &GenericTupleStruct(5u32, 6u32),\n        &[\n            Token::TupleStruct {\n                name: \"GenericTupleStruct\",\n                len: 2,\n            },\n            Token::U32(5),\n            Token::U32(6),\n            Token::TupleStructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_generic_enum_unit() {\n    assert_tokens(\n        &GenericEnum::Unit::<u32, u32>,\n        &[Token::UnitVariant {\n            name: \"GenericEnum\",\n            variant: \"Unit\",\n        }],\n    );\n}\n\n#[test]\nfn test_generic_enum_newtype() {\n    assert_tokens(\n        &GenericEnum::NewType::<u32, u32>(5),\n        &[\n            Token::NewtypeVariant {\n                name: \"GenericEnum\",\n                variant: \"NewType\",\n            },\n            Token::U32(5),\n        ],\n    );\n}\n\n#[test]\nfn test_generic_enum_seq() {\n    assert_tokens(\n        &GenericEnum::Seq::<u32, u32>(5, 6),\n        &[\n            Token::TupleVariant {\n                name: \"GenericEnum\",\n                variant: \"Seq\",\n                len: 2,\n            },\n            Token::U32(5),\n            Token::U32(6),\n            Token::TupleVariantEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_generic_enum_map() {\n    assert_tokens(\n        &GenericEnum::Map::<u32, u32> { x: 5, y: 6 },\n        &[\n            Token::StructVariant {\n                name: \"GenericEnum\",\n                variant: \"Map\",\n                len: 2,\n            },\n            Token::Str(\"x\"),\n            Token::U32(5),\n            Token::Str(\"y\"),\n            Token::U32(6),\n            Token::StructVariantEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_default_ty_param() {\n    assert_tokens(\n        &DefaultTyParam::<i32> {\n            phantom: PhantomData,\n        },\n        &[\n            Token::Struct {\n                name: \"DefaultTyParam\",\n                len: 1,\n            },\n            Token::Str(\"phantom\"),\n            Token::UnitStruct {\n                name: \"PhantomData\",\n            },\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_enum_state_field() {\n    #[derive(Debug, PartialEq, Serialize, Deserialize)]\n    enum SomeEnum {\n        Key { key: char, state: bool },\n    }\n\n    assert_tokens(\n        &SomeEnum::Key {\n            key: 'a',\n            state: true,\n        },\n        &[\n            Token::StructVariant {\n                name: \"SomeEnum\",\n                variant: \"Key\",\n                len: 2,\n            },\n            Token::Str(\"key\"),\n            Token::Char('a'),\n            Token::Str(\"state\"),\n            Token::Bool(true),\n            Token::StructVariantEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_internally_tagged_struct() {\n    #[derive(Debug, PartialEq, Serialize, Deserialize)]\n    #[serde(tag = \"type\")]\n    pub struct Struct {\n        a: u8,\n    }\n\n    assert_tokens(\n        &Struct { a: 1 },\n        &[\n            Token::Struct {\n                name: \"Struct\",\n                len: 2,\n            },\n            Token::Str(\"type\"),\n            Token::Str(\"Struct\"),\n            Token::Str(\"a\"),\n            Token::U8(1),\n            Token::StructEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &Struct { a: 1 },\n        &[\n            Token::Struct {\n                name: \"Struct\",\n                len: 1,\n            },\n            Token::Str(\"a\"),\n            Token::U8(1),\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_internally_tagged_braced_struct_with_zero_fields() {\n    #[derive(Debug, PartialEq, Serialize, Deserialize)]\n    #[serde(tag = \"type\")]\n    struct S {}\n\n    assert_tokens(\n        &S {},\n        &[\n            Token::Struct { name: \"S\", len: 1 },\n            Token::Str(\"type\"),\n            Token::Str(\"S\"),\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_internally_tagged_struct_with_flattened_field() {\n    #[derive(Debug, PartialEq, Serialize, Deserialize)]\n    #[serde(tag = \"tag_struct\")]\n    pub struct Struct {\n        #[serde(flatten)]\n        pub flat: Enum,\n    }\n\n    #[derive(Debug, PartialEq, Serialize, Deserialize)]\n    #[serde(tag = \"tag_enum\", content = \"content\")]\n    pub enum Enum {\n        A(u64),\n    }\n\n    assert_tokens(\n        &Struct { flat: Enum::A(0) },\n        &[\n            Token::Map { len: None },\n            Token::Str(\"tag_struct\"),\n            Token::Str(\"Struct\"),\n            Token::Str(\"tag_enum\"),\n            Token::UnitVariant {\n                name: \"Enum\",\n                variant: \"A\",\n            },\n            Token::Str(\"content\"),\n            Token::U64(0),\n            Token::MapEnd,\n        ],\n    );\n\n    assert_de_tokens(\n        &Struct { flat: Enum::A(0) },\n        &[\n            Token::Map { len: None },\n            Token::Str(\"tag_enum\"),\n            Token::Str(\"A\"),\n            Token::Str(\"content\"),\n            Token::U64(0),\n            Token::MapEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_rename_all() {\n    #[derive(Serialize, Deserialize, Debug, PartialEq)]\n    #[serde(rename_all = \"snake_case\")]\n    enum E {\n        #[serde(rename_all = \"camelCase\")]\n        Serialize {\n            serialize: bool,\n            serialize_seq: bool,\n        },\n        #[serde(rename_all = \"kebab-case\")]\n        SerializeSeq {\n            serialize: bool,\n            serialize_seq: bool,\n        },\n        #[serde(rename_all = \"SCREAMING_SNAKE_CASE\")]\n        SerializeMap {\n            serialize: bool,\n            serialize_seq: bool,\n        },\n    }\n\n    #[derive(Serialize, Deserialize, Debug, PartialEq)]\n    #[serde(rename_all = \"PascalCase\")]\n    struct S {\n        serialize: bool,\n        serialize_seq: bool,\n    }\n\n    #[derive(Serialize, Deserialize, Debug, PartialEq)]\n    #[serde(rename_all = \"SCREAMING-KEBAB-CASE\")]\n    struct ScreamingKebab {\n        serialize: bool,\n        serialize_seq: bool,\n    }\n\n    assert_tokens(\n        &E::Serialize {\n            serialize: true,\n            serialize_seq: true,\n        },\n        &[\n            Token::StructVariant {\n                name: \"E\",\n                variant: \"serialize\",\n                len: 2,\n            },\n            Token::Str(\"serialize\"),\n            Token::Bool(true),\n            Token::Str(\"serializeSeq\"),\n            Token::Bool(true),\n            Token::StructVariantEnd,\n        ],\n    );\n\n    assert_tokens(\n        &E::SerializeSeq {\n            serialize: true,\n            serialize_seq: true,\n        },\n        &[\n            Token::StructVariant {\n                name: \"E\",\n                variant: \"serialize_seq\",\n                len: 2,\n            },\n            Token::Str(\"serialize\"),\n            Token::Bool(true),\n            Token::Str(\"serialize-seq\"),\n            Token::Bool(true),\n            Token::StructVariantEnd,\n        ],\n    );\n\n    assert_tokens(\n        &E::SerializeMap {\n            serialize: true,\n            serialize_seq: true,\n        },\n        &[\n            Token::StructVariant {\n                name: \"E\",\n                variant: \"serialize_map\",\n                len: 2,\n            },\n            Token::Str(\"SERIALIZE\"),\n            Token::Bool(true),\n            Token::Str(\"SERIALIZE_SEQ\"),\n            Token::Bool(true),\n            Token::StructVariantEnd,\n        ],\n    );\n\n    assert_tokens(\n        &S {\n            serialize: true,\n            serialize_seq: true,\n        },\n        &[\n            Token::Struct { name: \"S\", len: 2 },\n            Token::Str(\"Serialize\"),\n            Token::Bool(true),\n            Token::Str(\"SerializeSeq\"),\n            Token::Bool(true),\n            Token::StructEnd,\n        ],\n    );\n\n    assert_tokens(\n        &ScreamingKebab {\n            serialize: true,\n            serialize_seq: true,\n        },\n        &[\n            Token::Struct {\n                name: \"ScreamingKebab\",\n                len: 2,\n            },\n            Token::Str(\"SERIALIZE\"),\n            Token::Bool(true),\n            Token::Str(\"SERIALIZE-SEQ\"),\n            Token::Bool(true),\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_rename_all_fields() {\n    #[derive(Serialize, Deserialize, Debug, PartialEq)]\n    #[serde(rename_all_fields = \"kebab-case\")]\n    enum E {\n        V1,\n        V2(bool),\n        V3 {\n            a_field: bool,\n            another_field: bool,\n            #[serde(rename = \"last-field\")]\n            yet_another_field: bool,\n        },\n        #[serde(rename_all = \"snake_case\")]\n        V4 {\n            a_field: bool,\n        },\n    }\n\n    assert_tokens(\n        &E::V3 {\n            a_field: true,\n            another_field: true,\n            yet_another_field: true,\n        },\n        &[\n            Token::StructVariant {\n                name: \"E\",\n                variant: \"V3\",\n                len: 3,\n            },\n            Token::Str(\"a-field\"),\n            Token::Bool(true),\n            Token::Str(\"another-field\"),\n            Token::Bool(true),\n            Token::Str(\"last-field\"),\n            Token::Bool(true),\n            Token::StructVariantEnd,\n        ],\n    );\n\n    assert_tokens(\n        &E::V4 { a_field: true },\n        &[\n            Token::StructVariant {\n                name: \"E\",\n                variant: \"V4\",\n                len: 1,\n            },\n            Token::Str(\"a_field\"),\n            Token::Bool(true),\n            Token::StructVariantEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_packed_struct_can_derive_serialize() {\n    #[derive(Copy, Clone, Serialize)]\n    #[repr(packed, C)]\n    #[allow(dead_code)]\n    struct PackedC {\n        t: f32,\n    }\n\n    #[derive(Copy, Clone, Serialize)]\n    #[repr(C, packed)]\n    #[allow(dead_code)]\n    struct CPacked {\n        t: f32,\n    }\n\n    #[derive(Copy, Clone, Serialize)]\n    #[repr(C, packed(2))]\n    #[allow(dead_code)]\n    struct CPacked2 {\n        t: f32,\n    }\n\n    #[derive(Copy, Clone, Serialize)]\n    #[repr(packed(2), C)]\n    #[allow(dead_code)]\n    struct Packed2C {\n        t: f32,\n    }\n}\n"
  },
  {
    "path": "test_suite/tests/test_remote.rs",
    "content": "#![allow(clippy::redundant_field_names, dead_code)]\n\nuse serde_derive::{Deserialize, Serialize};\n\nmod remote {\n    pub struct Unit;\n\n    pub struct PrimitivePriv(u8);\n\n    #[allow(dead_code)]\n    pub struct PrimitivePub(pub u8);\n\n    pub struct NewtypePriv(Unit);\n\n    #[allow(dead_code)]\n    pub struct NewtypePub(pub Unit);\n\n    pub struct TuplePriv(u8, Unit);\n\n    #[allow(dead_code)]\n    pub struct TuplePub(pub u8, pub Unit);\n\n    pub struct StructPriv {\n        a: u8,\n        b: Unit,\n    }\n\n    #[allow(dead_code)]\n    pub struct StructPub {\n        pub a: u8,\n        pub b: Unit,\n    }\n\n    impl PrimitivePriv {\n        pub fn new(a: u8) -> Self {\n            PrimitivePriv(a)\n        }\n\n        pub fn get(&self) -> u8 {\n            self.0\n        }\n    }\n\n    impl NewtypePriv {\n        pub fn new(a: Unit) -> Self {\n            NewtypePriv(a)\n        }\n\n        pub fn get(&self) -> &Unit {\n            &self.0\n        }\n    }\n\n    impl TuplePriv {\n        pub fn new(a: u8, b: Unit) -> Self {\n            TuplePriv(a, b)\n        }\n\n        pub fn first(&self) -> u8 {\n            self.0\n        }\n\n        pub fn second(&self) -> &Unit {\n            &self.1\n        }\n    }\n\n    impl StructPriv {\n        pub fn new(a: u8, b: Unit) -> Self {\n            StructPriv { a: a, b: b }\n        }\n\n        pub fn a(&self) -> u8 {\n            self.a\n        }\n\n        pub fn b(&self) -> &Unit {\n            &self.b\n        }\n    }\n\n    pub struct StructGeneric<T> {\n        pub value: T,\n    }\n\n    impl<T> StructGeneric<T> {\n        #[allow(dead_code)]\n        pub fn get_value(&self) -> &T {\n            &self.value\n        }\n    }\n\n    #[allow(dead_code)]\n    pub enum EnumGeneric<T> {\n        Variant(T),\n    }\n}\n\n#[derive(Serialize, Deserialize)]\n#[allow(dead_code)]\nstruct Test {\n    #[serde(with = \"UnitDef\")]\n    unit: remote::Unit,\n\n    #[serde(with = \"PrimitivePrivDef\")]\n    primitive_priv: remote::PrimitivePriv,\n\n    #[serde(with = \"PrimitivePubDef\")]\n    primitive_pub: remote::PrimitivePub,\n\n    #[serde(with = \"NewtypePrivDef\")]\n    newtype_priv: remote::NewtypePriv,\n\n    #[serde(with = \"NewtypePubDef\")]\n    newtype_pub: remote::NewtypePub,\n\n    #[serde(with = \"TuplePrivDef\")]\n    tuple_priv: remote::TuplePriv,\n\n    #[serde(with = \"TuplePubDef\")]\n    tuple_pub: remote::TuplePub,\n\n    #[serde(with = \"StructPrivDef\")]\n    struct_priv: remote::StructPriv,\n\n    #[serde(with = \"StructPubDef\")]\n    struct_pub: remote::StructPub,\n\n    #[serde(with = \"StructConcrete\")]\n    struct_concrete: remote::StructGeneric<u8>,\n\n    #[serde(with = \"EnumConcrete\")]\n    enum_concrete: remote::EnumGeneric<u8>,\n\n    #[serde(with = \"ErrorKindDef\")]\n    io_error_kind: ErrorKind,\n}\n\n#[derive(Serialize, Deserialize)]\n#[serde(remote = \"remote::Unit\")]\n#[allow(dead_code)]\nstruct UnitDef;\n\n#[derive(Serialize, Deserialize)]\n#[serde(remote = \"remote::PrimitivePriv\")]\nstruct PrimitivePrivDef(#[serde(getter = \"remote::PrimitivePriv::get\")] u8);\n\n#[derive(Serialize, Deserialize)]\n#[serde(remote = \"remote::PrimitivePub\")]\n#[allow(dead_code)]\nstruct PrimitivePubDef(u8);\n\n#[derive(Serialize, Deserialize)]\n#[serde(remote = \"remote::NewtypePriv\")]\nstruct NewtypePrivDef(#[serde(getter = \"remote::NewtypePriv::get\", with = \"UnitDef\")] remote::Unit);\n\n#[derive(Serialize, Deserialize)]\n#[serde(remote = \"remote::NewtypePub\")]\n#[allow(dead_code)]\nstruct NewtypePubDef(#[serde(with = \"UnitDef\")] remote::Unit);\n\n#[derive(Serialize, Deserialize)]\n#[serde(remote = \"remote::TuplePriv\")]\nstruct TuplePrivDef(\n    #[serde(getter = \"remote::TuplePriv::first\")] u8,\n    #[serde(getter = \"remote::TuplePriv::second\", with = \"UnitDef\")] remote::Unit,\n);\n\n#[derive(Serialize, Deserialize)]\n#[serde(remote = \"remote::TuplePub\")]\n#[allow(dead_code)]\nstruct TuplePubDef(u8, #[serde(with = \"UnitDef\")] remote::Unit);\n\n#[derive(Serialize, Deserialize)]\n#[serde(remote = \"remote::StructPriv\")]\nstruct StructPrivDef {\n    #[serde(getter = \"remote::StructPriv::a\")]\n    a: u8,\n\n    #[serde(getter = \"remote::StructPriv::b\")]\n    #[serde(with = \"UnitDef\")]\n    b: remote::Unit,\n}\n\n#[derive(Serialize, Deserialize)]\n#[serde(remote = \"remote::StructPub\")]\n#[allow(dead_code)]\nstruct StructPubDef {\n    a: u8,\n\n    #[serde(with = \"UnitDef\")]\n    b: remote::Unit,\n}\n\n#[derive(Serialize, Deserialize)]\n#[serde(remote = \"remote::StructGeneric\")]\nstruct StructGenericWithGetterDef<T> {\n    #[serde(getter = \"remote::StructGeneric::get_value\")]\n    value: T,\n}\n\n#[derive(Serialize, Deserialize)]\n#[serde(remote = \"remote::StructGeneric<u8>\")]\n#[allow(dead_code)]\nstruct StructConcrete {\n    value: u8,\n}\n\n#[derive(Serialize, Deserialize)]\n#[serde(remote = \"remote::EnumGeneric<u8>\")]\n#[allow(dead_code)]\nenum EnumConcrete {\n    Variant(u8),\n}\n\n#[derive(Debug)]\n#[allow(dead_code)]\nenum ErrorKind {\n    NotFound,\n    PermissionDenied,\n    #[allow(dead_code)]\n    ConnectionRefused,\n}\n\n#[derive(Serialize, Deserialize)]\n#[serde(remote = \"ErrorKind\")]\n#[non_exhaustive]\n#[allow(dead_code)]\nenum ErrorKindDef {\n    NotFound,\n    PermissionDenied,\n    // ...\n}\n\nimpl From<PrimitivePrivDef> for remote::PrimitivePriv {\n    fn from(def: PrimitivePrivDef) -> Self {\n        remote::PrimitivePriv::new(def.0)\n    }\n}\n\nimpl From<NewtypePrivDef> for remote::NewtypePriv {\n    fn from(def: NewtypePrivDef) -> Self {\n        remote::NewtypePriv::new(def.0)\n    }\n}\n\nimpl From<TuplePrivDef> for remote::TuplePriv {\n    fn from(def: TuplePrivDef) -> Self {\n        remote::TuplePriv::new(def.0, def.1)\n    }\n}\n\nimpl From<StructPrivDef> for remote::StructPriv {\n    fn from(def: StructPrivDef) -> Self {\n        remote::StructPriv::new(def.a, def.b)\n    }\n}\n\nimpl<T> From<StructGenericWithGetterDef<T>> for remote::StructGeneric<T> {\n    fn from(def: StructGenericWithGetterDef<T>) -> Self {\n        remote::StructGeneric { value: def.value }\n    }\n}\n"
  },
  {
    "path": "test_suite/tests/test_roundtrip.rs",
    "content": "use serde_test::{assert_tokens, Configure, Token};\nuse std::net;\n\n#[macro_use]\n#[allow(unused_macros)]\nmod macros;\n\n#[test]\nfn ip_addr_roundtrip() {\n    assert_tokens(\n        &net::IpAddr::from(*b\"1234\").compact(),\n        &seq![\n            Token::NewtypeVariant {\n                name: \"IpAddr\",\n                variant: \"V4\"\n            },\n            Token::Tuple { len: 4 },\n            b\"1234\".iter().copied().map(Token::U8),\n            Token::TupleEnd,\n        ],\n    );\n}\n\n#[test]\nfn socket_addr_roundtrip() {\n    assert_tokens(\n        &net::SocketAddr::from((*b\"1234567890123456\", 1234)).compact(),\n        &seq![\n            Token::NewtypeVariant {\n                name: \"SocketAddr\",\n                variant: \"V6\"\n            },\n            Token::Tuple { len: 2 },\n            Token::Tuple { len: 16 },\n            b\"1234567890123456\".iter().copied().map(Token::U8),\n            Token::TupleEnd,\n            Token::U16(1234),\n            Token::TupleEnd,\n        ],\n    );\n}\n"
  },
  {
    "path": "test_suite/tests/test_self.rs",
    "content": "#![allow(clippy::used_underscore_binding, dead_code)]\n\nuse serde_derive::{Deserialize, Serialize};\n\n#[test]\nfn test_self() {\n    pub trait Trait {\n        type Assoc;\n    }\n\n    #[derive(Deserialize, Serialize)]\n    pub struct Generics<T: Trait<Assoc = Self>>\n    where\n        Self: Trait<Assoc = Self>,\n        <Self as Trait>::Assoc: Sized,\n    {\n        _f: T,\n    }\n\n    impl<T: Trait<Assoc = Self>> Trait for Generics<T> {\n        type Assoc = Self;\n    }\n\n    #[derive(Deserialize, Serialize)]\n    pub struct Struct {\n        _f1: Box<Self>,\n        _f2: Box<<Self as Trait>::Assoc>,\n        _f4: [(); Self::ASSOC],\n        _f5: [(); Self::assoc()],\n    }\n\n    impl Struct {\n        const ASSOC: usize = 1;\n        const fn assoc() -> usize {\n            0\n        }\n    }\n\n    impl Trait for Struct {\n        type Assoc = Self;\n    }\n\n    #[derive(Deserialize, Serialize)]\n    pub struct Tuple(\n        Box<Self>,\n        Box<<Self as Trait>::Assoc>,\n        [(); Self::ASSOC],\n        [(); Self::assoc()],\n    );\n\n    impl Tuple {\n        const ASSOC: usize = 1;\n        const fn assoc() -> usize {\n            0\n        }\n    }\n\n    impl Trait for Tuple {\n        type Assoc = Self;\n    }\n\n    #[derive(Deserialize, Serialize)]\n    pub enum Enum {\n        Struct {\n            _f1: Box<Self>,\n            _f2: Box<<Self as Trait>::Assoc>,\n            _f4: [(); Self::ASSOC],\n            _f5: [(); Self::assoc()],\n        },\n        Tuple(\n            Box<Self>,\n            Box<<Self as Trait>::Assoc>,\n            [(); Self::ASSOC],\n            [(); Self::assoc()],\n        ),\n    }\n\n    impl Enum {\n        const ASSOC: usize = 1;\n        const fn assoc() -> usize {\n            0\n        }\n    }\n\n    impl Trait for Enum {\n        type Assoc = Self;\n    }\n}\n"
  },
  {
    "path": "test_suite/tests/test_ser.rs",
    "content": "#![allow(clippy::derive_partial_eq_without_eq, clippy::unreadable_literal)]\n#![cfg_attr(feature = \"unstable\", feature(never_type))]\n\nuse serde_derive::Serialize;\nuse serde_test::{assert_ser_tokens, assert_ser_tokens_error, Configure, Token};\nuse std::cell::RefCell;\nuse std::collections::{BTreeMap, BTreeSet, HashMap, HashSet};\nuse std::ffi::CString;\nuse std::net;\nuse std::num::{Saturating, Wrapping};\nuse std::ops::Bound;\nuse std::path::{Path, PathBuf};\nuse std::rc::{Rc, Weak as RcWeak};\n#[cfg(unix)]\nuse std::str;\nuse std::sync::atomic::{\n    AtomicBool, AtomicI16, AtomicI32, AtomicI8, AtomicIsize, AtomicU16, AtomicU32, AtomicU8,\n    AtomicUsize,\n};\n#[cfg(target_arch = \"x86_64\")]\nuse std::sync::atomic::{AtomicI64, AtomicU64};\nuse std::sync::{Arc, Mutex, RwLock, Weak as ArcWeak};\nuse std::time::{Duration, UNIX_EPOCH};\n\n#[macro_use]\nmod macros;\n\n//////////////////////////////////////////////////////////////////////////\n\n#[derive(Serialize)]\nstruct UnitStruct;\n\n#[derive(Serialize)]\nstruct TupleStruct(i32, i32, i32);\n\n#[derive(Serialize)]\nstruct Struct {\n    a: i32,\n    b: i32,\n    c: i32,\n}\n\n#[derive(PartialEq, Debug)]\nstruct NotSerializable;\n\n#[derive(Serialize, PartialEq, Debug)]\nenum Enum {\n    Unit,\n    One(i32),\n    Seq(i32, i32),\n    Map {\n        a: i32,\n        b: i32,\n    },\n    #[serde(skip_serializing)]\n    SkippedUnit,\n    #[serde(skip_serializing)]\n    SkippedOne(i32),\n    #[serde(skip_serializing)]\n    SkippedSeq(i32, i32),\n    #[serde(skip_serializing)]\n    SkippedMap {\n        _a: i32,\n        _b: i32,\n    },\n    OneWithSkipped(#[serde(skip_serializing)] NotSerializable),\n}\n\n//////////////////////////////////////////////////////////////////////////\n\n#[test]\nfn test_unit() {\n    assert_ser_tokens(&(), &[Token::Unit]);\n}\n\n#[test]\nfn test_bool() {\n    assert_ser_tokens(&true, &[Token::Bool(true)]);\n    assert_ser_tokens(&false, &[Token::Bool(false)]);\n}\n\n#[test]\nfn test_isizes() {\n    assert_ser_tokens(&0i8, &[Token::I8(0)]);\n    assert_ser_tokens(&0i16, &[Token::I16(0)]);\n    assert_ser_tokens(&0i32, &[Token::I32(0)]);\n    assert_ser_tokens(&0i64, &[Token::I64(0)]);\n}\n\n#[test]\nfn test_usizes() {\n    assert_ser_tokens(&0u8, &[Token::U8(0)]);\n    assert_ser_tokens(&0u16, &[Token::U16(0)]);\n    assert_ser_tokens(&0u32, &[Token::U32(0)]);\n    assert_ser_tokens(&0u64, &[Token::U64(0)]);\n}\n\n#[test]\nfn test_floats() {\n    assert_ser_tokens(&0f32, &[Token::F32(0.)]);\n    assert_ser_tokens(&0f64, &[Token::F64(0.)]);\n}\n\n#[test]\nfn test_char() {\n    assert_ser_tokens(&'a', &[Token::Char('a')]);\n}\n\n#[test]\nfn test_str() {\n    assert_ser_tokens(&\"abc\", &[Token::Str(\"abc\")]);\n    assert_ser_tokens(&\"abc\".to_owned(), &[Token::Str(\"abc\")]);\n}\n\n#[test]\nfn test_option() {\n    assert_ser_tokens(&None::<i32>, &[Token::None]);\n    assert_ser_tokens(&Some(1), &[Token::Some, Token::I32(1)]);\n}\n\n#[test]\nfn test_result() {\n    assert_ser_tokens(\n        &Ok::<i32, i32>(0),\n        &[\n            Token::NewtypeVariant {\n                name: \"Result\",\n                variant: \"Ok\",\n            },\n            Token::I32(0),\n        ],\n    );\n    assert_ser_tokens(\n        &Err::<i32, i32>(1),\n        &[\n            Token::NewtypeVariant {\n                name: \"Result\",\n                variant: \"Err\",\n            },\n            Token::I32(1),\n        ],\n    );\n}\n\n#[test]\nfn test_slice() {\n    assert_ser_tokens(&[0][..0], &[Token::Seq { len: Some(0) }, Token::SeqEnd]);\n    assert_ser_tokens(\n        &[1, 2, 3][..],\n        &[\n            Token::Seq { len: Some(3) },\n            Token::I32(1),\n            Token::I32(2),\n            Token::I32(3),\n            Token::SeqEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_array() {\n    assert_ser_tokens(&[0; 0], &[Token::Tuple { len: 0 }, Token::TupleEnd]);\n    assert_ser_tokens(\n        &[1, 2, 3],\n        &[\n            Token::Tuple { len: 3 },\n            Token::I32(1),\n            Token::I32(2),\n            Token::I32(3),\n            Token::TupleEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_vec() {\n    assert_ser_tokens(\n        &Vec::<isize>::new(),\n        &[Token::Seq { len: Some(0) }, Token::SeqEnd],\n    );\n    assert_ser_tokens(\n        &vec![vec![], vec![1], vec![2, 3]],\n        &[\n            Token::Seq { len: Some(3) },\n            Token::Seq { len: Some(0) },\n            Token::SeqEnd,\n            Token::Seq { len: Some(1) },\n            Token::I32(1),\n            Token::SeqEnd,\n            Token::Seq { len: Some(2) },\n            Token::I32(2),\n            Token::I32(3),\n            Token::SeqEnd,\n            Token::SeqEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_btreeset() {\n    assert_ser_tokens(\n        &BTreeSet::<isize>::new(),\n        &[Token::Seq { len: Some(0) }, Token::SeqEnd],\n    );\n    assert_ser_tokens(\n        &btreeset![1],\n        &[Token::Seq { len: Some(1) }, Token::I32(1), Token::SeqEnd],\n    );\n}\n\n#[test]\nfn test_hashset() {\n    assert_ser_tokens(\n        &HashSet::<isize>::new(),\n        &[Token::Seq { len: Some(0) }, Token::SeqEnd],\n    );\n    assert_ser_tokens(\n        &hashset![1],\n        &[Token::Seq { len: Some(1) }, Token::I32(1), Token::SeqEnd],\n    );\n    assert_ser_tokens(\n        &hashset![foldhash::fast::FixedState; 1],\n        &[Token::Seq { len: Some(1) }, Token::I32(1), Token::SeqEnd],\n    );\n}\n\n#[test]\nfn test_tuple() {\n    assert_ser_tokens(\n        &(1,),\n        &[Token::Tuple { len: 1 }, Token::I32(1), Token::TupleEnd],\n    );\n    assert_ser_tokens(\n        &(1, 2, 3),\n        &[\n            Token::Tuple { len: 3 },\n            Token::I32(1),\n            Token::I32(2),\n            Token::I32(3),\n            Token::TupleEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_btreemap() {\n    assert_ser_tokens(\n        &btreemap![1 => 2],\n        &[\n            Token::Map { len: Some(1) },\n            Token::I32(1),\n            Token::I32(2),\n            Token::MapEnd,\n        ],\n    );\n    assert_ser_tokens(\n        &btreemap![1 => 2, 3 => 4],\n        &[\n            Token::Map { len: Some(2) },\n            Token::I32(1),\n            Token::I32(2),\n            Token::I32(3),\n            Token::I32(4),\n            Token::MapEnd,\n        ],\n    );\n    assert_ser_tokens(\n        &btreemap![1 => btreemap![], 2 => btreemap![3 => 4, 5 => 6]],\n        &[\n            Token::Map { len: Some(2) },\n            Token::I32(1),\n            Token::Map { len: Some(0) },\n            Token::MapEnd,\n            Token::I32(2),\n            Token::Map { len: Some(2) },\n            Token::I32(3),\n            Token::I32(4),\n            Token::I32(5),\n            Token::I32(6),\n            Token::MapEnd,\n            Token::MapEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_hashmap() {\n    assert_ser_tokens(\n        &HashMap::<isize, isize>::new(),\n        &[Token::Map { len: Some(0) }, Token::MapEnd],\n    );\n    assert_ser_tokens(\n        &hashmap![1 => 2],\n        &[\n            Token::Map { len: Some(1) },\n            Token::I32(1),\n            Token::I32(2),\n            Token::MapEnd,\n        ],\n    );\n    assert_ser_tokens(\n        &hashmap![foldhash::fast::FixedState; 1 => 2],\n        &[\n            Token::Map { len: Some(1) },\n            Token::I32(1),\n            Token::I32(2),\n            Token::MapEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_unit_struct() {\n    assert_ser_tokens(&UnitStruct, &[Token::UnitStruct { name: \"UnitStruct\" }]);\n}\n\n#[test]\nfn test_tuple_struct() {\n    assert_ser_tokens(\n        &TupleStruct(1, 2, 3),\n        &[\n            Token::TupleStruct {\n                name: \"TupleStruct\",\n                len: 3,\n            },\n            Token::I32(1),\n            Token::I32(2),\n            Token::I32(3),\n            Token::TupleStructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_struct() {\n    assert_ser_tokens(\n        &Struct { a: 1, b: 2, c: 3 },\n        &[\n            Token::Struct {\n                name: \"Struct\",\n                len: 3,\n            },\n            Token::Str(\"a\"),\n            Token::I32(1),\n            Token::Str(\"b\"),\n            Token::I32(2),\n            Token::Str(\"c\"),\n            Token::I32(3),\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_enum() {\n    assert_ser_tokens(\n        &Enum::Unit,\n        &[Token::UnitVariant {\n            name: \"Enum\",\n            variant: \"Unit\",\n        }],\n    );\n    assert_ser_tokens(\n        &Enum::One(42),\n        &[\n            Token::NewtypeVariant {\n                name: \"Enum\",\n                variant: \"One\",\n            },\n            Token::I32(42),\n        ],\n    );\n    assert_ser_tokens(\n        &Enum::Seq(1, 2),\n        &[\n            Token::TupleVariant {\n                name: \"Enum\",\n                variant: \"Seq\",\n                len: 2,\n            },\n            Token::I32(1),\n            Token::I32(2),\n            Token::TupleVariantEnd,\n        ],\n    );\n    assert_ser_tokens(\n        &Enum::Map { a: 1, b: 2 },\n        &[\n            Token::StructVariant {\n                name: \"Enum\",\n                variant: \"Map\",\n                len: 2,\n            },\n            Token::Str(\"a\"),\n            Token::I32(1),\n            Token::Str(\"b\"),\n            Token::I32(2),\n            Token::StructVariantEnd,\n        ],\n    );\n    assert_ser_tokens(\n        &Enum::OneWithSkipped(NotSerializable),\n        &[Token::UnitVariant {\n            name: \"Enum\",\n            variant: \"OneWithSkipped\",\n        }],\n    );\n}\n\n#[test]\nfn test_box() {\n    assert_ser_tokens(&Box::new(0i32), &[Token::I32(0)]);\n}\n\n#[test]\nfn test_boxed_slice() {\n    assert_ser_tokens(\n        &Box::new([0, 1, 2]),\n        &[\n            Token::Tuple { len: 3 },\n            Token::I32(0),\n            Token::I32(1),\n            Token::I32(2),\n            Token::TupleEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_duration() {\n    assert_ser_tokens(\n        &Duration::new(1, 2),\n        &[\n            Token::Struct {\n                name: \"Duration\",\n                len: 2,\n            },\n            Token::Str(\"secs\"),\n            Token::U64(1),\n            Token::Str(\"nanos\"),\n            Token::U32(2),\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_system_time() {\n    let system_time = UNIX_EPOCH + Duration::new(1, 200);\n    assert_ser_tokens(\n        &system_time,\n        &[\n            Token::Struct {\n                name: \"SystemTime\",\n                len: 2,\n            },\n            Token::Str(\"secs_since_epoch\"),\n            Token::U64(1),\n            Token::Str(\"nanos_since_epoch\"),\n            Token::U32(200),\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_range() {\n    assert_ser_tokens(\n        &(1u32..2u32),\n        &[\n            Token::Struct {\n                name: \"Range\",\n                len: 2,\n            },\n            Token::Str(\"start\"),\n            Token::U32(1),\n            Token::Str(\"end\"),\n            Token::U32(2),\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_range_inclusive() {\n    assert_ser_tokens(\n        &(1u32..=2u32),\n        &[\n            Token::Struct {\n                name: \"RangeInclusive\",\n                len: 2,\n            },\n            Token::Str(\"start\"),\n            Token::U32(1),\n            Token::Str(\"end\"),\n            Token::U32(2),\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_range_from() {\n    assert_ser_tokens(\n        &(1u32..),\n        &[\n            Token::Struct {\n                name: \"RangeFrom\",\n                len: 1,\n            },\n            Token::Str(\"start\"),\n            Token::U32(1),\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_range_to() {\n    assert_ser_tokens(\n        &(..2u32),\n        &[\n            Token::Struct {\n                name: \"RangeTo\",\n                len: 1,\n            },\n            Token::Str(\"end\"),\n            Token::U32(2),\n            Token::StructEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_bound() {\n    assert_ser_tokens(\n        &Bound::Unbounded::<()>,\n        &[\n            Token::Enum { name: \"Bound\" },\n            Token::Str(\"Unbounded\"),\n            Token::Unit,\n        ],\n    );\n    assert_ser_tokens(\n        &Bound::Included(0u8),\n        &[\n            Token::Enum { name: \"Bound\" },\n            Token::Str(\"Included\"),\n            Token::U8(0),\n        ],\n    );\n    assert_ser_tokens(\n        &Bound::Excluded(0u8),\n        &[\n            Token::Enum { name: \"Bound\" },\n            Token::Str(\"Excluded\"),\n            Token::U8(0),\n        ],\n    );\n}\n\n#[test]\nfn test_path() {\n    assert_ser_tokens(\n        &Path::new(\"/usr/local/lib\"),\n        &[Token::Str(\"/usr/local/lib\")],\n    );\n}\n\n#[test]\nfn test_path_buf() {\n    assert_ser_tokens(\n        &PathBuf::from(\"/usr/local/lib\"),\n        &[Token::Str(\"/usr/local/lib\")],\n    );\n}\n\n#[test]\nfn test_cstring() {\n    assert_ser_tokens(&CString::new(\"abc\").unwrap(), &[Token::Bytes(b\"abc\")]);\n}\n\n#[test]\nfn test_cstr() {\n    let cstring = CString::new(\"abc\").unwrap();\n    assert_ser_tokens(cstring.as_c_str(), &[Token::Bytes(b\"abc\")]);\n}\n\n#[test]\nfn test_rc() {\n    assert_ser_tokens(&Rc::new(true), &[Token::Bool(true)]);\n}\n\n#[test]\nfn test_rc_weak_some() {\n    let rc = Rc::new(true);\n    assert_ser_tokens(&Rc::downgrade(&rc), &[Token::Some, Token::Bool(true)]);\n}\n\n#[test]\nfn test_rc_weak_none() {\n    assert_ser_tokens(&RcWeak::<bool>::new(), &[Token::None]);\n}\n\n#[test]\nfn test_arc() {\n    assert_ser_tokens(&Arc::new(true), &[Token::Bool(true)]);\n}\n\n#[test]\nfn test_arc_weak_some() {\n    let arc = Arc::new(true);\n    assert_ser_tokens(&Arc::downgrade(&arc), &[Token::Some, Token::Bool(true)]);\n}\n\n#[test]\nfn test_arc_weak_none() {\n    assert_ser_tokens(&ArcWeak::<bool>::new(), &[Token::None]);\n}\n\n#[test]\nfn test_wrapping() {\n    assert_ser_tokens(&Wrapping(1usize), &[Token::U64(1)]);\n}\n\n#[test]\nfn test_saturating() {\n    assert_ser_tokens(&Saturating(1usize), &[Token::U64(1)]);\n}\n\n#[test]\nfn test_rc_dst() {\n    assert_ser_tokens(&Rc::<str>::from(\"s\"), &[Token::Str(\"s\")]);\n    assert_ser_tokens(\n        &Rc::<[bool]>::from(&[true][..]),\n        &[\n            Token::Seq { len: Some(1) },\n            Token::Bool(true),\n            Token::SeqEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_arc_dst() {\n    assert_ser_tokens(&Arc::<str>::from(\"s\"), &[Token::Str(\"s\")]);\n    assert_ser_tokens(\n        &Arc::<[bool]>::from(&[true][..]),\n        &[\n            Token::Seq { len: Some(1) },\n            Token::Bool(true),\n            Token::SeqEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_fmt_arguments() {\n    assert_ser_tokens(&format_args!(\"{}{}\", 1, 'a'), &[Token::Str(\"1a\")]);\n}\n\n#[test]\nfn test_atomic() {\n    assert_ser_tokens(&AtomicBool::new(false), &[Token::Bool(false)]);\n    assert_ser_tokens(&AtomicBool::new(true), &[Token::Bool(true)]);\n    assert_ser_tokens(&AtomicI8::new(63i8), &[Token::I8(63i8)]);\n    assert_ser_tokens(&AtomicI16::new(-318i16), &[Token::I16(-318i16)]);\n    assert_ser_tokens(&AtomicI32::new(65792i32), &[Token::I32(65792i32)]);\n    assert_ser_tokens(&AtomicIsize::new(-65792isize), &[Token::I64(-65792i64)]);\n    assert_ser_tokens(&AtomicU8::new(192u8), &[Token::U8(192u8)]);\n    assert_ser_tokens(&AtomicU16::new(510u16), &[Token::U16(510u16)]);\n    assert_ser_tokens(&AtomicU32::new(131072u32), &[Token::U32(131072u32)]);\n    assert_ser_tokens(&AtomicUsize::new(655360usize), &[Token::U64(655360u64)]);\n}\n\n#[cfg(target_arch = \"x86_64\")]\n#[test]\nfn test_atomic64() {\n    assert_ser_tokens(\n        &AtomicI64::new(-4295032832i64),\n        &[Token::I64(-4295032832i64)],\n    );\n    assert_ser_tokens(\n        &AtomicU64::new(12884901888u64),\n        &[Token::U64(12884901888u64)],\n    );\n}\n\n#[test]\nfn test_net_ipv4addr_readable() {\n    assert_ser_tokens(\n        &\"1.2.3.4\".parse::<net::Ipv4Addr>().unwrap().readable(),\n        &[Token::Str(\"1.2.3.4\")],\n    );\n}\n\n#[test]\nfn test_net_ipv6addr_readable() {\n    assert_ser_tokens(\n        &\"::1\".parse::<net::Ipv6Addr>().unwrap().readable(),\n        &[Token::Str(\"::1\")],\n    );\n}\n\n#[test]\nfn test_net_ipaddr_readable() {\n    assert_ser_tokens(\n        &\"1.2.3.4\".parse::<net::IpAddr>().unwrap().readable(),\n        &[Token::Str(\"1.2.3.4\")],\n    );\n}\n\n#[test]\nfn test_net_socketaddr_readable() {\n    assert_ser_tokens(\n        &\"1.2.3.4:1234\"\n            .parse::<net::SocketAddr>()\n            .unwrap()\n            .readable(),\n        &[Token::Str(\"1.2.3.4:1234\")],\n    );\n    assert_ser_tokens(\n        &\"1.2.3.4:1234\"\n            .parse::<net::SocketAddrV4>()\n            .unwrap()\n            .readable(),\n        &[Token::Str(\"1.2.3.4:1234\")],\n    );\n    assert_ser_tokens(\n        &\"[::1]:1234\"\n            .parse::<net::SocketAddrV6>()\n            .unwrap()\n            .readable(),\n        &[Token::Str(\"[::1]:1234\")],\n    );\n}\n\n#[test]\nfn test_net_ipv4addr_compact() {\n    assert_ser_tokens(\n        &net::Ipv4Addr::from(*b\"1234\").compact(),\n        &seq![\n            Token::Tuple { len: 4 },\n            b\"1234\".iter().copied().map(Token::U8),\n            Token::TupleEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_net_ipv6addr_compact() {\n    assert_ser_tokens(\n        &net::Ipv6Addr::from(*b\"1234567890123456\").compact(),\n        &seq![\n            Token::Tuple { len: 16 },\n            b\"1234567890123456\".iter().copied().map(Token::U8),\n            Token::TupleEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_net_ipaddr_compact() {\n    assert_ser_tokens(\n        &net::IpAddr::from(*b\"1234\").compact(),\n        &seq![\n            Token::NewtypeVariant {\n                name: \"IpAddr\",\n                variant: \"V4\"\n            },\n            Token::Tuple { len: 4 },\n            b\"1234\".iter().copied().map(Token::U8),\n            Token::TupleEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_net_socketaddr_compact() {\n    assert_ser_tokens(\n        &net::SocketAddr::from((*b\"1234567890123456\", 1234)).compact(),\n        &seq![\n            Token::NewtypeVariant {\n                name: \"SocketAddr\",\n                variant: \"V6\"\n            },\n            Token::Tuple { len: 2 },\n            Token::Tuple { len: 16 },\n            b\"1234567890123456\".iter().copied().map(Token::U8),\n            Token::TupleEnd,\n            Token::U16(1234),\n            Token::TupleEnd,\n        ],\n    );\n    assert_ser_tokens(\n        &net::SocketAddrV4::new(net::Ipv4Addr::from(*b\"1234\"), 1234).compact(),\n        &seq![\n            Token::Tuple { len: 2 },\n            Token::Tuple { len: 4 },\n            b\"1234\".iter().copied().map(Token::U8),\n            Token::TupleEnd,\n            Token::U16(1234),\n            Token::TupleEnd,\n        ],\n    );\n    assert_ser_tokens(\n        &net::SocketAddrV6::new(net::Ipv6Addr::from(*b\"1234567890123456\"), 1234, 0, 0).compact(),\n        &seq![\n            Token::Tuple { len: 2 },\n            Token::Tuple { len: 16 },\n            b\"1234567890123456\".iter().copied().map(Token::U8),\n            Token::TupleEnd,\n            Token::U16(1234),\n            Token::TupleEnd,\n        ],\n    );\n}\n\n#[cfg(feature = \"unstable\")]\n#[test]\nfn test_never_result() {\n    assert_ser_tokens(\n        &Ok::<u8, !>(0),\n        &[\n            Token::NewtypeVariant {\n                name: \"Result\",\n                variant: \"Ok\",\n            },\n            Token::U8(0),\n        ],\n    );\n}\n\n#[test]\n#[cfg(unix)]\nfn test_cannot_serialize_paths() {\n    use std::ffi::OsStr;\n    use std::os::unix::ffi::OsStrExt;\n\n    assert_ser_tokens_error(\n        &Path::new(OsStr::from_bytes(b\"Hello \\xF0\\x90\\x80World\")),\n        &[],\n        \"path contains invalid UTF-8 characters\",\n    );\n}\n\n#[test]\nfn test_cannot_serialize_mutably_borrowed_ref_cell() {\n    let ref_cell = RefCell::new(42);\n    let _reference = ref_cell.borrow_mut();\n    assert_ser_tokens_error(&ref_cell, &[], \"already mutably borrowed\");\n}\n\n#[test]\nfn test_enum_skipped() {\n    assert_ser_tokens_error(\n        &Enum::SkippedUnit,\n        &[],\n        \"the enum variant Enum::SkippedUnit cannot be serialized\",\n    );\n    assert_ser_tokens_error(\n        &Enum::SkippedOne(42),\n        &[],\n        \"the enum variant Enum::SkippedOne cannot be serialized\",\n    );\n    assert_ser_tokens_error(\n        &Enum::SkippedSeq(1, 2),\n        &[],\n        \"the enum variant Enum::SkippedSeq cannot be serialized\",\n    );\n    assert_ser_tokens_error(\n        &Enum::SkippedMap { _a: 1, _b: 2 },\n        &[],\n        \"the enum variant Enum::SkippedMap cannot be serialized\",\n    );\n}\n\n#[test]\nfn test_integer128() {\n    assert_ser_tokens_error(&1i128, &[], \"i128 is not supported\");\n\n    assert_ser_tokens_error(&1u128, &[], \"u128 is not supported\");\n}\n\n#[test]\nfn test_refcell_dst() {\n    assert_ser_tokens(\n        &RefCell::new([true]) as &RefCell<[bool]>,\n        &[\n            Token::Seq { len: Some(1) },\n            Token::Bool(true),\n            Token::SeqEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_mutex_dst() {\n    assert_ser_tokens(\n        &Mutex::new([true]) as &Mutex<[bool]>,\n        &[\n            Token::Seq { len: Some(1) },\n            Token::Bool(true),\n            Token::SeqEnd,\n        ],\n    );\n}\n\n#[test]\nfn test_rwlock_dst() {\n    assert_ser_tokens(\n        &RwLock::new([true]) as &RwLock<[bool]>,\n        &[\n            Token::Seq { len: Some(1) },\n            Token::Bool(true),\n            Token::SeqEnd,\n        ],\n    );\n}\n"
  },
  {
    "path": "test_suite/tests/test_serde_path.rs",
    "content": "#![allow(\n    clippy::elidable_lifetime_names,\n    clippy::extra_unused_type_parameters,\n    clippy::needless_lifetimes,\n    clippy::type_repetition_in_bounds\n)]\n\n#[test]\nfn test_gen_custom_serde() {\n    #[derive(serde_derive::Serialize, serde_derive::Deserialize)]\n    #[serde(crate = \"fake_serde\")]\n    struct Foo;\n\n    // Would be overlapping if serde::Serialize were implemented\n    impl AssertNotSerdeSerialize for Foo {}\n    // Would be overlapping if serde::Deserialize were implemented\n    impl<'a> AssertNotSerdeDeserialize<'a> for Foo {}\n\n    fake_serde::assert::<Foo>();\n}\n\nmod fake_serde {\n    pub use serde::*;\n\n    pub fn assert<T>()\n    where\n        T: Serialize,\n        T: for<'a> Deserialize<'a>,\n    {\n    }\n\n    #[allow(dead_code)]\n    pub trait Serialize {\n        fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error>;\n    }\n\n    #[allow(dead_code)]\n    pub trait Deserialize<'a>: Sized {\n        fn deserialize<D: Deserializer<'a>>(deserializer: D) -> Result<Self, D::Error>;\n    }\n}\n\npub trait AssertNotSerdeSerialize {}\n\nimpl<T: serde::Serialize> AssertNotSerdeSerialize for T {}\n\npub trait AssertNotSerdeDeserialize<'a> {}\n\nimpl<'a, T: serde::Deserialize<'a>> AssertNotSerdeDeserialize<'a> for T {}\n"
  },
  {
    "path": "test_suite/tests/test_unstable.rs",
    "content": "#![deny(warnings)]\n#![allow(clippy::derive_partial_eq_without_eq)]\n\n// This test target is convoluted with the actual #[test] in a separate file to\n// get it so that the stable compiler does not need to parse the code of the\n// test. If the test were written with #[cfg(feature = \"unstable\")] #[test]\n// right here, the stable compiler would fail to parse those raw identifiers\n// even if the cfg were not enabled.\n#[cfg(feature = \"unstable\")]\nmod unstable;\n"
  },
  {
    "path": "test_suite/tests/test_value.rs",
    "content": "#![allow(clippy::derive_partial_eq_without_eq, clippy::similar_names)]\n\nuse serde::de::value::{self, MapAccessDeserializer};\nuse serde::de::{Deserialize, Deserializer, IntoDeserializer, MapAccess, Visitor};\nuse serde_derive::Deserialize;\nuse serde_test::{assert_de_tokens, Token};\nuse std::fmt;\n\n#[test]\nfn test_u32_to_enum() {\n    #[derive(Deserialize, Debug, PartialEq)]\n    enum E {\n        A,\n        B,\n    }\n\n    let deserializer = IntoDeserializer::<value::Error>::into_deserializer(1u32);\n    let e: E = E::deserialize(deserializer).unwrap();\n    assert_eq!(E::B, e);\n}\n\n#[test]\nfn test_integer128() {\n    let de_u128 = IntoDeserializer::<value::Error>::into_deserializer(1u128);\n    let de_i128 = IntoDeserializer::<value::Error>::into_deserializer(1i128);\n\n    // u128 to u128\n    assert_eq!(1u128, u128::deserialize(de_u128).unwrap());\n\n    // u128 to i128\n    assert_eq!(1i128, i128::deserialize(de_u128).unwrap());\n\n    // i128 to u128\n    assert_eq!(1u128, u128::deserialize(de_i128).unwrap());\n\n    // i128 to i128\n    assert_eq!(1i128, i128::deserialize(de_i128).unwrap());\n}\n\n#[test]\nfn test_map_access_to_enum() {\n    #[derive(PartialEq, Debug)]\n    struct Potential(PotentialKind);\n\n    #[derive(PartialEq, Debug, Deserialize)]\n    enum PotentialKind {\n        Airebo(Airebo),\n    }\n\n    #[derive(PartialEq, Debug, Deserialize)]\n    struct Airebo {\n        lj_sigma: f64,\n    }\n\n    impl<'de> Deserialize<'de> for Potential {\n        fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n        where\n            D: Deserializer<'de>,\n        {\n            struct PotentialVisitor;\n\n            impl<'de> Visitor<'de> for PotentialVisitor {\n                type Value = Potential;\n\n                fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\n                    formatter.write_str(\"a map\")\n                }\n\n                fn visit_map<A>(self, map: A) -> Result<Self::Value, A::Error>\n                where\n                    A: MapAccess<'de>,\n                {\n                    Deserialize::deserialize(MapAccessDeserializer::new(map)).map(Potential)\n                }\n            }\n\n            deserializer.deserialize_any(PotentialVisitor)\n        }\n    }\n\n    let expected = Potential(PotentialKind::Airebo(Airebo { lj_sigma: 14.0 }));\n\n    assert_de_tokens(\n        &expected,\n        &[\n            Token::Map { len: Some(1) },\n            Token::Str(\"Airebo\"),\n            Token::Map { len: Some(1) },\n            Token::Str(\"lj_sigma\"),\n            Token::F64(14.0),\n            Token::MapEnd,\n            Token::MapEnd,\n        ],\n    );\n}\n"
  },
  {
    "path": "test_suite/tests/ui/borrow/bad_lifetimes.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\nstruct Test<'a> {\n    #[serde(borrow = \"zzz\")]\n    s: &'a str,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/borrow/bad_lifetimes.stderr",
    "content": "error: failed to parse borrowed lifetimes: \"zzz\"\n --> tests/ui/borrow/bad_lifetimes.rs:5:22\n  |\n5 |     #[serde(borrow = \"zzz\")]\n  |                      ^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/borrow/duplicate_lifetime.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\nstruct Test<'a> {\n    #[serde(borrow = \"'a + 'a\")]\n    s: &'a str,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/borrow/duplicate_lifetime.stderr",
    "content": "error: duplicate borrowed lifetime `'a`\n --> tests/ui/borrow/duplicate_lifetime.rs:5:22\n  |\n5 |     #[serde(borrow = \"'a + 'a\")]\n  |                      ^^^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/borrow/duplicate_variant.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\nstruct Str<'a>(&'a str);\n\n#[derive(Deserialize)]\nenum Test<'a> {\n    #[serde(borrow)]\n    S(#[serde(borrow)] Str<'a>),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/borrow/duplicate_variant.stderr",
    "content": "error: duplicate serde attribute `borrow`\n --> tests/ui/borrow/duplicate_variant.rs:9:15\n  |\n9 |     S(#[serde(borrow)] Str<'a>),\n  |               ^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/borrow/empty_lifetimes.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\nstruct Test<'a> {\n    #[serde(borrow = \"\")]\n    r: &'a str,\n    #[serde(borrow = \"  \")]\n    s: &'a str,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/borrow/empty_lifetimes.stderr",
    "content": "error: at least one lifetime must be borrowed\n --> tests/ui/borrow/empty_lifetimes.rs:5:22\n  |\n5 |     #[serde(borrow = \"\")]\n  |                      ^^\n\nerror: at least one lifetime must be borrowed\n --> tests/ui/borrow/empty_lifetimes.rs:7:22\n  |\n7 |     #[serde(borrow = \"  \")]\n  |                      ^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/borrow/no_lifetimes.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\nstruct Test {\n    #[serde(borrow)]\n    s: String,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/borrow/no_lifetimes.stderr",
    "content": "error: field `s` has no lifetimes to borrow\n --> tests/ui/borrow/no_lifetimes.rs:5:5\n  |\n5 | /     #[serde(borrow)]\n6 | |     s: String,\n  | |_____________^\n"
  },
  {
    "path": "test_suite/tests/ui/borrow/struct_variant.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\nstruct Str<'a>(&'a str);\n\n#[derive(Deserialize)]\nenum Test<'a> {\n    #[serde(borrow)]\n    S { s: Str<'a> },\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/borrow/struct_variant.stderr",
    "content": "error: #[serde(borrow)] may only be used on newtype variants\n --> tests/ui/borrow/struct_variant.rs:8:5\n  |\n8 | /     #[serde(borrow)]\n9 | |     S { s: Str<'a> },\n  | |____________________^\n"
  },
  {
    "path": "test_suite/tests/ui/borrow/wrong_lifetime.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\nstruct Test<'a> {\n    #[serde(borrow = \"'b\")]\n    s: &'a str,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/borrow/wrong_lifetime.stderr",
    "content": "error: field `s` does not have lifetime 'b\n --> tests/ui/borrow/wrong_lifetime.rs:5:5\n  |\n5 | /     #[serde(borrow = \"'b\")]\n6 | |     s: &'a str,\n  | |______________^\n"
  },
  {
    "path": "test_suite/tests/ui/conflict/adjacent-tag.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\n#[serde(tag = \"conflict\", content = \"conflict\")]\nenum E {\n    A,\n    B,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/conflict/adjacent-tag.stderr",
    "content": "error: enum tags `conflict` for type and content conflict with each other\n --> tests/ui/conflict/adjacent-tag.rs:4:1\n  |\n4 | / #[serde(tag = \"conflict\", content = \"conflict\")]\n5 | | enum E {\n6 | |     A,\n7 | |     B,\n8 | | }\n  | |_^\n"
  },
  {
    "path": "test_suite/tests/ui/conflict/alias-enum.rs",
    "content": "#![allow(non_camel_case_types)]\n\nuse serde_derive::Deserialize;\n\n#[derive(Deserialize)]\nenum E {\n    S1 {\n        #[serde(alias = \"a\", alias = \"b\", alias = \"c\")]\n        a: (),\n\n        // Warning on \"c\" and \"b\"\n        #[serde(alias = \"c\")]\n        b: (),\n\n        #[serde(skip_deserializing)]\n        c: (),\n    },\n\n    S2 {\n        #[serde(alias = \"b\", alias = \"c\")]\n        a: (),\n\n        // Warning on \"c\"\n        #[serde(rename = \"c\")]\n        b: (),\n    },\n\n    #[serde(rename_all = \"UPPERCASE\")]\n    S3 {\n        #[serde(alias = \"B\", alias = \"c\")]\n        a: (),\n\n        // Warning on \"b\" because this collides with the \"B\" above after\n        // applying rename rules\n        b: (),\n    },\n}\n\n#[derive(Deserialize)]\nenum E1 {\n    #[serde(alias = \"a\", alias = \"b\", alias = \"c\")]\n    a,\n\n    // Warning on \"c\" and \"b\"\n    #[serde(alias = \"c\")]\n    b,\n\n    #[serde(skip_deserializing)]\n    c,\n}\n\n#[derive(Deserialize)]\nenum E2 {\n    #[serde(alias = \"b\", alias = \"c\")]\n    a,\n\n    // Warning on \"c\"\n    #[serde(rename = \"c\")]\n    b,\n}\n\n#[derive(Deserialize)]\n#[serde(rename_all = \"UPPERCASE\")]\nenum E3 {\n    #[serde(alias = \"B\", alias = \"c\")]\n    a,\n\n    // Warning on \"b\" because this collides with the \"B\" above after applying\n    // rename rules\n    b,\n}\n\nfn main() {\n    __FAIL__;\n}\n"
  },
  {
    "path": "test_suite/tests/ui/conflict/alias-enum.stderr",
    "content": "error[E0425]: cannot find value `__FAIL__` in this scope\n  --> tests/ui/conflict/alias-enum.rs:74:5\n   |\n74 |     __FAIL__;\n   |     ^^^^^^^^ not found in this scope\n\nwarning: unreachable pattern\n  --> tests/ui/conflict/alias-enum.rs:13:9\n   |\n 8 |         #[serde(alias = \"a\", alias = \"b\", alias = \"c\")]\n   |                                      --- matches all the relevant values\n...\n13 |         b: (),\n   |         ^ no value can reach this\n   |\n   = note: `#[warn(unreachable_patterns)]` (part of `#[warn(unused)]`) on by default\n\nwarning: unreachable pattern\n  --> tests/ui/conflict/alias-enum.rs:12:25\n   |\n 8 |         #[serde(alias = \"a\", alias = \"b\", alias = \"c\")]\n   |                                                   --- matches all the relevant values\n...\n12 |         #[serde(alias = \"c\")]\n   |                         ^^^ no value can reach this\n\nwarning: unreachable pattern\n  --> tests/ui/conflict/alias-enum.rs:24:26\n   |\n20 |         #[serde(alias = \"b\", alias = \"c\")]\n   |                                      --- matches all the relevant values\n...\n24 |         #[serde(rename = \"c\")]\n   |                          ^^^ no value can reach this\n\nwarning: unreachable pattern\n  --> tests/ui/conflict/alias-enum.rs:35:9\n   |\n30 |         #[serde(alias = \"B\", alias = \"c\")]\n   |                         --- matches all the relevant values\n...\n35 |         b: (),\n   |         ^ no value can reach this\n\nwarning: unreachable pattern\n  --> tests/ui/conflict/alias-enum.rs:46:5\n   |\n41 |     #[serde(alias = \"a\", alias = \"b\", alias = \"c\")]\n   |                                  --- matches all the relevant values\n...\n46 |     b,\n   |     ^ no value can reach this\n\nwarning: unreachable pattern\n  --> tests/ui/conflict/alias-enum.rs:45:21\n   |\n41 |     #[serde(alias = \"a\", alias = \"b\", alias = \"c\")]\n   |                                               --- matches all the relevant values\n...\n45 |     #[serde(alias = \"c\")]\n   |                     ^^^ no value can reach this\n\nwarning: unreachable pattern\n  --> tests/ui/conflict/alias-enum.rs:58:22\n   |\n54 |     #[serde(alias = \"b\", alias = \"c\")]\n   |                                  --- matches all the relevant values\n...\n58 |     #[serde(rename = \"c\")]\n   |                      ^^^ no value can reach this\n\nwarning: unreachable pattern\n  --> tests/ui/conflict/alias-enum.rs:70:5\n   |\n65 |     #[serde(alias = \"B\", alias = \"c\")]\n   |                     --- matches all the relevant values\n...\n70 |     b,\n   |     ^ no value can reach this\n"
  },
  {
    "path": "test_suite/tests/ui/conflict/alias.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\nstruct S1 {\n    #[serde(alias = \"a\", alias = \"b\", alias = \"c\")]\n    a: (),\n\n    // Warning on \"c\" and \"b\"\n    #[serde(alias = \"c\")]\n    b: (),\n\n    #[serde(skip_deserializing)]\n    c: (),\n}\n\n#[derive(Deserialize)]\nstruct S2 {\n    #[serde(alias = \"b\", alias = \"c\")]\n    a: (),\n\n    // Warning on \"c\"\n    #[serde(rename = \"c\")]\n    b: (),\n}\n\n#[derive(Deserialize)]\n#[serde(rename_all = \"UPPERCASE\")]\nstruct S3 {\n    #[serde(alias = \"B\", alias = \"c\")]\n    a: (),\n\n    // Warning on \"b\" because this collides with the \"B\" above after applying\n    // rename rules\n    b: (),\n}\n\nfn main() {\n    __FAIL__;\n}\n"
  },
  {
    "path": "test_suite/tests/ui/conflict/alias.stderr",
    "content": "error[E0425]: cannot find value `__FAIL__` in this scope\n  --> tests/ui/conflict/alias.rs:38:5\n   |\n38 |     __FAIL__;\n   |     ^^^^^^^^ not found in this scope\n\nwarning: unreachable pattern\n  --> tests/ui/conflict/alias.rs:10:5\n   |\n 5 |     #[serde(alias = \"a\", alias = \"b\", alias = \"c\")]\n   |                                  --- matches all the relevant values\n...\n10 |     b: (),\n   |     ^ no value can reach this\n   |\n   = note: `#[warn(unreachable_patterns)]` (part of `#[warn(unused)]`) on by default\n\nwarning: unreachable pattern\n --> tests/ui/conflict/alias.rs:9:21\n  |\n5 |     #[serde(alias = \"a\", alias = \"b\", alias = \"c\")]\n  |                                               --- matches all the relevant values\n...\n9 |     #[serde(alias = \"c\")]\n  |                     ^^^ no value can reach this\n\nwarning: unreachable pattern\n  --> tests/ui/conflict/alias.rs:22:22\n   |\n18 |     #[serde(alias = \"b\", alias = \"c\")]\n   |                                  --- matches all the relevant values\n...\n22 |     #[serde(rename = \"c\")]\n   |                      ^^^ no value can reach this\n\nwarning: unreachable pattern\n  --> tests/ui/conflict/alias.rs:34:5\n   |\n29 |     #[serde(alias = \"B\", alias = \"c\")]\n   |                     --- matches all the relevant values\n...\n34 |     b: (),\n   |     ^ no value can reach this\n"
  },
  {
    "path": "test_suite/tests/ui/conflict/flatten-newtype-struct.rs",
    "content": "use serde_derive::Serialize;\nuse std::collections::HashMap;\n\n#[derive(Serialize)]\nstruct Foo(#[serde(flatten)] HashMap<String, String>);\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/conflict/flatten-newtype-struct.stderr",
    "content": "error: #[serde(flatten)] cannot be used on newtype structs\n --> tests/ui/conflict/flatten-newtype-struct.rs:5:12\n  |\n5 | struct Foo(#[serde(flatten)] HashMap<String, String>);\n  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/conflict/flatten-tuple-struct.rs",
    "content": "use serde_derive::Serialize;\nuse std::collections::HashMap;\n\n#[derive(Serialize)]\nstruct Foo(u32, #[serde(flatten)] HashMap<String, String>);\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/conflict/flatten-tuple-struct.stderr",
    "content": "error: #[serde(flatten)] cannot be used on tuple structs\n --> tests/ui/conflict/flatten-tuple-struct.rs:5:17\n  |\n5 | struct Foo(u32, #[serde(flatten)] HashMap<String, String>);\n  |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/conflict/from-try-from.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\n#[serde(from = \"u64\", try_from = \"u64\")]\nstruct S {\n    a: u8,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/conflict/from-try-from.stderr",
    "content": "error: #[serde(from = \"...\")] and #[serde(try_from = \"...\")] conflict with each other\n --> tests/ui/conflict/from-try-from.rs:4:1\n  |\n4 | / #[serde(from = \"u64\", try_from = \"u64\")]\n5 | | struct S {\n6 | |     a: u8,\n7 | | }\n  | |_^\n"
  },
  {
    "path": "test_suite/tests/ui/conflict/internal-tag-alias.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\n#[serde(tag = \"conflict\")]\nenum E {\n    A {\n        #[serde(alias = \"conflict\")]\n        x: (),\n    },\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/conflict/internal-tag-alias.stderr",
    "content": "error: variant field name `conflict` conflicts with internal tag\n  --> tests/ui/conflict/internal-tag-alias.rs:4:1\n   |\n 4 | / #[serde(tag = \"conflict\")]\n 5 | | enum E {\n 6 | |     A {\n 7 | |         #[serde(alias = \"conflict\")]\n 8 | |         x: (),\n 9 | |     },\n10 | | }\n   | |_^\n"
  },
  {
    "path": "test_suite/tests/ui/conflict/internal-tag.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\n#[serde(tag = \"conflict\")]\nenum E {\n    A {\n        #[serde(rename = \"conflict\")]\n        x: (),\n    },\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/conflict/internal-tag.stderr",
    "content": "error: variant field name `conflict` conflicts with internal tag\n  --> tests/ui/conflict/internal-tag.rs:4:1\n   |\n 4 | / #[serde(tag = \"conflict\")]\n 5 | | enum E {\n 6 | |     A {\n 7 | |         #[serde(rename = \"conflict\")]\n 8 | |         x: (),\n 9 | |     },\n10 | | }\n   | |_^\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/enum.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\n#[serde(default)]\nenum E {\n    S { f: u8 },\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/enum.stderr",
    "content": "error: #[serde(default)] can only be used on structs\n --> tests/ui/default-attribute/enum.rs:4:9\n  |\n4 | #[serde(default)]\n  |         ^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/enum_path.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\n#[serde(default = \"default_e\")]\nenum E {\n    S { f: u8 },\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/enum_path.stderr",
    "content": "error: #[serde(default = \"...\")] can only be used on structs\n --> tests/ui/default-attribute/enum_path.rs:4:9\n  |\n4 | #[serde(default = \"default_e\")]\n  |         ^^^^^^^^^^^^^^^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/incorrect_type_enum_adjacently_tagged.rs",
    "content": "// Tests that type error points to the path in attribute\n\nuse serde_derive::Deserialize;\n\n#[derive(Deserialize)]\n#[serde(tag = \"tag\", content = \"content\")]\nenum Enum {\n    // Newtype variants do not use the provided path, so it is forbidden here\n    // Newtype(#[serde(default = \"main\")] u8),\n    Tuple(u8, #[serde(default = \"main\")] i8),\n    Struct {\n        #[serde(default = \"main\")]\n        f1: u8,\n        f2: u8,\n        #[serde(default = \"main\")]\n        f3: i8,\n    },\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/incorrect_type_enum_adjacently_tagged.stderr",
    "content": "error[E0308]: `match` arms have incompatible types\n  --> tests/ui/default-attribute/incorrect_type_enum_adjacently_tagged.rs:10:33\n   |\n 5 | #[derive(Deserialize)]\n   |          -----------\n   |          |\n   |          this is found to be of type `i8`\n   |          `match` arms have incompatible types\n...\n10 |     Tuple(u8, #[serde(default = \"main\")] i8),\n   |                                 ^^^^^^ expected `i8`, found `()`\n\nerror[E0308]: `match` arms have incompatible types\n  --> tests/ui/default-attribute/incorrect_type_enum_adjacently_tagged.rs:12:27\n   |\n 5 | #[derive(Deserialize)]\n   |          -----------\n   |          |\n   |          this is found to be of type `u8`\n   |          `match` arms have incompatible types\n...\n12 |         #[serde(default = \"main\")]\n   |                           ^^^^^^ expected `u8`, found `()`\n\nerror[E0308]: `match` arms have incompatible types\n  --> tests/ui/default-attribute/incorrect_type_enum_adjacently_tagged.rs:15:27\n   |\n 5 | #[derive(Deserialize)]\n   |          -----------\n   |          |\n   |          this is found to be of type `i8`\n   |          `match` arms have incompatible types\n...\n15 |         #[serde(default = \"main\")]\n   |                           ^^^^^^ expected `i8`, found `()`\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/incorrect_type_enum_externally_tagged.rs",
    "content": "// Tests that type error points to the path in attribute\n\nuse serde_derive::Deserialize;\n\n#[derive(Deserialize)]\nenum Enum {\n    // Newtype variants do not use the provided path, so it is forbidden here\n    // Newtype(#[serde(default = \"main\")] u8),\n    Tuple(u8, #[serde(default = \"main\")] i8),\n    Struct {\n        #[serde(default = \"main\")]\n        f1: u8,\n        f2: u8,\n        #[serde(default = \"main\")]\n        f3: i8,\n    },\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/incorrect_type_enum_externally_tagged.stderr",
    "content": "error[E0308]: `match` arms have incompatible types\n --> tests/ui/default-attribute/incorrect_type_enum_externally_tagged.rs:9:33\n  |\n5 | #[derive(Deserialize)]\n  |          -----------\n  |          |\n  |          this is found to be of type `i8`\n  |          `match` arms have incompatible types\n...\n9 |     Tuple(u8, #[serde(default = \"main\")] i8),\n  |                                 ^^^^^^ expected `i8`, found `()`\n\nerror[E0308]: `match` arms have incompatible types\n  --> tests/ui/default-attribute/incorrect_type_enum_externally_tagged.rs:11:27\n   |\n 5 | #[derive(Deserialize)]\n   |          -----------\n   |          |\n   |          this is found to be of type `u8`\n   |          `match` arms have incompatible types\n...\n11 |         #[serde(default = \"main\")]\n   |                           ^^^^^^ expected `u8`, found `()`\n\nerror[E0308]: `match` arms have incompatible types\n  --> tests/ui/default-attribute/incorrect_type_enum_externally_tagged.rs:14:27\n   |\n 5 | #[derive(Deserialize)]\n   |          -----------\n   |          |\n   |          this is found to be of type `i8`\n   |          `match` arms have incompatible types\n...\n14 |         #[serde(default = \"main\")]\n   |                           ^^^^^^ expected `i8`, found `()`\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/incorrect_type_enum_internally_tagged.rs",
    "content": "// Tests that type error points to the path in attribute\n\nuse serde_derive::Deserialize;\n\n#[derive(Deserialize)]\n#[serde(tag = \"tag\")]\nenum Enum {\n    // Newtype variants do not use the provided path, so it is forbidden here\n    // Newtype(#[serde(default = \"main\")] u8),\n    // Tuple variants are not supported in internally tagged enums\n    Struct {\n        #[serde(default = \"main\")]\n        f1: u8,\n        f2: u8,\n        #[serde(default = \"main\")]\n        f3: i8,\n    },\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/incorrect_type_enum_internally_tagged.stderr",
    "content": "error[E0308]: `match` arms have incompatible types\n  --> tests/ui/default-attribute/incorrect_type_enum_internally_tagged.rs:12:27\n   |\n 5 | #[derive(Deserialize)]\n   |          -----------\n   |          |\n   |          this is found to be of type `u8`\n   |          `match` arms have incompatible types\n...\n12 |         #[serde(default = \"main\")]\n   |                           ^^^^^^ expected `u8`, found `()`\n\nerror[E0308]: `match` arms have incompatible types\n  --> tests/ui/default-attribute/incorrect_type_enum_internally_tagged.rs:15:27\n   |\n 5 | #[derive(Deserialize)]\n   |          -----------\n   |          |\n   |          this is found to be of type `i8`\n   |          `match` arms have incompatible types\n...\n15 |         #[serde(default = \"main\")]\n   |                           ^^^^^^ expected `i8`, found `()`\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/incorrect_type_enum_untagged.rs",
    "content": "// Tests that type error points to the path in attribute\n\nuse serde_derive::Deserialize;\n\n#[derive(Deserialize)]\n#[serde(untagged)]\nenum Enum {\n    // Newtype variants do not use the provided path, so it is forbidden here\n    // Newtype(#[serde(default = \"main\")] u8),\n    Tuple(u8, #[serde(default = \"main\")] i8),\n    Struct {\n        #[serde(default = \"main\")]\n        f1: u8,\n        f2: u8,\n        #[serde(default = \"main\")]\n        f3: i8,\n    },\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/incorrect_type_enum_untagged.stderr",
    "content": "error[E0308]: `match` arms have incompatible types\n  --> tests/ui/default-attribute/incorrect_type_enum_untagged.rs:10:33\n   |\n 5 | #[derive(Deserialize)]\n   |          -----------\n   |          |\n   |          this is found to be of type `i8`\n   |          `match` arms have incompatible types\n...\n10 |     Tuple(u8, #[serde(default = \"main\")] i8),\n   |                                 ^^^^^^ expected `i8`, found `()`\n\nerror[E0308]: `match` arms have incompatible types\n  --> tests/ui/default-attribute/incorrect_type_enum_untagged.rs:12:27\n   |\n 5 | #[derive(Deserialize)]\n   |          -----------\n   |          |\n   |          this is found to be of type `u8`\n   |          `match` arms have incompatible types\n...\n12 |         #[serde(default = \"main\")]\n   |                           ^^^^^^ expected `u8`, found `()`\n\nerror[E0308]: `match` arms have incompatible types\n  --> tests/ui/default-attribute/incorrect_type_enum_untagged.rs:15:27\n   |\n 5 | #[derive(Deserialize)]\n   |          -----------\n   |          |\n   |          this is found to be of type `i8`\n   |          `match` arms have incompatible types\n...\n15 |         #[serde(default = \"main\")]\n   |                           ^^^^^^ expected `i8`, found `()`\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/incorrect_type_newtype.rs",
    "content": "// Tests that type error points to the path in attribute\n\nuse serde_derive::Deserialize;\n\n#[derive(Deserialize)]\n#[serde(default = \"main\")]\nstruct Newtype(#[serde(default = \"main\")] u8);\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/incorrect_type_newtype.stderr",
    "content": "error[E0308]: mismatched types\n --> tests/ui/default-attribute/incorrect_type_newtype.rs:6:19\n  |\n6 | #[serde(default = \"main\")]\n  |                   ^^^^^^ expected `Newtype`, found `()`\n\nerror[E0308]: `match` arms have incompatible types\n --> tests/ui/default-attribute/incorrect_type_newtype.rs:7:34\n  |\n5 | #[derive(Deserialize)]\n  |          -----------\n  |          |\n  |          this is found to be of type `u8`\n  |          `match` arms have incompatible types\n6 | #[serde(default = \"main\")]\n7 | struct Newtype(#[serde(default = \"main\")] u8);\n  |                                  ^^^^^^ expected `u8`, found `()`\n\nerror[E0308]: mismatched types\n --> tests/ui/default-attribute/incorrect_type_newtype.rs:6:19\n  |\n6 | #[serde(default = \"main\")]\n  |                   ^^^^^^ expected `Newtype`, found `()`\n7 | struct Newtype(#[serde(default = \"main\")] u8);\n  |        ------- expected due to this\n\nerror[E0308]: mismatched types\n --> tests/ui/default-attribute/incorrect_type_newtype.rs:7:34\n  |\n5 | #[derive(Deserialize)]\n  |          ----------- expected due to the type of this binding\n6 | #[serde(default = \"main\")]\n7 | struct Newtype(#[serde(default = \"main\")] u8);\n  |                                  ^^^^^^ expected `u8`, found `()`\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/incorrect_type_struct.rs",
    "content": "// Tests that type error points to the path in attribute\n\nuse serde_derive::Deserialize;\n\n#[derive(Deserialize)]\n#[serde(default = \"main\")]\nstruct Struct {\n    #[serde(default = \"main\")]\n    f1: u8,\n    f2: u8,\n    #[serde(default = \"main\")]\n    f3: i8,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/incorrect_type_struct.stderr",
    "content": "error[E0308]: mismatched types\n --> tests/ui/default-attribute/incorrect_type_struct.rs:6:19\n  |\n6 | #[serde(default = \"main\")]\n  |                   ^^^^^^ expected `Struct`, found `()`\n\nerror[E0308]: `match` arms have incompatible types\n --> tests/ui/default-attribute/incorrect_type_struct.rs:8:23\n  |\n5 | #[derive(Deserialize)]\n  |          -----------\n  |          |\n  |          this is found to be of type `u8`\n  |          `match` arms have incompatible types\n...\n8 |     #[serde(default = \"main\")]\n  |                       ^^^^^^ expected `u8`, found `()`\n\nerror[E0308]: `match` arms have incompatible types\n  --> tests/ui/default-attribute/incorrect_type_struct.rs:11:23\n   |\n 5 | #[derive(Deserialize)]\n   |          -----------\n   |          |\n   |          this is found to be of type `i8`\n   |          `match` arms have incompatible types\n...\n11 |     #[serde(default = \"main\")]\n   |                       ^^^^^^ expected `i8`, found `()`\n\nerror[E0308]: mismatched types\n --> tests/ui/default-attribute/incorrect_type_struct.rs:6:19\n  |\n6 | #[serde(default = \"main\")]\n  |                   ^^^^^^ expected `Struct`, found `()`\n7 | struct Struct {\n  |        ------ expected due to this\n\nerror[E0308]: mismatched types\n --> tests/ui/default-attribute/incorrect_type_struct.rs:8:23\n  |\n5 | #[derive(Deserialize)]\n  |          ----------- expected due to the type of this binding\n...\n8 |     #[serde(default = \"main\")]\n  |                       ^^^^^^ expected `u8`, found `()`\n\nerror[E0308]: mismatched types\n  --> tests/ui/default-attribute/incorrect_type_struct.rs:11:23\n   |\n 5 | #[derive(Deserialize)]\n   |          ----------- expected due to the type of this binding\n...\n11 |     #[serde(default = \"main\")]\n   |                       ^^^^^^ expected `i8`, found `()`\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/incorrect_type_tuple.rs",
    "content": "// Tests that type error points to the path in attribute\n\nuse serde_derive::Deserialize;\n\n#[derive(Deserialize)]\n#[serde(default = \"main\")]\nstruct Tuple(u8, #[serde(default = \"main\")] i8);\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/incorrect_type_tuple.stderr",
    "content": "error[E0308]: mismatched types\n --> tests/ui/default-attribute/incorrect_type_tuple.rs:6:19\n  |\n6 | #[serde(default = \"main\")]\n  |                   ^^^^^^ expected `Tuple`, found `()`\n\nerror[E0308]: `match` arms have incompatible types\n --> tests/ui/default-attribute/incorrect_type_tuple.rs:7:36\n  |\n5 | #[derive(Deserialize)]\n  |          -----------\n  |          |\n  |          this is found to be of type `i8`\n  |          `match` arms have incompatible types\n6 | #[serde(default = \"main\")]\n7 | struct Tuple(u8, #[serde(default = \"main\")] i8);\n  |                                    ^^^^^^ expected `i8`, found `()`\n\nerror[E0308]: mismatched types\n --> tests/ui/default-attribute/incorrect_type_tuple.rs:6:19\n  |\n6 | #[serde(default = \"main\")]\n  |                   ^^^^^^ expected `Tuple`, found `()`\n7 | struct Tuple(u8, #[serde(default = \"main\")] i8);\n  |        ----- expected due to this\n\nerror[E0308]: mismatched types\n --> tests/ui/default-attribute/incorrect_type_tuple.rs:7:36\n  |\n5 | #[derive(Deserialize)]\n  |          ----------- expected due to the type of this binding\n6 | #[serde(default = \"main\")]\n7 | struct Tuple(u8, #[serde(default = \"main\")] i8);\n  |                                    ^^^^^^ expected `i8`, found `()`\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/tuple_struct.rs",
    "content": "use serde_derive::Deserialize;\n\n// No errors expected.\n#[derive(Deserialize)]\nstruct T0(u8, u8);\n\n// No errors expected:\n// - If both fields are provided, both get value from data.\n// - If only one field is provided, the second gets default value.\n#[derive(Deserialize)]\nstruct T1(u8, #[serde(default)] u8);\n\n// ERROR: The first field can get default value only if sequence is empty, but\n// that means that all other fields cannot be deserialized without errors.\n#[derive(Deserialize)]\nstruct T2(#[serde(default)] u8, u8, u8);\n\n// No errors expected:\n// - If both fields are provided, both get value from data.\n// - If only one field is provided, the second gets default value.\n// - If no fields are provided, both get default value.\n#[derive(Deserialize)]\nstruct T3(#[serde(default)] u8, #[serde(default)] u8);\n\n////////////////////////////////////////////////////////////////////////////////\n\n// No errors expected -- missing fields get default values.\n#[derive(Deserialize, Default)]\n#[serde(default)]\nstruct T4(u8, u8);\n\n// No errors expected -- missing fields get default values.\n#[derive(Deserialize, Default)]\n#[serde(default)]\nstruct T5(#[serde(default)] u8, u8);\n\n// No errors expected -- missing fields get default values.\n#[derive(Deserialize, Default)]\n#[serde(default)]\nstruct T6(u8, #[serde(default)] u8);\n\n// No errors expected -- missing fields get default values.\n#[derive(Deserialize, Default)]\n#[serde(default)]\nstruct T7(#[serde(default)] u8, #[serde(default)] u8);\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/tuple_struct.stderr",
    "content": "error: field must have #[serde(default)] because previous field 0 has #[serde(default)]\n  --> tests/ui/default-attribute/tuple_struct.rs:16:33\n   |\n16 | struct T2(#[serde(default)] u8, u8, u8);\n   |                                 ^^\n\nerror: field must have #[serde(default)] because previous field 0 has #[serde(default)]\n  --> tests/ui/default-attribute/tuple_struct.rs:16:37\n   |\n16 | struct T2(#[serde(default)] u8, u8, u8);\n   |                                     ^^\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/tuple_struct_path.rs",
    "content": "use serde_derive::Deserialize;\n\nfn d<T>() -> T {\n    unimplemented!()\n}\n\n// No errors expected:\n// - If both fields are provided, both get value from data.\n// - If only one field is provided, the second gets default value.\n#[derive(Deserialize)]\nstruct T1(u8, #[serde(default = \"d\")] u8);\n\n// ERROR: The first field can get default value only if sequence is empty, but\n// that means that all other fields cannot be deserialized without errors.\n#[derive(Deserialize)]\nstruct T2(#[serde(default = \"d\")] u8, u8, u8);\n\n// No errors expected:\n// - If both fields are provided, both get value from data.\n// - If only one field is provided, the second gets default value.\n// - If no fields are provided, both get default value.\n#[derive(Deserialize)]\nstruct T3(#[serde(default = \"d\")] u8, #[serde(default = \"d\")] u8);\n\n////////////////////////////////////////////////////////////////////////////////\n\n// No errors expected -- missing fields get default values.\n#[derive(Deserialize, Default)]\n#[serde(default)]\nstruct T1D(#[serde(default = \"d\")] u8, u8);\n\n// No errors expected -- missing fields get default values.\n#[derive(Deserialize, Default)]\n#[serde(default)]\nstruct T2D(u8, #[serde(default = \"d\")] u8);\n\n// No errors expected -- missing fields get default values.\n#[derive(Deserialize, Default)]\n#[serde(default)]\nstruct T3D(#[serde(default = \"d\")] u8, #[serde(default = \"d\")] u8);\n\n////////////////////////////////////////////////////////////////////////////////\n\n// No errors expected -- missing fields get default values.\n#[derive(Deserialize)]\n#[serde(default = \"d\")]\nstruct T1Path(#[serde(default)] u8, u8);\n\n// No errors expected -- missing fields get default values.\n#[derive(Deserialize)]\n#[serde(default = \"d\")]\nstruct T2Path(u8, #[serde(default)] u8);\n\n// No errors expected -- missing fields get default values.\n#[derive(Deserialize)]\n#[serde(default = \"d\")]\nstruct T3Path(#[serde(default)] u8, #[serde(default)] u8);\n\n////////////////////////////////////////////////////////////////////////////////\n\n// No errors expected -- missing fields get default values.\n#[derive(Deserialize)]\n#[serde(default = \"d\")]\nstruct T1PathD(#[serde(default = \"d\")] u8, u8);\n\n// No errors expected -- missing fields get default values.\n#[derive(Deserialize)]\n#[serde(default = \"d\")]\nstruct T2PathD(u8, #[serde(default = \"d\")] u8);\n\n// No errors expected -- missing fields get default values.\n#[derive(Deserialize)]\n#[serde(default = \"d\")]\nstruct T3PathD(#[serde(default = \"d\")] u8, #[serde(default = \"d\")] u8);\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/tuple_struct_path.stderr",
    "content": "error: field must have #[serde(default)] because previous field 0 has #[serde(default)]\n  --> tests/ui/default-attribute/tuple_struct_path.rs:16:39\n   |\n16 | struct T2(#[serde(default = \"d\")] u8, u8, u8);\n   |                                       ^^\n\nerror: field must have #[serde(default)] because previous field 0 has #[serde(default)]\n  --> tests/ui/default-attribute/tuple_struct_path.rs:16:43\n   |\n16 | struct T2(#[serde(default = \"d\")] u8, u8, u8);\n   |                                           ^^\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/union.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\n#[serde(default)]\nunion Union {\n    f: u8,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/union.stderr",
    "content": "error: #[serde(default)] can only be used on structs\n --> tests/ui/default-attribute/union.rs:4:9\n  |\n4 | #[serde(default)]\n  |         ^^^^^^^\n\nerror: Serde does not support derive for unions\n --> tests/ui/default-attribute/union.rs:4:1\n  |\n4 | / #[serde(default)]\n5 | | union Union {\n6 | |     f: u8,\n7 | | }\n  | |_^\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/union_path.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\n#[serde(default = \"default_u\")]\nunion Union {\n    f: u8,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/union_path.stderr",
    "content": "error: #[serde(default = \"...\")] can only be used on structs\n --> tests/ui/default-attribute/union_path.rs:4:9\n  |\n4 | #[serde(default = \"default_u\")]\n  |         ^^^^^^^^^^^^^^^^^^^^^\n\nerror: Serde does not support derive for unions\n --> tests/ui/default-attribute/union_path.rs:4:1\n  |\n4 | / #[serde(default = \"default_u\")]\n5 | | union Union {\n6 | |     f: u8,\n7 | | }\n  | |_^\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/unit.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\n#[serde(default)]\nstruct Unit;\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/unit.stderr",
    "content": "error: #[serde(default)] can only be used on structs that have fields\n --> tests/ui/default-attribute/unit.rs:3:10\n  |\n3 | #[derive(Deserialize)]\n  |          ^^^^^^^^^^^\n  |\n  = note: this error originates in the derive macro `Deserialize` (in Nightly builds, run with -Z macro-backtrace for more info)\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/unit_path.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\n#[serde(default = \"default_u\")]\nstruct Unit;\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/default-attribute/unit_path.stderr",
    "content": "error: #[serde(default = \"...\")] can only be used on structs that have fields\n --> tests/ui/default-attribute/unit_path.rs:4:9\n  |\n4 | #[serde(default = \"default_u\")]\n  |         ^^^^^^^^^^^^^^^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/deprecated/deprecated_de_with.rs",
    "content": "#![deny(deprecated)]\n\nuse serde::Deserializer;\nuse serde_derive::Deserialize;\n\n#[derive(Deserialize)]\npub struct Struct {\n    #[serde(deserialize_with = \"deprecated_with\")]\n    pub field: i32,\n}\n\n#[deprecated]\nfn deprecated_with<'de, D>(_deserializer: D) -> Result<i32, D::Error>\nwhere\n    D: Deserializer<'de>,\n{\n    unimplemented!()\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/deprecated/deprecated_de_with.stderr",
    "content": "error: use of deprecated function `deprecated_with`\n --> tests/ui/deprecated/deprecated_de_with.rs:8:32\n  |\n8 |     #[serde(deserialize_with = \"deprecated_with\")]\n  |                                ^^^^^^^^^^^^^^^^^\n  |\nnote: the lint level is defined here\n --> tests/ui/deprecated/deprecated_de_with.rs:1:9\n  |\n1 | #![deny(deprecated)]\n  |         ^^^^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/deprecated/deprecated_ser_with.rs",
    "content": "#![deny(deprecated)]\n\nuse serde::Serializer;\nuse serde_derive::Serialize;\n\n#[derive(Serialize)]\npub struct Struct {\n    #[serde(serialize_with = \"deprecated_with\")]\n    pub field: i32,\n}\n\n#[deprecated]\nfn deprecated_with<S>(_field: &i32, _serializer: S) -> Result<S::Ok, S::Error>\nwhere\n    S: Serializer,\n{\n    unimplemented!()\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/deprecated/deprecated_ser_with.stderr",
    "content": "error: use of deprecated function `deprecated_with`\n --> tests/ui/deprecated/deprecated_ser_with.rs:8:30\n  |\n8 |     #[serde(serialize_with = \"deprecated_with\")]\n  |                              ^^^^^^^^^^^^^^^^^\n  |\nnote: the lint level is defined here\n --> tests/ui/deprecated/deprecated_ser_with.rs:1:9\n  |\n1 | #![deny(deprecated)]\n  |         ^^^^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/duplicate-attribute/rename-and-ser.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\nstruct S {\n    #[serde(rename = \"x\", serialize = \"y\")]\n    x: (),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/duplicate-attribute/rename-and-ser.stderr",
    "content": "error: unknown serde field attribute `serialize`\n --> tests/ui/duplicate-attribute/rename-and-ser.rs:5:27\n  |\n5 |     #[serde(rename = \"x\", serialize = \"y\")]\n  |                           ^^^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/duplicate-attribute/rename-ser-rename-ser.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\nstruct S {\n    #[serde(rename(serialize = \"x\"), rename(serialize = \"y\"))]\n    x: (),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/duplicate-attribute/rename-ser-rename-ser.stderr",
    "content": "error: duplicate serde attribute `rename`\n --> tests/ui/duplicate-attribute/rename-ser-rename-ser.rs:5:38\n  |\n5 |     #[serde(rename(serialize = \"x\"), rename(serialize = \"y\"))]\n  |                                      ^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/duplicate-attribute/rename-ser-rename.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\nstruct S {\n    #[serde(rename(serialize = \"x\"))]\n    #[serde(rename = \"y\")]\n    x: (),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/duplicate-attribute/rename-ser-rename.stderr",
    "content": "error: duplicate serde attribute `rename`\n --> tests/ui/duplicate-attribute/rename-ser-rename.rs:6:13\n  |\n6 |     #[serde(rename = \"y\")]\n  |             ^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/duplicate-attribute/rename-ser-ser.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\nstruct S {\n    #[serde(rename(serialize = \"x\", serialize = \"y\"))]\n    x: (),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/duplicate-attribute/rename-ser-ser.stderr",
    "content": "error: duplicate serde attribute `rename`\n --> tests/ui/duplicate-attribute/rename-ser-ser.rs:5:37\n  |\n5 |     #[serde(rename(serialize = \"x\", serialize = \"y\"))]\n  |                                     ^^^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/duplicate-attribute/two-rename-ser.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\nstruct S {\n    #[serde(rename(serialize = \"x\"))]\n    #[serde(rename(serialize = \"y\"))]\n    x: (),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/duplicate-attribute/two-rename-ser.stderr",
    "content": "error: duplicate serde attribute `rename`\n --> tests/ui/duplicate-attribute/two-rename-ser.rs:6:13\n  |\n6 |     #[serde(rename(serialize = \"y\"))]\n  |             ^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/duplicate-attribute/with-and-serialize-with.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\nstruct S {\n    #[serde(with = \"w\", serialize_with = \"s\")]\n    x: (),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/duplicate-attribute/with-and-serialize-with.stderr",
    "content": "error: duplicate serde attribute `serialize_with`\n --> tests/ui/duplicate-attribute/with-and-serialize-with.rs:5:25\n  |\n5 |     #[serde(with = \"w\", serialize_with = \"s\")]\n  |                         ^^^^^^^^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/enum-representation/content-no-tag.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\n#[serde(content = \"c\")]\nenum E {\n    A(u8),\n    B(String),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/enum-representation/content-no-tag.stderr",
    "content": "error: #[serde(tag = \"...\", content = \"...\")] must be used together\n --> tests/ui/enum-representation/content-no-tag.rs:4:9\n  |\n4 | #[serde(content = \"c\")]\n  |         ^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/enum-representation/internal-tuple-variant.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\n#[serde(tag = \"type\")]\nenum E {\n    Tuple(u8, u8),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/enum-representation/internal-tuple-variant.stderr",
    "content": "error: #[serde(tag = \"...\")] cannot be used with tuple variants\n --> tests/ui/enum-representation/internal-tuple-variant.rs:6:5\n  |\n6 |     Tuple(u8, u8),\n  |     ^^^^^^^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/enum-representation/partially_tagged_wrong_order.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\nenum E {\n    #[serde(untagged)]\n    A(u8),\n    B(String),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/enum-representation/partially_tagged_wrong_order.stderr",
    "content": "error: all variants with the #[serde(untagged)] attribute must be placed at the end of the enum\n --> tests/ui/enum-representation/partially_tagged_wrong_order.rs:6:5\n  |\n6 |     A(u8),\n  |     ^\n"
  },
  {
    "path": "test_suite/tests/ui/enum-representation/untagged-and-adjacent.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\n#[serde(untagged)]\n#[serde(tag = \"t\", content = \"c\")]\nenum E {\n    A(u8),\n    B(String),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/enum-representation/untagged-and-adjacent.stderr",
    "content": "error: untagged enum cannot have #[serde(tag = \"...\", content = \"...\")]\n --> tests/ui/enum-representation/untagged-and-adjacent.rs:4:9\n  |\n4 | #[serde(untagged)]\n  |         ^^^^^^^^\n\nerror: untagged enum cannot have #[serde(tag = \"...\", content = \"...\")]\n --> tests/ui/enum-representation/untagged-and-adjacent.rs:5:9\n  |\n5 | #[serde(tag = \"t\", content = \"c\")]\n  |         ^^^\n\nerror: untagged enum cannot have #[serde(tag = \"...\", content = \"...\")]\n --> tests/ui/enum-representation/untagged-and-adjacent.rs:5:20\n  |\n5 | #[serde(tag = \"t\", content = \"c\")]\n  |                    ^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/enum-representation/untagged-and-content.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\n#[serde(untagged)]\n#[serde(content = \"c\")]\nenum E {\n    A(u8),\n    B(String),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/enum-representation/untagged-and-content.stderr",
    "content": "error: untagged enum cannot have #[serde(content = \"...\")]\n --> tests/ui/enum-representation/untagged-and-content.rs:4:9\n  |\n4 | #[serde(untagged)]\n  |         ^^^^^^^^\n\nerror: untagged enum cannot have #[serde(content = \"...\")]\n --> tests/ui/enum-representation/untagged-and-content.rs:5:9\n  |\n5 | #[serde(content = \"c\")]\n  |         ^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/enum-representation/untagged-and-internal.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\n#[serde(untagged)]\n#[serde(tag = \"type\")]\nenum E {\n    A(u8),\n    B(String),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/enum-representation/untagged-and-internal.stderr",
    "content": "error: enum cannot be both untagged and internally tagged\n --> tests/ui/enum-representation/untagged-and-internal.rs:4:9\n  |\n4 | #[serde(untagged)]\n  |         ^^^^^^^^\n\nerror: enum cannot be both untagged and internally tagged\n --> tests/ui/enum-representation/untagged-and-internal.rs:5:9\n  |\n5 | #[serde(tag = \"type\")]\n  |         ^^^\n"
  },
  {
    "path": "test_suite/tests/ui/enum-representation/untagged-struct.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\n#[serde(untagged)]\nstruct S;\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/enum-representation/untagged-struct.stderr",
    "content": "error: #[serde(untagged)] can only be used on enums\n --> tests/ui/enum-representation/untagged-struct.rs:4:9\n  |\n4 | #[serde(untagged)]\n  |         ^^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/expected-string/boolean.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\nstruct S {\n    #[serde(rename = true)]\n    boolean: (),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/expected-string/boolean.stderr",
    "content": "error: expected serde rename attribute to be a string: `rename = \"...\"`\n --> tests/ui/expected-string/boolean.rs:5:22\n  |\n5 |     #[serde(rename = true)]\n  |                      ^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/expected-string/byte_character.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\nstruct S {\n    #[serde(rename = b'a')]\n    byte_character: (),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/expected-string/byte_character.stderr",
    "content": "error: expected serde rename attribute to be a string: `rename = \"...\"`\n --> tests/ui/expected-string/byte_character.rs:5:22\n  |\n5 |     #[serde(rename = b'a')]\n  |                      ^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/expected-string/byte_string.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\nstruct S {\n    #[serde(rename = b\"byte string\")]\n    byte_string: (),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/expected-string/byte_string.stderr",
    "content": "error: expected serde rename attribute to be a string: `rename = \"...\"`\n --> tests/ui/expected-string/byte_string.rs:5:22\n  |\n5 |     #[serde(rename = b\"byte string\")]\n  |                      ^^^^^^^^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/expected-string/character.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\nstruct S {\n    #[serde(rename = 'a')]\n    character: (),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/expected-string/character.stderr",
    "content": "error: expected serde rename attribute to be a string: `rename = \"...\"`\n --> tests/ui/expected-string/character.rs:5:22\n  |\n5 |     #[serde(rename = 'a')]\n  |                      ^^^\n"
  },
  {
    "path": "test_suite/tests/ui/expected-string/float.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\nstruct S {\n    #[serde(rename = 3.14)]\n    float: (),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/expected-string/float.stderr",
    "content": "error: expected serde rename attribute to be a string: `rename = \"...\"`\n --> tests/ui/expected-string/float.rs:5:22\n  |\n5 |     #[serde(rename = 3.14)]\n  |                      ^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/expected-string/integer.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\nstruct S {\n    #[serde(rename = 100)]\n    integer: (),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/expected-string/integer.stderr",
    "content": "error: expected serde rename attribute to be a string: `rename = \"...\"`\n --> tests/ui/expected-string/integer.rs:5:22\n  |\n5 |     #[serde(rename = 100)]\n  |                      ^^^\n"
  },
  {
    "path": "test_suite/tests/ui/identifier/both.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\n#[serde(field_identifier, variant_identifier)]\nenum F {\n    A,\n    B,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/identifier/both.stderr",
    "content": "error: #[serde(field_identifier)] and #[serde(variant_identifier)] cannot both be set\n --> tests/ui/identifier/both.rs:4:9\n  |\n4 | #[serde(field_identifier, variant_identifier)]\n  |         ^^^^^^^^^^^^^^^^\n\nerror: #[serde(field_identifier)] and #[serde(variant_identifier)] cannot both be set\n --> tests/ui/identifier/both.rs:4:27\n  |\n4 | #[serde(field_identifier, variant_identifier)]\n  |                           ^^^^^^^^^^^^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/identifier/field_struct.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\n#[serde(field_identifier)]\nstruct S;\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/identifier/field_struct.stderr",
    "content": "error: #[serde(field_identifier)] can only be used on an enum\n --> tests/ui/identifier/field_struct.rs:5:1\n  |\n5 | struct S;\n  | ^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/identifier/field_tuple.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\n#[serde(field_identifier)]\nenum F {\n    A,\n    B(u8, u8),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/identifier/field_tuple.stderr",
    "content": "error: #[serde(field_identifier)] may only contain unit variants\n --> tests/ui/identifier/field_tuple.rs:7:5\n  |\n7 |     B(u8, u8),\n  |     ^^^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/identifier/newtype_not_last.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\n#[serde(field_identifier)]\nenum F {\n    A,\n    Other(String),\n    B,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/identifier/newtype_not_last.stderr",
    "content": "error: `Other` must be the last variant\n --> tests/ui/identifier/newtype_not_last.rs:7:5\n  |\n7 |     Other(String),\n  |     ^^^^^^^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/identifier/not_unit.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\n#[serde(field_identifier)]\nenum F {\n    A,\n    #[serde(other)]\n    Other(u8, u8),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/identifier/not_unit.stderr",
    "content": "error: #[serde(other)] must be on a unit variant\n --> tests/ui/identifier/not_unit.rs:7:5\n  |\n7 | /     #[serde(other)]\n8 | |     Other(u8, u8),\n  | |_________________^\n"
  },
  {
    "path": "test_suite/tests/ui/identifier/other_not_last.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\n#[serde(field_identifier)]\nenum F {\n    A,\n    #[serde(other)]\n    Other,\n    B,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/identifier/other_not_last.stderr",
    "content": "error: #[serde(other)] must be on the last variant\n --> tests/ui/identifier/other_not_last.rs:7:5\n  |\n7 | /     #[serde(other)]\n8 | |     Other,\n  | |_________^\n"
  },
  {
    "path": "test_suite/tests/ui/identifier/other_untagged.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\n#[serde(untagged)]\nenum F {\n    #[serde(other)]\n    Other,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/identifier/other_untagged.stderr",
    "content": "error: #[serde(other)] cannot appear on untagged enum\n --> tests/ui/identifier/other_untagged.rs:6:5\n  |\n6 | /     #[serde(other)]\n7 | |     Other,\n  | |_________^\n"
  },
  {
    "path": "test_suite/tests/ui/identifier/other_variant.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\n#[serde(variant_identifier)]\nenum F {\n    #[serde(other)]\n    Other,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/identifier/other_variant.stderr",
    "content": "error: #[serde(other)] may not be used on a variant identifier\n --> tests/ui/identifier/other_variant.rs:6:5\n  |\n6 | /     #[serde(other)]\n7 | |     Other,\n  | |_________^\n"
  },
  {
    "path": "test_suite/tests/ui/identifier/variant_struct.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\n#[serde(variant_identifier)]\nstruct S;\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/identifier/variant_struct.stderr",
    "content": "error: #[serde(variant_identifier)] can only be used on an enum\n --> tests/ui/identifier/variant_struct.rs:5:1\n  |\n5 | struct S;\n  | ^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/identifier/variant_tuple.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\n#[serde(variant_identifier)]\nenum F {\n    A,\n    B(u8, u8),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/identifier/variant_tuple.stderr",
    "content": "error: #[serde(variant_identifier)] may only contain unit variants\n --> tests/ui/identifier/variant_tuple.rs:7:5\n  |\n7 |     B(u8, u8),\n  |     ^^^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/malformed/bound.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\nstruct S {\n    #[serde(bound(unknown))]\n    x: (),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/malformed/bound.stderr",
    "content": "error: malformed bound attribute, expected `bound(serialize = ..., deserialize = ...)`\n --> tests/ui/malformed/bound.rs:5:19\n  |\n5 |     #[serde(bound(unknown))]\n  |                   ^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/malformed/cut_off.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\n#[serde(rename =)]\nstruct S;\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/malformed/cut_off.stderr",
    "content": "error: unexpected end of input, expected an expression\n --> tests/ui/malformed/cut_off.rs:4:17\n  |\n4 | #[serde(rename =)]\n  |                 ^\n"
  },
  {
    "path": "test_suite/tests/ui/malformed/not_list.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\n#[serde]\n#[serde = \"?\"]\nstruct S;\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/malformed/not_list.stderr",
    "content": "error: expected attribute arguments in parentheses: #[serde(...)]\n --> tests/ui/malformed/not_list.rs:4:3\n  |\n4 | #[serde]\n  |   ^^^^^\n\nerror: expected parentheses: #[serde(...)]\n --> tests/ui/malformed/not_list.rs:5:9\n  |\n5 | #[serde = \"?\"]\n  |         ^\n"
  },
  {
    "path": "test_suite/tests/ui/malformed/rename.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\nstruct S {\n    #[serde(rename(unknown))]\n    x: (),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/malformed/rename.stderr",
    "content": "error: malformed rename attribute, expected `rename(serialize = ..., deserialize = ...)`\n --> tests/ui/malformed/rename.rs:5:20\n  |\n5 |     #[serde(rename(unknown))]\n  |                    ^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/malformed/str_suffix.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\n#[serde(bound = \"\"huh)]\npub struct Struct {\n    #[serde(rename = \"\"what)]\n    pub field: i32,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/malformed/str_suffix.stderr",
    "content": "error: unexpected suffix `huh` on string literal\n --> tests/ui/malformed/str_suffix.rs:4:17\n  |\n4 | #[serde(bound = \"\"huh)]\n  |                 ^^^^^\n\nerror: unexpected suffix `what` on string literal\n --> tests/ui/malformed/str_suffix.rs:6:22\n  |\n6 |     #[serde(rename = \"\"what)]\n  |                      ^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/malformed/trailing_expr.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\nstruct S {\n    #[serde(skip_serializing_if, x.is_empty())]\n    x: Vec<()>,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/malformed/trailing_expr.stderr",
    "content": "error: expected `=`\n --> tests/ui/malformed/trailing_expr.rs:5:32\n  |\n5 |     #[serde(skip_serializing_if, x.is_empty())]\n  |                                ^\n"
  },
  {
    "path": "test_suite/tests/ui/precondition/deserialize_de_lifetime.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\nstruct S<'de> {\n    s: &'de str,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/precondition/deserialize_de_lifetime.stderr",
    "content": "error: cannot deserialize when there is a lifetime parameter called 'de\n --> tests/ui/precondition/deserialize_de_lifetime.rs:4:10\n  |\n4 | struct S<'de> {\n  |          ^^^\n"
  },
  {
    "path": "test_suite/tests/ui/precondition/deserialize_dst.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\nstruct S {\n    string: String,\n    slice: [u8],\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/precondition/deserialize_dst.stderr",
    "content": "error: cannot deserialize a dynamically sized struct\n --> tests/ui/precondition/deserialize_dst.rs:4:1\n  |\n4 | / struct S {\n5 | |     string: String,\n6 | |     slice: [u8],\n7 | | }\n  | |_^\n"
  },
  {
    "path": "test_suite/tests/ui/precondition/serialize_field_identifier.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\n#[serde(field_identifier)]\nenum F {\n    A,\n    B,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/precondition/serialize_field_identifier.stderr",
    "content": "error: field identifiers cannot be serialized\n --> tests/ui/precondition/serialize_field_identifier.rs:4:1\n  |\n4 | / #[serde(field_identifier)]\n5 | | enum F {\n6 | |     A,\n7 | |     B,\n8 | | }\n  | |_^\n"
  },
  {
    "path": "test_suite/tests/ui/precondition/serialize_variant_identifier.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\n#[serde(variant_identifier)]\nenum F {\n    A,\n    B,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/precondition/serialize_variant_identifier.stderr",
    "content": "error: variant identifiers cannot be serialized\n --> tests/ui/precondition/serialize_variant_identifier.rs:4:1\n  |\n4 | / #[serde(variant_identifier)]\n5 | | enum F {\n6 | |     A,\n7 | |     B,\n8 | | }\n  | |_^\n"
  },
  {
    "path": "test_suite/tests/ui/remote/bad_getter.rs",
    "content": "use serde_derive::Serialize;\n\nmod remote {\n    pub struct S {\n        a: u8,\n    }\n}\n\n#[derive(Serialize)]\n#[serde(remote = \"remote::S\")]\nstruct S {\n    #[serde(getter = \"~~~\")]\n    a: u8,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/remote/bad_getter.stderr",
    "content": "error: failed to parse path: \"~~~\"\n  --> tests/ui/remote/bad_getter.rs:12:22\n   |\n12 |     #[serde(getter = \"~~~\")]\n   |                      ^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/remote/bad_remote.rs",
    "content": "use serde_derive::Serialize;\n\nmod remote {\n    pub struct S {\n        a: u8,\n    }\n}\n\n#[derive(Serialize)]\n#[serde(remote = \"~~~\")]\nstruct S {\n    a: u8,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/remote/bad_remote.stderr",
    "content": "error: failed to parse path: \"~~~\"\n  --> tests/ui/remote/bad_remote.rs:10:18\n   |\n10 | #[serde(remote = \"~~~\")]\n   |                  ^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/remote/double_generic.rs",
    "content": "use serde_derive::{Deserialize, Serialize};\n\nmod remote {\n    pub struct Struct<T, U> {\n        pub t: T,\n        pub u: U,\n    }\n}\n\n#[derive(Serialize, Deserialize)]\n#[serde(remote = \"remote::StructGeneric<u8>\")]\nstruct StructDef<U> {\n    t: u8,\n    u: U,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/remote/double_generic.stderr",
    "content": "error: remove generic parameters from this path\n  --> tests/ui/remote/double_generic.rs:11:18\n   |\n11 | #[serde(remote = \"remote::StructGeneric<u8>\")]\n   |                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/remote/enum_getter.rs",
    "content": "use serde_derive::Serialize;\n\nmod remote {\n    pub enum E {\n        A { a: u8 },\n    }\n}\n\n#[derive(Serialize)]\n#[serde(remote = \"remote::E\")]\npub enum E {\n    A {\n        #[serde(getter = \"get_a\")]\n        a: u8,\n    },\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/remote/enum_getter.stderr",
    "content": "error: #[serde(getter = \"...\")] is not allowed in an enum\n  --> tests/ui/remote/enum_getter.rs:10:1\n   |\n10 | / #[serde(remote = \"remote::E\")]\n11 | | pub enum E {\n12 | |     A {\n13 | |         #[serde(getter = \"get_a\")]\n14 | |         a: u8,\n15 | |     },\n16 | | }\n   | |_^\n"
  },
  {
    "path": "test_suite/tests/ui/remote/missing_field.rs",
    "content": "use serde_derive::{Deserialize, Serialize};\n\nmod remote {\n    pub struct S {\n        pub a: u8,\n        pub b: u8,\n    }\n}\n\n#[derive(Serialize, Deserialize)]\n#[serde(remote = \"remote::S\")]\nstruct S {\n    a: u8,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/remote/missing_field.stderr",
    "content": "error[E0063]: missing field `b` in initializer of `remote::S`\n  --> tests/ui/remote/missing_field.rs:11:18\n   |\n11 | #[serde(remote = \"remote::S\")]\n   |                  ^^^^^^^^^^^ missing `b`\n"
  },
  {
    "path": "test_suite/tests/ui/remote/nonremote_getter.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\nstruct S {\n    #[serde(getter = \"S::get\")]\n    a: u8,\n}\n\nimpl S {\n    fn get(&self) -> u8 {\n        self.a\n    }\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/remote/nonremote_getter.stderr",
    "content": "error: #[serde(getter = \"...\")] can only be used in structs that have #[serde(remote = \"...\")]\n --> tests/ui/remote/nonremote_getter.rs:4:1\n  |\n4 | / struct S {\n5 | |     #[serde(getter = \"S::get\")]\n6 | |     a: u8,\n7 | | }\n  | |_^\n"
  },
  {
    "path": "test_suite/tests/ui/remote/unknown_field.rs",
    "content": "use serde_derive::{Deserialize, Serialize};\n\nmod remote {\n    pub struct S {\n        pub a: u8,\n    }\n}\n\n#[derive(Serialize, Deserialize)]\n#[serde(remote = \"remote::S\")]\nstruct S {\n    b: u8,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/remote/unknown_field.stderr",
    "content": "error[E0609]: no field `b` on type `&remote::S`\n  --> tests/ui/remote/unknown_field.rs:12:5\n   |\n12 |     b: u8,\n   |     ^ unknown field\n   |\nhelp: a field with a similar name exists\n   |\n12 -     b: u8,\n12 +     a: u8,\n   |\n\nerror[E0560]: struct `remote::S` has no field named `b`\n  --> tests/ui/remote/unknown_field.rs:12:5\n   |\n12 |     b: u8,\n   |     ^ `remote::S` does not have this field\n   |\n   = note: all struct fields are already assigned\n"
  },
  {
    "path": "test_suite/tests/ui/remote/wrong_de.rs",
    "content": "use serde_derive::Deserialize;\n\nmod remote {\n    pub struct S(pub u16);\n}\n\n#[derive(Deserialize)]\n#[serde(remote = \"remote::S\")]\nstruct S(u8);\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/remote/wrong_de.stderr",
    "content": "error[E0308]: mismatched types\n --> tests/ui/remote/wrong_de.rs:7:10\n  |\n7 | #[derive(Deserialize)]\n  |          ^^^^^^^^^^^ expected `u16`, found `u8`\n8 | #[serde(remote = \"remote::S\")]\n  |                  ----------- arguments to this struct are incorrect\n  |\nnote: tuple struct defined here\n --> tests/ui/remote/wrong_de.rs:4:16\n  |\n4 |     pub struct S(pub u16);\n  |                ^\n  = note: this error originates in the derive macro `Deserialize` (in Nightly builds, run with -Z macro-backtrace for more info)\n"
  },
  {
    "path": "test_suite/tests/ui/remote/wrong_getter.rs",
    "content": "use serde_derive::Serialize;\n\nmod remote {\n    pub struct S {\n        a: u8,\n    }\n\n    impl S {\n        pub fn get(&self) -> u16 {\n            self.a as u16\n        }\n    }\n}\n\n#[derive(Serialize)]\n#[serde(remote = \"remote::S\")]\nstruct S {\n    #[serde(getter = \"remote::S::get\")]\n    a: u8,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/remote/wrong_getter.stderr",
    "content": "error[E0308]: mismatched types\n  --> tests/ui/remote/wrong_getter.rs:15:10\n   |\n15 | #[derive(Serialize)]\n   |          ^^^^^^^^^\n   |          |\n   |          expected `&u8`, found `&u16`\n   |          arguments to this function are incorrect\n   |\n   = note: expected reference `&u8`\n              found reference `&u16`\nnote: function defined here\n  --> $WORKSPACE/serde/src/private/ser.rs\n   |\n   | pub fn constrain<T: ?Sized>(t: &T) -> &T {\n   |        ^^^^^^^^^\n   = note: this error originates in the derive macro `Serialize` (in Nightly builds, run with -Z macro-backtrace for more info)\n"
  },
  {
    "path": "test_suite/tests/ui/remote/wrong_ser.rs",
    "content": "use serde_derive::Serialize;\n\nmod remote {\n    pub struct S {\n        pub a: u16,\n    }\n}\n\n#[derive(Serialize)]\n#[serde(remote = \"remote::S\")]\nstruct S {\n    a: u8,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/remote/wrong_ser.stderr",
    "content": "error[E0308]: mismatched types\n --> tests/ui/remote/wrong_ser.rs:9:10\n  |\n9 | #[derive(Serialize)]\n  |          ^^^^^^^^^\n  |          |\n  |          expected `&u8`, found `&u16`\n  |          arguments to this function are incorrect\n  |\n  = note: expected reference `&u8`\n             found reference `&u16`\nnote: function defined here\n --> $WORKSPACE/serde/src/private/ser.rs\n  |\n  | pub fn constrain<T: ?Sized>(t: &T) -> &T {\n  |        ^^^^^^^^^\n  = note: this error originates in the derive macro `Serialize` (in Nightly builds, run with -Z macro-backtrace for more info)\n"
  },
  {
    "path": "test_suite/tests/ui/rename/container_unknown_rename_rule.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\n#[serde(rename_all = \"abc\")]\nstruct S {\n    name: u8,\n    long_name: u8,\n    very_long_name: u8,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/rename/container_unknown_rename_rule.stderr",
    "content": "error: unknown rename rule `rename_all = \"abc\"`, expected one of \"lowercase\", \"UPPERCASE\", \"PascalCase\", \"camelCase\", \"snake_case\", \"SCREAMING_SNAKE_CASE\", \"kebab-case\", \"SCREAMING-KEBAB-CASE\"\n --> tests/ui/rename/container_unknown_rename_rule.rs:4:22\n  |\n4 | #[serde(rename_all = \"abc\")]\n  |                      ^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/rename/variant_unknown_rename_rule.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\nenum S {\n    #[serde(rename_all = \"abc\")]\n    V {\n        name: u8,\n        long_name: u8,\n        very_long_name: u8,\n    },\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/rename/variant_unknown_rename_rule.stderr",
    "content": "error: unknown rename rule `rename_all = \"abc\"`, expected one of \"lowercase\", \"UPPERCASE\", \"PascalCase\", \"camelCase\", \"snake_case\", \"SCREAMING_SNAKE_CASE\", \"kebab-case\", \"SCREAMING-KEBAB-CASE\"\n --> tests/ui/rename/variant_unknown_rename_rule.rs:5:26\n  |\n5 |     #[serde(rename_all = \"abc\")]\n  |                          ^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/struct-representation/internally-tagged-tuple.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\n#[serde(tag = \"type\")]\nstruct S(u8, u8);\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/struct-representation/internally-tagged-tuple.stderr",
    "content": "error: #[serde(tag = \"...\")] can only be used on enums and structs with named fields\n --> tests/ui/struct-representation/internally-tagged-tuple.rs:4:9\n  |\n4 | #[serde(tag = \"type\")]\n  |         ^^^^^^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/struct-representation/internally-tagged-unit.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\n#[serde(tag = \"type\")]\nstruct U;\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/struct-representation/internally-tagged-unit.stderr",
    "content": "error: #[serde(tag = \"...\")] can only be used on enums and structs with named fields\n --> tests/ui/struct-representation/internally-tagged-unit.rs:4:9\n  |\n4 | #[serde(tag = \"type\")]\n  |         ^^^^^^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/transparent/at_most_one.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\n#[serde(transparent)]\nstruct S {\n    a: u8,\n    b: u8,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/transparent/at_most_one.stderr",
    "content": "error: #[serde(transparent)] requires struct to have at most one transparent field\n --> tests/ui/transparent/at_most_one.rs:4:1\n  |\n4 | / #[serde(transparent)]\n5 | | struct S {\n6 | |     a: u8,\n7 | |     b: u8,\n8 | | }\n  | |_^\n"
  },
  {
    "path": "test_suite/tests/ui/transparent/de_at_least_one.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\n#[serde(transparent)]\nstruct S {\n    #[serde(skip)]\n    a: u8,\n    #[serde(default)]\n    b: u8,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/transparent/de_at_least_one.stderr",
    "content": "error: #[serde(transparent)] requires at least one field that is neither skipped nor has a default\n  --> tests/ui/transparent/de_at_least_one.rs:4:1\n   |\n 4 | / #[serde(transparent)]\n 5 | | struct S {\n 6 | |     #[serde(skip)]\n 7 | |     a: u8,\n 8 | |     #[serde(default)]\n 9 | |     b: u8,\n10 | | }\n   | |_^\n"
  },
  {
    "path": "test_suite/tests/ui/transparent/enum.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\n#[serde(transparent)]\nenum E {}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/transparent/enum.stderr",
    "content": "error: #[serde(transparent)] is not allowed on an enum\n --> tests/ui/transparent/enum.rs:4:1\n  |\n4 | / #[serde(transparent)]\n5 | | enum E {}\n  | |_________^\n"
  },
  {
    "path": "test_suite/tests/ui/transparent/ser_at_least_one.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\n#[serde(transparent)]\nstruct S {\n    #[serde(skip)]\n    a: u8,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/transparent/ser_at_least_one.stderr",
    "content": "error: #[serde(transparent)] requires at least one field that is not skipped\n --> tests/ui/transparent/ser_at_least_one.rs:4:1\n  |\n4 | / #[serde(transparent)]\n5 | | struct S {\n6 | |     #[serde(skip)]\n7 | |     a: u8,\n8 | | }\n  | |_^\n"
  },
  {
    "path": "test_suite/tests/ui/transparent/unit_struct.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\n#[serde(transparent)]\nstruct S;\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/transparent/unit_struct.stderr",
    "content": "error: #[serde(transparent)] is not allowed on a unit struct\n --> tests/ui/transparent/unit_struct.rs:4:1\n  |\n4 | / #[serde(transparent)]\n5 | | struct S;\n  | |_________^\n"
  },
  {
    "path": "test_suite/tests/ui/transparent/with_from.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\n#[serde(transparent, from = \"u64\")]\nstruct S {\n    a: u8,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/transparent/with_from.stderr",
    "content": "error: #[serde(transparent)] is not allowed with #[serde(from = \"...\")]\n --> tests/ui/transparent/with_from.rs:4:1\n  |\n4 | / #[serde(transparent, from = \"u64\")]\n5 | | struct S {\n6 | |     a: u8,\n7 | | }\n  | |_^\n"
  },
  {
    "path": "test_suite/tests/ui/transparent/with_into.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\n#[serde(transparent, into = \"u64\")]\nstruct S {\n    a: u8,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/transparent/with_into.stderr",
    "content": "error: #[serde(transparent)] is not allowed with #[serde(into = \"...\")]\n --> tests/ui/transparent/with_into.rs:4:1\n  |\n4 | / #[serde(transparent, into = \"u64\")]\n5 | | struct S {\n6 | |     a: u8,\n7 | | }\n  | |_^\n"
  },
  {
    "path": "test_suite/tests/ui/transparent/with_try_from.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\n#[serde(transparent, try_from = \"u64\")]\nstruct S {\n    a: u8,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/transparent/with_try_from.stderr",
    "content": "error: #[serde(transparent)] is not allowed with #[serde(try_from = \"...\")]\n --> tests/ui/transparent/with_try_from.rs:4:1\n  |\n4 | / #[serde(transparent, try_from = \"u64\")]\n5 | | struct S {\n6 | |     a: u8,\n7 | | }\n  | |_^\n"
  },
  {
    "path": "test_suite/tests/ui/type-attribute/from.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\n#[serde(from = \"Option<T\")]\nenum TestOne {\n    Testing,\n    One,\n    Two,\n    Three,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/type-attribute/from.stderr",
    "content": "error: failed to parse type: from = \"Option<T\"\n --> tests/ui/type-attribute/from.rs:4:16\n  |\n4 | #[serde(from = \"Option<T\")]\n  |                ^^^^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/type-attribute/into.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\n#[serde(into = \"Option<T\")]\nenum TestOne {\n    Testing,\n    One,\n    Two,\n    Three,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/type-attribute/into.stderr",
    "content": "error: failed to parse type: into = \"Option<T\"\n --> tests/ui/type-attribute/into.rs:4:16\n  |\n4 | #[serde(into = \"Option<T\")]\n  |                ^^^^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/type-attribute/try_from.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\n#[serde(try_from = \"Option<T\")]\nenum TestOne {\n    Testing,\n    One,\n    Two,\n    Three,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/type-attribute/try_from.stderr",
    "content": "error: failed to parse type: try_from = \"Option<T\"\n --> tests/ui/type-attribute/try_from.rs:4:20\n  |\n4 | #[serde(try_from = \"Option<T\")]\n  |                    ^^^^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/unexpected-literal/container.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\n#[serde(\"literal\")]\nstruct S;\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/unexpected-literal/container.stderr",
    "content": "error: unexpected literal in nested attribute, expected ident\n --> tests/ui/unexpected-literal/container.rs:4:9\n  |\n4 | #[serde(\"literal\")]\n  |         ^^^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/unexpected-literal/field.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\nstruct S {\n    #[serde(\"literal\")]\n    x: (),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/unexpected-literal/field.stderr",
    "content": "error: unexpected literal in nested attribute, expected ident\n --> tests/ui/unexpected-literal/field.rs:5:13\n  |\n5 |     #[serde(\"literal\")]\n  |             ^^^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/unexpected-literal/variant.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\nenum E {\n    #[serde(\"literal\")]\n    V,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/unexpected-literal/variant.stderr",
    "content": "error: unexpected literal in nested attribute, expected ident\n --> tests/ui/unexpected-literal/variant.rs:5:13\n  |\n5 |     #[serde(\"literal\")]\n  |             ^^^^^^^^^\n"
  },
  {
    "path": "test_suite/tests/ui/unimplemented/required_by_dependency.rs",
    "content": "struct MyStruct;\n\nfn main() {\n    serde_test::assert_ser_tokens(&MyStruct, &[]);\n    serde_test::assert_de_tokens(&MyStruct, &[]);\n}\n"
  },
  {
    "path": "test_suite/tests/ui/unimplemented/required_by_dependency.stderr",
    "content": "error[E0277]: the trait bound `MyStruct: serde::Serialize` is not satisfied\n --> tests/ui/unimplemented/required_by_dependency.rs:4:35\n  |\n4 |     serde_test::assert_ser_tokens(&MyStruct, &[]);\n  |     ----------------------------- ^^^^^^^^^ unsatisfied trait bound\n  |     |\n  |     required by a bound introduced by this call\n  |\nhelp: the trait `serde_core::ser::Serialize` is not implemented for `MyStruct`\n --> tests/ui/unimplemented/required_by_dependency.rs:1:1\n  |\n1 | struct MyStruct;\n  | ^^^^^^^^^^^^^^^\n  = note: for local types consider adding `#[derive(serde::Serialize)]` to your `MyStruct` type\n  = note: for types from other crates check whether the crate offers a `serde` feature flag\n  = help: the following other types implement trait `serde_core::ser::Serialize`:\n            &'a T\n            &'a mut T\n            ()\n            (T,)\n            (T0, T1)\n            (T0, T1, T2)\n            (T0, T1, T2, T3)\n            (T0, T1, T2, T3, T4)\n          and $N others\nnote: required by a bound in `assert_ser_tokens`\n --> $CARGO/serde_test-$VERSION/src/assert.rs\n  |\n  | pub fn assert_ser_tokens<T>(value: &T, tokens: &[Token])\n  |        ----------------- required by a bound in this function\n  | where\n  |     T: ?Sized + Serialize,\n  |                 ^^^^^^^^^ required by this bound in `assert_ser_tokens`\n\nerror[E0277]: the trait bound `MyStruct: serde::Deserialize<'de>` is not satisfied\n --> tests/ui/unimplemented/required_by_dependency.rs:5:34\n  |\n5 |     serde_test::assert_de_tokens(&MyStruct, &[]);\n  |     ---------------------------- ^^^^^^^^^ unsatisfied trait bound\n  |     |\n  |     required by a bound introduced by this call\n  |\nhelp: the trait `serde_core::de::Deserialize<'_>` is not implemented for `MyStruct`\n --> tests/ui/unimplemented/required_by_dependency.rs:1:1\n  |\n1 | struct MyStruct;\n  | ^^^^^^^^^^^^^^^\n  = note: for local types consider adding `#[derive(serde::Deserialize)]` to your `MyStruct` type\n  = note: for types from other crates check whether the crate offers a `serde` feature flag\n  = help: the following other types implement trait `serde_core::de::Deserialize<'de>`:\n            &'a Path\n            &'a [u8]\n            &'a str\n            ()\n            (T,)\n            (T0, T1)\n            (T0, T1, T2)\n            (T0, T1, T2, T3)\n          and $N others\nnote: required by a bound in `assert_de_tokens`\n --> $CARGO/serde_test-$VERSION/src/assert.rs\n  |\n  | pub fn assert_de_tokens<'de, T>(value: &T, tokens: &'de [Token])\n  |        ---------------- required by a bound in this function\n  | where\n  |     T: Deserialize<'de> + PartialEq + Debug,\n  |        ^^^^^^^^^^^^^^^^ required by this bound in `assert_de_tokens`\n\nerror[E0277]: can't compare `MyStruct` with `MyStruct`\n --> tests/ui/unimplemented/required_by_dependency.rs:5:34\n  |\n5 |     serde_test::assert_de_tokens(&MyStruct, &[]);\n  |     ---------------------------- ^^^^^^^^^ no implementation for `MyStruct == MyStruct`\n  |     |\n  |     required by a bound introduced by this call\n  |\n  = help: the trait `PartialEq` is not implemented for `MyStruct`\nnote: required by a bound in `assert_de_tokens`\n --> $CARGO/serde_test-$VERSION/src/assert.rs\n  |\n  | pub fn assert_de_tokens<'de, T>(value: &T, tokens: &'de [Token])\n  |        ---------------- required by a bound in this function\n  | where\n  |     T: Deserialize<'de> + PartialEq + Debug,\n  |                           ^^^^^^^^^ required by this bound in `assert_de_tokens`\nhelp: consider annotating `MyStruct` with `#[derive(PartialEq)]`\n  |\n  1 + #[derive(PartialEq)]\n  2 | struct MyStruct;\n    |\n\nerror[E0277]: `MyStruct` doesn't implement `Debug`\n --> tests/ui/unimplemented/required_by_dependency.rs:5:34\n  |\n5 |     serde_test::assert_de_tokens(&MyStruct, &[]);\n  |     ---------------------------- ^^^^^^^^^ the trait `Debug` is not implemented for `MyStruct`\n  |     |\n  |     required by a bound introduced by this call\n  |\n  = note: add `#[derive(Debug)]` to `MyStruct` or manually `impl Debug for MyStruct`\nnote: required by a bound in `assert_de_tokens`\n --> $CARGO/serde_test-$VERSION/src/assert.rs\n  |\n  | pub fn assert_de_tokens<'de, T>(value: &T, tokens: &'de [Token])\n  |        ---------------- required by a bound in this function\n  | where\n  |     T: Deserialize<'de> + PartialEq + Debug,\n  |                                       ^^^^^ required by this bound in `assert_de_tokens`\nhelp: consider annotating `MyStruct` with `#[derive(Debug)]`\n  |\n  1 + #[derive(Debug)]\n  2 | struct MyStruct;\n    |\n"
  },
  {
    "path": "test_suite/tests/ui/unimplemented/required_locally.rs",
    "content": "use serde::de::Deserialize;\nuse serde::ser::Serialize;\n\nfn to_string<T>(_: &T) -> String\nwhere\n    T: Serialize,\n{\n    unimplemented!()\n}\n\nfn from_str<'de, T>(_: &'de str) -> T\nwhere\n    T: Deserialize<'de>,\n{\n    unimplemented!()\n}\n\nstruct MyStruct;\n\nfn main() {\n    to_string(&MyStruct);\n    let _: MyStruct = from_str(\"\");\n}\n"
  },
  {
    "path": "test_suite/tests/ui/unimplemented/required_locally.stderr",
    "content": "error[E0277]: the trait bound `MyStruct: serde::Serialize` is not satisfied\n  --> tests/ui/unimplemented/required_locally.rs:21:15\n   |\n21 |     to_string(&MyStruct);\n   |     --------- ^^^^^^^^^ unsatisfied trait bound\n   |     |\n   |     required by a bound introduced by this call\n   |\nhelp: the trait `Serialize` is not implemented for `MyStruct`\n  --> tests/ui/unimplemented/required_locally.rs:18:1\n   |\n18 | struct MyStruct;\n   | ^^^^^^^^^^^^^^^\n   = note: for local types consider adding `#[derive(serde::Serialize)]` to your `MyStruct` type\n   = note: for types from other crates check whether the crate offers a `serde` feature flag\n   = help: the following other types implement trait `Serialize`:\n             &'a T\n             &'a mut T\n             ()\n             (T,)\n             (T0, T1)\n             (T0, T1, T2)\n             (T0, T1, T2, T3)\n             (T0, T1, T2, T3, T4)\n           and $N others\nnote: required by a bound in `to_string`\n  --> tests/ui/unimplemented/required_locally.rs:6:8\n   |\n 4 | fn to_string<T>(_: &T) -> String\n   |    --------- required by a bound in this function\n 5 | where\n 6 |     T: Serialize,\n   |        ^^^^^^^^^ required by this bound in `to_string`\n\nerror[E0277]: the trait bound `MyStruct: serde::Deserialize<'de>` is not satisfied\n  --> tests/ui/unimplemented/required_locally.rs:22:23\n   |\n22 |     let _: MyStruct = from_str(\"\");\n   |                       ^^^^^^^^^^^^ unsatisfied trait bound\n   |\nhelp: the trait `Deserialize<'_>` is not implemented for `MyStruct`\n  --> tests/ui/unimplemented/required_locally.rs:18:1\n   |\n18 | struct MyStruct;\n   | ^^^^^^^^^^^^^^^\n   = note: for local types consider adding `#[derive(serde::Deserialize)]` to your `MyStruct` type\n   = note: for types from other crates check whether the crate offers a `serde` feature flag\n   = help: the following other types implement trait `Deserialize<'de>`:\n             &'a Path\n             &'a [u8]\n             &'a str\n             ()\n             (T,)\n             (T0, T1)\n             (T0, T1, T2)\n             (T0, T1, T2, T3)\n           and $N others\nnote: required by a bound in `from_str`\n  --> tests/ui/unimplemented/required_locally.rs:13:8\n   |\n11 | fn from_str<'de, T>(_: &'de str) -> T\n   |    -------- required by a bound in this function\n12 | where\n13 |     T: Deserialize<'de>,\n   |        ^^^^^^^^^^^^^^^^ required by this bound in `from_str`\n"
  },
  {
    "path": "test_suite/tests/ui/unknown-attribute/container.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\n#[serde(abc = \"xyz\")]\nstruct A {\n    x: u32,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/unknown-attribute/container.stderr",
    "content": "error: unknown serde container attribute `abc`\n --> tests/ui/unknown-attribute/container.rs:4:9\n  |\n4 | #[serde(abc = \"xyz\")]\n  |         ^^^\n"
  },
  {
    "path": "test_suite/tests/ui/unknown-attribute/field.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\nstruct C {\n    #[serde(abc = \"xyz\")]\n    x: u32,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/unknown-attribute/field.stderr",
    "content": "error: unknown serde field attribute `abc`\n --> tests/ui/unknown-attribute/field.rs:5:13\n  |\n5 |     #[serde(abc = \"xyz\")]\n  |             ^^^\n"
  },
  {
    "path": "test_suite/tests/ui/unknown-attribute/variant.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\nenum E {\n    #[serde(abc = \"xyz\")]\n    V,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/unknown-attribute/variant.stderr",
    "content": "error: unknown serde variant attribute `abc`\n --> tests/ui/unknown-attribute/variant.rs:5:13\n  |\n5 |     #[serde(abc = \"xyz\")]\n  |             ^^^\n"
  },
  {
    "path": "test_suite/tests/ui/unsupported/union_de.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\nunion Union {\n    x: u8,\n    y: (),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/unsupported/union_de.stderr",
    "content": "error: Serde does not support derive for unions\n --> tests/ui/unsupported/union_de.rs:4:1\n  |\n4 | / union Union {\n5 | |     x: u8,\n6 | |     y: (),\n7 | | }\n  | |_^\n"
  },
  {
    "path": "test_suite/tests/ui/unsupported/union_ser.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\nunion Union {\n    x: u8,\n    y: (),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/unsupported/union_ser.stderr",
    "content": "error: Serde does not support derive for unions\n --> tests/ui/unsupported/union_ser.rs:4:1\n  |\n4 | / union Union {\n5 | |     x: u8,\n6 | |     y: (),\n7 | | }\n  | |_^\n"
  },
  {
    "path": "test_suite/tests/ui/with/incorrect_type.rs",
    "content": "use serde_derive::{Deserialize, Serialize};\n\nmod w {\n    use serde::{Deserializer, Serializer};\n\n    pub fn deserialize<'de, D: Deserializer<'de>>(_: D) -> Result<(), D::Error> {\n        unimplemented!()\n    }\n    pub fn serialize<T, S: Serializer>(_: S) -> Result<S::Ok, S::Error> {\n        unimplemented!()\n    }\n}\n\n#[derive(Serialize, Deserialize)]\nstruct W(#[serde(with = \"w\")] u8, u8);\n\n#[derive(Serialize, Deserialize)]\nstruct S(#[serde(serialize_with = \"w::serialize\")] u8, u8);\n\n#[derive(Serialize, Deserialize)]\nstruct D(#[serde(deserialize_with = \"w::deserialize\")] u8, u8);\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/with/incorrect_type.stderr",
    "content": "error[E0277]: the trait bound `&u8: serde::Serializer` is not satisfied\n  --> tests/ui/with/incorrect_type.rs:14:10\n   |\n14 | #[derive(Serialize, Deserialize)]\n   |          ^^^^^^^^^ the trait `Serializer` is not implemented for `&u8`\n15 | struct W(#[serde(with = \"w\")] u8, u8);\n   |                         --- required by a bound introduced by this call\n   |\nhelp: the trait `Serializer` is implemented for `&mut Formatter<'a>`\n  --> $WORKSPACE/serde_core/src/ser/fmt.rs\n   |\n   | impl<'a> Serializer for &mut fmt::Formatter<'a> {\n   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nnote: required by a bound in `w::serialize`\n  --> tests/ui/with/incorrect_type.rs:9:28\n   |\n 9 |     pub fn serialize<T, S: Serializer>(_: S) -> Result<S::Ok, S::Error> {\n   |                            ^^^^^^^^^^ required by this bound in `serialize`\n\nerror[E0061]: this function takes 1 argument but 2 arguments were supplied\n  --> tests/ui/with/incorrect_type.rs:15:25\n   |\n14 | #[derive(Serialize, Deserialize)]\n   |          --------- unexpected argument #2 of type `__S`\n15 | struct W(#[serde(with = \"w\")] u8, u8);\n   |                         ^^^\n   |\nnote: function defined here\n  --> tests/ui/with/incorrect_type.rs:9:12\n   |\n 9 |     pub fn serialize<T, S: Serializer>(_: S) -> Result<S::Ok, S::Error> {\n   |            ^^^^^^^^^\n\nerror[E0277]: the trait bound `&u8: serde::Serializer` is not satisfied\n  --> tests/ui/with/incorrect_type.rs:15:25\n   |\n15 | struct W(#[serde(with = \"w\")] u8, u8);\n   |                         ^^^ the trait `Serializer` is not implemented for `&u8`\n   |\nhelp: the trait `Serializer` is implemented for `&mut Formatter<'a>`\n  --> $WORKSPACE/serde_core/src/ser/fmt.rs\n   |\n   | impl<'a> Serializer for &mut fmt::Formatter<'a> {\n   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nerror[E0308]: `?` operator has incompatible types\n  --> tests/ui/with/incorrect_type.rs:15:25\n   |\n15 | struct W(#[serde(with = \"w\")] u8, u8);\n   |                         ^^^ expected `u8`, found `()`\n   |\n   = note: `?` operator cannot convert from `()` to `u8`\n\nerror[E0277]: the trait bound `&u8: serde::Serializer` is not satisfied\n  --> tests/ui/with/incorrect_type.rs:17:10\n   |\n17 | #[derive(Serialize, Deserialize)]\n   |          ^^^^^^^^^ the trait `Serializer` is not implemented for `&u8`\n18 | struct S(#[serde(serialize_with = \"w::serialize\")] u8, u8);\n   |                                   -------------- required by a bound introduced by this call\n   |\nhelp: the trait `Serializer` is implemented for `&mut Formatter<'a>`\n  --> $WORKSPACE/serde_core/src/ser/fmt.rs\n   |\n   | impl<'a> Serializer for &mut fmt::Formatter<'a> {\n   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nnote: required by a bound in `w::serialize`\n  --> tests/ui/with/incorrect_type.rs:9:28\n   |\n 9 |     pub fn serialize<T, S: Serializer>(_: S) -> Result<S::Ok, S::Error> {\n   |                            ^^^^^^^^^^ required by this bound in `serialize`\n\nerror[E0061]: this function takes 1 argument but 2 arguments were supplied\n  --> tests/ui/with/incorrect_type.rs:18:35\n   |\n17 | #[derive(Serialize, Deserialize)]\n   |          --------- unexpected argument #2 of type `__S`\n18 | struct S(#[serde(serialize_with = \"w::serialize\")] u8, u8);\n   |                                   ^^^^^^^^^^^^^^\n   |\nnote: function defined here\n  --> tests/ui/with/incorrect_type.rs:9:12\n   |\n 9 |     pub fn serialize<T, S: Serializer>(_: S) -> Result<S::Ok, S::Error> {\n   |            ^^^^^^^^^\n\nerror[E0277]: the trait bound `&u8: serde::Serializer` is not satisfied\n  --> tests/ui/with/incorrect_type.rs:18:35\n   |\n18 | struct S(#[serde(serialize_with = \"w::serialize\")] u8, u8);\n   |                                   ^^^^^^^^^^^^^^ the trait `Serializer` is not implemented for `&u8`\n   |\nhelp: the trait `Serializer` is implemented for `&mut Formatter<'a>`\n  --> $WORKSPACE/serde_core/src/ser/fmt.rs\n   |\n   | impl<'a> Serializer for &mut fmt::Formatter<'a> {\n   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nerror[E0308]: `?` operator has incompatible types\n  --> tests/ui/with/incorrect_type.rs:21:37\n   |\n21 | struct D(#[serde(deserialize_with = \"w::deserialize\")] u8, u8);\n   |                                     ^^^^^^^^^^^^^^^^ expected `u8`, found `()`\n   |\n   = note: `?` operator cannot convert from `()` to `u8`\n"
  },
  {
    "path": "test_suite/tests/ui/with-variant/skip_de_newtype_field.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\nenum Enum {\n    #[serde(deserialize_with = \"deserialize_some_newtype_variant\")]\n    Newtype(#[serde(skip_deserializing)] String),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/with-variant/skip_de_newtype_field.stderr",
    "content": "error: variant `Newtype` cannot have both #[serde(deserialize_with)] and a field #0 marked with #[serde(skip_deserializing)]\n --> tests/ui/with-variant/skip_de_newtype_field.rs:5:5\n  |\n5 | /     #[serde(deserialize_with = \"deserialize_some_newtype_variant\")]\n6 | |     Newtype(#[serde(skip_deserializing)] String),\n  | |________________________________________________^\n"
  },
  {
    "path": "test_suite/tests/ui/with-variant/skip_de_struct_field.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\nenum Enum {\n    #[serde(deserialize_with = \"deserialize_some_other_variant\")]\n    Struct {\n        #[serde(skip_deserializing)]\n        f1: String,\n        f2: u8,\n    },\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/with-variant/skip_de_struct_field.stderr",
    "content": "error: variant `Struct` cannot have both #[serde(deserialize_with)] and a field `f1` marked with #[serde(skip_deserializing)]\n  --> tests/ui/with-variant/skip_de_struct_field.rs:5:5\n   |\n 5 | /     #[serde(deserialize_with = \"deserialize_some_other_variant\")]\n 6 | |     Struct {\n 7 | |         #[serde(skip_deserializing)]\n 8 | |         f1: String,\n 9 | |         f2: u8,\n10 | |     },\n   | |_____^\n"
  },
  {
    "path": "test_suite/tests/ui/with-variant/skip_de_tuple_field.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\nenum Enum {\n    #[serde(deserialize_with = \"deserialize_some_other_variant\")]\n    Tuple(#[serde(skip_deserializing)] String, u8),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/with-variant/skip_de_tuple_field.stderr",
    "content": "error: variant `Tuple` cannot have both #[serde(deserialize_with)] and a field #0 marked with #[serde(skip_deserializing)]\n --> tests/ui/with-variant/skip_de_tuple_field.rs:5:5\n  |\n5 | /     #[serde(deserialize_with = \"deserialize_some_other_variant\")]\n6 | |     Tuple(#[serde(skip_deserializing)] String, u8),\n  | |__________________________________________________^\n"
  },
  {
    "path": "test_suite/tests/ui/with-variant/skip_de_whole_variant.rs",
    "content": "use serde_derive::Deserialize;\n\n#[derive(Deserialize)]\nenum Enum {\n    #[serde(deserialize_with = \"deserialize_some_unit_variant\")]\n    #[serde(skip_deserializing)]\n    Unit,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/with-variant/skip_de_whole_variant.stderr",
    "content": "error: variant `Unit` cannot have both #[serde(deserialize_with)] and #[serde(skip_deserializing)]\n --> tests/ui/with-variant/skip_de_whole_variant.rs:5:5\n  |\n5 | /     #[serde(deserialize_with = \"deserialize_some_unit_variant\")]\n6 | |     #[serde(skip_deserializing)]\n7 | |     Unit,\n  | |________^\n"
  },
  {
    "path": "test_suite/tests/ui/with-variant/skip_ser_newtype_field.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\nenum Enum {\n    #[serde(serialize_with = \"serialize_some_newtype_variant\")]\n    Newtype(#[serde(skip_serializing)] String),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/with-variant/skip_ser_newtype_field.stderr",
    "content": "error: variant `Newtype` cannot have both #[serde(serialize_with)] and a field #0 marked with #[serde(skip_serializing)]\n --> tests/ui/with-variant/skip_ser_newtype_field.rs:5:5\n  |\n5 | /     #[serde(serialize_with = \"serialize_some_newtype_variant\")]\n6 | |     Newtype(#[serde(skip_serializing)] String),\n  | |______________________________________________^\n"
  },
  {
    "path": "test_suite/tests/ui/with-variant/skip_ser_newtype_field_if.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\nenum Enum {\n    #[serde(serialize_with = \"serialize_some_newtype_variant\")]\n    Newtype(#[serde(skip_serializing_if = \"always\")] String),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/with-variant/skip_ser_newtype_field_if.stderr",
    "content": "error: variant `Newtype` cannot have both #[serde(serialize_with)] and a field #0 marked with #[serde(skip_serializing_if)]\n --> tests/ui/with-variant/skip_ser_newtype_field_if.rs:5:5\n  |\n5 | /     #[serde(serialize_with = \"serialize_some_newtype_variant\")]\n6 | |     Newtype(#[serde(skip_serializing_if = \"always\")] String),\n  | |____________________________________________________________^\n"
  },
  {
    "path": "test_suite/tests/ui/with-variant/skip_ser_struct_field.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\nenum Enum {\n    #[serde(serialize_with = \"serialize_some_other_variant\")]\n    Struct {\n        #[serde(skip_serializing)]\n        f1: String,\n        f2: u8,\n    },\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/with-variant/skip_ser_struct_field.stderr",
    "content": "error: variant `Struct` cannot have both #[serde(serialize_with)] and a field `f1` marked with #[serde(skip_serializing)]\n  --> tests/ui/with-variant/skip_ser_struct_field.rs:5:5\n   |\n 5 | /     #[serde(serialize_with = \"serialize_some_other_variant\")]\n 6 | |     Struct {\n 7 | |         #[serde(skip_serializing)]\n 8 | |         f1: String,\n 9 | |         f2: u8,\n10 | |     },\n   | |_____^\n"
  },
  {
    "path": "test_suite/tests/ui/with-variant/skip_ser_struct_field_if.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\nenum Enum {\n    #[serde(serialize_with = \"serialize_some_newtype_variant\")]\n    Struct {\n        #[serde(skip_serializing_if = \"always\")]\n        f1: String,\n        f2: u8,\n    },\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/with-variant/skip_ser_struct_field_if.stderr",
    "content": "error: variant `Struct` cannot have both #[serde(serialize_with)] and a field `f1` marked with #[serde(skip_serializing_if)]\n  --> tests/ui/with-variant/skip_ser_struct_field_if.rs:5:5\n   |\n 5 | /     #[serde(serialize_with = \"serialize_some_newtype_variant\")]\n 6 | |     Struct {\n 7 | |         #[serde(skip_serializing_if = \"always\")]\n 8 | |         f1: String,\n 9 | |         f2: u8,\n10 | |     },\n   | |_____^\n"
  },
  {
    "path": "test_suite/tests/ui/with-variant/skip_ser_tuple_field.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\nenum Enum {\n    #[serde(serialize_with = \"serialize_some_other_variant\")]\n    Tuple(#[serde(skip_serializing)] String, u8),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/with-variant/skip_ser_tuple_field.stderr",
    "content": "error: variant `Tuple` cannot have both #[serde(serialize_with)] and a field #0 marked with #[serde(skip_serializing)]\n --> tests/ui/with-variant/skip_ser_tuple_field.rs:5:5\n  |\n5 | /     #[serde(serialize_with = \"serialize_some_other_variant\")]\n6 | |     Tuple(#[serde(skip_serializing)] String, u8),\n  | |________________________________________________^\n"
  },
  {
    "path": "test_suite/tests/ui/with-variant/skip_ser_tuple_field_if.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\nenum Enum {\n    #[serde(serialize_with = \"serialize_some_other_variant\")]\n    Tuple(#[serde(skip_serializing_if = \"always\")] String, u8),\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/with-variant/skip_ser_tuple_field_if.stderr",
    "content": "error: variant `Tuple` cannot have both #[serde(serialize_with)] and a field #0 marked with #[serde(skip_serializing_if)]\n --> tests/ui/with-variant/skip_ser_tuple_field_if.rs:5:5\n  |\n5 | /     #[serde(serialize_with = \"serialize_some_other_variant\")]\n6 | |     Tuple(#[serde(skip_serializing_if = \"always\")] String, u8),\n  | |______________________________________________________________^\n"
  },
  {
    "path": "test_suite/tests/ui/with-variant/skip_ser_whole_variant.rs",
    "content": "use serde_derive::Serialize;\n\n#[derive(Serialize)]\nenum Enum {\n    #[serde(serialize_with = \"serialize_some_unit_variant\")]\n    #[serde(skip_serializing)]\n    Unit,\n}\n\nfn main() {}\n"
  },
  {
    "path": "test_suite/tests/ui/with-variant/skip_ser_whole_variant.stderr",
    "content": "error: variant `Unit` cannot have both #[serde(serialize_with)] and #[serde(skip_serializing)]\n --> tests/ui/with-variant/skip_ser_whole_variant.rs:5:5\n  |\n5 | /     #[serde(serialize_with = \"serialize_some_unit_variant\")]\n6 | |     #[serde(skip_serializing)]\n7 | |     Unit,\n  | |________^\n"
  },
  {
    "path": "test_suite/tests/unstable/mod.rs",
    "content": "use serde_derive::{Deserialize, Serialize};\nuse serde_test::{assert_tokens, Token};\n\n#[test]\nfn test_raw_identifiers() {\n    #[derive(Debug, PartialEq, Serialize, Deserialize)]\n    #[allow(non_camel_case_types)]\n    enum r#type {\n        r#type { r#type: () },\n    }\n\n    assert_tokens(\n        &r#type::r#type { r#type: () },\n        &[\n            Token::StructVariant {\n                name: \"type\",\n                variant: \"type\",\n                len: 1,\n            },\n            Token::Str(\"type\"),\n            Token::Unit,\n            Token::StructVariantEnd,\n        ],\n    );\n}\n"
  }
]