mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-04-23 21:08:00 +00:00
Compare commits
61 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 033d05f70b | |||
| fe4e3fd3b0 | |||
| 8a8a8a70ee | |||
| 339dca828d | |||
| 0d7349fa4e | |||
| 830528d5b1 | |||
| ab90fbc7c9 | |||
| 3eec111e8f | |||
| 9388433642 | |||
| ba12070665 | |||
| a57a324d72 | |||
| 92e91b3557 | |||
| 4dcf791706 | |||
| e77900fb94 | |||
| 1b14cadf20 | |||
| 4f59cd217a | |||
| 27c8b2d66a | |||
| 89976c2712 | |||
| c91737fef1 | |||
| a100719bc6 | |||
| 9a0e149225 | |||
| 9350927903 | |||
| 677c13a4ec | |||
| ee8e1ee7ff | |||
| f969080b9f | |||
| c2b16bfbb0 | |||
| e7df53701c | |||
| 02c34e490b | |||
| 427c839b3d | |||
| 48aa054f53 | |||
| 3616860203 | |||
| 861b0dfea2 | |||
| 8b3d71ae2d | |||
| ff5442cd9e | |||
| 92d686f9a5 | |||
| 7b09cccd77 | |||
| 6f1f38d046 | |||
| db8f06467b | |||
| 91ec1c290f | |||
| 0676673ca5 | |||
| 7a4335d664 | |||
| 31a0e73489 | |||
| 74fe70855f | |||
| e74925bc43 | |||
| 56be1c203e | |||
| 2f9bf4d3eb | |||
| ad94aed753 | |||
| 30db83fc44 | |||
| b0f7b00e1f | |||
| 7255e192d8 | |||
| 2102e1aa42 | |||
| 4e5e55bf1c | |||
| 4513a9e6a7 | |||
| 4f922e4e5b | |||
| 993966600e | |||
| 5b96cf1bde | |||
| f3d50e5209 | |||
| ab21d4d017 | |||
| f7c5d93e6a | |||
| 52a7d40e6e | |||
| 348bc6b257 |
+25
-19
@@ -62,6 +62,7 @@ jobs:
|
||||
- run: cd serde && cargo build --no-default-features
|
||||
- run: cd serde && cargo build --no-default-features --features alloc
|
||||
- run: cd serde && cargo build --no-default-features --features rc,alloc
|
||||
- run: cd serde && cargo build --no-default-features --features unstable
|
||||
- run: cd serde && cargo test --features derive,rc,unstable
|
||||
- run: cd test_suite/no_std && cargo build
|
||||
if: matrix.os != 'windows'
|
||||
@@ -76,7 +77,7 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
rust: [1.19.0, 1.20.0, 1.21.0, 1.25.0, 1.26.0, 1.34.0]
|
||||
rust: [1.31.0, 1.34.0]
|
||||
timeout-minutes: 45
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
@@ -87,24 +88,6 @@ jobs:
|
||||
- run: cd serde && cargo build --no-default-features
|
||||
- run: cd serde && cargo build
|
||||
|
||||
more:
|
||||
name: Rust ${{matrix.rust}}
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
rust: [1.27.0, 1.28.0]
|
||||
timeout-minutes: 45
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: dtolnay/rust-toolchain@master
|
||||
with:
|
||||
toolchain: ${{matrix.rust}}
|
||||
# Work around failing to parse manifest because editions are unstable.
|
||||
- run: sed -i /test_suite/d Cargo.toml
|
||||
- run: cd serde && cargo build --no-default-features
|
||||
- run: cd serde && cargo build
|
||||
|
||||
derive:
|
||||
name: Rust 1.56.0
|
||||
runs-on: ubuntu-latest
|
||||
@@ -126,6 +109,29 @@ jobs:
|
||||
- uses: dtolnay/rust-toolchain@1.36.0
|
||||
- run: cd serde && cargo build --no-default-features --features alloc
|
||||
|
||||
precompiled:
|
||||
name: Precompiled
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 45
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: dtolnay/rust-toolchain@nightly
|
||||
with:
|
||||
components: rust-src
|
||||
targets: x86_64-unknown-linux-musl
|
||||
- run: precompiled/build.sh
|
||||
- name: replace serde_derive dependency with precompiled
|
||||
run: |
|
||||
# FIXME: consider using `cargo rm serde_derive` but it's currently broken
|
||||
# https://github.com/rust-lang/cargo/issues/12419
|
||||
sed -i '/serde_derive =/d' serde/Cargo.toml
|
||||
sed -i '/derive = \["serde_derive"\]/d' serde/Cargo.toml
|
||||
sed -i '/"serde_derive"/d' Cargo.toml
|
||||
sed -i '/\[workspace\]/d' precompiled/serde_derive/Cargo.toml
|
||||
cargo add --dev serde_derive --path precompiled/serde_derive --manifest-path test_suite/Cargo.toml
|
||||
git diff
|
||||
- run: cd test_suite && cargo test --features unstable -- --skip ui --exact
|
||||
|
||||
macos:
|
||||
name: macOS
|
||||
runs-on: macos-latest
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# Serde   [![Build Status]][actions] [![Latest Version]][crates.io] [![serde: rustc 1.19+]][Rust 1.19] [![serde_derive: rustc 1.56+]][Rust 1.56]
|
||||
# Serde   [![Build Status]][actions] [![Latest Version]][crates.io] [![serde: rustc 1.31+]][Rust 1.31] [![serde_derive: rustc 1.56+]][Rust 1.56]
|
||||
|
||||
[Build Status]: https://img.shields.io/github/actions/workflow/status/serde-rs/serde/ci.yml?branch=master
|
||||
[actions]: https://github.com/serde-rs/serde/actions?query=branch%3Amaster
|
||||
[Latest Version]: https://img.shields.io/crates/v/serde.svg
|
||||
[crates.io]: https://crates.io/crates/serde
|
||||
[serde: rustc 1.19+]: https://img.shields.io/badge/serde-rustc_1.19+-lightgray.svg
|
||||
[serde: rustc 1.31+]: https://img.shields.io/badge/serde-rustc_1.31+-lightgray.svg
|
||||
[serde_derive: rustc 1.56+]: https://img.shields.io/badge/serde_derive-rustc_1.56+-lightgray.svg
|
||||
[Rust 1.19]: https://blog.rust-lang.org/2017/07/20/Rust-1.19.html
|
||||
[Rust 1.31]: https://blog.rust-lang.org/2018/12/06/Rust-1.31-and-rust-2018.html
|
||||
[Rust 1.56]: https://blog.rust-lang.org/2021/10/21/Rust-1.56.0.html
|
||||
|
||||
**Serde is a framework for *ser*ializing and *de*serializing Rust data structures efficiently and generically.**
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "serde_derive"
|
||||
version = "1.0.176"
|
||||
version = "1.0.180"
|
||||
authors = ["David Tolnay <dtolnay@gmail.com>"]
|
||||
publish = false
|
||||
|
||||
@@ -14,4 +14,4 @@ path = "main.rs"
|
||||
[dependencies]
|
||||
proc-macro2 = "1"
|
||||
quote = { version = "1", default-features = false }
|
||||
syn = { version = "2.0.25", default-features = false, features = ["clone-impls", "derive", "full", "parsing", "printing"] }
|
||||
syn = { version = "2.0.28", default-features = false, features = ["clone-impls", "derive", "full", "parsing", "printing"] }
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "serde_derive"
|
||||
version = "1.0.176"
|
||||
version = "1.0.180"
|
||||
authors = ["David Tolnay <dtolnay@gmail.com>"]
|
||||
categories = ["no-std", "no-std::no-alloc"]
|
||||
description = "Implementation of #[derive(Serialize, Deserialize)]"
|
||||
@@ -24,7 +24,7 @@ proc-macro = true
|
||||
[target.'cfg(not(all(target_arch = "x86_64", target_os = "linux", target_env = "gnu")))'.dependencies]
|
||||
proc-macro2 = "1"
|
||||
quote = "1"
|
||||
syn = "2.0.25"
|
||||
syn = "2.0.28"
|
||||
|
||||
[dev-dependencies]
|
||||
serde = { version = "1", path = "../../serde" }
|
||||
|
||||
@@ -13,8 +13,7 @@
|
||||
//!
|
||||
//! [https://serde.rs/derive.html]: https://serde.rs/derive.html
|
||||
|
||||
#![doc(html_root_url = "https://docs.rs/serde_derive/1.0.176")]
|
||||
#![allow(unknown_lints, bare_trait_objects)]
|
||||
#![doc(html_root_url = "https://docs.rs/serde_derive/1.0.180")]
|
||||
|
||||
#[cfg(not(all(target_arch = "x86_64", target_os = "linux", target_env = "gnu")))]
|
||||
include!("lib_from_source.rs");
|
||||
|
||||
@@ -14,7 +14,6 @@ mod internals;
|
||||
mod pretend;
|
||||
mod ser;
|
||||
mod this;
|
||||
mod try;
|
||||
|
||||
use proc_macro::TokenStream;
|
||||
use syn::{parse_macro_input, DeriveInput};
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
../../../serde_derive/src/try.rs
|
||||
+4
-3
@@ -1,20 +1,21 @@
|
||||
[package]
|
||||
name = "serde"
|
||||
version = "1.0.176" # remember to update html_root_url and serde_derive dependency
|
||||
version = "1.0.180" # remember to update html_root_url and serde_derive dependency
|
||||
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"]
|
||||
build = "build.rs"
|
||||
categories = ["encoding", "no-std", "no-std::no-alloc"]
|
||||
description = "A generic serialization/deserialization framework"
|
||||
documentation = "https://docs.rs/serde"
|
||||
edition = "2018"
|
||||
homepage = "https://serde.rs"
|
||||
keywords = ["serde", "serialization", "no_std"]
|
||||
license = "MIT OR Apache-2.0"
|
||||
readme = "crates-io.md"
|
||||
repository = "https://github.com/serde-rs/serde"
|
||||
rust-version = "1.19"
|
||||
rust-version = "1.31"
|
||||
|
||||
[dependencies]
|
||||
serde_derive = { version = "=1.0.176", optional = true, path = "../serde_derive" }
|
||||
serde_derive = { version = "=1.0.180", optional = true, path = "../serde_derive" }
|
||||
|
||||
[dev-dependencies]
|
||||
serde_derive = { version = "1", path = "../serde_derive" }
|
||||
|
||||
+7
-62
@@ -16,68 +16,6 @@ fn main() {
|
||||
let target = env::var("TARGET").unwrap();
|
||||
let emscripten = target == "asmjs-unknown-emscripten" || target == "wasm32-unknown-emscripten";
|
||||
|
||||
// std::collections::Bound was stabilized in Rust 1.17
|
||||
// but it was moved to core::ops later in Rust 1.26:
|
||||
// https://doc.rust-lang.org/core/ops/enum.Bound.html
|
||||
if minor < 26 {
|
||||
println!("cargo:rustc-cfg=no_ops_bound");
|
||||
if minor < 17 {
|
||||
println!("cargo:rustc-cfg=no_collections_bound");
|
||||
}
|
||||
}
|
||||
|
||||
// core::cmp::Reverse stabilized in Rust 1.19:
|
||||
// https://doc.rust-lang.org/stable/core/cmp/struct.Reverse.html
|
||||
if minor < 19 {
|
||||
println!("cargo:rustc-cfg=no_core_reverse");
|
||||
}
|
||||
|
||||
// CString::into_boxed_c_str and PathBuf::into_boxed_path stabilized in Rust 1.20:
|
||||
// https://doc.rust-lang.org/std/ffi/struct.CString.html#method.into_boxed_c_str
|
||||
// https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.into_boxed_path
|
||||
if minor < 20 {
|
||||
println!("cargo:rustc-cfg=no_de_boxed_c_str");
|
||||
println!("cargo:rustc-cfg=no_de_boxed_path");
|
||||
}
|
||||
|
||||
// From<Box<T>> for Rc<T> / Arc<T> stabilized in Rust 1.21:
|
||||
// https://doc.rust-lang.org/std/rc/struct.Rc.html#impl-From<Box<T>>
|
||||
// https://doc.rust-lang.org/std/sync/struct.Arc.html#impl-From<Box<T>>
|
||||
if minor < 21 {
|
||||
println!("cargo:rustc-cfg=no_de_rc_dst");
|
||||
}
|
||||
|
||||
// Duration available in core since Rust 1.25:
|
||||
// https://blog.rust-lang.org/2018/03/29/Rust-1.25.html#library-stabilizations
|
||||
if minor < 25 {
|
||||
println!("cargo:rustc-cfg=no_core_duration");
|
||||
}
|
||||
|
||||
// 128-bit integers stabilized in Rust 1.26:
|
||||
// https://blog.rust-lang.org/2018/05/10/Rust-1.26.html
|
||||
//
|
||||
// Disabled on Emscripten targets before Rust 1.40 since
|
||||
// Emscripten did not support 128-bit integers until Rust 1.40
|
||||
// (https://github.com/rust-lang/rust/pull/65251)
|
||||
if minor < 26 || emscripten && minor < 40 {
|
||||
println!("cargo:rustc-cfg=no_integer128");
|
||||
}
|
||||
|
||||
// Inclusive ranges methods stabilized in Rust 1.27:
|
||||
// https://github.com/rust-lang/rust/pull/50758
|
||||
// Also Iterator::try_for_each:
|
||||
// https://blog.rust-lang.org/2018/06/21/Rust-1.27.html#library-stabilizations
|
||||
if minor < 27 {
|
||||
println!("cargo:rustc-cfg=no_range_inclusive");
|
||||
println!("cargo:rustc-cfg=no_iterator_try_fold");
|
||||
}
|
||||
|
||||
// Non-zero integers stabilized in Rust 1.28:
|
||||
// https://blog.rust-lang.org/2018/08/02/Rust-1.28.html#library-stabilizations
|
||||
if minor < 28 {
|
||||
println!("cargo:rustc-cfg=no_num_nonzero");
|
||||
}
|
||||
|
||||
// TryFrom, Atomic types, non-zero signed integers, and SystemTime::checked_add
|
||||
// stabilized in Rust 1.34:
|
||||
// https://blog.rust-lang.org/2019/04/11/Rust-1.34.0.html#tryfrom-and-tryinto
|
||||
@@ -89,6 +27,13 @@ fn main() {
|
||||
println!("cargo:rustc-cfg=no_relaxed_trait_bounds");
|
||||
}
|
||||
|
||||
// Disabled on Emscripten targets before Rust 1.40 since
|
||||
// Emscripten did not support 128-bit integers until Rust 1.40
|
||||
// (https://github.com/rust-lang/rust/pull/65251)
|
||||
if emscripten && minor < 40 {
|
||||
println!("cargo:rustc-cfg=no_integer128");
|
||||
}
|
||||
|
||||
// Current minimum supported version of serde_derive crate is Rust 1.56.
|
||||
if minor < 56 {
|
||||
println!("cargo:rustc-cfg=no_serde_derive");
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
use lib::fmt::{self, Write};
|
||||
use lib::str;
|
||||
use crate::lib::fmt::{self, Write};
|
||||
use crate::lib::str;
|
||||
|
||||
pub(super) struct Buf<'a> {
|
||||
bytes: &'a mut [u8],
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
use lib::*;
|
||||
use crate::lib::*;
|
||||
|
||||
use de::{
|
||||
use crate::de::{
|
||||
Deserialize, Deserializer, EnumAccess, Error, MapAccess, SeqAccess, VariantAccess, Visitor,
|
||||
};
|
||||
|
||||
@@ -197,7 +197,7 @@ impl<'de> Visitor<'de> for IgnoredAny {
|
||||
where
|
||||
A: SeqAccess<'de>,
|
||||
{
|
||||
while let Some(IgnoredAny) = try!(seq.next_element()) {
|
||||
while let Some(IgnoredAny) = tri!(seq.next_element()) {
|
||||
// Gobble
|
||||
}
|
||||
Ok(IgnoredAny)
|
||||
@@ -208,7 +208,7 @@ impl<'de> Visitor<'de> for IgnoredAny {
|
||||
where
|
||||
A: MapAccess<'de>,
|
||||
{
|
||||
while let Some((IgnoredAny, IgnoredAny)) = try!(map.next_entry()) {
|
||||
while let Some((IgnoredAny, IgnoredAny)) = tri!(map.next_entry()) {
|
||||
// Gobble
|
||||
}
|
||||
Ok(IgnoredAny)
|
||||
@@ -227,7 +227,7 @@ impl<'de> Visitor<'de> for IgnoredAny {
|
||||
where
|
||||
A: EnumAccess<'de>,
|
||||
{
|
||||
try!(data.variant::<IgnoredAny>()).1.newtype_variant()
|
||||
tri!(data.variant::<IgnoredAny>()).1.newtype_variant()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+72
-117
@@ -1,16 +1,14 @@
|
||||
use lib::*;
|
||||
use crate::lib::*;
|
||||
|
||||
use de::{
|
||||
Deserialize, Deserializer, EnumAccess, Error, SeqAccess, Unexpected, VariantAccess, Visitor,
|
||||
use crate::de::{
|
||||
Deserialize, Deserializer, EnumAccess, Error, MapAccess, SeqAccess, Unexpected, VariantAccess,
|
||||
Visitor,
|
||||
};
|
||||
|
||||
#[cfg(any(feature = "std", feature = "alloc", not(no_core_duration)))]
|
||||
use de::MapAccess;
|
||||
|
||||
use seed::InPlaceSeed;
|
||||
use crate::seed::InPlaceSeed;
|
||||
|
||||
#[cfg(any(feature = "std", feature = "alloc"))]
|
||||
use __private::size_hint;
|
||||
use crate::__private::size_hint;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -84,7 +82,7 @@ macro_rules! impl_deserialize_num {
|
||||
($primitive:ident, $nonzero:ident $(cfg($($cfg:tt)*))*, $deserialize:ident $($method:ident!($($val:ident : $visit:ident)*);)*) => {
|
||||
impl_deserialize_num!($primitive, $deserialize $($method!($($val : $visit)*);)*);
|
||||
|
||||
#[cfg(all(not(no_num_nonzero), $($($cfg)*)*))]
|
||||
$(#[cfg($($cfg)*)])*
|
||||
impl<'de> Deserialize<'de> for num::$nonzero {
|
||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||
where
|
||||
@@ -684,7 +682,7 @@ impl<'de> Visitor<'de> for CStringVisitor {
|
||||
let capacity = size_hint::cautious::<u8>(seq.size_hint());
|
||||
let mut values = Vec::<u8>::with_capacity(capacity);
|
||||
|
||||
while let Some(value) = try!(seq.next_element()) {
|
||||
while let Some(value) = tri!(seq.next_element()) {
|
||||
values.push(value);
|
||||
}
|
||||
|
||||
@@ -747,13 +745,9 @@ macro_rules! forwarded_impl {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(all(
|
||||
any(feature = "std", all(not(no_core_cstr), feature = "alloc")),
|
||||
not(no_de_boxed_c_str)
|
||||
))]
|
||||
#[cfg(any(feature = "std", all(not(no_core_cstr), feature = "alloc")))]
|
||||
forwarded_impl!((), Box<CStr>, CString::into_boxed_c_str);
|
||||
|
||||
#[cfg(not(no_core_reverse))]
|
||||
forwarded_impl!((T), Reverse<T>, Reverse);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -901,7 +895,7 @@ macro_rules! seq_impl {
|
||||
{
|
||||
let mut values = $with_capacity;
|
||||
|
||||
while let Some(value) = try!($access.next_element()) {
|
||||
while let Some(value) = tri!($access.next_element()) {
|
||||
$insert(&mut values, value);
|
||||
}
|
||||
|
||||
@@ -939,7 +933,7 @@ macro_rules! seq_impl {
|
||||
$reserve(&mut self.0, size_hint::cautious::<T>($access.size_hint()));
|
||||
|
||||
// FIXME: try to overwrite old values here? (Vec, VecDeque, LinkedList)
|
||||
while let Some(value) = try!($access.next_element()) {
|
||||
while let Some(value) = tri!($access.next_element()) {
|
||||
$insert(&mut self.0, value);
|
||||
}
|
||||
|
||||
@@ -1039,7 +1033,7 @@ where
|
||||
let capacity = size_hint::cautious::<T>(seq.size_hint());
|
||||
let mut values = Vec::<T>::with_capacity(capacity);
|
||||
|
||||
while let Some(value) = try!(seq.next_element()) {
|
||||
while let Some(value) = tri!(seq.next_element()) {
|
||||
values.push(value);
|
||||
}
|
||||
|
||||
@@ -1081,7 +1075,7 @@ where
|
||||
for i in 0..self.0.len() {
|
||||
let next = {
|
||||
let next_place = InPlaceSeed(&mut self.0[i]);
|
||||
try!(seq.next_element_seed(next_place))
|
||||
tri!(seq.next_element_seed(next_place))
|
||||
};
|
||||
if next.is_none() {
|
||||
self.0.truncate(i);
|
||||
@@ -1089,7 +1083,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
while let Some(value) = try!(seq.next_element()) {
|
||||
while let Some(value) = tri!(seq.next_element()) {
|
||||
self.0.push(value);
|
||||
}
|
||||
|
||||
@@ -1161,7 +1155,7 @@ macro_rules! array_impls {
|
||||
A: SeqAccess<'de>,
|
||||
{
|
||||
Ok([$(
|
||||
match try!(seq.next_element()) {
|
||||
match tri!(seq.next_element()) {
|
||||
Some(val) => val,
|
||||
None => return Err(Error::invalid_length($n, &self)),
|
||||
}
|
||||
@@ -1186,7 +1180,7 @@ macro_rules! array_impls {
|
||||
{
|
||||
let mut fail_idx = None;
|
||||
for (idx, dest) in self.0[..].iter_mut().enumerate() {
|
||||
if try!(seq.next_element_seed(InPlaceSeed(dest))).is_none() {
|
||||
if tri!(seq.next_element_seed(InPlaceSeed(dest))).is_none() {
|
||||
fail_idx = Some(idx);
|
||||
break;
|
||||
}
|
||||
@@ -1284,7 +1278,7 @@ macro_rules! tuple_impls {
|
||||
A: SeqAccess<'de>,
|
||||
{
|
||||
$(
|
||||
let $name = match try!(seq.next_element()) {
|
||||
let $name = match tri!(seq.next_element()) {
|
||||
Some(value) => value,
|
||||
None => return Err(Error::invalid_length($n, &self)),
|
||||
};
|
||||
@@ -1318,7 +1312,7 @@ macro_rules! tuple_impls {
|
||||
A: SeqAccess<'de>,
|
||||
{
|
||||
$(
|
||||
if try!(seq.next_element_seed(InPlaceSeed(&mut (self.0).$n))).is_none() {
|
||||
if tri!(seq.next_element_seed(InPlaceSeed(&mut (self.0).$n))).is_none() {
|
||||
return Err(Error::invalid_length($n, &self));
|
||||
}
|
||||
)+
|
||||
@@ -1395,7 +1389,7 @@ macro_rules! map_impl {
|
||||
{
|
||||
let mut values = $with_capacity;
|
||||
|
||||
while let Some((key, value)) = try!($access.next_entry()) {
|
||||
while let Some((key, value)) = tri!($access.next_entry()) {
|
||||
values.insert(key, value);
|
||||
}
|
||||
|
||||
@@ -1541,7 +1535,7 @@ macro_rules! deserialize_enum {
|
||||
where
|
||||
A: EnumAccess<'de>,
|
||||
{
|
||||
match try!(data.variant()) {
|
||||
match tri!(data.variant()) {
|
||||
$(
|
||||
($name_kind :: $variant, v) => v.newtype_variant().map($name :: $variant),
|
||||
)*
|
||||
@@ -1561,7 +1555,7 @@ impl<'de> Deserialize<'de> for net::IpAddr {
|
||||
if deserializer.is_human_readable() {
|
||||
deserializer.deserialize_str(FromStrVisitor::new("IP address"))
|
||||
} else {
|
||||
use lib::net::IpAddr;
|
||||
use crate::lib::net::IpAddr;
|
||||
deserialize_enum! {
|
||||
IpAddr IpAddrKind (V4; b"V4"; 0, V6; b"V6"; 1)
|
||||
"`V4` or `V6`",
|
||||
@@ -1604,7 +1598,7 @@ impl<'de> Deserialize<'de> for net::SocketAddr {
|
||||
if deserializer.is_human_readable() {
|
||||
deserializer.deserialize_str(FromStrVisitor::new("socket address"))
|
||||
} else {
|
||||
use lib::net::SocketAddr;
|
||||
use crate::lib::net::SocketAddr;
|
||||
deserialize_enum! {
|
||||
SocketAddr SocketAddrKind (V4; b"V4"; 0, V6; b"V6"; 1)
|
||||
"`V4` or `V6`",
|
||||
@@ -1714,7 +1708,7 @@ impl<'de> Deserialize<'de> for PathBuf {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(all(feature = "std", not(no_de_boxed_path)))]
|
||||
#[cfg(feature = "std")]
|
||||
forwarded_impl!((), Box<Path>, PathBuf::into_boxed_path);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -1748,7 +1742,7 @@ impl<'de> Visitor<'de> for OsStringVisitor {
|
||||
{
|
||||
use std::os::unix::ffi::OsStringExt;
|
||||
|
||||
match try!(data.variant()) {
|
||||
match tri!(data.variant()) {
|
||||
(OsStringKind::Unix, v) => v.newtype_variant().map(OsString::from_vec),
|
||||
(OsStringKind::Windows, _) => Err(Error::custom(
|
||||
"cannot deserialize Windows OS string on Unix",
|
||||
@@ -1763,7 +1757,7 @@ impl<'de> Visitor<'de> for OsStringVisitor {
|
||||
{
|
||||
use std::os::windows::ffi::OsStringExt;
|
||||
|
||||
match try!(data.variant()) {
|
||||
match tri!(data.variant()) {
|
||||
(OsStringKind::Windows, v) => v
|
||||
.newtype_variant::<Vec<u16>>()
|
||||
.map(|vec| OsString::from_wide(&vec)),
|
||||
@@ -1795,30 +1789,6 @@ forwarded_impl!((T), Box<[T]>, Vec::into_boxed_slice);
|
||||
#[cfg(any(feature = "std", feature = "alloc"))]
|
||||
forwarded_impl!((), Box<str>, String::into_boxed_str);
|
||||
|
||||
#[cfg(all(no_de_rc_dst, feature = "rc", any(feature = "std", feature = "alloc")))]
|
||||
forwarded_impl! {
|
||||
/// This impl requires the [`"rc"`] Cargo feature of Serde.
|
||||
///
|
||||
/// Deserializing a data structure containing `Arc` will not attempt to
|
||||
/// deduplicate `Arc` references to the same data. Every deserialized `Arc`
|
||||
/// will end up with a strong count of 1.
|
||||
///
|
||||
/// [`"rc"`]: https://serde.rs/feature-flags.html#-features-rc
|
||||
(T), Arc<T>, Arc::new
|
||||
}
|
||||
|
||||
#[cfg(all(no_de_rc_dst, feature = "rc", any(feature = "std", feature = "alloc")))]
|
||||
forwarded_impl! {
|
||||
/// This impl requires the [`"rc"`] Cargo feature of Serde.
|
||||
///
|
||||
/// Deserializing a data structure containing `Rc` will not attempt to
|
||||
/// deduplicate `Rc` references to the same data. Every deserialized `Rc`
|
||||
/// will end up with a strong count of 1.
|
||||
///
|
||||
/// [`"rc"`]: https://serde.rs/feature-flags.html#-features-rc
|
||||
(T), Rc<T>, Rc::new
|
||||
}
|
||||
|
||||
#[cfg(any(feature = "std", feature = "alloc"))]
|
||||
impl<'de, 'a, T: ?Sized> Deserialize<'de> for Cow<'a, T>
|
||||
where
|
||||
@@ -1849,7 +1819,7 @@ where
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
try!(Option::<T>::deserialize(deserializer));
|
||||
tri!(Option::<T>::deserialize(deserializer));
|
||||
Ok(RcWeak::new())
|
||||
}
|
||||
}
|
||||
@@ -1867,18 +1837,14 @@ where
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
try!(Option::<T>::deserialize(deserializer));
|
||||
tri!(Option::<T>::deserialize(deserializer));
|
||||
Ok(ArcWeak::new())
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#[cfg(all(
|
||||
not(no_de_rc_dst),
|
||||
feature = "rc",
|
||||
any(feature = "std", feature = "alloc")
|
||||
))]
|
||||
#[cfg(all(feature = "rc", any(feature = "std", feature = "alloc")))]
|
||||
macro_rules! box_forwarded_impl {
|
||||
(
|
||||
$(#[doc = $doc:tt])*
|
||||
@@ -1899,11 +1865,7 @@ macro_rules! box_forwarded_impl {
|
||||
};
|
||||
}
|
||||
|
||||
#[cfg(all(
|
||||
not(no_de_rc_dst),
|
||||
feature = "rc",
|
||||
any(feature = "std", feature = "alloc")
|
||||
))]
|
||||
#[cfg(all(feature = "rc", any(feature = "std", feature = "alloc")))]
|
||||
box_forwarded_impl! {
|
||||
/// This impl requires the [`"rc"`] Cargo feature of Serde.
|
||||
///
|
||||
@@ -1915,11 +1877,7 @@ box_forwarded_impl! {
|
||||
Rc
|
||||
}
|
||||
|
||||
#[cfg(all(
|
||||
not(no_de_rc_dst),
|
||||
feature = "rc",
|
||||
any(feature = "std", feature = "alloc")
|
||||
))]
|
||||
#[cfg(all(feature = "rc", any(feature = "std", feature = "alloc")))]
|
||||
box_forwarded_impl! {
|
||||
/// This impl requires the [`"rc"`] Cargo feature of Serde.
|
||||
///
|
||||
@@ -1963,7 +1921,6 @@ forwarded_impl!((T), RwLock<T>, RwLock::new);
|
||||
// secs: u64,
|
||||
// nanos: u32,
|
||||
// }
|
||||
#[cfg(any(feature = "std", not(no_core_duration)))]
|
||||
impl<'de> Deserialize<'de> for Duration {
|
||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||
where
|
||||
@@ -2011,7 +1968,7 @@ impl<'de> Deserialize<'de> for Duration {
|
||||
b"secs" => Ok(Field::Secs),
|
||||
b"nanos" => Ok(Field::Nanos),
|
||||
_ => {
|
||||
let value = ::__private::from_utf8_lossy(value);
|
||||
let value = crate::__private::from_utf8_lossy(value);
|
||||
Err(Error::unknown_field(&*value, FIELDS))
|
||||
}
|
||||
}
|
||||
@@ -2046,19 +2003,19 @@ impl<'de> Deserialize<'de> for Duration {
|
||||
where
|
||||
A: SeqAccess<'de>,
|
||||
{
|
||||
let secs: u64 = match try!(seq.next_element()) {
|
||||
let secs: u64 = match tri!(seq.next_element()) {
|
||||
Some(value) => value,
|
||||
None => {
|
||||
return Err(Error::invalid_length(0, &self));
|
||||
}
|
||||
};
|
||||
let nanos: u32 = match try!(seq.next_element()) {
|
||||
let nanos: u32 = match tri!(seq.next_element()) {
|
||||
Some(value) => value,
|
||||
None => {
|
||||
return Err(Error::invalid_length(1, &self));
|
||||
}
|
||||
};
|
||||
try!(check_overflow(secs, nanos));
|
||||
tri!(check_overflow(secs, nanos));
|
||||
Ok(Duration::new(secs, nanos))
|
||||
}
|
||||
|
||||
@@ -2068,19 +2025,19 @@ impl<'de> Deserialize<'de> for Duration {
|
||||
{
|
||||
let mut secs: Option<u64> = None;
|
||||
let mut nanos: Option<u32> = None;
|
||||
while let Some(key) = try!(map.next_key()) {
|
||||
while let Some(key) = tri!(map.next_key()) {
|
||||
match key {
|
||||
Field::Secs => {
|
||||
if secs.is_some() {
|
||||
return Err(<A::Error as Error>::duplicate_field("secs"));
|
||||
}
|
||||
secs = Some(try!(map.next_value()));
|
||||
secs = Some(tri!(map.next_value()));
|
||||
}
|
||||
Field::Nanos => {
|
||||
if nanos.is_some() {
|
||||
return Err(<A::Error as Error>::duplicate_field("nanos"));
|
||||
}
|
||||
nanos = Some(try!(map.next_value()));
|
||||
nanos = Some(tri!(map.next_value()));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2092,7 +2049,7 @@ impl<'de> Deserialize<'de> for Duration {
|
||||
Some(nanos) => nanos,
|
||||
None => return Err(<A::Error as Error>::missing_field("nanos")),
|
||||
};
|
||||
try!(check_overflow(secs, nanos));
|
||||
tri!(check_overflow(secs, nanos));
|
||||
Ok(Duration::new(secs, nanos))
|
||||
}
|
||||
}
|
||||
@@ -2184,19 +2141,19 @@ impl<'de> Deserialize<'de> for SystemTime {
|
||||
where
|
||||
A: SeqAccess<'de>,
|
||||
{
|
||||
let secs: u64 = match try!(seq.next_element()) {
|
||||
let secs: u64 = match tri!(seq.next_element()) {
|
||||
Some(value) => value,
|
||||
None => {
|
||||
return Err(Error::invalid_length(0, &self));
|
||||
}
|
||||
};
|
||||
let nanos: u32 = match try!(seq.next_element()) {
|
||||
let nanos: u32 = match tri!(seq.next_element()) {
|
||||
Some(value) => value,
|
||||
None => {
|
||||
return Err(Error::invalid_length(1, &self));
|
||||
}
|
||||
};
|
||||
try!(check_overflow(secs, nanos));
|
||||
tri!(check_overflow(secs, nanos));
|
||||
Ok(Duration::new(secs, nanos))
|
||||
}
|
||||
|
||||
@@ -2206,7 +2163,7 @@ impl<'de> Deserialize<'de> for SystemTime {
|
||||
{
|
||||
let mut secs: Option<u64> = None;
|
||||
let mut nanos: Option<u32> = None;
|
||||
while let Some(key) = try!(map.next_key()) {
|
||||
while let Some(key) = tri!(map.next_key()) {
|
||||
match key {
|
||||
Field::Secs => {
|
||||
if secs.is_some() {
|
||||
@@ -2214,7 +2171,7 @@ impl<'de> Deserialize<'de> for SystemTime {
|
||||
"secs_since_epoch",
|
||||
));
|
||||
}
|
||||
secs = Some(try!(map.next_value()));
|
||||
secs = Some(tri!(map.next_value()));
|
||||
}
|
||||
Field::Nanos => {
|
||||
if nanos.is_some() {
|
||||
@@ -2222,7 +2179,7 @@ impl<'de> Deserialize<'de> for SystemTime {
|
||||
"nanos_since_epoch",
|
||||
));
|
||||
}
|
||||
nanos = Some(try!(map.next_value()));
|
||||
nanos = Some(tri!(map.next_value()));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2234,13 +2191,13 @@ impl<'de> Deserialize<'de> for SystemTime {
|
||||
Some(nanos) => nanos,
|
||||
None => return Err(<A::Error as Error>::missing_field("nanos_since_epoch")),
|
||||
};
|
||||
try!(check_overflow(secs, nanos));
|
||||
tri!(check_overflow(secs, nanos));
|
||||
Ok(Duration::new(secs, nanos))
|
||||
}
|
||||
}
|
||||
|
||||
const FIELDS: &[&str] = &["secs_since_epoch", "nanos_since_epoch"];
|
||||
let duration = try!(deserializer.deserialize_struct("SystemTime", FIELDS, DurationVisitor));
|
||||
let duration = tri!(deserializer.deserialize_struct("SystemTime", FIELDS, DurationVisitor));
|
||||
#[cfg(not(no_systemtime_checked_add))]
|
||||
let ret = UNIX_EPOCH
|
||||
.checked_add(duration)
|
||||
@@ -2269,7 +2226,7 @@ where
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
let (start, end) = try!(deserializer.deserialize_struct(
|
||||
let (start, end) = tri!(deserializer.deserialize_struct(
|
||||
"Range",
|
||||
range::FIELDS,
|
||||
range::RangeVisitor {
|
||||
@@ -2281,7 +2238,6 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(no_range_inclusive))]
|
||||
impl<'de, Idx> Deserialize<'de> for RangeInclusive<Idx>
|
||||
where
|
||||
Idx: Deserialize<'de>,
|
||||
@@ -2290,7 +2246,7 @@ where
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
let (start, end) = try!(deserializer.deserialize_struct(
|
||||
let (start, end) = tri!(deserializer.deserialize_struct(
|
||||
"RangeInclusive",
|
||||
range::FIELDS,
|
||||
range::RangeVisitor {
|
||||
@@ -2303,9 +2259,9 @@ where
|
||||
}
|
||||
|
||||
mod range {
|
||||
use lib::*;
|
||||
use crate::lib::*;
|
||||
|
||||
use de::{Deserialize, Deserializer, Error, MapAccess, SeqAccess, Visitor};
|
||||
use crate::de::{Deserialize, Deserializer, Error, MapAccess, SeqAccess, Visitor};
|
||||
|
||||
pub const FIELDS: &[&str] = &["start", "end"];
|
||||
|
||||
@@ -2351,7 +2307,7 @@ mod range {
|
||||
b"start" => Ok(Field::Start),
|
||||
b"end" => Ok(Field::End),
|
||||
_ => {
|
||||
let value = ::__private::from_utf8_lossy(value);
|
||||
let value = crate::__private::from_utf8_lossy(value);
|
||||
Err(Error::unknown_field(&*value, FIELDS))
|
||||
}
|
||||
}
|
||||
@@ -2381,13 +2337,13 @@ mod range {
|
||||
where
|
||||
A: SeqAccess<'de>,
|
||||
{
|
||||
let start: Idx = match try!(seq.next_element()) {
|
||||
let start: Idx = match tri!(seq.next_element()) {
|
||||
Some(value) => value,
|
||||
None => {
|
||||
return Err(Error::invalid_length(0, &self));
|
||||
}
|
||||
};
|
||||
let end: Idx = match try!(seq.next_element()) {
|
||||
let end: Idx = match tri!(seq.next_element()) {
|
||||
Some(value) => value,
|
||||
None => {
|
||||
return Err(Error::invalid_length(1, &self));
|
||||
@@ -2402,19 +2358,19 @@ mod range {
|
||||
{
|
||||
let mut start: Option<Idx> = None;
|
||||
let mut end: Option<Idx> = None;
|
||||
while let Some(key) = try!(map.next_key()) {
|
||||
while let Some(key) = tri!(map.next_key()) {
|
||||
match key {
|
||||
Field::Start => {
|
||||
if start.is_some() {
|
||||
return Err(<A::Error as Error>::duplicate_field("start"));
|
||||
}
|
||||
start = Some(try!(map.next_value()));
|
||||
start = Some(tri!(map.next_value()));
|
||||
}
|
||||
Field::End => {
|
||||
if end.is_some() {
|
||||
return Err(<A::Error as Error>::duplicate_field("end"));
|
||||
}
|
||||
end = Some(try!(map.next_value()));
|
||||
end = Some(tri!(map.next_value()));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2448,7 +2404,7 @@ where
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
let start = try!(deserializer.deserialize_struct(
|
||||
let start = tri!(deserializer.deserialize_struct(
|
||||
"RangeFrom",
|
||||
range_from::FIELDS,
|
||||
range_from::RangeFromVisitor {
|
||||
@@ -2461,9 +2417,9 @@ where
|
||||
}
|
||||
|
||||
mod range_from {
|
||||
use lib::*;
|
||||
use crate::lib::*;
|
||||
|
||||
use de::{Deserialize, Deserializer, Error, MapAccess, SeqAccess, Visitor};
|
||||
use crate::de::{Deserialize, Deserializer, Error, MapAccess, SeqAccess, Visitor};
|
||||
|
||||
pub const FIELDS: &[&str] = &["end"];
|
||||
|
||||
@@ -2506,7 +2462,7 @@ mod range_from {
|
||||
match value {
|
||||
b"end" => Ok(Field::End),
|
||||
_ => {
|
||||
let value = ::__private::from_utf8_lossy(value);
|
||||
let value = crate::__private::from_utf8_lossy(value);
|
||||
Err(Error::unknown_field(&*value, FIELDS))
|
||||
}
|
||||
}
|
||||
@@ -2536,7 +2492,7 @@ mod range_from {
|
||||
where
|
||||
A: SeqAccess<'de>,
|
||||
{
|
||||
let end: Idx = match try!(seq.next_element()) {
|
||||
let end: Idx = match tri!(seq.next_element()) {
|
||||
Some(value) => value,
|
||||
None => {
|
||||
return Err(Error::invalid_length(0, &self));
|
||||
@@ -2550,13 +2506,13 @@ mod range_from {
|
||||
A: MapAccess<'de>,
|
||||
{
|
||||
let mut end: Option<Idx> = None;
|
||||
while let Some(key) = try!(map.next_key()) {
|
||||
while let Some(key) = tri!(map.next_key()) {
|
||||
match key {
|
||||
Field::End => {
|
||||
if end.is_some() {
|
||||
return Err(<A::Error as Error>::duplicate_field("end"));
|
||||
}
|
||||
end = Some(try!(map.next_value()));
|
||||
end = Some(tri!(map.next_value()));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2586,7 +2542,7 @@ where
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
let end = try!(deserializer.deserialize_struct(
|
||||
let end = tri!(deserializer.deserialize_struct(
|
||||
"RangeTo",
|
||||
range_to::FIELDS,
|
||||
range_to::RangeToVisitor {
|
||||
@@ -2599,9 +2555,9 @@ where
|
||||
}
|
||||
|
||||
mod range_to {
|
||||
use lib::*;
|
||||
use crate::lib::*;
|
||||
|
||||
use de::{Deserialize, Deserializer, Error, MapAccess, SeqAccess, Visitor};
|
||||
use crate::de::{Deserialize, Deserializer, Error, MapAccess, SeqAccess, Visitor};
|
||||
|
||||
pub const FIELDS: &[&str] = &["start"];
|
||||
|
||||
@@ -2644,7 +2600,7 @@ mod range_to {
|
||||
match value {
|
||||
b"start" => Ok(Field::Start),
|
||||
_ => {
|
||||
let value = ::__private::from_utf8_lossy(value);
|
||||
let value = crate::__private::from_utf8_lossy(value);
|
||||
Err(Error::unknown_field(&*value, FIELDS))
|
||||
}
|
||||
}
|
||||
@@ -2674,7 +2630,7 @@ mod range_to {
|
||||
where
|
||||
A: SeqAccess<'de>,
|
||||
{
|
||||
let start: Idx = match try!(seq.next_element()) {
|
||||
let start: Idx = match tri!(seq.next_element()) {
|
||||
Some(value) => value,
|
||||
None => {
|
||||
return Err(Error::invalid_length(0, &self));
|
||||
@@ -2688,13 +2644,13 @@ mod range_to {
|
||||
A: MapAccess<'de>,
|
||||
{
|
||||
let mut start: Option<Idx> = None;
|
||||
while let Some(key) = try!(map.next_key()) {
|
||||
while let Some(key) = tri!(map.next_key()) {
|
||||
match key {
|
||||
Field::Start => {
|
||||
if start.is_some() {
|
||||
return Err(<A::Error as Error>::duplicate_field("start"));
|
||||
}
|
||||
start = Some(try!(map.next_value()));
|
||||
start = Some(tri!(map.next_value()));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2709,7 +2665,6 @@ mod range_to {
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#[cfg(any(not(no_ops_bound), all(feature = "std", not(no_collections_bound))))]
|
||||
impl<'de, T> Deserialize<'de> for Bound<T>
|
||||
where
|
||||
T: Deserialize<'de>,
|
||||
@@ -2801,7 +2756,7 @@ where
|
||||
where
|
||||
A: EnumAccess<'de>,
|
||||
{
|
||||
match try!(data.variant()) {
|
||||
match tri!(data.variant()) {
|
||||
(Field::Unbounded, v) => v.unit_variant().map(|()| Bound::Unbounded),
|
||||
(Field::Included, v) => v.newtype_variant().map(Bound::Included),
|
||||
(Field::Excluded, v) => v.newtype_variant().map(Bound::Excluded),
|
||||
@@ -2910,7 +2865,7 @@ where
|
||||
where
|
||||
A: EnumAccess<'de>,
|
||||
{
|
||||
match try!(data.variant()) {
|
||||
match tri!(data.variant()) {
|
||||
(Field::Ok, v) => v.newtype_variant().map(Ok),
|
||||
(Field::Err, v) => v.newtype_variant().map(Err),
|
||||
}
|
||||
|
||||
+16
-13
@@ -112,7 +112,7 @@
|
||||
//! [derive section of the manual]: https://serde.rs/derive.html
|
||||
//! [data formats]: https://serde.rs/#data-formats
|
||||
|
||||
use lib::*;
|
||||
use crate::lib::*;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -126,12 +126,15 @@ mod utf8;
|
||||
|
||||
pub use self::ignored_any::IgnoredAny;
|
||||
|
||||
#[cfg(not(any(feature = "std", feature = "unstable")))]
|
||||
#[doc(no_inline)]
|
||||
pub use crate::std_error::Error as StdError;
|
||||
#[cfg(all(feature = "unstable", not(feature = "std")))]
|
||||
#[doc(no_inline)]
|
||||
pub use core::error::Error as StdError;
|
||||
#[cfg(feature = "std")]
|
||||
#[doc(no_inline)]
|
||||
pub use std::error::Error as StdError;
|
||||
#[cfg(not(feature = "std"))]
|
||||
#[doc(no_inline)]
|
||||
pub use std_error::Error as StdError;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -566,7 +569,7 @@ pub trait Deserialize<'de>: Sized {
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
// Default implementation just delegates to `deserialize` impl.
|
||||
*place = try!(Deserialize::deserialize(deserializer));
|
||||
*place = tri!(Deserialize::deserialize(deserializer));
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
@@ -1226,11 +1229,11 @@ pub trait Deserializer<'de>: Sized {
|
||||
#[doc(hidden)]
|
||||
fn __deserialize_content<V>(
|
||||
self,
|
||||
_: ::actually_private::T,
|
||||
_: crate::actually_private::T,
|
||||
visitor: V,
|
||||
) -> Result<::private::de::Content<'de>, Self::Error>
|
||||
) -> Result<crate::__private::de::Content<'de>, Self::Error>
|
||||
where
|
||||
V: Visitor<'de, Value = ::private::de::Content<'de>>,
|
||||
V: Visitor<'de, Value = crate::__private::de::Content<'de>>,
|
||||
{
|
||||
self.deserialize_any(visitor)
|
||||
}
|
||||
@@ -1831,9 +1834,9 @@ pub trait MapAccess<'de> {
|
||||
K: DeserializeSeed<'de>,
|
||||
V: DeserializeSeed<'de>,
|
||||
{
|
||||
match try!(self.next_key_seed(kseed)) {
|
||||
match tri!(self.next_key_seed(kseed)) {
|
||||
Some(key) => {
|
||||
let value = try!(self.next_value_seed(vseed));
|
||||
let value = tri!(self.next_value_seed(vseed));
|
||||
Ok(Some((key, value)))
|
||||
}
|
||||
None => Ok(None),
|
||||
@@ -2281,12 +2284,12 @@ impl Display for OneOf {
|
||||
1 => write!(formatter, "`{}`", self.names[0]),
|
||||
2 => write!(formatter, "`{}` or `{}`", self.names[0], self.names[1]),
|
||||
_ => {
|
||||
try!(write!(formatter, "one of "));
|
||||
tri!(write!(formatter, "one of "));
|
||||
for (i, alt) in self.names.iter().enumerate() {
|
||||
if i > 0 {
|
||||
try!(write!(formatter, ", "));
|
||||
tri!(write!(formatter, ", "));
|
||||
}
|
||||
try!(write!(formatter, "`{}`", alt));
|
||||
tri!(write!(formatter, "`{}`", alt));
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use de::{Deserialize, DeserializeSeed, Deserializer};
|
||||
use crate::de::{Deserialize, DeserializeSeed, Deserializer};
|
||||
|
||||
/// A DeserializeSeed helper for implementing deserialize_in_place Visitors.
|
||||
///
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use lib::*;
|
||||
use crate::lib::*;
|
||||
|
||||
const TAG_CONT: u8 = 0b1000_0000;
|
||||
const TAG_TWO_B: u8 = 0b1100_0000;
|
||||
|
||||
+18
-16
@@ -21,12 +21,12 @@
|
||||
//! }
|
||||
//! ```
|
||||
|
||||
use lib::*;
|
||||
use crate::lib::*;
|
||||
|
||||
use self::private::{First, Second};
|
||||
use __private::size_hint;
|
||||
use de::{self, Deserializer, Expected, IntoDeserializer, SeqAccess, Visitor};
|
||||
use ser;
|
||||
use crate::__private::size_hint;
|
||||
use crate::de::{self, Deserializer, Expected, IntoDeserializer, SeqAccess, Visitor};
|
||||
use crate::ser;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -937,8 +937,8 @@ where
|
||||
where
|
||||
V: de::Visitor<'de>,
|
||||
{
|
||||
let v = try!(visitor.visit_seq(&mut self));
|
||||
try!(self.end());
|
||||
let v = tri!(visitor.visit_seq(&mut self));
|
||||
tri!(self.end());
|
||||
Ok(v)
|
||||
}
|
||||
|
||||
@@ -1162,8 +1162,8 @@ where
|
||||
where
|
||||
V: de::Visitor<'de>,
|
||||
{
|
||||
let value = try!(visitor.visit_map(&mut self));
|
||||
try!(self.end());
|
||||
let value = tri!(visitor.visit_map(&mut self));
|
||||
tri!(self.end());
|
||||
Ok(value)
|
||||
}
|
||||
|
||||
@@ -1171,8 +1171,8 @@ where
|
||||
where
|
||||
V: de::Visitor<'de>,
|
||||
{
|
||||
let value = try!(visitor.visit_seq(&mut self));
|
||||
try!(self.end());
|
||||
let value = tri!(visitor.visit_seq(&mut self));
|
||||
tri!(self.end());
|
||||
Ok(value)
|
||||
}
|
||||
|
||||
@@ -1236,8 +1236,8 @@ where
|
||||
{
|
||||
match self.next_pair() {
|
||||
Some((key, value)) => {
|
||||
let key = try!(kseed.deserialize(key.into_deserializer()));
|
||||
let value = try!(vseed.deserialize(value.into_deserializer()));
|
||||
let key = tri!(kseed.deserialize(key.into_deserializer()));
|
||||
let value = tri!(vseed.deserialize(value.into_deserializer()));
|
||||
Ok(Some((key, value)))
|
||||
}
|
||||
None => Ok(None),
|
||||
@@ -1341,7 +1341,7 @@ where
|
||||
V: de::Visitor<'de>,
|
||||
{
|
||||
let mut pair_visitor = PairVisitor(Some(self.0), Some(self.1), PhantomData);
|
||||
let pair = try!(visitor.visit_seq(&mut pair_visitor));
|
||||
let pair = tri!(visitor.visit_seq(&mut pair_visitor));
|
||||
if pair_visitor.1.is_none() {
|
||||
Ok(pair)
|
||||
} else {
|
||||
@@ -1501,7 +1501,7 @@ where
|
||||
where
|
||||
T: de::DeserializeSeed<'de>,
|
||||
{
|
||||
match try!(self.map.next_key_seed(seed)) {
|
||||
match tri!(self.map.next_key_seed(seed)) {
|
||||
Some(key) => Ok((key, private::map_as_enum(self.map))),
|
||||
None => Err(de::Error::invalid_type(de::Unexpected::Map, &"enum")),
|
||||
}
|
||||
@@ -1546,9 +1546,11 @@ where
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
mod private {
|
||||
use lib::*;
|
||||
use crate::lib::*;
|
||||
|
||||
use de::{self, DeserializeSeed, Deserializer, MapAccess, Unexpected, VariantAccess, Visitor};
|
||||
use crate::de::{
|
||||
self, DeserializeSeed, Deserializer, MapAccess, Unexpected, VariantAccess, Visitor,
|
||||
};
|
||||
|
||||
pub struct UnitOnly<E> {
|
||||
marker: PhantomData<E>,
|
||||
|
||||
+10
-26
@@ -93,7 +93,7 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Serde types in rustdoc of other crates get linked to here.
|
||||
#![doc(html_root_url = "https://docs.rs/serde/1.0.176")]
|
||||
#![doc(html_root_url = "https://docs.rs/serde/1.0.180")]
|
||||
// Support using Serde without the standard library!
|
||||
#![cfg_attr(not(feature = "std"), no_std)]
|
||||
// Unstable functionality only if the user asks for it. For tracking and
|
||||
@@ -149,6 +149,8 @@
|
||||
must_use_candidate,
|
||||
)
|
||||
)]
|
||||
// Restrictions
|
||||
#![cfg_attr(feature = "cargo-clippy", deny(question_mark_used))]
|
||||
// Rustc lints.
|
||||
#![deny(missing_docs, unused_imports)]
|
||||
|
||||
@@ -175,14 +177,16 @@ mod lib {
|
||||
|
||||
pub use self::core::cell::{Cell, RefCell};
|
||||
pub use self::core::clone::{self, Clone};
|
||||
pub use self::core::cmp::Reverse;
|
||||
pub use self::core::convert::{self, From, Into};
|
||||
pub use self::core::default::{self, Default};
|
||||
pub use self::core::fmt::{self, Debug, Display};
|
||||
pub use self::core::marker::{self, PhantomData};
|
||||
pub use self::core::num::Wrapping;
|
||||
pub use self::core::ops::{Range, RangeFrom, RangeTo};
|
||||
pub use self::core::ops::{Bound, Range, RangeFrom, RangeInclusive, RangeTo};
|
||||
pub use self::core::option::{self, Option};
|
||||
pub use self::core::result::{self, Result};
|
||||
pub use self::core::time::Duration;
|
||||
|
||||
#[cfg(all(feature = "alloc", not(feature = "std")))]
|
||||
pub use alloc::borrow::{Cow, ToOwned};
|
||||
@@ -220,7 +224,7 @@ mod lib {
|
||||
pub use std::collections::{BTreeMap, BTreeSet, BinaryHeap, LinkedList, VecDeque};
|
||||
|
||||
#[cfg(all(not(no_core_cstr), not(feature = "std")))]
|
||||
pub use core::ffi::CStr;
|
||||
pub use self::core::ffi::CStr;
|
||||
#[cfg(feature = "std")]
|
||||
pub use std::ffi::CStr;
|
||||
|
||||
@@ -247,18 +251,6 @@ mod lib {
|
||||
#[cfg(feature = "std")]
|
||||
pub use std::time::{SystemTime, UNIX_EPOCH};
|
||||
|
||||
#[cfg(all(feature = "std", not(no_collections_bound), no_ops_bound))]
|
||||
pub use std::collections::Bound;
|
||||
|
||||
#[cfg(not(no_core_reverse))]
|
||||
pub use self::core::cmp::Reverse;
|
||||
|
||||
#[cfg(not(no_ops_bound))]
|
||||
pub use self::core::ops::Bound;
|
||||
|
||||
#[cfg(not(no_range_inclusive))]
|
||||
pub use self::core::ops::RangeInclusive;
|
||||
|
||||
#[cfg(all(feature = "std", no_target_has_atomic, not(no_std_atomic)))]
|
||||
pub use std::sync::atomic::{
|
||||
AtomicBool, AtomicI16, AtomicI32, AtomicI8, AtomicIsize, AtomicU16, AtomicU32, AtomicU8,
|
||||
@@ -279,16 +271,13 @@ mod lib {
|
||||
pub use std::sync::atomic::{AtomicI64, AtomicU64};
|
||||
#[cfg(all(feature = "std", not(no_target_has_atomic), target_has_atomic = "ptr"))]
|
||||
pub use std::sync::atomic::{AtomicIsize, AtomicUsize};
|
||||
|
||||
#[cfg(any(feature = "std", not(no_core_duration)))]
|
||||
pub use self::core::time::Duration;
|
||||
}
|
||||
|
||||
// None of this crate's error handling needs the `From::from` error conversion
|
||||
// performed implicitly by the `?` operator or the standard library's `try!`
|
||||
// macro. This simplified macro gives a 5.5% improvement in compile time
|
||||
// compared to standard `try!`, and 9% improvement compared to `?`.
|
||||
macro_rules! try {
|
||||
macro_rules! tri {
|
||||
($expr:expr) => {
|
||||
match $expr {
|
||||
Ok(val) => val,
|
||||
@@ -309,20 +298,15 @@ pub mod de;
|
||||
pub mod ser;
|
||||
|
||||
#[doc(inline)]
|
||||
pub use de::{Deserialize, Deserializer};
|
||||
pub use crate::de::{Deserialize, Deserializer};
|
||||
#[doc(inline)]
|
||||
pub use ser::{Serialize, Serializer};
|
||||
pub use crate::ser::{Serialize, Serializer};
|
||||
|
||||
// Used by generated code and doc tests. Not public API.
|
||||
#[doc(hidden)]
|
||||
#[path = "private/mod.rs"]
|
||||
pub mod __private;
|
||||
|
||||
#[allow(unused_imports)]
|
||||
use self::__private as export;
|
||||
#[allow(unused_imports)]
|
||||
use self::__private as private;
|
||||
|
||||
#[path = "de/seed.rs"]
|
||||
mod seed;
|
||||
|
||||
|
||||
+45
-183
@@ -1,10 +1,10 @@
|
||||
use lib::*;
|
||||
use crate::lib::*;
|
||||
|
||||
use de::value::{BorrowedBytesDeserializer, BytesDeserializer};
|
||||
use de::{Deserialize, Deserializer, Error, IntoDeserializer, Visitor};
|
||||
use crate::de::value::{BorrowedBytesDeserializer, BytesDeserializer};
|
||||
use crate::de::{Deserialize, Deserializer, Error, IntoDeserializer, Visitor};
|
||||
|
||||
#[cfg(any(feature = "std", feature = "alloc"))]
|
||||
use de::{DeserializeSeed, MapAccess, Unexpected};
|
||||
use crate::de::{DeserializeSeed, MapAccess, Unexpected};
|
||||
|
||||
#[cfg(any(feature = "std", feature = "alloc"))]
|
||||
pub use self::content::{
|
||||
@@ -13,7 +13,7 @@ pub use self::content::{
|
||||
TagOrContentField, TagOrContentFieldVisitor, TaggedContentVisitor, UntaggedUnitVisitor,
|
||||
};
|
||||
|
||||
pub use seed::InPlaceSeed;
|
||||
pub use crate::seed::InPlaceSeed;
|
||||
|
||||
/// If the missing field is of type `Option<T>` then treat is as `None`,
|
||||
/// otherwise it is an error.
|
||||
@@ -203,11 +203,12 @@ mod content {
|
||||
// This issue is tracking making some of this stuff public:
|
||||
// https://github.com/serde-rs/serde/issues/741
|
||||
|
||||
use lib::*;
|
||||
use crate::lib::*;
|
||||
|
||||
use __private::size_hint;
|
||||
use actually_private;
|
||||
use de::{
|
||||
use crate::__private::size_hint;
|
||||
use crate::actually_private;
|
||||
use crate::de::value::{MapDeserializer, SeqDeserializer};
|
||||
use crate::de::{
|
||||
self, Deserialize, DeserializeSeed, Deserializer, EnumAccess, Expected, IgnoredAny,
|
||||
MapAccess, SeqAccess, Unexpected, Visitor,
|
||||
};
|
||||
@@ -299,6 +300,17 @@ mod content {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'de, E> de::IntoDeserializer<'de, E> for Content<'de>
|
||||
where
|
||||
E: de::Error,
|
||||
{
|
||||
type Deserializer = ContentDeserializer<'de, E>;
|
||||
|
||||
fn into_deserializer(self) -> Self::Deserializer {
|
||||
ContentDeserializer::new(self)
|
||||
}
|
||||
}
|
||||
|
||||
struct ContentVisitor<'de> {
|
||||
value: PhantomData<Content<'de>>,
|
||||
}
|
||||
@@ -476,7 +488,7 @@ mod content {
|
||||
{
|
||||
let mut vec =
|
||||
Vec::<Content>::with_capacity(size_hint::cautious::<Content>(visitor.size_hint()));
|
||||
while let Some(e) = try!(visitor.next_element()) {
|
||||
while let Some(e) = tri!(visitor.next_element()) {
|
||||
vec.push(e);
|
||||
}
|
||||
Ok(Content::Seq(vec))
|
||||
@@ -490,7 +502,7 @@ mod content {
|
||||
Vec::<(Content, Content)>::with_capacity(
|
||||
size_hint::cautious::<(Content, Content)>(visitor.size_hint()),
|
||||
);
|
||||
while let Some(kv) = try!(visitor.next_entry()) {
|
||||
while let Some(kv) = tri!(visitor.next_entry()) {
|
||||
vec.push(kv);
|
||||
}
|
||||
Ok(Content::Map(vec))
|
||||
@@ -833,14 +845,14 @@ mod content {
|
||||
where
|
||||
S: SeqAccess<'de>,
|
||||
{
|
||||
let tag = match try!(seq.next_element()) {
|
||||
let tag = match tri!(seq.next_element()) {
|
||||
Some(tag) => tag,
|
||||
None => {
|
||||
return Err(de::Error::missing_field(self.tag_name));
|
||||
}
|
||||
};
|
||||
let rest = de::value::SeqAccessDeserializer::new(seq);
|
||||
Ok((tag, try!(Content::deserialize(rest))))
|
||||
Ok((tag, tri!(Content::deserialize(rest))))
|
||||
}
|
||||
|
||||
fn visit_map<M>(self, mut map: M) -> Result<Self::Value, M::Error>
|
||||
@@ -852,16 +864,16 @@ mod content {
|
||||
Content,
|
||||
Content,
|
||||
)>(map.size_hint()));
|
||||
while let Some(k) = try!(map.next_key_seed(TagOrContentVisitor::new(self.tag_name))) {
|
||||
while let Some(k) = tri!(map.next_key_seed(TagOrContentVisitor::new(self.tag_name))) {
|
||||
match k {
|
||||
TagOrContent::Tag => {
|
||||
if tag.is_some() {
|
||||
return Err(de::Error::duplicate_field(self.tag_name));
|
||||
}
|
||||
tag = Some(try!(map.next_value()));
|
||||
tag = Some(tri!(map.next_value()));
|
||||
}
|
||||
TagOrContent::Content(k) => {
|
||||
let v = try!(map.next_value());
|
||||
let v = tri!(map.next_value());
|
||||
vec.push((k, v));
|
||||
}
|
||||
}
|
||||
@@ -1074,9 +1086,9 @@ mod content {
|
||||
E: de::Error,
|
||||
{
|
||||
let seq = content.into_iter().map(ContentDeserializer::new);
|
||||
let mut seq_visitor = de::value::SeqDeserializer::new(seq);
|
||||
let value = try!(visitor.visit_seq(&mut seq_visitor));
|
||||
try!(seq_visitor.end());
|
||||
let mut seq_visitor = SeqDeserializer::new(seq);
|
||||
let value = tri!(visitor.visit_seq(&mut seq_visitor));
|
||||
tri!(seq_visitor.end());
|
||||
Ok(value)
|
||||
}
|
||||
|
||||
@@ -1091,9 +1103,9 @@ mod content {
|
||||
let map = content
|
||||
.into_iter()
|
||||
.map(|(k, v)| (ContentDeserializer::new(k), ContentDeserializer::new(v)));
|
||||
let mut map_visitor = de::value::MapDeserializer::new(map);
|
||||
let value = try!(visitor.visit_map(&mut map_visitor));
|
||||
try!(map_visitor.end());
|
||||
let mut map_visitor = MapDeserializer::new(map);
|
||||
let value = tri!(visitor.visit_map(&mut map_visitor));
|
||||
tri!(map_visitor.end());
|
||||
Ok(value)
|
||||
}
|
||||
|
||||
@@ -1569,7 +1581,7 @@ mod content {
|
||||
{
|
||||
match self.value {
|
||||
Some(Content::Seq(v)) => {
|
||||
de::Deserializer::deserialize_any(SeqDeserializer::new(v), visitor)
|
||||
de::Deserializer::deserialize_any(SeqDeserializer::new(v.into_iter()), visitor)
|
||||
}
|
||||
Some(other) => Err(de::Error::invalid_type(
|
||||
other.unexpected(),
|
||||
@@ -1592,10 +1604,10 @@ mod content {
|
||||
{
|
||||
match self.value {
|
||||
Some(Content::Map(v)) => {
|
||||
de::Deserializer::deserialize_any(MapDeserializer::new(v), visitor)
|
||||
de::Deserializer::deserialize_any(MapDeserializer::new(v.into_iter()), visitor)
|
||||
}
|
||||
Some(Content::Seq(v)) => {
|
||||
de::Deserializer::deserialize_any(SeqDeserializer::new(v), visitor)
|
||||
de::Deserializer::deserialize_any(SeqDeserializer::new(v.into_iter()), visitor)
|
||||
}
|
||||
Some(other) => Err(de::Error::invalid_type(
|
||||
other.unexpected(),
|
||||
@@ -1609,156 +1621,6 @@ mod content {
|
||||
}
|
||||
}
|
||||
|
||||
struct SeqDeserializer<'de, E>
|
||||
where
|
||||
E: de::Error,
|
||||
{
|
||||
iter: <Vec<Content<'de>> as IntoIterator>::IntoIter,
|
||||
err: PhantomData<E>,
|
||||
}
|
||||
|
||||
impl<'de, E> SeqDeserializer<'de, E>
|
||||
where
|
||||
E: de::Error,
|
||||
{
|
||||
fn new(vec: Vec<Content<'de>>) -> Self {
|
||||
SeqDeserializer {
|
||||
iter: vec.into_iter(),
|
||||
err: PhantomData,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'de, E> de::Deserializer<'de> for SeqDeserializer<'de, E>
|
||||
where
|
||||
E: de::Error,
|
||||
{
|
||||
type Error = E;
|
||||
|
||||
#[inline]
|
||||
fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
|
||||
where
|
||||
V: de::Visitor<'de>,
|
||||
{
|
||||
let len = self.iter.len();
|
||||
if len == 0 {
|
||||
visitor.visit_unit()
|
||||
} else {
|
||||
let ret = try!(visitor.visit_seq(&mut self));
|
||||
let remaining = self.iter.len();
|
||||
if remaining == 0 {
|
||||
Ok(ret)
|
||||
} else {
|
||||
Err(de::Error::invalid_length(len, &"fewer elements in array"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
forward_to_deserialize_any! {
|
||||
bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
|
||||
bytes byte_buf option unit unit_struct newtype_struct seq tuple
|
||||
tuple_struct map struct enum identifier ignored_any
|
||||
}
|
||||
}
|
||||
|
||||
impl<'de, E> de::SeqAccess<'de> for SeqDeserializer<'de, E>
|
||||
where
|
||||
E: de::Error,
|
||||
{
|
||||
type Error = E;
|
||||
|
||||
fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
|
||||
where
|
||||
T: de::DeserializeSeed<'de>,
|
||||
{
|
||||
match self.iter.next() {
|
||||
Some(value) => seed.deserialize(ContentDeserializer::new(value)).map(Some),
|
||||
None => Ok(None),
|
||||
}
|
||||
}
|
||||
|
||||
fn size_hint(&self) -> Option<usize> {
|
||||
size_hint::from_bounds(&self.iter)
|
||||
}
|
||||
}
|
||||
|
||||
struct MapDeserializer<'de, E>
|
||||
where
|
||||
E: de::Error,
|
||||
{
|
||||
iter: <Vec<(Content<'de>, Content<'de>)> as IntoIterator>::IntoIter,
|
||||
value: Option<Content<'de>>,
|
||||
err: PhantomData<E>,
|
||||
}
|
||||
|
||||
impl<'de, E> MapDeserializer<'de, E>
|
||||
where
|
||||
E: de::Error,
|
||||
{
|
||||
fn new(map: Vec<(Content<'de>, Content<'de>)>) -> Self {
|
||||
MapDeserializer {
|
||||
iter: map.into_iter(),
|
||||
value: None,
|
||||
err: PhantomData,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'de, E> de::MapAccess<'de> for MapDeserializer<'de, E>
|
||||
where
|
||||
E: de::Error,
|
||||
{
|
||||
type Error = E;
|
||||
|
||||
fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
|
||||
where
|
||||
T: de::DeserializeSeed<'de>,
|
||||
{
|
||||
match self.iter.next() {
|
||||
Some((key, value)) => {
|
||||
self.value = Some(value);
|
||||
seed.deserialize(ContentDeserializer::new(key)).map(Some)
|
||||
}
|
||||
None => Ok(None),
|
||||
}
|
||||
}
|
||||
|
||||
fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error>
|
||||
where
|
||||
T: de::DeserializeSeed<'de>,
|
||||
{
|
||||
match self.value.take() {
|
||||
Some(value) => seed.deserialize(ContentDeserializer::new(value)),
|
||||
None => Err(de::Error::custom("value is missing")),
|
||||
}
|
||||
}
|
||||
|
||||
fn size_hint(&self) -> Option<usize> {
|
||||
size_hint::from_bounds(&self.iter)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'de, E> de::Deserializer<'de> for MapDeserializer<'de, E>
|
||||
where
|
||||
E: de::Error,
|
||||
{
|
||||
type Error = E;
|
||||
|
||||
#[inline]
|
||||
fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
|
||||
where
|
||||
V: de::Visitor<'de>,
|
||||
{
|
||||
visitor.visit_map(self)
|
||||
}
|
||||
|
||||
forward_to_deserialize_any! {
|
||||
bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
|
||||
bytes byte_buf option unit unit_struct newtype_struct seq tuple
|
||||
tuple_struct map struct enum identifier ignored_any
|
||||
}
|
||||
}
|
||||
|
||||
/// Not public API.
|
||||
pub struct ContentRefDeserializer<'a, 'de: 'a, E> {
|
||||
content: &'a Content<'de>,
|
||||
@@ -1820,9 +1682,9 @@ mod content {
|
||||
E: de::Error,
|
||||
{
|
||||
let seq = content.iter().map(ContentRefDeserializer::new);
|
||||
let mut seq_visitor = de::value::SeqDeserializer::new(seq);
|
||||
let value = try!(visitor.visit_seq(&mut seq_visitor));
|
||||
try!(seq_visitor.end());
|
||||
let mut seq_visitor = SeqDeserializer::new(seq);
|
||||
let value = tri!(visitor.visit_seq(&mut seq_visitor));
|
||||
tri!(seq_visitor.end());
|
||||
Ok(value)
|
||||
}
|
||||
|
||||
@@ -1840,9 +1702,9 @@ mod content {
|
||||
ContentRefDeserializer::new(v),
|
||||
)
|
||||
});
|
||||
let mut map_visitor = de::value::MapDeserializer::new(map);
|
||||
let value = try!(visitor.visit_map(&mut map_visitor));
|
||||
try!(map_visitor.end());
|
||||
let mut map_visitor = MapDeserializer::new(map);
|
||||
let value = tri!(visitor.visit_map(&mut map_visitor));
|
||||
tri!(map_visitor.end());
|
||||
Ok(value)
|
||||
}
|
||||
|
||||
@@ -2362,7 +2224,7 @@ mod content {
|
||||
if len == 0 {
|
||||
visitor.visit_unit()
|
||||
} else {
|
||||
let ret = try!(visitor.visit_seq(&mut self));
|
||||
let ret = tri!(visitor.visit_seq(&mut self));
|
||||
let remaining = self.iter.len();
|
||||
if remaining == 0 {
|
||||
Ok(ret)
|
||||
@@ -2541,7 +2403,7 @@ mod content {
|
||||
where
|
||||
M: MapAccess<'de>,
|
||||
{
|
||||
while try!(access.next_entry::<IgnoredAny, IgnoredAny>()).is_some() {}
|
||||
while tri!(access.next_entry::<IgnoredAny, IgnoredAny>()).is_some() {}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
// Used only by Serde doc tests. Not public API.
|
||||
|
||||
use lib::*;
|
||||
use crate::lib::*;
|
||||
|
||||
use ser;
|
||||
use crate::ser;
|
||||
|
||||
#[doc(hidden)]
|
||||
#[derive(Debug)]
|
||||
|
||||
+11
-11
@@ -8,25 +8,25 @@ pub mod size_hint;
|
||||
// FIXME: #[cfg(doctest)] once https://github.com/rust-lang/rust/issues/67295 is fixed.
|
||||
pub mod doc;
|
||||
|
||||
pub use lib::clone::Clone;
|
||||
pub use lib::convert::{From, Into};
|
||||
pub use lib::default::Default;
|
||||
pub use lib::fmt::{self, Formatter};
|
||||
pub use lib::marker::PhantomData;
|
||||
pub use lib::option::Option::{self, None, Some};
|
||||
pub use lib::ptr;
|
||||
pub use lib::result::Result::{self, Err, Ok};
|
||||
pub use crate::lib::clone::Clone;
|
||||
pub use crate::lib::convert::{From, Into};
|
||||
pub use crate::lib::default::Default;
|
||||
pub use crate::lib::fmt::{self, Formatter};
|
||||
pub use crate::lib::marker::PhantomData;
|
||||
pub use crate::lib::option::Option::{self, None, Some};
|
||||
pub use crate::lib::ptr;
|
||||
pub use crate::lib::result::Result::{self, Err, Ok};
|
||||
|
||||
pub use self::string::from_utf8_lossy;
|
||||
|
||||
#[cfg(any(feature = "alloc", feature = "std"))]
|
||||
pub use lib::{ToString, Vec};
|
||||
pub use crate::lib::{ToString, Vec};
|
||||
|
||||
#[cfg(not(no_core_try_from))]
|
||||
pub use lib::convert::TryFrom;
|
||||
pub use crate::lib::convert::TryFrom;
|
||||
|
||||
mod string {
|
||||
use lib::*;
|
||||
use crate::lib::*;
|
||||
|
||||
#[cfg(any(feature = "std", feature = "alloc"))]
|
||||
pub fn from_utf8_lossy(bytes: &[u8]) -> Cow<str> {
|
||||
|
||||
+113
-66
@@ -1,6 +1,6 @@
|
||||
use lib::*;
|
||||
use crate::lib::*;
|
||||
|
||||
use ser::{self, Impossible, Serialize, SerializeMap, SerializeStruct, Serializer};
|
||||
use crate::ser::{self, Impossible, Serialize, SerializeMap, SerializeStruct, Serializer};
|
||||
|
||||
#[cfg(any(feature = "std", feature = "alloc"))]
|
||||
use self::content::{
|
||||
@@ -182,14 +182,14 @@ where
|
||||
}
|
||||
|
||||
fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
|
||||
let mut map = try!(self.delegate.serialize_map(Some(1)));
|
||||
try!(map.serialize_entry(self.tag, self.variant_name));
|
||||
let mut map = tri!(self.delegate.serialize_map(Some(1)));
|
||||
tri!(map.serialize_entry(self.tag, self.variant_name));
|
||||
map.end()
|
||||
}
|
||||
|
||||
fn serialize_unit_struct(self, _: &'static str) -> Result<Self::Ok, Self::Error> {
|
||||
let mut map = try!(self.delegate.serialize_map(Some(1)));
|
||||
try!(map.serialize_entry(self.tag, self.variant_name));
|
||||
let mut map = tri!(self.delegate.serialize_map(Some(1)));
|
||||
tri!(map.serialize_entry(self.tag, self.variant_name));
|
||||
map.end()
|
||||
}
|
||||
|
||||
@@ -199,9 +199,9 @@ where
|
||||
_: u32,
|
||||
inner_variant: &'static str,
|
||||
) -> Result<Self::Ok, Self::Error> {
|
||||
let mut map = try!(self.delegate.serialize_map(Some(2)));
|
||||
try!(map.serialize_entry(self.tag, self.variant_name));
|
||||
try!(map.serialize_entry(inner_variant, &()));
|
||||
let mut map = tri!(self.delegate.serialize_map(Some(2)));
|
||||
tri!(map.serialize_entry(self.tag, self.variant_name));
|
||||
tri!(map.serialize_entry(inner_variant, &()));
|
||||
map.end()
|
||||
}
|
||||
|
||||
@@ -226,9 +226,9 @@ where
|
||||
where
|
||||
T: Serialize,
|
||||
{
|
||||
let mut map = try!(self.delegate.serialize_map(Some(2)));
|
||||
try!(map.serialize_entry(self.tag, self.variant_name));
|
||||
try!(map.serialize_entry(inner_variant, inner_value));
|
||||
let mut map = tri!(self.delegate.serialize_map(Some(2)));
|
||||
tri!(map.serialize_entry(self.tag, self.variant_name));
|
||||
tri!(map.serialize_entry(inner_variant, inner_value));
|
||||
map.end()
|
||||
}
|
||||
|
||||
@@ -269,9 +269,9 @@ where
|
||||
inner_variant: &'static str,
|
||||
len: usize,
|
||||
) -> Result<Self::SerializeTupleVariant, Self::Error> {
|
||||
let mut map = try!(self.delegate.serialize_map(Some(2)));
|
||||
try!(map.serialize_entry(self.tag, self.variant_name));
|
||||
try!(map.serialize_key(inner_variant));
|
||||
let mut map = tri!(self.delegate.serialize_map(Some(2)));
|
||||
tri!(map.serialize_entry(self.tag, self.variant_name));
|
||||
tri!(map.serialize_key(inner_variant));
|
||||
Ok(SerializeTupleVariantAsMapValue::new(
|
||||
map,
|
||||
inner_variant,
|
||||
@@ -280,8 +280,8 @@ where
|
||||
}
|
||||
|
||||
fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
|
||||
let mut map = try!(self.delegate.serialize_map(len.map(|len| len + 1)));
|
||||
try!(map.serialize_entry(self.tag, self.variant_name));
|
||||
let mut map = tri!(self.delegate.serialize_map(len.map(|len| len + 1)));
|
||||
tri!(map.serialize_entry(self.tag, self.variant_name));
|
||||
Ok(map)
|
||||
}
|
||||
|
||||
@@ -290,8 +290,8 @@ where
|
||||
name: &'static str,
|
||||
len: usize,
|
||||
) -> Result<Self::SerializeStruct, Self::Error> {
|
||||
let mut state = try!(self.delegate.serialize_struct(name, len + 1));
|
||||
try!(state.serialize_field(self.tag, self.variant_name));
|
||||
let mut state = tri!(self.delegate.serialize_struct(name, len + 1));
|
||||
tri!(state.serialize_field(self.tag, self.variant_name));
|
||||
Ok(state)
|
||||
}
|
||||
|
||||
@@ -316,9 +316,9 @@ where
|
||||
inner_variant: &'static str,
|
||||
len: usize,
|
||||
) -> Result<Self::SerializeStructVariant, Self::Error> {
|
||||
let mut map = try!(self.delegate.serialize_map(Some(2)));
|
||||
try!(map.serialize_entry(self.tag, self.variant_name));
|
||||
try!(map.serialize_key(inner_variant));
|
||||
let mut map = tri!(self.delegate.serialize_map(Some(2)));
|
||||
tri!(map.serialize_entry(self.tag, self.variant_name));
|
||||
tri!(map.serialize_key(inner_variant));
|
||||
Ok(SerializeStructVariantAsMapValue::new(
|
||||
map,
|
||||
inner_variant,
|
||||
@@ -337,9 +337,9 @@ where
|
||||
|
||||
#[cfg(any(feature = "std", feature = "alloc"))]
|
||||
mod content {
|
||||
use lib::*;
|
||||
use crate::lib::*;
|
||||
|
||||
use ser::{self, Serialize, Serializer};
|
||||
use crate::ser::{self, Serialize, Serializer};
|
||||
|
||||
pub struct SerializeTupleVariantAsMapValue<M> {
|
||||
map: M,
|
||||
@@ -368,13 +368,13 @@ mod content {
|
||||
where
|
||||
T: Serialize,
|
||||
{
|
||||
let value = try!(value.serialize(ContentSerializer::<M::Error>::new()));
|
||||
let value = tri!(value.serialize(ContentSerializer::<M::Error>::new()));
|
||||
self.fields.push(value);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn end(mut self) -> Result<M::Ok, M::Error> {
|
||||
try!(self
|
||||
tri!(self
|
||||
.map
|
||||
.serialize_value(&Content::TupleStruct(self.name, self.fields)));
|
||||
self.map.end()
|
||||
@@ -412,13 +412,13 @@ mod content {
|
||||
where
|
||||
T: Serialize,
|
||||
{
|
||||
let value = try!(value.serialize(ContentSerializer::<M::Error>::new()));
|
||||
let value = tri!(value.serialize(ContentSerializer::<M::Error>::new()));
|
||||
self.fields.push((key, value));
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn end(mut self) -> Result<M::Ok, M::Error> {
|
||||
try!(self
|
||||
tri!(self
|
||||
.map
|
||||
.serialize_value(&Content::Struct(self.name, self.fields)));
|
||||
self.map.end()
|
||||
@@ -499,50 +499,50 @@ mod content {
|
||||
}
|
||||
Content::Seq(ref elements) => elements.serialize(serializer),
|
||||
Content::Tuple(ref elements) => {
|
||||
use ser::SerializeTuple;
|
||||
let mut tuple = try!(serializer.serialize_tuple(elements.len()));
|
||||
use crate::ser::SerializeTuple;
|
||||
let mut tuple = tri!(serializer.serialize_tuple(elements.len()));
|
||||
for e in elements {
|
||||
try!(tuple.serialize_element(e));
|
||||
tri!(tuple.serialize_element(e));
|
||||
}
|
||||
tuple.end()
|
||||
}
|
||||
Content::TupleStruct(n, ref fields) => {
|
||||
use ser::SerializeTupleStruct;
|
||||
let mut ts = try!(serializer.serialize_tuple_struct(n, fields.len()));
|
||||
use crate::ser::SerializeTupleStruct;
|
||||
let mut ts = tri!(serializer.serialize_tuple_struct(n, fields.len()));
|
||||
for f in fields {
|
||||
try!(ts.serialize_field(f));
|
||||
tri!(ts.serialize_field(f));
|
||||
}
|
||||
ts.end()
|
||||
}
|
||||
Content::TupleVariant(n, i, v, ref fields) => {
|
||||
use ser::SerializeTupleVariant;
|
||||
let mut tv = try!(serializer.serialize_tuple_variant(n, i, v, fields.len()));
|
||||
use crate::ser::SerializeTupleVariant;
|
||||
let mut tv = tri!(serializer.serialize_tuple_variant(n, i, v, fields.len()));
|
||||
for f in fields {
|
||||
try!(tv.serialize_field(f));
|
||||
tri!(tv.serialize_field(f));
|
||||
}
|
||||
tv.end()
|
||||
}
|
||||
Content::Map(ref entries) => {
|
||||
use ser::SerializeMap;
|
||||
let mut map = try!(serializer.serialize_map(Some(entries.len())));
|
||||
use crate::ser::SerializeMap;
|
||||
let mut map = tri!(serializer.serialize_map(Some(entries.len())));
|
||||
for (k, v) in entries {
|
||||
try!(map.serialize_entry(k, v));
|
||||
tri!(map.serialize_entry(k, v));
|
||||
}
|
||||
map.end()
|
||||
}
|
||||
Content::Struct(n, ref fields) => {
|
||||
use ser::SerializeStruct;
|
||||
let mut s = try!(serializer.serialize_struct(n, fields.len()));
|
||||
use crate::ser::SerializeStruct;
|
||||
let mut s = tri!(serializer.serialize_struct(n, fields.len()));
|
||||
for &(k, ref v) in fields {
|
||||
try!(s.serialize_field(k, v));
|
||||
tri!(s.serialize_field(k, v));
|
||||
}
|
||||
s.end()
|
||||
}
|
||||
Content::StructVariant(n, i, v, ref fields) => {
|
||||
use ser::SerializeStructVariant;
|
||||
let mut sv = try!(serializer.serialize_struct_variant(n, i, v, fields.len()));
|
||||
use crate::ser::SerializeStructVariant;
|
||||
let mut sv = tri!(serializer.serialize_struct_variant(n, i, v, fields.len()));
|
||||
for &(k, ref v) in fields {
|
||||
try!(sv.serialize_field(k, v));
|
||||
tri!(sv.serialize_field(k, v));
|
||||
}
|
||||
sv.end()
|
||||
}
|
||||
@@ -639,7 +639,7 @@ mod content {
|
||||
where
|
||||
T: Serialize,
|
||||
{
|
||||
Ok(Content::Some(Box::new(try!(value.serialize(self)))))
|
||||
Ok(Content::Some(Box::new(tri!(value.serialize(self)))))
|
||||
}
|
||||
|
||||
fn serialize_unit(self) -> Result<Content, E> {
|
||||
@@ -669,7 +669,7 @@ mod content {
|
||||
{
|
||||
Ok(Content::NewtypeStruct(
|
||||
name,
|
||||
Box::new(try!(value.serialize(self))),
|
||||
Box::new(tri!(value.serialize(self))),
|
||||
))
|
||||
}
|
||||
|
||||
@@ -687,7 +687,7 @@ mod content {
|
||||
name,
|
||||
variant_index,
|
||||
variant,
|
||||
Box::new(try!(value.serialize(self))),
|
||||
Box::new(tri!(value.serialize(self))),
|
||||
))
|
||||
}
|
||||
|
||||
@@ -786,7 +786,7 @@ mod content {
|
||||
where
|
||||
T: Serialize,
|
||||
{
|
||||
let value = try!(value.serialize(ContentSerializer::<E>::new()));
|
||||
let value = tri!(value.serialize(ContentSerializer::<E>::new()));
|
||||
self.elements.push(value);
|
||||
Ok(())
|
||||
}
|
||||
@@ -812,7 +812,7 @@ mod content {
|
||||
where
|
||||
T: Serialize,
|
||||
{
|
||||
let value = try!(value.serialize(ContentSerializer::<E>::new()));
|
||||
let value = tri!(value.serialize(ContentSerializer::<E>::new()));
|
||||
self.elements.push(value);
|
||||
Ok(())
|
||||
}
|
||||
@@ -839,7 +839,7 @@ mod content {
|
||||
where
|
||||
T: Serialize,
|
||||
{
|
||||
let value = try!(value.serialize(ContentSerializer::<E>::new()));
|
||||
let value = tri!(value.serialize(ContentSerializer::<E>::new()));
|
||||
self.fields.push(value);
|
||||
Ok(())
|
||||
}
|
||||
@@ -868,7 +868,7 @@ mod content {
|
||||
where
|
||||
T: Serialize,
|
||||
{
|
||||
let value = try!(value.serialize(ContentSerializer::<E>::new()));
|
||||
let value = tri!(value.serialize(ContentSerializer::<E>::new()));
|
||||
self.fields.push(value);
|
||||
Ok(())
|
||||
}
|
||||
@@ -900,7 +900,7 @@ mod content {
|
||||
where
|
||||
T: Serialize,
|
||||
{
|
||||
let key = try!(key.serialize(ContentSerializer::<E>::new()));
|
||||
let key = tri!(key.serialize(ContentSerializer::<E>::new()));
|
||||
self.key = Some(key);
|
||||
Ok(())
|
||||
}
|
||||
@@ -913,7 +913,7 @@ mod content {
|
||||
.key
|
||||
.take()
|
||||
.expect("serialize_value called before serialize_key");
|
||||
let value = try!(value.serialize(ContentSerializer::<E>::new()));
|
||||
let value = tri!(value.serialize(ContentSerializer::<E>::new()));
|
||||
self.entries.push((key, value));
|
||||
Ok(())
|
||||
}
|
||||
@@ -927,8 +927,8 @@ mod content {
|
||||
K: Serialize,
|
||||
V: Serialize,
|
||||
{
|
||||
let key = try!(key.serialize(ContentSerializer::<E>::new()));
|
||||
let value = try!(value.serialize(ContentSerializer::<E>::new()));
|
||||
let key = tri!(key.serialize(ContentSerializer::<E>::new()));
|
||||
let value = tri!(value.serialize(ContentSerializer::<E>::new()));
|
||||
self.entries.push((key, value));
|
||||
Ok(())
|
||||
}
|
||||
@@ -951,7 +951,7 @@ mod content {
|
||||
where
|
||||
T: Serialize,
|
||||
{
|
||||
let value = try!(value.serialize(ContentSerializer::<E>::new()));
|
||||
let value = tri!(value.serialize(ContentSerializer::<E>::new()));
|
||||
self.fields.push((key, value));
|
||||
Ok(())
|
||||
}
|
||||
@@ -980,7 +980,7 @@ mod content {
|
||||
where
|
||||
T: Serialize,
|
||||
{
|
||||
let value = try!(value.serialize(ContentSerializer::<E>::new()));
|
||||
let value = tri!(value.serialize(ContentSerializer::<E>::new()));
|
||||
self.fields.push((key, value));
|
||||
Ok(())
|
||||
}
|
||||
@@ -1025,7 +1025,7 @@ where
|
||||
type SerializeTupleStruct = Impossible<Self::Ok, M::Error>;
|
||||
type SerializeMap = FlatMapSerializeMap<'a, M>;
|
||||
type SerializeStruct = FlatMapSerializeStruct<'a, M>;
|
||||
type SerializeTupleVariant = Impossible<Self::Ok, M::Error>;
|
||||
type SerializeTupleVariant = FlatMapSerializeTupleVariantAsMapValue<'a, M>;
|
||||
type SerializeStructVariant = FlatMapSerializeStructVariantAsMapValue<'a, M>;
|
||||
|
||||
fn serialize_bool(self, _: bool) -> Result<Self::Ok, Self::Error> {
|
||||
@@ -1133,7 +1133,7 @@ where
|
||||
where
|
||||
T: Serialize,
|
||||
{
|
||||
try!(self.0.serialize_key(variant));
|
||||
tri!(self.0.serialize_key(variant));
|
||||
self.0.serialize_value(value)
|
||||
}
|
||||
|
||||
@@ -1157,10 +1157,11 @@ where
|
||||
self,
|
||||
_: &'static str,
|
||||
_: u32,
|
||||
_: &'static str,
|
||||
variant: &'static str,
|
||||
_: usize,
|
||||
) -> Result<Self::SerializeTupleVariant, Self::Error> {
|
||||
Err(Self::bad_type(Unsupported::Enum))
|
||||
tri!(self.0.serialize_key(variant));
|
||||
Ok(FlatMapSerializeTupleVariantAsMapValue::new(self.0))
|
||||
}
|
||||
|
||||
fn serialize_map(self, _: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
|
||||
@@ -1182,7 +1183,7 @@ where
|
||||
inner_variant: &'static str,
|
||||
_: usize,
|
||||
) -> Result<Self::SerializeStructVariant, Self::Error> {
|
||||
try!(self.0.serialize_key(inner_variant));
|
||||
tri!(self.0.serialize_key(inner_variant));
|
||||
Ok(FlatMapSerializeStructVariantAsMapValue::new(
|
||||
self.0,
|
||||
inner_variant,
|
||||
@@ -1259,6 +1260,52 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#[cfg(any(feature = "std", feature = "alloc"))]
|
||||
pub struct FlatMapSerializeTupleVariantAsMapValue<'a, M: 'a> {
|
||||
map: &'a mut M,
|
||||
fields: Vec<Content>,
|
||||
}
|
||||
|
||||
#[cfg(any(feature = "std", feature = "alloc"))]
|
||||
impl<'a, M> FlatMapSerializeTupleVariantAsMapValue<'a, M>
|
||||
where
|
||||
M: SerializeMap + 'a,
|
||||
{
|
||||
fn new(map: &'a mut M) -> Self {
|
||||
FlatMapSerializeTupleVariantAsMapValue {
|
||||
map,
|
||||
fields: Vec::new(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(any(feature = "std", feature = "alloc"))]
|
||||
impl<'a, M> ser::SerializeTupleVariant for FlatMapSerializeTupleVariantAsMapValue<'a, M>
|
||||
where
|
||||
M: SerializeMap + 'a,
|
||||
{
|
||||
type Ok = ();
|
||||
type Error = M::Error;
|
||||
|
||||
fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
|
||||
where
|
||||
T: Serialize,
|
||||
{
|
||||
let value = tri!(value.serialize(ContentSerializer::<M::Error>::new()));
|
||||
self.fields.push(value);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn end(self) -> Result<(), Self::Error> {
|
||||
tri!(self.map.serialize_value(&Content::Seq(self.fields)));
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#[cfg(any(feature = "std", feature = "alloc"))]
|
||||
pub struct FlatMapSerializeStructVariantAsMapValue<'a, M: 'a> {
|
||||
map: &'a mut M,
|
||||
@@ -1296,13 +1343,13 @@ where
|
||||
where
|
||||
T: Serialize,
|
||||
{
|
||||
let value = try!(value.serialize(ContentSerializer::<M::Error>::new()));
|
||||
let value = tri!(value.serialize(ContentSerializer::<M::Error>::new()));
|
||||
self.fields.push((key, value));
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn end(self) -> Result<(), Self::Error> {
|
||||
try!(self
|
||||
tri!(self
|
||||
.map
|
||||
.serialize_value(&Content::Struct(self.name, self.fields)));
|
||||
Ok(())
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use lib::*;
|
||||
use crate::lib::*;
|
||||
|
||||
pub fn from_bounds<I>(iter: &I) -> Option<usize>
|
||||
where
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
use lib::*;
|
||||
use ser::{Error, Impossible, Serialize, Serializer};
|
||||
use crate::lib::*;
|
||||
use crate::ser::{Error, Impossible, Serialize, Serializer};
|
||||
|
||||
impl Error for fmt::Error {
|
||||
fn custom<T: Display>(_msg: T) -> Self {
|
||||
|
||||
+23
-28
@@ -1,6 +1,6 @@
|
||||
use lib::*;
|
||||
use crate::lib::*;
|
||||
|
||||
use ser::{Error, Serialize, SerializeTuple, Serializer};
|
||||
use crate::ser::{Error, Serialize, SerializeTuple, Serializer};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -133,7 +133,7 @@ impl<T> Serialize for [T; 0] {
|
||||
where
|
||||
S: Serializer,
|
||||
{
|
||||
try!(serializer.serialize_tuple(0)).end()
|
||||
tri!(serializer.serialize_tuple(0)).end()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -149,9 +149,9 @@ macro_rules! array_impls {
|
||||
where
|
||||
S: Serializer,
|
||||
{
|
||||
let mut seq = try!(serializer.serialize_tuple($len));
|
||||
let mut seq = tri!(serializer.serialize_tuple($len));
|
||||
for e in self {
|
||||
try!(seq.serialize_element(e));
|
||||
tri!(seq.serialize_element(e));
|
||||
}
|
||||
seq.end()
|
||||
}
|
||||
@@ -248,9 +248,9 @@ where
|
||||
S: Serializer,
|
||||
{
|
||||
use super::SerializeStruct;
|
||||
let mut state = try!(serializer.serialize_struct("Range", 2));
|
||||
try!(state.serialize_field("start", &self.start));
|
||||
try!(state.serialize_field("end", &self.end));
|
||||
let mut state = tri!(serializer.serialize_struct("Range", 2));
|
||||
tri!(state.serialize_field("start", &self.start));
|
||||
tri!(state.serialize_field("end", &self.end));
|
||||
state.end()
|
||||
}
|
||||
}
|
||||
@@ -266,15 +266,14 @@ where
|
||||
S: Serializer,
|
||||
{
|
||||
use super::SerializeStruct;
|
||||
let mut state = try!(serializer.serialize_struct("RangeFrom", 1));
|
||||
try!(state.serialize_field("start", &self.start));
|
||||
let mut state = tri!(serializer.serialize_struct("RangeFrom", 1));
|
||||
tri!(state.serialize_field("start", &self.start));
|
||||
state.end()
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#[cfg(not(no_range_inclusive))]
|
||||
impl<Idx> Serialize for RangeInclusive<Idx>
|
||||
where
|
||||
Idx: Serialize,
|
||||
@@ -284,9 +283,9 @@ where
|
||||
S: Serializer,
|
||||
{
|
||||
use super::SerializeStruct;
|
||||
let mut state = try!(serializer.serialize_struct("RangeInclusive", 2));
|
||||
try!(state.serialize_field("start", &self.start()));
|
||||
try!(state.serialize_field("end", &self.end()));
|
||||
let mut state = tri!(serializer.serialize_struct("RangeInclusive", 2));
|
||||
tri!(state.serialize_field("start", &self.start()));
|
||||
tri!(state.serialize_field("end", &self.end()));
|
||||
state.end()
|
||||
}
|
||||
}
|
||||
@@ -302,15 +301,14 @@ where
|
||||
S: Serializer,
|
||||
{
|
||||
use super::SerializeStruct;
|
||||
let mut state = try!(serializer.serialize_struct("RangeTo", 1));
|
||||
try!(state.serialize_field("end", &self.end));
|
||||
let mut state = tri!(serializer.serialize_struct("RangeTo", 1));
|
||||
tri!(state.serialize_field("end", &self.end));
|
||||
state.end()
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#[cfg(any(not(no_ops_bound), all(feature = "std", not(no_collections_bound))))]
|
||||
impl<T> Serialize for Bound<T>
|
||||
where
|
||||
T: Serialize,
|
||||
@@ -367,9 +365,9 @@ macro_rules! tuple_impls {
|
||||
where
|
||||
S: Serializer,
|
||||
{
|
||||
let mut tuple = try!(serializer.serialize_tuple($len));
|
||||
let mut tuple = tri!(serializer.serialize_tuple($len));
|
||||
$(
|
||||
try!(tuple.serialize_element(&self.$n));
|
||||
tri!(tuple.serialize_element(&self.$n));
|
||||
)+
|
||||
tuple.end()
|
||||
}
|
||||
@@ -538,7 +536,6 @@ where
|
||||
macro_rules! nonzero_integers {
|
||||
($($T:ident,)+) => {
|
||||
$(
|
||||
#[cfg(not(no_num_nonzero))]
|
||||
impl Serialize for num::$T {
|
||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
@@ -662,16 +659,15 @@ where
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#[cfg(any(feature = "std", not(no_core_duration)))]
|
||||
impl Serialize for Duration {
|
||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
S: Serializer,
|
||||
{
|
||||
use super::SerializeStruct;
|
||||
let mut state = try!(serializer.serialize_struct("Duration", 2));
|
||||
try!(state.serialize_field("secs", &self.as_secs()));
|
||||
try!(state.serialize_field("nanos", &self.subsec_nanos()));
|
||||
let mut state = tri!(serializer.serialize_struct("Duration", 2));
|
||||
tri!(state.serialize_field("secs", &self.as_secs()));
|
||||
tri!(state.serialize_field("nanos", &self.subsec_nanos()));
|
||||
state.end()
|
||||
}
|
||||
}
|
||||
@@ -689,9 +685,9 @@ impl Serialize for SystemTime {
|
||||
Ok(duration_since_epoch) => duration_since_epoch,
|
||||
Err(_) => return Err(S::Error::custom("SystemTime must be later than UNIX_EPOCH")),
|
||||
};
|
||||
let mut state = try!(serializer.serialize_struct("SystemTime", 2));
|
||||
try!(state.serialize_field("secs_since_epoch", &duration_since_epoch.as_secs()));
|
||||
try!(state.serialize_field("nanos_since_epoch", &duration_since_epoch.subsec_nanos()));
|
||||
let mut state = tri!(serializer.serialize_struct("SystemTime", 2));
|
||||
tri!(state.serialize_field("secs_since_epoch", &duration_since_epoch.as_secs()));
|
||||
tri!(state.serialize_field("nanos_since_epoch", &duration_since_epoch.subsec_nanos()));
|
||||
state.end()
|
||||
}
|
||||
}
|
||||
@@ -963,7 +959,6 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(no_core_reverse))]
|
||||
impl<T> Serialize for Reverse<T>
|
||||
where
|
||||
T: Serialize,
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
//! This module contains `Impossible` serializer and its implementations.
|
||||
|
||||
use lib::*;
|
||||
use crate::lib::*;
|
||||
|
||||
use ser::{
|
||||
use crate::ser::{
|
||||
self, Serialize, SerializeMap, SerializeSeq, SerializeStruct, SerializeStructVariant,
|
||||
SerializeTuple, SerializeTupleStruct, SerializeTupleVariant,
|
||||
};
|
||||
|
||||
+12
-38
@@ -107,7 +107,7 @@
|
||||
//! [derive section of the manual]: https://serde.rs/derive.html
|
||||
//! [data formats]: https://serde.rs/#data-formats
|
||||
|
||||
use lib::*;
|
||||
use crate::lib::*;
|
||||
|
||||
mod fmt;
|
||||
mod impls;
|
||||
@@ -115,15 +115,15 @@ mod impossible;
|
||||
|
||||
pub use self::impossible::Impossible;
|
||||
|
||||
#[cfg(not(any(feature = "std", feature = "unstable")))]
|
||||
#[doc(no_inline)]
|
||||
pub use crate::std_error::Error as StdError;
|
||||
#[cfg(all(feature = "unstable", not(feature = "std")))]
|
||||
#[doc(inline)]
|
||||
#[doc(no_inline)]
|
||||
pub use core::error::Error as StdError;
|
||||
#[cfg(feature = "std")]
|
||||
#[doc(no_inline)]
|
||||
pub use std::error::Error as StdError;
|
||||
#[cfg(not(any(feature = "std", feature = "unstable")))]
|
||||
#[doc(no_inline)]
|
||||
pub use std_error::Error as StdError;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -1279,22 +1279,9 @@ pub trait Serializer: Sized {
|
||||
I: IntoIterator,
|
||||
<I as IntoIterator>::Item: Serialize,
|
||||
{
|
||||
let iter = iter.into_iter();
|
||||
let mut serializer = try!(self.serialize_seq(iterator_len_hint(&iter)));
|
||||
|
||||
#[cfg(not(no_iterator_try_fold))]
|
||||
{
|
||||
let mut iter = iter;
|
||||
try!(iter.try_for_each(|item| serializer.serialize_element(&item)));
|
||||
}
|
||||
|
||||
#[cfg(no_iterator_try_fold)]
|
||||
{
|
||||
for item in iter {
|
||||
try!(serializer.serialize_element(&item));
|
||||
}
|
||||
}
|
||||
|
||||
let mut iter = iter.into_iter();
|
||||
let mut serializer = tri!(self.serialize_seq(iterator_len_hint(&iter)));
|
||||
tri!(iter.try_for_each(|item| serializer.serialize_element(&item)));
|
||||
serializer.end()
|
||||
}
|
||||
|
||||
@@ -1330,22 +1317,9 @@ pub trait Serializer: Sized {
|
||||
V: Serialize,
|
||||
I: IntoIterator<Item = (K, V)>,
|
||||
{
|
||||
let iter = iter.into_iter();
|
||||
let mut serializer = try!(self.serialize_map(iterator_len_hint(&iter)));
|
||||
|
||||
#[cfg(not(no_iterator_try_fold))]
|
||||
{
|
||||
let mut iter = iter;
|
||||
try!(iter.try_for_each(|(key, value)| serializer.serialize_entry(&key, &value)));
|
||||
}
|
||||
|
||||
#[cfg(no_iterator_try_fold)]
|
||||
{
|
||||
for (key, value) in iter {
|
||||
try!(serializer.serialize_entry(&key, &value));
|
||||
}
|
||||
}
|
||||
|
||||
let mut iter = iter.into_iter();
|
||||
let mut serializer = tri!(self.serialize_map(iterator_len_hint(&iter)));
|
||||
tri!(iter.try_for_each(|(key, value)| serializer.serialize_entry(&key, &value)));
|
||||
serializer.end()
|
||||
}
|
||||
|
||||
@@ -1839,7 +1813,7 @@ pub trait SerializeMap {
|
||||
K: Serialize,
|
||||
V: Serialize,
|
||||
{
|
||||
try!(self.serialize_key(key));
|
||||
tri!(self.serialize_key(key));
|
||||
self.serialize_value(value)
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use lib::{Debug, Display};
|
||||
use crate::lib::{Debug, Display};
|
||||
|
||||
/// Either a re-export of std::error::Error or a new identical trait, depending
|
||||
/// on whether Serde's "std" feature is enabled.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "serde_derive"
|
||||
version = "1.0.176" # remember to update html_root_url
|
||||
version = "1.0.180" # remember to update html_root_url
|
||||
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"]
|
||||
categories = ["no-std", "no-std::no-alloc"]
|
||||
description = "Macros 1.1 implementation of #[derive(Serialize, Deserialize)]"
|
||||
@@ -23,7 +23,7 @@ proc-macro = true
|
||||
[dependencies]
|
||||
proc-macro2 = "1.0"
|
||||
quote = "1.0"
|
||||
syn = "2.0.25"
|
||||
syn = "2.0.28"
|
||||
|
||||
[dev-dependencies]
|
||||
serde = { version = "1", path = "../serde" }
|
||||
|
||||
+41
-41
@@ -710,14 +710,14 @@ fn deserialize_seq(
|
||||
let span = field.original.span();
|
||||
let func =
|
||||
quote_spanned!(span=> _serde::de::SeqAccess::next_element::<#field_ty>);
|
||||
quote!(try!(#func(&mut __seq)))
|
||||
quote!(#func(&mut __seq)?)
|
||||
}
|
||||
Some(path) => {
|
||||
let (wrapper, wrapper_ty) = wrap_deserialize_field_with(params, field.ty, path);
|
||||
quote!({
|
||||
#wrapper
|
||||
_serde::__private::Option::map(
|
||||
try!(_serde::de::SeqAccess::next_element::<#wrapper_ty>(&mut __seq)),
|
||||
_serde::de::SeqAccess::next_element::<#wrapper_ty>(&mut __seq)?,
|
||||
|__wrap| __wrap.value)
|
||||
})
|
||||
}
|
||||
@@ -824,8 +824,8 @@ fn deserialize_seq_in_place(
|
||||
let write = match field.attrs.deserialize_with() {
|
||||
None => {
|
||||
quote! {
|
||||
if let _serde::__private::None = try!(_serde::de::SeqAccess::next_element_seed(&mut __seq,
|
||||
_serde::__private::de::InPlaceSeed(&mut self.place.#member)))
|
||||
if let _serde::__private::None = _serde::de::SeqAccess::next_element_seed(&mut __seq,
|
||||
_serde::__private::de::InPlaceSeed(&mut self.place.#member))?
|
||||
{
|
||||
#value_if_none
|
||||
}
|
||||
@@ -835,7 +835,7 @@ fn deserialize_seq_in_place(
|
||||
let (wrapper, wrapper_ty) = wrap_deserialize_field_with(params, field.ty, path);
|
||||
quote!({
|
||||
#wrapper
|
||||
match try!(_serde::de::SeqAccess::next_element::<#wrapper_ty>(&mut __seq)) {
|
||||
match _serde::de::SeqAccess::next_element::<#wrapper_ty>(&mut __seq)? {
|
||||
_serde::__private::Some(__wrap) => {
|
||||
self.place.#member = __wrap.value;
|
||||
}
|
||||
@@ -887,12 +887,12 @@ fn deserialize_newtype_struct(
|
||||
let span = field.original.span();
|
||||
let func = quote_spanned!(span=> <#field_ty as _serde::Deserialize>::deserialize);
|
||||
quote! {
|
||||
try!(#func(__e))
|
||||
#func(__e)?
|
||||
}
|
||||
}
|
||||
Some(path) => {
|
||||
quote! {
|
||||
try!(#path(__e))
|
||||
#path(__e)?
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -1364,7 +1364,7 @@ fn deserialize_externally_tagged_enum(
|
||||
}
|
||||
} else {
|
||||
quote! {
|
||||
match try!(_serde::de::EnumAccess::variant(__data)) {
|
||||
match _serde::de::EnumAccess::variant(__data)? {
|
||||
#(#variant_arms)*
|
||||
}
|
||||
}
|
||||
@@ -1444,9 +1444,9 @@ fn deserialize_internally_tagged_enum(
|
||||
|
||||
#variants_stmt
|
||||
|
||||
let (__tag, __content) = try!(_serde::Deserializer::deserialize_any(
|
||||
let (__tag, __content) = _serde::Deserializer::deserialize_any(
|
||||
__deserializer,
|
||||
_serde::__private::de::TaggedContentVisitor::<__Field>::new(#tag, #expecting)));
|
||||
_serde::__private::de::TaggedContentVisitor::<__Field>::new(#tag, #expecting))?;
|
||||
let __deserializer = _serde::__private::de::ContentDeserializer::<__D::Error>::new(__content);
|
||||
|
||||
match __tag {
|
||||
@@ -1554,7 +1554,7 @@ fn deserialize_adjacently_tagged_enum(
|
||||
|
||||
// Advance the map by one key, returning early in case of error.
|
||||
let next_key = quote! {
|
||||
try!(_serde::de::MapAccess::next_key_seed(&mut __map, #tag_or_content))
|
||||
_serde::de::MapAccess::next_key_seed(&mut __map, #tag_or_content)?
|
||||
};
|
||||
|
||||
// When allowing unknown fields, we want to transparently step through keys
|
||||
@@ -1567,7 +1567,7 @@ fn deserialize_adjacently_tagged_enum(
|
||||
while let _serde::__private::Some(__k) = #next_key {
|
||||
match __k {
|
||||
_serde::__private::de::TagContentOtherField::Other => {
|
||||
let _ = try!(_serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map));
|
||||
let _ = _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
|
||||
continue;
|
||||
},
|
||||
_serde::__private::de::TagContentOtherField::Tag => {
|
||||
@@ -1602,14 +1602,14 @@ fn deserialize_adjacently_tagged_enum(
|
||||
|
||||
let finish_content_then_tag = if variant_arms.is_empty() {
|
||||
quote! {
|
||||
match try!(_serde::de::MapAccess::next_value::<__Field>(&mut __map)) {}
|
||||
match _serde::de::MapAccess::next_value::<__Field>(&mut __map)? {}
|
||||
}
|
||||
} else {
|
||||
quote! {
|
||||
let __ret = try!(match try!(_serde::de::MapAccess::next_value(&mut __map)) {
|
||||
let __ret = match _serde::de::MapAccess::next_value(&mut __map)? {
|
||||
// Deserialize the buffered content now that we know the variant.
|
||||
#(#variant_arms)*
|
||||
});
|
||||
}?;
|
||||
// Visit remaining keys, looking for duplicates.
|
||||
#visit_remaining_keys
|
||||
}
|
||||
@@ -1662,7 +1662,7 @@ fn deserialize_adjacently_tagged_enum(
|
||||
// First key is the tag.
|
||||
_serde::__private::Some(_serde::__private::de::TagOrContentField::Tag) => {
|
||||
// Parse the tag.
|
||||
let __field = try!(_serde::de::MapAccess::next_value(&mut __map));
|
||||
let __field = _serde::de::MapAccess::next_value(&mut __map)?;
|
||||
// Visit the second key.
|
||||
match #next_relevant_key {
|
||||
// Second key is a duplicate of the tag.
|
||||
@@ -1671,12 +1671,12 @@ fn deserialize_adjacently_tagged_enum(
|
||||
}
|
||||
// Second key is the content.
|
||||
_serde::__private::Some(_serde::__private::de::TagOrContentField::Content) => {
|
||||
let __ret = try!(_serde::de::MapAccess::next_value_seed(&mut __map,
|
||||
let __ret = _serde::de::MapAccess::next_value_seed(&mut __map,
|
||||
__Seed {
|
||||
field: __field,
|
||||
marker: _serde::__private::PhantomData,
|
||||
lifetime: _serde::__private::PhantomData,
|
||||
}));
|
||||
})?;
|
||||
// Visit remaining keys, looking for duplicates.
|
||||
#visit_remaining_keys
|
||||
}
|
||||
@@ -1687,7 +1687,7 @@ fn deserialize_adjacently_tagged_enum(
|
||||
// First key is the content.
|
||||
_serde::__private::Some(_serde::__private::de::TagOrContentField::Content) => {
|
||||
// Buffer up the content.
|
||||
let __content = try!(_serde::de::MapAccess::next_value::<_serde::__private::de::Content>(&mut __map));
|
||||
let __content = _serde::de::MapAccess::next_value::<_serde::__private::de::Content>(&mut __map)?;
|
||||
// Visit the second key.
|
||||
match #next_relevant_key {
|
||||
// Second key is the tag.
|
||||
@@ -1717,17 +1717,17 @@ fn deserialize_adjacently_tagged_enum(
|
||||
__A: _serde::de::SeqAccess<#delife>,
|
||||
{
|
||||
// Visit the first element - the tag.
|
||||
match try!(_serde::de::SeqAccess::next_element(&mut __seq)) {
|
||||
match _serde::de::SeqAccess::next_element(&mut __seq)? {
|
||||
_serde::__private::Some(__field) => {
|
||||
// Visit the second element - the content.
|
||||
match try!(_serde::de::SeqAccess::next_element_seed(
|
||||
match _serde::de::SeqAccess::next_element_seed(
|
||||
&mut __seq,
|
||||
__Seed {
|
||||
field: __field,
|
||||
marker: _serde::__private::PhantomData,
|
||||
lifetime: _serde::__private::PhantomData,
|
||||
},
|
||||
)) {
|
||||
)? {
|
||||
_serde::__private::Some(__ret) => _serde::__private::Ok(__ret),
|
||||
// There is no second element.
|
||||
_serde::__private::None => {
|
||||
@@ -1797,7 +1797,7 @@ fn deserialize_untagged_enum_after(
|
||||
let fallthrough_msg = cattrs.expecting().unwrap_or(&fallthrough_msg);
|
||||
|
||||
quote_block! {
|
||||
let __content = try!(<_serde::__private::de::Content as _serde::Deserialize>::deserialize(__deserializer));
|
||||
let __content = <_serde::__private::de::Content as _serde::Deserialize>::deserialize(__deserializer)?;
|
||||
let __deserializer = _serde::__private::de::ContentRefDeserializer::<__D::Error>::new(&__content);
|
||||
|
||||
#(
|
||||
@@ -1830,7 +1830,7 @@ fn deserialize_externally_tagged_variant(
|
||||
Style::Unit => {
|
||||
let this_value = ¶ms.this_value;
|
||||
quote_block! {
|
||||
try!(_serde::de::VariantAccess::unit_variant(__variant));
|
||||
_serde::de::VariantAccess::unit_variant(__variant)?;
|
||||
_serde::__private::Ok(#this_value::#variant_ident)
|
||||
}
|
||||
}
|
||||
@@ -1879,7 +1879,7 @@ fn deserialize_internally_tagged_variant(
|
||||
quote!((#default))
|
||||
});
|
||||
quote_block! {
|
||||
try!(_serde::Deserializer::deserialize_any(#deserializer, _serde::__private::de::InternallyTaggedUnitVisitor::new(#type_name, #variant_name)));
|
||||
_serde::Deserializer::deserialize_any(#deserializer, _serde::__private::de::InternallyTaggedUnitVisitor::new(#type_name, #variant_name))?;
|
||||
_serde::__private::Ok(#this_value::#variant_ident #default)
|
||||
}
|
||||
}
|
||||
@@ -1965,7 +1965,7 @@ fn deserialize_externally_tagged_newtype_variant(
|
||||
if field.attrs.skip_deserializing() {
|
||||
let default = Expr(expr_is_missing(field, cattrs));
|
||||
return quote_block! {
|
||||
try!(_serde::de::VariantAccess::unit_variant(__variant));
|
||||
_serde::de::VariantAccess::unit_variant(__variant)?;
|
||||
_serde::__private::Ok(#this_value::#variant_ident(#default))
|
||||
};
|
||||
}
|
||||
@@ -2540,7 +2540,7 @@ fn deserialize_map(
|
||||
let func =
|
||||
quote_spanned!(span=> _serde::de::MapAccess::next_value::<#field_ty>);
|
||||
quote! {
|
||||
try!(#func(&mut __map))
|
||||
#func(&mut __map)?
|
||||
}
|
||||
}
|
||||
Some(path) => {
|
||||
@@ -2572,14 +2572,14 @@ fn deserialize_map(
|
||||
__Field::__other(__name) => {
|
||||
__collect.push(_serde::__private::Some((
|
||||
__name,
|
||||
try!(_serde::de::MapAccess::next_value(&mut __map)))));
|
||||
_serde::de::MapAccess::next_value(&mut __map)?)));
|
||||
}
|
||||
})
|
||||
} else if cattrs.deny_unknown_fields() {
|
||||
None
|
||||
} else {
|
||||
Some(quote! {
|
||||
_ => { let _ = try!(_serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)); }
|
||||
_ => { let _ = _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?; }
|
||||
})
|
||||
};
|
||||
|
||||
@@ -2587,14 +2587,14 @@ fn deserialize_map(
|
||||
let match_keys = if cattrs.deny_unknown_fields() && all_skipped {
|
||||
quote! {
|
||||
// FIXME: Once feature(exhaustive_patterns) is stable:
|
||||
// let _serde::__private::None::<__Field> = try!(_serde::de::MapAccess::next_key(&mut __map));
|
||||
// let _serde::__private::None::<__Field> = _serde::de::MapAccess::next_key(&mut __map)?;
|
||||
_serde::__private::Option::map(
|
||||
try!(_serde::de::MapAccess::next_key::<__Field>(&mut __map)),
|
||||
_serde::de::MapAccess::next_key::<__Field>(&mut __map)?,
|
||||
|__impossible| match __impossible {});
|
||||
}
|
||||
} else {
|
||||
quote! {
|
||||
while let _serde::__private::Some(__key) = try!(_serde::de::MapAccess::next_key::<__Field>(&mut __map)) {
|
||||
while let _serde::__private::Some(__key) = _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
|
||||
match __key {
|
||||
#(#value_arms)*
|
||||
#ignored_arm
|
||||
@@ -2630,10 +2630,10 @@ fn deserialize_map(
|
||||
Some(path) => quote!(#path),
|
||||
};
|
||||
quote! {
|
||||
let #name: #field_ty = try!(#func(
|
||||
let #name: #field_ty = #func(
|
||||
_serde::__private::de::FlatMapDeserializer(
|
||||
&mut __collect,
|
||||
_serde::__private::PhantomData)));
|
||||
_serde::__private::PhantomData))?;
|
||||
}
|
||||
});
|
||||
|
||||
@@ -2780,7 +2780,7 @@ fn deserialize_map_in_place(
|
||||
let visit = match field.attrs.deserialize_with() {
|
||||
None => {
|
||||
quote! {
|
||||
try!(_serde::de::MapAccess::next_value_seed(&mut __map, _serde::__private::de::InPlaceSeed(&mut self.place.#member)))
|
||||
_serde::de::MapAccess::next_value_seed(&mut __map, _serde::__private::de::InPlaceSeed(&mut self.place.#member))?
|
||||
}
|
||||
}
|
||||
Some(path) => {
|
||||
@@ -2812,7 +2812,7 @@ fn deserialize_map_in_place(
|
||||
None
|
||||
} else {
|
||||
Some(quote! {
|
||||
_ => { let _ = try!(_serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)); }
|
||||
_ => { let _ = _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?; }
|
||||
})
|
||||
};
|
||||
|
||||
@@ -2821,14 +2821,14 @@ fn deserialize_map_in_place(
|
||||
let match_keys = if cattrs.deny_unknown_fields() && all_skipped {
|
||||
quote! {
|
||||
// FIXME: Once feature(exhaustive_patterns) is stable:
|
||||
// let _serde::__private::None::<__Field> = try!(_serde::de::MapAccess::next_key(&mut __map));
|
||||
// let _serde::__private::None::<__Field> = _serde::de::MapAccess::next_key(&mut __map)?;
|
||||
_serde::__private::Option::map(
|
||||
try!(_serde::de::MapAccess::next_key::<__Field>(&mut __map)),
|
||||
_serde::de::MapAccess::next_key::<__Field>(&mut __map)?,
|
||||
|__impossible| match __impossible {});
|
||||
}
|
||||
} else {
|
||||
quote! {
|
||||
while let _serde::__private::Some(__key) = try!(_serde::de::MapAccess::next_key::<__Field>(&mut __map)) {
|
||||
while let _serde::__private::Some(__key) = _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
|
||||
match __key {
|
||||
#(#value_arms_from)*
|
||||
#ignored_arm
|
||||
@@ -2925,7 +2925,7 @@ fn wrap_deserialize_with(
|
||||
__D: _serde::Deserializer<#delife>,
|
||||
{
|
||||
_serde::__private::Ok(__DeserializeWith {
|
||||
value: try!(#deserialize_with(__deserializer)),
|
||||
value: #deserialize_with(__deserializer)?,
|
||||
phantom: _serde::__private::PhantomData,
|
||||
lifetime: _serde::__private::PhantomData,
|
||||
})
|
||||
@@ -3035,7 +3035,7 @@ fn expr_is_missing(field: &Field, cattrs: &attr::Container) -> Fragment {
|
||||
let span = field.original.span();
|
||||
let func = quote_spanned!(span=> _serde::__private::de::missing_field);
|
||||
quote_expr! {
|
||||
try!(#func(#name))
|
||||
#func(#name)?
|
||||
}
|
||||
}
|
||||
Some(_) => {
|
||||
|
||||
@@ -1,10 +1,7 @@
|
||||
use crate::try;
|
||||
use proc_macro2::TokenStream;
|
||||
use quote::quote;
|
||||
|
||||
pub fn wrap_in_const(serde_path: Option<&syn::Path>, code: TokenStream) -> TokenStream {
|
||||
let try_replacement = try::replacement();
|
||||
|
||||
let use_serde = match serde_path {
|
||||
Some(path) => quote! {
|
||||
use #path as _serde;
|
||||
@@ -20,7 +17,6 @@ pub fn wrap_in_const(serde_path: Option<&syn::Path>, code: TokenStream) -> Token
|
||||
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications)]
|
||||
const _: () = {
|
||||
#use_serde
|
||||
#try_replacement
|
||||
#code
|
||||
};
|
||||
}
|
||||
|
||||
@@ -86,9 +86,12 @@ impl<'a> Container<'a> {
|
||||
if field.attrs.flatten() {
|
||||
has_flatten = true;
|
||||
}
|
||||
field
|
||||
.attrs
|
||||
.rename_by_rules(variant.attrs.rename_all_rules());
|
||||
field.attrs.rename_by_rules(
|
||||
variant
|
||||
.attrs
|
||||
.rename_all_rules()
|
||||
.or(attrs.rename_all_fields_rules()),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -119,7 +122,7 @@ impl<'a> Container<'a> {
|
||||
}
|
||||
|
||||
impl<'a> Data<'a> {
|
||||
pub fn all_fields(&'a self) -> Box<Iterator<Item = &'a Field<'a>> + 'a> {
|
||||
pub fn all_fields(&'a self) -> Box<dyn Iterator<Item = &'a Field<'a>> + 'a> {
|
||||
match self {
|
||||
Data::Enum(variants) => {
|
||||
Box::new(variants.iter().flat_map(|variant| variant.fields.iter()))
|
||||
|
||||
@@ -192,11 +192,23 @@ impl Name {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct RenameAllRules {
|
||||
serialize: RenameRule,
|
||||
deserialize: RenameRule,
|
||||
}
|
||||
|
||||
impl RenameAllRules {
|
||||
/// Returns a new `RenameAllRules` with the individual rules of `self` and
|
||||
/// `other_rules` joined by `RenameRules::or`.
|
||||
pub fn or(self, other_rules: Self) -> Self {
|
||||
Self {
|
||||
serialize: self.serialize.or(other_rules.serialize),
|
||||
deserialize: self.deserialize.or(other_rules.deserialize),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Represents struct or enum attribute information.
|
||||
pub struct Container {
|
||||
name: Name,
|
||||
@@ -204,6 +216,7 @@ pub struct Container {
|
||||
deny_unknown_fields: bool,
|
||||
default: Default,
|
||||
rename_all_rules: RenameAllRules,
|
||||
rename_all_fields_rules: RenameAllRules,
|
||||
ser_bound: Option<Vec<syn::WherePredicate>>,
|
||||
de_bound: Option<Vec<syn::WherePredicate>>,
|
||||
tag: TagType,
|
||||
@@ -287,6 +300,8 @@ impl Container {
|
||||
let mut default = Attr::none(cx, DEFAULT);
|
||||
let mut rename_all_ser_rule = Attr::none(cx, RENAME_ALL);
|
||||
let mut rename_all_de_rule = Attr::none(cx, RENAME_ALL);
|
||||
let mut rename_all_fields_ser_rule = Attr::none(cx, RENAME_ALL_FIELDS);
|
||||
let mut rename_all_fields_de_rule = Attr::none(cx, RENAME_ALL_FIELDS);
|
||||
let mut ser_bound = Attr::none(cx, BOUND);
|
||||
let mut de_bound = Attr::none(cx, BOUND);
|
||||
let mut untagged = BoolAttr::none(cx, UNTAGGED);
|
||||
@@ -340,6 +355,44 @@ impl Container {
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if meta.path == RENAME_ALL_FIELDS {
|
||||
// #[serde(rename_all_fields = "foo")]
|
||||
// #[serde(rename_all_fields(serialize = "foo", deserialize = "bar"))]
|
||||
let one_name = meta.input.peek(Token![=]);
|
||||
let (ser, de) = get_renames(cx, RENAME_ALL_FIELDS, &meta)?;
|
||||
|
||||
match item.data {
|
||||
syn::Data::Enum(_) => {
|
||||
if let Some(ser) = ser {
|
||||
match RenameRule::from_str(&ser.value()) {
|
||||
Ok(rename_rule) => {
|
||||
rename_all_fields_ser_rule.set(&meta.path, rename_rule);
|
||||
}
|
||||
Err(err) => cx.error_spanned_by(ser, err),
|
||||
}
|
||||
}
|
||||
if let Some(de) = de {
|
||||
match RenameRule::from_str(&de.value()) {
|
||||
Ok(rename_rule) => {
|
||||
rename_all_fields_de_rule.set(&meta.path, rename_rule);
|
||||
}
|
||||
Err(err) => {
|
||||
if !one_name {
|
||||
cx.error_spanned_by(de, err);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
syn::Data::Struct(_) => {
|
||||
let msg = "#[serde(rename_all_fields)] can only be used on enums";
|
||||
cx.syn_error(meta.error(msg));
|
||||
}
|
||||
syn::Data::Union(_) => {
|
||||
let msg = "#[serde(rename_all_fields)] can only be used on enums";
|
||||
cx.syn_error(meta.error(msg));
|
||||
}
|
||||
}
|
||||
} else if meta.path == TRANSPARENT {
|
||||
// #[serde(transparent)]
|
||||
transparent.set_true(meta.path);
|
||||
@@ -357,16 +410,16 @@ impl Container {
|
||||
}
|
||||
syn::Fields::Unnamed(_) | syn::Fields::Unit => {
|
||||
let msg = "#[serde(default = \"...\")] can only be used on structs with named fields";
|
||||
cx.error_spanned_by(fields, msg);
|
||||
cx.syn_error(meta.error(msg));
|
||||
}
|
||||
},
|
||||
syn::Data::Enum(syn::DataEnum { enum_token, .. }) => {
|
||||
syn::Data::Enum(_) => {
|
||||
let msg = "#[serde(default = \"...\")] can only be used on structs with named fields";
|
||||
cx.error_spanned_by(enum_token, msg);
|
||||
cx.syn_error(meta.error(msg));
|
||||
}
|
||||
syn::Data::Union(syn::DataUnion { union_token, .. }) => {
|
||||
syn::Data::Union(_) => {
|
||||
let msg = "#[serde(default = \"...\")] can only be used on structs with named fields";
|
||||
cx.error_spanned_by(union_token, msg);
|
||||
cx.syn_error(meta.error(msg));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -382,13 +435,13 @@ impl Container {
|
||||
cx.error_spanned_by(fields, msg);
|
||||
}
|
||||
},
|
||||
syn::Data::Enum(syn::DataEnum { enum_token, .. }) => {
|
||||
syn::Data::Enum(_) => {
|
||||
let msg = "#[serde(default)] can only be used on structs with named fields";
|
||||
cx.error_spanned_by(enum_token, msg);
|
||||
cx.syn_error(meta.error(msg));
|
||||
}
|
||||
syn::Data::Union(syn::DataUnion { union_token, .. }) => {
|
||||
syn::Data::Union(_) => {
|
||||
let msg = "#[serde(default)] can only be used on structs with named fields";
|
||||
cx.error_spanned_by(union_token, msg);
|
||||
cx.syn_error(meta.error(msg));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -404,13 +457,13 @@ impl Container {
|
||||
syn::Data::Enum(_) => {
|
||||
untagged.set_true(&meta.path);
|
||||
}
|
||||
syn::Data::Struct(syn::DataStruct { struct_token, .. }) => {
|
||||
syn::Data::Struct(_) => {
|
||||
let msg = "#[serde(untagged)] can only be used on enums";
|
||||
cx.error_spanned_by(struct_token, msg);
|
||||
cx.syn_error(meta.error(msg));
|
||||
}
|
||||
syn::Data::Union(syn::DataUnion { union_token, .. }) => {
|
||||
syn::Data::Union(_) => {
|
||||
let msg = "#[serde(untagged)] can only be used on enums";
|
||||
cx.error_spanned_by(union_token, msg);
|
||||
cx.syn_error(meta.error(msg));
|
||||
}
|
||||
}
|
||||
} else if meta.path == TAG {
|
||||
@@ -426,12 +479,12 @@ impl Container {
|
||||
}
|
||||
syn::Fields::Unnamed(_) | syn::Fields::Unit => {
|
||||
let msg = "#[serde(tag = \"...\")] can only be used on enums and structs with named fields";
|
||||
cx.error_spanned_by(fields, msg);
|
||||
cx.syn_error(meta.error(msg));
|
||||
}
|
||||
},
|
||||
syn::Data::Union(syn::DataUnion { union_token, .. }) => {
|
||||
syn::Data::Union(_) => {
|
||||
let msg = "#[serde(tag = \"...\")] can only be used on enums and structs with named fields";
|
||||
cx.error_spanned_by(union_token, msg);
|
||||
cx.syn_error(meta.error(msg));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -442,13 +495,13 @@ impl Container {
|
||||
syn::Data::Enum(_) => {
|
||||
content.set(&meta.path, s.value());
|
||||
}
|
||||
syn::Data::Struct(syn::DataStruct { struct_token, .. }) => {
|
||||
syn::Data::Struct(_) => {
|
||||
let msg = "#[serde(content = \"...\")] can only be used on enums";
|
||||
cx.error_spanned_by(struct_token, msg);
|
||||
cx.syn_error(meta.error(msg));
|
||||
}
|
||||
syn::Data::Union(syn::DataUnion { union_token, .. }) => {
|
||||
syn::Data::Union(_) => {
|
||||
let msg = "#[serde(content = \"...\")] can only be used on enums";
|
||||
cx.error_spanned_by(union_token, msg);
|
||||
cx.syn_error(meta.error(msg));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -527,6 +580,10 @@ impl Container {
|
||||
serialize: rename_all_ser_rule.get().unwrap_or(RenameRule::None),
|
||||
deserialize: rename_all_de_rule.get().unwrap_or(RenameRule::None),
|
||||
},
|
||||
rename_all_fields_rules: RenameAllRules {
|
||||
serialize: rename_all_fields_ser_rule.get().unwrap_or(RenameRule::None),
|
||||
deserialize: rename_all_fields_de_rule.get().unwrap_or(RenameRule::None),
|
||||
},
|
||||
ser_bound: ser_bound.get(),
|
||||
de_bound: de_bound.get(),
|
||||
tag: decide_tag(cx, item, untagged, internal_tag, content),
|
||||
@@ -546,8 +603,12 @@ impl Container {
|
||||
&self.name
|
||||
}
|
||||
|
||||
pub fn rename_all_rules(&self) -> &RenameAllRules {
|
||||
&self.rename_all_rules
|
||||
pub fn rename_all_rules(&self) -> RenameAllRules {
|
||||
self.rename_all_rules
|
||||
}
|
||||
|
||||
pub fn rename_all_fields_rules(&self) -> RenameAllRules {
|
||||
self.rename_all_fields_rules
|
||||
}
|
||||
|
||||
pub fn transparent(&self) -> bool {
|
||||
@@ -920,7 +981,7 @@ impl Variant {
|
||||
self.name.deserialize_aliases()
|
||||
}
|
||||
|
||||
pub fn rename_by_rules(&mut self, rules: &RenameAllRules) {
|
||||
pub fn rename_by_rules(&mut self, rules: RenameAllRules) {
|
||||
if !self.name.serialize_renamed {
|
||||
self.name.serialize = rules.serialize.apply_to_variant(&self.name.serialize);
|
||||
}
|
||||
@@ -929,8 +990,8 @@ impl Variant {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn rename_all_rules(&self) -> &RenameAllRules {
|
||||
&self.rename_all_rules
|
||||
pub fn rename_all_rules(&self) -> RenameAllRules {
|
||||
self.rename_all_rules
|
||||
}
|
||||
|
||||
pub fn ser_bound(&self) -> Option<&[syn::WherePredicate]> {
|
||||
@@ -1259,7 +1320,7 @@ impl Field {
|
||||
self.name.deserialize_aliases()
|
||||
}
|
||||
|
||||
pub fn rename_by_rules(&mut self, rules: &RenameAllRules) {
|
||||
pub fn rename_by_rules(&mut self, rules: RenameAllRules) {
|
||||
if !self.name.serialize_renamed {
|
||||
self.name.serialize = rules.serialize.apply_to_field(&self.name.serialize);
|
||||
}
|
||||
|
||||
@@ -54,8 +54,8 @@ impl RenameRule {
|
||||
}
|
||||
|
||||
/// Apply a renaming rule to an enum variant, returning the version expected in the source.
|
||||
pub fn apply_to_variant(&self, variant: &str) -> String {
|
||||
match *self {
|
||||
pub fn apply_to_variant(self, variant: &str) -> String {
|
||||
match self {
|
||||
None | PascalCase => variant.to_owned(),
|
||||
LowerCase => variant.to_ascii_lowercase(),
|
||||
UpperCase => variant.to_ascii_uppercase(),
|
||||
@@ -79,8 +79,8 @@ impl RenameRule {
|
||||
}
|
||||
|
||||
/// Apply a renaming rule to a struct field, returning the version expected in the source.
|
||||
pub fn apply_to_field(&self, field: &str) -> String {
|
||||
match *self {
|
||||
pub fn apply_to_field(self, field: &str) -> String {
|
||||
match self {
|
||||
None | LowerCase | SnakeCase => field.to_owned(),
|
||||
UpperCase => field.to_ascii_uppercase(),
|
||||
PascalCase => {
|
||||
@@ -107,6 +107,14 @@ impl RenameRule {
|
||||
ScreamingKebabCase => ScreamingSnakeCase.apply_to_field(field).replace('_', "-"),
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns the `RenameRule` if it is not `None`, `rule_b` otherwise.
|
||||
pub fn or(self, rule_b: Self) -> Self {
|
||||
match self {
|
||||
None => rule_b,
|
||||
_ => self,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub struct ParseError<'a> {
|
||||
|
||||
@@ -23,6 +23,7 @@ pub const OTHER: Symbol = Symbol("other");
|
||||
pub const REMOTE: Symbol = Symbol("remote");
|
||||
pub const RENAME: Symbol = Symbol("rename");
|
||||
pub const RENAME_ALL: Symbol = Symbol("rename_all");
|
||||
pub const RENAME_ALL_FIELDS: Symbol = Symbol("rename_all_fields");
|
||||
pub const REPR: Symbol = Symbol("repr");
|
||||
pub const SERDE: Symbol = Symbol("serde");
|
||||
pub const SERIALIZE: Symbol = Symbol("serialize");
|
||||
|
||||
@@ -13,8 +13,7 @@
|
||||
//!
|
||||
//! [https://serde.rs/derive.html]: https://serde.rs/derive.html
|
||||
|
||||
#![doc(html_root_url = "https://docs.rs/serde_derive/1.0.176")]
|
||||
#![allow(unknown_lints, bare_trait_objects)]
|
||||
#![doc(html_root_url = "https://docs.rs/serde_derive/1.0.180")]
|
||||
// Ignored clippy lints
|
||||
#![allow(
|
||||
// clippy false positive: https://github.com/rust-lang/rust-clippy/issues/7054
|
||||
@@ -91,7 +90,6 @@ mod dummy;
|
||||
mod pretend;
|
||||
mod ser;
|
||||
mod this;
|
||||
mod try;
|
||||
|
||||
#[cfg(precompiled)]
|
||||
macro_rules! parse_macro_input {
|
||||
|
||||
+49
-49
@@ -282,7 +282,7 @@ fn serialize_tuple_struct(
|
||||
.fold(quote!(0), |sum, expr| quote!(#sum + #expr));
|
||||
|
||||
quote_block! {
|
||||
let #let_mut __serde_state = try!(_serde::Serializer::serialize_tuple_struct(__serializer, #type_name, #len));
|
||||
let #let_mut __serde_state = _serde::Serializer::serialize_tuple_struct(__serializer, #type_name, #len)?;
|
||||
#(#serialize_stmts)*
|
||||
_serde::ser::SerializeTupleStruct::end(__serde_state)
|
||||
}
|
||||
@@ -304,7 +304,7 @@ fn serialize_struct_tag_field(cattrs: &attr::Container, struct_trait: &StructTra
|
||||
let type_name = cattrs.name().serialize_name();
|
||||
let func = struct_trait.serialize_field(Span::call_site());
|
||||
quote! {
|
||||
try!(#func(&mut __serde_state, #tag, #type_name));
|
||||
#func(&mut __serde_state, #tag, #type_name)?;
|
||||
}
|
||||
}
|
||||
_ => quote! {},
|
||||
@@ -345,7 +345,7 @@ fn serialize_struct_as_struct(
|
||||
);
|
||||
|
||||
quote_block! {
|
||||
let #let_mut __serde_state = try!(_serde::Serializer::serialize_struct(__serializer, #type_name, #len));
|
||||
let #let_mut __serde_state = _serde::Serializer::serialize_struct(__serializer, #type_name, #len)?;
|
||||
#tag_field
|
||||
#(#serialize_fields)*
|
||||
_serde::ser::SerializeStruct::end(__serde_state)
|
||||
@@ -389,7 +389,7 @@ fn serialize_struct_as_map(
|
||||
};
|
||||
|
||||
quote_block! {
|
||||
let #let_mut __serde_state = try!(_serde::Serializer::serialize_map(__serializer, #len));
|
||||
let #let_mut __serde_state = _serde::Serializer::serialize_map(__serializer, #len)?;
|
||||
#tag_field
|
||||
#(#serialize_fields)*
|
||||
_serde::ser::SerializeMap::end(__serde_state)
|
||||
@@ -593,10 +593,10 @@ fn serialize_internally_tagged_variant(
|
||||
match effective_style(variant) {
|
||||
Style::Unit => {
|
||||
quote_block! {
|
||||
let mut __struct = try!(_serde::Serializer::serialize_struct(
|
||||
__serializer, #type_name, 1));
|
||||
try!(_serde::ser::SerializeStruct::serialize_field(
|
||||
&mut __struct, #tag, #variant_name));
|
||||
let mut __struct = _serde::Serializer::serialize_struct(
|
||||
__serializer, #type_name, 1)?;
|
||||
_serde::ser::SerializeStruct::serialize_field(
|
||||
&mut __struct, #tag, #variant_name)?;
|
||||
_serde::ser::SerializeStruct::end(__struct)
|
||||
}
|
||||
}
|
||||
@@ -650,10 +650,10 @@ fn serialize_adjacently_tagged_variant(
|
||||
match effective_style(variant) {
|
||||
Style::Unit => {
|
||||
return quote_block! {
|
||||
let mut __struct = try!(_serde::Serializer::serialize_struct(
|
||||
__serializer, #type_name, 1));
|
||||
try!(_serde::ser::SerializeStruct::serialize_field(
|
||||
&mut __struct, #tag, #variant_name));
|
||||
let mut __struct = _serde::Serializer::serialize_struct(
|
||||
__serializer, #type_name, 1)?;
|
||||
_serde::ser::SerializeStruct::serialize_field(
|
||||
&mut __struct, #tag, #variant_name)?;
|
||||
_serde::ser::SerializeStruct::end(__struct)
|
||||
};
|
||||
}
|
||||
@@ -667,12 +667,12 @@ fn serialize_adjacently_tagged_variant(
|
||||
let span = field.original.span();
|
||||
let func = quote_spanned!(span=> _serde::ser::SerializeStruct::serialize_field);
|
||||
return quote_block! {
|
||||
let mut __struct = try!(_serde::Serializer::serialize_struct(
|
||||
__serializer, #type_name, 2));
|
||||
try!(_serde::ser::SerializeStruct::serialize_field(
|
||||
&mut __struct, #tag, #variant_name));
|
||||
try!(#func(
|
||||
&mut __struct, #content, #field_expr));
|
||||
let mut __struct = _serde::Serializer::serialize_struct(
|
||||
__serializer, #type_name, 2)?;
|
||||
_serde::ser::SerializeStruct::serialize_field(
|
||||
&mut __struct, #tag, #variant_name)?;
|
||||
#func(
|
||||
&mut __struct, #content, #field_expr)?;
|
||||
_serde::ser::SerializeStruct::end(__struct)
|
||||
};
|
||||
}
|
||||
@@ -732,15 +732,15 @@ fn serialize_adjacently_tagged_variant(
|
||||
}
|
||||
}
|
||||
|
||||
let mut __struct = try!(_serde::Serializer::serialize_struct(
|
||||
__serializer, #type_name, 2));
|
||||
try!(_serde::ser::SerializeStruct::serialize_field(
|
||||
&mut __struct, #tag, #variant_name));
|
||||
try!(_serde::ser::SerializeStruct::serialize_field(
|
||||
let mut __struct = _serde::Serializer::serialize_struct(
|
||||
__serializer, #type_name, 2)?;
|
||||
_serde::ser::SerializeStruct::serialize_field(
|
||||
&mut __struct, #tag, #variant_name)?;
|
||||
_serde::ser::SerializeStruct::serialize_field(
|
||||
&mut __struct, #content, &__AdjacentlyTagged {
|
||||
data: (#(#fields_ident,)*),
|
||||
phantom: _serde::__private::PhantomData::<#this_type #ty_generics>,
|
||||
}));
|
||||
})?;
|
||||
_serde::ser::SerializeStruct::end(__struct)
|
||||
}
|
||||
}
|
||||
@@ -830,21 +830,21 @@ fn serialize_tuple_variant(
|
||||
variant_name,
|
||||
} => {
|
||||
quote_block! {
|
||||
let #let_mut __serde_state = try!(_serde::Serializer::serialize_tuple_variant(
|
||||
let #let_mut __serde_state = _serde::Serializer::serialize_tuple_variant(
|
||||
__serializer,
|
||||
#type_name,
|
||||
#variant_index,
|
||||
#variant_name,
|
||||
#len));
|
||||
#len)?;
|
||||
#(#serialize_stmts)*
|
||||
_serde::ser::SerializeTupleVariant::end(__serde_state)
|
||||
}
|
||||
}
|
||||
TupleVariant::Untagged => {
|
||||
quote_block! {
|
||||
let #let_mut __serde_state = try!(_serde::Serializer::serialize_tuple(
|
||||
let #let_mut __serde_state = _serde::Serializer::serialize_tuple(
|
||||
__serializer,
|
||||
#len));
|
||||
#len)?;
|
||||
#(#serialize_stmts)*
|
||||
_serde::ser::SerializeTuple::end(__serde_state)
|
||||
}
|
||||
@@ -907,40 +907,40 @@ fn serialize_struct_variant(
|
||||
variant_name,
|
||||
} => {
|
||||
quote_block! {
|
||||
let #let_mut __serde_state = try!(_serde::Serializer::serialize_struct_variant(
|
||||
let #let_mut __serde_state = _serde::Serializer::serialize_struct_variant(
|
||||
__serializer,
|
||||
#name,
|
||||
#variant_index,
|
||||
#variant_name,
|
||||
#len,
|
||||
));
|
||||
)?;
|
||||
#(#serialize_fields)*
|
||||
_serde::ser::SerializeStructVariant::end(__serde_state)
|
||||
}
|
||||
}
|
||||
StructVariant::InternallyTagged { tag, variant_name } => {
|
||||
quote_block! {
|
||||
let mut __serde_state = try!(_serde::Serializer::serialize_struct(
|
||||
let mut __serde_state = _serde::Serializer::serialize_struct(
|
||||
__serializer,
|
||||
#name,
|
||||
#len + 1,
|
||||
));
|
||||
try!(_serde::ser::SerializeStruct::serialize_field(
|
||||
)?;
|
||||
_serde::ser::SerializeStruct::serialize_field(
|
||||
&mut __serde_state,
|
||||
#tag,
|
||||
#variant_name,
|
||||
));
|
||||
)?;
|
||||
#(#serialize_fields)*
|
||||
_serde::ser::SerializeStruct::end(__serde_state)
|
||||
}
|
||||
}
|
||||
StructVariant::Untagged => {
|
||||
quote_block! {
|
||||
let #let_mut __serde_state = try!(_serde::Serializer::serialize_struct(
|
||||
let #let_mut __serde_state = _serde::Serializer::serialize_struct(
|
||||
__serializer,
|
||||
#name,
|
||||
#len,
|
||||
));
|
||||
)?;
|
||||
#(#serialize_fields)*
|
||||
_serde::ser::SerializeStruct::end(__serde_state)
|
||||
}
|
||||
@@ -990,9 +990,9 @@ fn serialize_struct_variant_with_flatten(
|
||||
__S: _serde::Serializer,
|
||||
{
|
||||
let (#(#members,)*) = self.data;
|
||||
let #let_mut __serde_state = try!(_serde::Serializer::serialize_map(
|
||||
let #let_mut __serde_state = _serde::Serializer::serialize_map(
|
||||
__serializer,
|
||||
_serde::__private::None));
|
||||
_serde::__private::None)?;
|
||||
#(#serialize_fields)*
|
||||
_serde::ser::SerializeMap::end(__serde_state)
|
||||
}
|
||||
@@ -1011,23 +1011,23 @@ fn serialize_struct_variant_with_flatten(
|
||||
}
|
||||
StructVariant::InternallyTagged { tag, variant_name } => {
|
||||
quote_block! {
|
||||
let #let_mut __serde_state = try!(_serde::Serializer::serialize_map(
|
||||
let #let_mut __serde_state = _serde::Serializer::serialize_map(
|
||||
__serializer,
|
||||
_serde::__private::None));
|
||||
try!(_serde::ser::SerializeMap::serialize_entry(
|
||||
_serde::__private::None)?;
|
||||
_serde::ser::SerializeMap::serialize_entry(
|
||||
&mut __serde_state,
|
||||
#tag,
|
||||
#variant_name,
|
||||
));
|
||||
)?;
|
||||
#(#serialize_fields)*
|
||||
_serde::ser::SerializeMap::end(__serde_state)
|
||||
}
|
||||
}
|
||||
StructVariant::Untagged => {
|
||||
quote_block! {
|
||||
let #let_mut __serde_state = try!(_serde::Serializer::serialize_map(
|
||||
let #let_mut __serde_state = _serde::Serializer::serialize_map(
|
||||
__serializer,
|
||||
_serde::__private::None));
|
||||
_serde::__private::None)?;
|
||||
#(#serialize_fields)*
|
||||
_serde::ser::SerializeMap::end(__serde_state)
|
||||
}
|
||||
@@ -1072,7 +1072,7 @@ fn serialize_tuple_struct_visitor(
|
||||
let span = field.original.span();
|
||||
let func = tuple_trait.serialize_element(span);
|
||||
let ser = quote! {
|
||||
try!(#func(&mut __serde_state, #field_expr));
|
||||
#func(&mut __serde_state, #field_expr)?;
|
||||
};
|
||||
|
||||
match skip {
|
||||
@@ -1116,12 +1116,12 @@ fn serialize_struct_visitor(
|
||||
let ser = if field.attrs.flatten() {
|
||||
let func = quote_spanned!(span=> _serde::Serialize::serialize);
|
||||
quote! {
|
||||
try!(#func(&#field_expr, _serde::__private::ser::FlatMapSerializer(&mut __serde_state)));
|
||||
#func(&#field_expr, _serde::__private::ser::FlatMapSerializer(&mut __serde_state))?;
|
||||
}
|
||||
} else {
|
||||
let func = struct_trait.serialize_field(span);
|
||||
quote! {
|
||||
try!(#func(&mut __serde_state, #key_expr, #field_expr));
|
||||
#func(&mut __serde_state, #key_expr, #field_expr)?;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1133,7 +1133,7 @@ fn serialize_struct_visitor(
|
||||
if !#skip {
|
||||
#ser
|
||||
} else {
|
||||
try!(#skip_func(&mut __serde_state, #key_expr));
|
||||
#skip_func(&mut __serde_state, #key_expr)?;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -1233,7 +1233,7 @@ fn wrap_serialize_with(
|
||||
|
||||
// Serialization of an empty struct results in code like:
|
||||
//
|
||||
// let mut __serde_state = try!(serializer.serialize_struct("S", 0));
|
||||
// let mut __serde_state = serializer.serialize_struct("S", 0)?;
|
||||
// _serde::ser::SerializeStruct::end(__serde_state)
|
||||
//
|
||||
// where we want to omit the `mut` to avoid a warning.
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
use proc_macro2::{Punct, Spacing, TokenStream};
|
||||
use quote::quote;
|
||||
|
||||
// None of our generated code requires the `From::from` error conversion
|
||||
// performed by the standard library's `try!` macro. With this simplified macro
|
||||
// we see a significant improvement in type checking and borrow checking time of
|
||||
// the generated code and a slight improvement in binary size.
|
||||
pub fn replacement() -> TokenStream {
|
||||
// Cannot pass `$expr` to `quote!` prior to Rust 1.17.0 so interpolate it.
|
||||
let dollar = Punct::new('$', Spacing::Alone);
|
||||
|
||||
quote! {
|
||||
#[allow(unused_macros)]
|
||||
macro_rules! try {
|
||||
(#dollar __expr:expr) => {
|
||||
match #dollar __expr {
|
||||
_serde::__private::Ok(__val) => __val,
|
||||
_serde::__private::Err(__err) => {
|
||||
return _serde::__private::Err(__err);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -17,7 +17,7 @@ path = "lib.rs"
|
||||
[dependencies]
|
||||
proc-macro2 = "1.0"
|
||||
quote = "1.0"
|
||||
syn = { version = "2.0.25", default-features = false, features = ["clone-impls", "derive", "parsing", "printing"] }
|
||||
syn = { version = "2.0.28", default-features = false, features = ["clone-impls", "derive", "parsing", "printing"] }
|
||||
|
||||
[package.metadata.docs.rs]
|
||||
targets = ["x86_64-unknown-linux-gnu"]
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#![doc(html_root_url = "https://docs.rs/serde_derive_internals/0.28.0")]
|
||||
#![allow(unknown_lints, bare_trait_objects)]
|
||||
// Ignored clippy lints
|
||||
#![allow(
|
||||
clippy::cognitive_complexity,
|
||||
@@ -30,6 +29,7 @@
|
||||
clippy::missing_errors_doc,
|
||||
clippy::module_name_repetitions,
|
||||
clippy::must_use_candidate,
|
||||
clippy::return_self_not_must_use,
|
||||
clippy::similar_names,
|
||||
clippy::single_match_else,
|
||||
clippy::struct_excessive_bools,
|
||||
|
||||
@@ -114,42 +114,6 @@ struct CollectOther {
|
||||
extra: HashMap<String, u32>,
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||
struct FlattenStructEnumWrapper {
|
||||
#[serde(flatten)]
|
||||
data: FlattenStructEnum,
|
||||
#[serde(flatten)]
|
||||
extra: HashMap<String, String>,
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||
#[serde(rename_all = "snake_case")]
|
||||
enum FlattenStructEnum {
|
||||
InsertInteger { index: u32, value: u32 },
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||
struct FlattenStructTagContentEnumWrapper {
|
||||
outer: u32,
|
||||
#[serde(flatten)]
|
||||
data: FlattenStructTagContentEnumNewtype,
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||
struct FlattenStructTagContentEnumNewtype(pub FlattenStructTagContentEnum);
|
||||
|
||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||
#[serde(rename_all = "snake_case", tag = "type", content = "value")]
|
||||
enum FlattenStructTagContentEnum {
|
||||
InsertInteger { index: u32, value: u32 },
|
||||
NewtypeVariant(FlattenStructTagContentEnumNewtypeVariant),
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||
struct FlattenStructTagContentEnumNewtypeVariant {
|
||||
value: u32,
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_default_struct() {
|
||||
assert_de_tokens(
|
||||
@@ -1643,149 +1607,6 @@ fn test_collect_other() {
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_flatten_struct_enum() {
|
||||
let mut extra = HashMap::new();
|
||||
extra.insert("extra_key".into(), "extra value".into());
|
||||
let change_request = FlattenStructEnumWrapper {
|
||||
data: FlattenStructEnum::InsertInteger {
|
||||
index: 0,
|
||||
value: 42,
|
||||
},
|
||||
extra,
|
||||
};
|
||||
assert_de_tokens(
|
||||
&change_request,
|
||||
&[
|
||||
Token::Map { len: None },
|
||||
Token::Str("insert_integer"),
|
||||
Token::Map { len: None },
|
||||
Token::Str("index"),
|
||||
Token::U32(0),
|
||||
Token::Str("value"),
|
||||
Token::U32(42),
|
||||
Token::MapEnd,
|
||||
Token::Str("extra_key"),
|
||||
Token::Str("extra value"),
|
||||
Token::MapEnd,
|
||||
],
|
||||
);
|
||||
assert_ser_tokens(
|
||||
&change_request,
|
||||
&[
|
||||
Token::Map { len: None },
|
||||
Token::Str("insert_integer"),
|
||||
Token::Struct {
|
||||
len: 2,
|
||||
name: "insert_integer",
|
||||
},
|
||||
Token::Str("index"),
|
||||
Token::U32(0),
|
||||
Token::Str("value"),
|
||||
Token::U32(42),
|
||||
Token::StructEnd,
|
||||
Token::Str("extra_key"),
|
||||
Token::Str("extra value"),
|
||||
Token::MapEnd,
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_flatten_struct_tag_content_enum() {
|
||||
let change_request = FlattenStructTagContentEnumWrapper {
|
||||
outer: 42,
|
||||
data: FlattenStructTagContentEnumNewtype(FlattenStructTagContentEnum::InsertInteger {
|
||||
index: 0,
|
||||
value: 42,
|
||||
}),
|
||||
};
|
||||
assert_de_tokens(
|
||||
&change_request,
|
||||
&[
|
||||
Token::Map { len: None },
|
||||
Token::Str("outer"),
|
||||
Token::U32(42),
|
||||
Token::Str("type"),
|
||||
Token::Str("insert_integer"),
|
||||
Token::Str("value"),
|
||||
Token::Map { len: None },
|
||||
Token::Str("index"),
|
||||
Token::U32(0),
|
||||
Token::Str("value"),
|
||||
Token::U32(42),
|
||||
Token::MapEnd,
|
||||
Token::MapEnd,
|
||||
],
|
||||
);
|
||||
assert_ser_tokens(
|
||||
&change_request,
|
||||
&[
|
||||
Token::Map { len: None },
|
||||
Token::Str("outer"),
|
||||
Token::U32(42),
|
||||
Token::Str("type"),
|
||||
Token::Str("insert_integer"),
|
||||
Token::Str("value"),
|
||||
Token::Struct {
|
||||
len: 2,
|
||||
name: "insert_integer",
|
||||
},
|
||||
Token::Str("index"),
|
||||
Token::U32(0),
|
||||
Token::Str("value"),
|
||||
Token::U32(42),
|
||||
Token::StructEnd,
|
||||
Token::MapEnd,
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_flatten_struct_tag_content_enum_newtype() {
|
||||
let change_request = FlattenStructTagContentEnumWrapper {
|
||||
outer: 42,
|
||||
data: FlattenStructTagContentEnumNewtype(FlattenStructTagContentEnum::NewtypeVariant(
|
||||
FlattenStructTagContentEnumNewtypeVariant { value: 23 },
|
||||
)),
|
||||
};
|
||||
assert_de_tokens(
|
||||
&change_request,
|
||||
&[
|
||||
Token::Map { len: None },
|
||||
Token::Str("outer"),
|
||||
Token::U32(42),
|
||||
Token::Str("type"),
|
||||
Token::Str("newtype_variant"),
|
||||
Token::Str("value"),
|
||||
Token::Map { len: None },
|
||||
Token::Str("value"),
|
||||
Token::U32(23),
|
||||
Token::MapEnd,
|
||||
Token::MapEnd,
|
||||
],
|
||||
);
|
||||
assert_ser_tokens(
|
||||
&change_request,
|
||||
&[
|
||||
Token::Map { len: None },
|
||||
Token::Str("outer"),
|
||||
Token::U32(42),
|
||||
Token::Str("type"),
|
||||
Token::Str("newtype_variant"),
|
||||
Token::Str("value"),
|
||||
Token::Struct {
|
||||
len: 1,
|
||||
name: "FlattenStructTagContentEnumNewtypeVariant",
|
||||
},
|
||||
Token::Str("value"),
|
||||
Token::U32(23),
|
||||
Token::StructEnd,
|
||||
Token::MapEnd,
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_unknown_field_in_flatten() {
|
||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||
@@ -2142,86 +1963,6 @@ fn test_lifetime_propagation_for_flatten() {
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_flatten_enum_newtype() {
|
||||
#[derive(Serialize, Deserialize, PartialEq, Debug)]
|
||||
struct S {
|
||||
#[serde(flatten)]
|
||||
flat: E,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, PartialEq, Debug)]
|
||||
enum E {
|
||||
Q(HashMap<String, String>),
|
||||
}
|
||||
|
||||
let e = E::Q({
|
||||
let mut map = HashMap::new();
|
||||
map.insert("k".to_owned(), "v".to_owned());
|
||||
map
|
||||
});
|
||||
let s = S { flat: e };
|
||||
|
||||
assert_tokens(
|
||||
&s,
|
||||
&[
|
||||
Token::Map { len: None },
|
||||
Token::Str("Q"),
|
||||
Token::Map { len: Some(1) },
|
||||
Token::Str("k"),
|
||||
Token::Str("v"),
|
||||
Token::MapEnd,
|
||||
Token::MapEnd,
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_flatten_internally_tagged() {
|
||||
#[derive(Serialize, Deserialize, PartialEq, Debug)]
|
||||
struct S {
|
||||
#[serde(flatten)]
|
||||
x: X,
|
||||
#[serde(flatten)]
|
||||
y: Y,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, PartialEq, Debug)]
|
||||
#[serde(tag = "typeX")]
|
||||
enum X {
|
||||
A { a: i32 },
|
||||
B { b: i32 },
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, PartialEq, Debug)]
|
||||
#[serde(tag = "typeY")]
|
||||
enum Y {
|
||||
C { c: i32 },
|
||||
D { d: i32 },
|
||||
}
|
||||
|
||||
let s = S {
|
||||
x: X::B { b: 1 },
|
||||
y: Y::D { d: 2 },
|
||||
};
|
||||
|
||||
assert_tokens(
|
||||
&s,
|
||||
&[
|
||||
Token::Map { len: None },
|
||||
Token::Str("typeX"),
|
||||
Token::Str("B"),
|
||||
Token::Str("b"),
|
||||
Token::I32(1),
|
||||
Token::Str("typeY"),
|
||||
Token::Str("D"),
|
||||
Token::Str("d"),
|
||||
Token::I32(2),
|
||||
Token::MapEnd,
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_externally_tagged_enum_containing_flatten() {
|
||||
#[derive(Serialize, Deserialize, PartialEq, Debug)]
|
||||
@@ -2266,24 +2007,26 @@ fn test_internally_tagged_enum_with_skipped_conflict() {
|
||||
#[serde(tag = "t")]
|
||||
enum Data {
|
||||
A,
|
||||
#[serde(skip)]
|
||||
B {
|
||||
t: String
|
||||
},
|
||||
C {
|
||||
#[serde(default, skip)]
|
||||
t: String
|
||||
},
|
||||
#[serde(skip)]
|
||||
#[allow(dead_code)]
|
||||
B {
|
||||
t: String,
|
||||
},
|
||||
C {
|
||||
#[serde(default, skip)]
|
||||
t: String,
|
||||
},
|
||||
}
|
||||
|
||||
let _data = Data::B { t: "".to_string() };
|
||||
|
||||
let data = Data::C { t: "".to_string() };
|
||||
let data = Data::C { t: String::new() };
|
||||
|
||||
assert_tokens(
|
||||
&data,
|
||||
&[
|
||||
Token::Struct { name: "Data", len: 1 },
|
||||
Token::Struct {
|
||||
name: "Data",
|
||||
len: 1,
|
||||
},
|
||||
Token::Str("t"),
|
||||
Token::Str("C"),
|
||||
Token::StructEnd,
|
||||
@@ -2628,35 +2371,6 @@ fn test_partially_untagged_enum_desugared() {
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_flatten_untagged_enum() {
|
||||
#[derive(Serialize, Deserialize, PartialEq, Debug)]
|
||||
struct Outer {
|
||||
#[serde(flatten)]
|
||||
inner: Inner,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, PartialEq, Debug)]
|
||||
#[serde(untagged)]
|
||||
enum Inner {
|
||||
Variant { a: i32 },
|
||||
}
|
||||
|
||||
let data = Outer {
|
||||
inner: Inner::Variant { a: 0 },
|
||||
};
|
||||
|
||||
assert_tokens(
|
||||
&data,
|
||||
&[
|
||||
Token::Map { len: None },
|
||||
Token::Str("a"),
|
||||
Token::I32(0),
|
||||
Token::MapEnd,
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_flatten_option() {
|
||||
#[derive(Serialize, Deserialize, PartialEq, Debug)]
|
||||
@@ -2813,48 +2527,6 @@ fn test_internally_tagged_unit_enum_with_unknown_fields() {
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_flattened_internally_tagged_unit_enum_with_unknown_fields() {
|
||||
#[derive(Deserialize, PartialEq, Debug)]
|
||||
struct S {
|
||||
#[serde(flatten)]
|
||||
x: X,
|
||||
#[serde(flatten)]
|
||||
y: Y,
|
||||
}
|
||||
|
||||
#[derive(Deserialize, PartialEq, Debug)]
|
||||
#[serde(tag = "typeX")]
|
||||
enum X {
|
||||
A,
|
||||
}
|
||||
|
||||
#[derive(Deserialize, PartialEq, Debug)]
|
||||
#[serde(tag = "typeY")]
|
||||
enum Y {
|
||||
B { c: u32 },
|
||||
}
|
||||
|
||||
let s = S {
|
||||
x: X::A,
|
||||
y: Y::B { c: 0 },
|
||||
};
|
||||
|
||||
assert_de_tokens(
|
||||
&s,
|
||||
&[
|
||||
Token::Map { len: None },
|
||||
Token::Str("typeX"),
|
||||
Token::Str("A"),
|
||||
Token::Str("typeY"),
|
||||
Token::Str("B"),
|
||||
Token::Str("c"),
|
||||
Token::I32(0),
|
||||
Token::MapEnd,
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_flatten_any_after_flatten_struct() {
|
||||
#[derive(PartialEq, Debug)]
|
||||
@@ -3147,3 +2819,339 @@ fn test_expecting_message_identifier_enum() {
|
||||
r#"invalid type: map, expected something strange..."#,
|
||||
);
|
||||
}
|
||||
|
||||
mod flatten {
|
||||
use super::*;
|
||||
|
||||
mod enum_ {
|
||||
use super::*;
|
||||
|
||||
mod externally_tagged {
|
||||
use super::*;
|
||||
use std::iter::FromIterator;
|
||||
|
||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||
struct Flatten {
|
||||
#[serde(flatten)]
|
||||
data: Enum,
|
||||
|
||||
#[serde(flatten)]
|
||||
extra: HashMap<String, String>,
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||
enum Enum {
|
||||
Newtype(HashMap<String, String>),
|
||||
Tuple(u32, u32),
|
||||
Struct { index: u32, value: u32 },
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn newtype() {
|
||||
assert_tokens(
|
||||
&Flatten {
|
||||
data: Enum::Newtype(HashMap::from_iter([("key".into(), "value".into())])),
|
||||
extra: HashMap::from_iter([("extra_key".into(), "extra value".into())]),
|
||||
},
|
||||
&[
|
||||
Token::Map { len: None },
|
||||
Token::Str("Newtype"), // variant
|
||||
Token::Map { len: Some(1) },
|
||||
Token::Str("key"),
|
||||
Token::Str("value"),
|
||||
Token::MapEnd,
|
||||
Token::Str("extra_key"),
|
||||
Token::Str("extra value"),
|
||||
Token::MapEnd,
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
// Reaches crate::private::de::content::VariantDeserializer::tuple_variant
|
||||
// Content::Seq case
|
||||
// via FlatMapDeserializer::deserialize_enum
|
||||
#[test]
|
||||
fn tuple() {
|
||||
assert_tokens(
|
||||
&Flatten {
|
||||
data: Enum::Tuple(0, 42),
|
||||
extra: HashMap::from_iter([("extra_key".into(), "extra value".into())]),
|
||||
},
|
||||
&[
|
||||
Token::Map { len: None },
|
||||
Token::Str("Tuple"), // variant
|
||||
Token::Seq { len: Some(2) },
|
||||
Token::U32(0),
|
||||
Token::U32(42),
|
||||
Token::SeqEnd,
|
||||
Token::Str("extra_key"),
|
||||
Token::Str("extra value"),
|
||||
Token::MapEnd,
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
// Reaches crate::private::de::content::VariantDeserializer::struct_variant
|
||||
// Content::Seq case
|
||||
// via FlatMapDeserializer::deserialize_enum
|
||||
#[test]
|
||||
fn struct_from_seq() {
|
||||
assert_de_tokens(
|
||||
&Flatten {
|
||||
data: Enum::Struct {
|
||||
index: 0,
|
||||
value: 42,
|
||||
},
|
||||
extra: HashMap::from_iter([("extra_key".into(), "extra value".into())]),
|
||||
},
|
||||
&[
|
||||
Token::Map { len: None },
|
||||
Token::Str("Struct"), // variant
|
||||
Token::Seq { len: Some(2) },
|
||||
Token::U32(0), // index
|
||||
Token::U32(42), // value
|
||||
Token::SeqEnd,
|
||||
Token::Str("extra_key"),
|
||||
Token::Str("extra value"),
|
||||
Token::MapEnd,
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
// Reaches crate::private::de::content::VariantDeserializer::struct_variant
|
||||
// Content::Map case
|
||||
// via FlatMapDeserializer::deserialize_enum
|
||||
#[test]
|
||||
fn struct_from_map() {
|
||||
assert_tokens(
|
||||
&Flatten {
|
||||
data: Enum::Struct {
|
||||
index: 0,
|
||||
value: 42,
|
||||
},
|
||||
extra: HashMap::from_iter([("extra_key".into(), "extra value".into())]),
|
||||
},
|
||||
&[
|
||||
Token::Map { len: None },
|
||||
Token::Str("Struct"), // variant
|
||||
Token::Struct {
|
||||
len: 2,
|
||||
name: "Struct",
|
||||
},
|
||||
Token::Str("index"),
|
||||
Token::U32(0),
|
||||
Token::Str("value"),
|
||||
Token::U32(42),
|
||||
Token::StructEnd,
|
||||
Token::Str("extra_key"),
|
||||
Token::Str("extra value"),
|
||||
Token::MapEnd,
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
mod adjacently_tagged {
|
||||
use super::*;
|
||||
|
||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||
struct Flatten {
|
||||
outer: u32,
|
||||
|
||||
#[serde(flatten)]
|
||||
data: NewtypeWrapper,
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||
struct NewtypeWrapper(pub Enum);
|
||||
|
||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||
#[serde(tag = "tag", content = "content")]
|
||||
enum Enum {
|
||||
Newtype(NewtypeVariant),
|
||||
Struct { index: u32, value: u32 },
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||
struct NewtypeVariant {
|
||||
value: u32,
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn struct_() {
|
||||
assert_tokens(
|
||||
&Flatten {
|
||||
outer: 42,
|
||||
data: NewtypeWrapper(Enum::Struct {
|
||||
index: 0,
|
||||
value: 42,
|
||||
}),
|
||||
},
|
||||
&[
|
||||
Token::Map { len: None },
|
||||
Token::Str("outer"),
|
||||
Token::U32(42),
|
||||
Token::Str("tag"),
|
||||
Token::Str("Struct"),
|
||||
Token::Str("content"),
|
||||
Token::Struct {
|
||||
len: 2,
|
||||
name: "Struct",
|
||||
},
|
||||
Token::Str("index"),
|
||||
Token::U32(0),
|
||||
Token::Str("value"),
|
||||
Token::U32(42),
|
||||
Token::StructEnd,
|
||||
Token::MapEnd,
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn newtype() {
|
||||
assert_tokens(
|
||||
&Flatten {
|
||||
outer: 42,
|
||||
data: NewtypeWrapper(Enum::Newtype(NewtypeVariant { value: 23 })),
|
||||
},
|
||||
&[
|
||||
Token::Map { len: None },
|
||||
Token::Str("outer"),
|
||||
Token::U32(42),
|
||||
Token::Str("tag"),
|
||||
Token::Str("Newtype"),
|
||||
Token::Str("content"),
|
||||
Token::Struct {
|
||||
len: 1,
|
||||
name: "NewtypeVariant",
|
||||
},
|
||||
Token::Str("value"),
|
||||
Token::U32(23),
|
||||
Token::StructEnd,
|
||||
Token::MapEnd,
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
mod internally_tagged {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn structs() {
|
||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||
struct Flatten {
|
||||
#[serde(flatten)]
|
||||
x: X,
|
||||
#[serde(flatten)]
|
||||
y: Y,
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||
#[serde(tag = "typeX")]
|
||||
enum X {
|
||||
A { a: i32 },
|
||||
B { b: i32 },
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||
#[serde(tag = "typeY")]
|
||||
enum Y {
|
||||
C { c: i32 },
|
||||
D { d: i32 },
|
||||
}
|
||||
|
||||
assert_tokens(
|
||||
&Flatten {
|
||||
x: X::B { b: 1 },
|
||||
y: Y::D { d: 2 },
|
||||
},
|
||||
&[
|
||||
Token::Map { len: None },
|
||||
Token::Str("typeX"),
|
||||
Token::Str("B"),
|
||||
Token::Str("b"),
|
||||
Token::I32(1),
|
||||
Token::Str("typeY"),
|
||||
Token::Str("D"),
|
||||
Token::Str("d"),
|
||||
Token::I32(2),
|
||||
Token::MapEnd,
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn unit_enum_with_unknown_fields() {
|
||||
#[derive(Debug, PartialEq, Deserialize)]
|
||||
struct Flatten {
|
||||
#[serde(flatten)]
|
||||
x: X,
|
||||
#[serde(flatten)]
|
||||
y: Y,
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Deserialize)]
|
||||
#[serde(tag = "typeX")]
|
||||
enum X {
|
||||
A,
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Deserialize)]
|
||||
#[serde(tag = "typeY")]
|
||||
enum Y {
|
||||
B { c: u32 },
|
||||
}
|
||||
|
||||
assert_de_tokens(
|
||||
&Flatten {
|
||||
x: X::A,
|
||||
y: Y::B { c: 0 },
|
||||
},
|
||||
&[
|
||||
Token::Map { len: None },
|
||||
Token::Str("typeX"),
|
||||
Token::Str("A"),
|
||||
Token::Str("typeY"),
|
||||
Token::Str("B"),
|
||||
Token::Str("c"),
|
||||
Token::I32(0),
|
||||
Token::MapEnd,
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
mod untagged {
|
||||
use super::*;
|
||||
|
||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||
struct Flatten {
|
||||
#[serde(flatten)]
|
||||
data: Enum,
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||
#[serde(untagged)]
|
||||
enum Enum {
|
||||
Struct { a: i32 },
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn struct_() {
|
||||
assert_tokens(
|
||||
&Flatten {
|
||||
data: Enum::Struct { a: 0 },
|
||||
},
|
||||
&[
|
||||
Token::Map { len: None },
|
||||
Token::Str("a"),
|
||||
Token::I32(0),
|
||||
Token::MapEnd,
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1429,6 +1429,9 @@ fn test_enum_in_internally_tagged_enum() {
|
||||
],
|
||||
);
|
||||
|
||||
// Reaches crate::private::de::content::VariantDeserializer::tuple_variant
|
||||
// Content::Seq case
|
||||
// via ContentDeserializer::deserialize_enum
|
||||
assert_tokens(
|
||||
&Outer::Inner(Inner::Tuple(1, 1)),
|
||||
&[
|
||||
@@ -1447,6 +1450,9 @@ fn test_enum_in_internally_tagged_enum() {
|
||||
],
|
||||
);
|
||||
|
||||
// Reaches crate::private::de::content::VariantDeserializer::struct_variant
|
||||
// Content::Map case
|
||||
// via ContentDeserializer::deserialize_enum
|
||||
assert_tokens(
|
||||
&Outer::Inner(Inner::Struct { f: 1 }),
|
||||
&[
|
||||
@@ -1464,6 +1470,23 @@ fn test_enum_in_internally_tagged_enum() {
|
||||
Token::MapEnd,
|
||||
],
|
||||
);
|
||||
|
||||
// Reaches crate::private::de::content::VariantDeserializer::struct_variant
|
||||
// Content::Seq case
|
||||
// via ContentDeserializer::deserialize_enum
|
||||
assert_de_tokens(
|
||||
&Outer::Inner(Inner::Struct { f: 1 }),
|
||||
&[
|
||||
Token::Map { len: Some(2) },
|
||||
Token::Str("type"),
|
||||
Token::Str("Inner"),
|
||||
Token::Str("Struct"),
|
||||
Token::Seq { len: Some(1) },
|
||||
Token::U8(1), // f
|
||||
Token::SeqEnd,
|
||||
Token::MapEnd,
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -1923,6 +1946,62 @@ fn test_rename_all() {
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_rename_all_fields() {
|
||||
#[derive(Serialize, Deserialize, Debug, PartialEq)]
|
||||
#[serde(rename_all_fields = "kebab-case")]
|
||||
enum E {
|
||||
V1,
|
||||
V2(bool),
|
||||
V3 {
|
||||
a_field: bool,
|
||||
another_field: bool,
|
||||
#[serde(rename = "last-field")]
|
||||
yet_another_field: bool,
|
||||
},
|
||||
#[serde(rename_all = "snake_case")]
|
||||
V4 {
|
||||
a_field: bool,
|
||||
},
|
||||
}
|
||||
|
||||
assert_tokens(
|
||||
&E::V3 {
|
||||
a_field: true,
|
||||
another_field: true,
|
||||
yet_another_field: true,
|
||||
},
|
||||
&[
|
||||
Token::StructVariant {
|
||||
name: "E",
|
||||
variant: "V3",
|
||||
len: 3,
|
||||
},
|
||||
Token::Str("a-field"),
|
||||
Token::Bool(true),
|
||||
Token::Str("another-field"),
|
||||
Token::Bool(true),
|
||||
Token::Str("last-field"),
|
||||
Token::Bool(true),
|
||||
Token::StructVariantEnd,
|
||||
],
|
||||
);
|
||||
|
||||
assert_tokens(
|
||||
&E::V4 { a_field: true },
|
||||
&[
|
||||
Token::StructVariant {
|
||||
name: "E",
|
||||
variant: "V4",
|
||||
len: 1,
|
||||
},
|
||||
Token::Str("a_field"),
|
||||
Token::Bool(true),
|
||||
Token::StructVariantEnd,
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_untagged_newtype_variant_containing_unit_struct_not_map() {
|
||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
error: #[serde(default)] can only be used on structs with named fields
|
||||
--> tests/ui/default-attribute/enum.rs:5:1
|
||||
--> tests/ui/default-attribute/enum.rs:4:9
|
||||
|
|
||||
5 | enum E {
|
||||
| ^^^^
|
||||
4 | #[serde(default)]
|
||||
| ^^^^^^^
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
error: #[serde(default = "...")] can only be used on structs with named fields
|
||||
--> tests/ui/default-attribute/enum_path.rs:5:1
|
||||
--> tests/ui/default-attribute/enum_path.rs:4:9
|
||||
|
|
||||
5 | enum E {
|
||||
| ^^^^
|
||||
4 | #[serde(default = "default_e")]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
error: #[serde(default = "...")] can only be used on structs with named fields
|
||||
--> tests/ui/default-attribute/nameless_struct_fields_path.rs:5:9
|
||||
--> tests/ui/default-attribute/nameless_struct_fields_path.rs:4:9
|
||||
|
|
||||
5 | struct T(u8, u8);
|
||||
| ^^^^^^^^
|
||||
4 | #[serde(default = "default_t")]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
error: #[serde(untagged)] can only be used on enums
|
||||
--> tests/ui/enum-representation/untagged-struct.rs:5:1
|
||||
--> tests/ui/enum-representation/untagged-struct.rs:4:9
|
||||
|
|
||||
5 | struct S;
|
||||
| ^^^^^^
|
||||
4 | #[serde(untagged)]
|
||||
| ^^^^^^^^
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
error: #[serde(tag = "...")] can only be used on enums and structs with named fields
|
||||
--> tests/ui/struct-representation/internally-tagged-tuple.rs:5:9
|
||||
--> tests/ui/struct-representation/internally-tagged-tuple.rs:4:9
|
||||
|
|
||||
5 | struct S(u8, u8);
|
||||
| ^^^^^^^^
|
||||
4 | #[serde(tag = "type")]
|
||||
| ^^^^^^^^^^^^
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
error: #[serde(tag = "...")] can only be used on enums and structs with named fields
|
||||
--> tests/ui/struct-representation/internally-tagged-unit.rs:3:10
|
||||
--> tests/ui/struct-representation/internally-tagged-unit.rs:4:9
|
||||
|
|
||||
3 | #[derive(Serialize)]
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
= note: this error originates in the derive macro `Serialize` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
4 | #[serde(tag = "type")]
|
||||
| ^^^^^^^^^^^^
|
||||
|
||||
Reference in New Issue
Block a user