mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-06-23 21:11:04 +00:00
Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1c1eecabc0 | |||
| abd3fd004e | |||
| 15ee353488 | |||
| e75efbfd31 | |||
| 1c97a7ecb3 | |||
| fccd3e9fba | |||
| 4cb13b33e0 | |||
| 629802f2ab | |||
| afb1754528 | |||
| dbd67c6c89 | |||
| ed01bdb9dd | |||
| b54821d8ab | |||
| 89c6a79b6e |
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
version = "1.0.92" # remember to update html_root_url
|
version = "1.0.94" # remember to update html_root_url
|
||||||
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"]
|
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"]
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
description = "A generic serialization/deserialization framework"
|
description = "A generic serialization/deserialization framework"
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
use lib::*;
|
use lib::*;
|
||||||
|
|
||||||
use de::{Deserialize, Deserializer, Error, MapAccess, SeqAccess, Visitor};
|
use de::{
|
||||||
|
Deserialize, Deserializer, EnumAccess, Error, MapAccess, SeqAccess, VariantAccess, Visitor,
|
||||||
|
};
|
||||||
|
|
||||||
/// An efficient way of discarding data from a deserializer.
|
/// An efficient way of discarding data from a deserializer.
|
||||||
///
|
///
|
||||||
@@ -205,6 +207,13 @@ impl<'de> Visitor<'de> for IgnoredAny {
|
|||||||
let _ = bytes;
|
let _ = bytes;
|
||||||
Ok(IgnoredAny)
|
Ok(IgnoredAny)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error>
|
||||||
|
where
|
||||||
|
A: EnumAccess<'de>,
|
||||||
|
{
|
||||||
|
data.variant::<IgnoredAny>()?.1.newtype_variant()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'de> Deserialize<'de> for IgnoredAny {
|
impl<'de> Deserialize<'de> for IgnoredAny {
|
||||||
|
|||||||
+3
-4
@@ -73,7 +73,7 @@
|
|||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// Serde types in rustdoc of other crates get linked to here.
|
// Serde types in rustdoc of other crates get linked to here.
|
||||||
#![doc(html_root_url = "https://docs.rs/serde/1.0.92")]
|
#![doc(html_root_url = "https://docs.rs/serde/1.0.94")]
|
||||||
// Support using Serde without the standard library!
|
// Support using Serde without the standard library!
|
||||||
#![cfg_attr(not(feature = "std"), no_std)]
|
#![cfg_attr(not(feature = "std"), no_std)]
|
||||||
// Unstable functionality only if the user asks for it. For tracking and
|
// Unstable functionality only if the user asks for it. For tracking and
|
||||||
@@ -81,7 +81,6 @@
|
|||||||
//
|
//
|
||||||
// https://github.com/serde-rs/serde/issues/812
|
// https://github.com/serde-rs/serde/issues/812
|
||||||
#![cfg_attr(feature = "unstable", feature(specialization, never_type))]
|
#![cfg_attr(feature = "unstable", feature(specialization, never_type))]
|
||||||
#![cfg_attr(feature = "alloc", feature(alloc))]
|
|
||||||
#![allow(unknown_lints, bare_trait_objects)]
|
#![allow(unknown_lints, bare_trait_objects)]
|
||||||
#![cfg_attr(feature = "cargo-clippy", allow(renamed_and_removed_lints))]
|
#![cfg_attr(feature = "cargo-clippy", allow(renamed_and_removed_lints))]
|
||||||
#![cfg_attr(feature = "cargo-clippy", deny(clippy, clippy_pedantic))]
|
#![cfg_attr(feature = "cargo-clippy", deny(clippy, clippy_pedantic))]
|
||||||
@@ -90,13 +89,13 @@
|
|||||||
feature = "cargo-clippy",
|
feature = "cargo-clippy",
|
||||||
allow(
|
allow(
|
||||||
// not available in our oldest supported compiler
|
// not available in our oldest supported compiler
|
||||||
const_static_lifetime,
|
checked_conversions,
|
||||||
empty_enum,
|
empty_enum,
|
||||||
redundant_field_names,
|
redundant_field_names,
|
||||||
|
redundant_static_lifetimes,
|
||||||
// integer and float ser/de requires these sorts of casts
|
// integer and float ser/de requires these sorts of casts
|
||||||
cast_possible_truncation,
|
cast_possible_truncation,
|
||||||
cast_possible_wrap,
|
cast_possible_wrap,
|
||||||
cast_precision_loss,
|
|
||||||
cast_sign_loss,
|
cast_sign_loss,
|
||||||
// things are often more readable this way
|
// things are often more readable this way
|
||||||
cast_lossless,
|
cast_lossless,
|
||||||
|
|||||||
@@ -1420,6 +1420,7 @@ mod content {
|
|||||||
Content::ByteBuf(v) => visitor.visit_byte_buf(v),
|
Content::ByteBuf(v) => visitor.visit_byte_buf(v),
|
||||||
Content::Bytes(v) => visitor.visit_borrowed_bytes(v),
|
Content::Bytes(v) => visitor.visit_borrowed_bytes(v),
|
||||||
Content::U8(v) => visitor.visit_u8(v),
|
Content::U8(v) => visitor.visit_u8(v),
|
||||||
|
Content::U64(v) => visitor.visit_u64(v),
|
||||||
_ => Err(self.invalid_type(&visitor)),
|
_ => Err(self.invalid_type(&visitor)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2123,6 +2124,7 @@ mod content {
|
|||||||
Content::ByteBuf(ref v) => visitor.visit_bytes(v),
|
Content::ByteBuf(ref v) => visitor.visit_bytes(v),
|
||||||
Content::Bytes(v) => visitor.visit_borrowed_bytes(v),
|
Content::Bytes(v) => visitor.visit_borrowed_bytes(v),
|
||||||
Content::U8(v) => visitor.visit_u8(v),
|
Content::U8(v) => visitor.visit_u8(v),
|
||||||
|
Content::U64(v) => visitor.visit_u64(v),
|
||||||
_ => Err(self.invalid_type(&visitor)),
|
_ => Err(self.invalid_type(&visitor)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "serde_derive"
|
name = "serde_derive"
|
||||||
version = "1.0.92" # remember to update html_root_url
|
version = "1.0.94" # remember to update html_root_url
|
||||||
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"]
|
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"]
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
description = "Macros 1.1 implementation of #[derive(Serialize, Deserialize)]"
|
description = "Macros 1.1 implementation of #[derive(Serialize, Deserialize)]"
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
//!
|
//!
|
||||||
//! [https://serde.rs/derive.html]: https://serde.rs/derive.html
|
//! [https://serde.rs/derive.html]: https://serde.rs/derive.html
|
||||||
|
|
||||||
#![doc(html_root_url = "https://docs.rs/serde_derive/1.0.92")]
|
#![doc(html_root_url = "https://docs.rs/serde_derive/1.0.94")]
|
||||||
#![allow(unknown_lints, bare_trait_objects)]
|
#![allow(unknown_lints, bare_trait_objects)]
|
||||||
#![cfg_attr(feature = "cargo-clippy", allow(renamed_and_removed_lints))]
|
#![cfg_attr(feature = "cargo-clippy", allow(renamed_and_removed_lints))]
|
||||||
#![cfg_attr(feature = "cargo-clippy", deny(clippy, clippy_pedantic))]
|
#![cfg_attr(feature = "cargo-clippy", deny(clippy, clippy_pedantic))]
|
||||||
@@ -35,6 +35,7 @@
|
|||||||
feature = "cargo-clippy",
|
feature = "cargo-clippy",
|
||||||
allow(
|
allow(
|
||||||
cast_possible_truncation,
|
cast_possible_truncation,
|
||||||
|
checked_conversions,
|
||||||
doc_markdown,
|
doc_markdown,
|
||||||
enum_glob_use,
|
enum_glob_use,
|
||||||
filter_map,
|
filter_map,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "serde_test"
|
name = "serde_test"
|
||||||
version = "1.0.92" # remember to update html_root_url
|
version = "1.0.94" # remember to update html_root_url
|
||||||
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"]
|
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"]
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
description = "Token De/Serializer for testing De/Serialize implementations"
|
description = "Token De/Serializer for testing De/Serialize implementations"
|
||||||
|
|||||||
@@ -144,7 +144,7 @@
|
|||||||
//! # }
|
//! # }
|
||||||
//! ```
|
//! ```
|
||||||
|
|
||||||
#![doc(html_root_url = "https://docs.rs/serde_test/1.0.92")]
|
#![doc(html_root_url = "https://docs.rs/serde_test/1.0.94")]
|
||||||
#![cfg_attr(feature = "cargo-clippy", allow(renamed_and_removed_lints))]
|
#![cfg_attr(feature = "cargo-clippy", allow(renamed_and_removed_lints))]
|
||||||
#![cfg_attr(feature = "cargo-clippy", deny(clippy, clippy_pedantic))]
|
#![cfg_attr(feature = "cargo-clippy", deny(clippy, clippy_pedantic))]
|
||||||
// Ignored clippy lints
|
// Ignored clippy lints
|
||||||
|
|||||||
@@ -124,6 +124,19 @@ enum EnumOther {
|
|||||||
Other,
|
Other,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(PartialEq, Debug)]
|
||||||
|
struct IgnoredAny;
|
||||||
|
|
||||||
|
impl<'de> Deserialize<'de> for IgnoredAny {
|
||||||
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||||
|
where
|
||||||
|
D: Deserializer<'de>,
|
||||||
|
{
|
||||||
|
serde::de::IgnoredAny::deserialize(deserializer)?;
|
||||||
|
Ok(IgnoredAny)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
macro_rules! declare_tests {
|
macro_rules! declare_tests {
|
||||||
@@ -929,6 +942,21 @@ declare_tests! {
|
|||||||
Token::SeqEnd,
|
Token::SeqEnd,
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
test_ignored_any {
|
||||||
|
IgnoredAny => &[
|
||||||
|
Token::Str("s"),
|
||||||
|
],
|
||||||
|
IgnoredAny => &[
|
||||||
|
Token::Seq { len: Some(1) },
|
||||||
|
Token::Bool(true),
|
||||||
|
Token::SeqEnd,
|
||||||
|
],
|
||||||
|
IgnoredAny => &[
|
||||||
|
Token::Enum { name: "E" },
|
||||||
|
Token::Str("Rust"),
|
||||||
|
Token::Unit,
|
||||||
|
],
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
declare_tests! {
|
declare_tests! {
|
||||||
|
|||||||
@@ -0,0 +1,104 @@
|
|||||||
|
use serde::de::value::{Error, MapDeserializer, SeqDeserializer};
|
||||||
|
use serde::de::{
|
||||||
|
DeserializeSeed, EnumAccess, IgnoredAny, IntoDeserializer, VariantAccess, Visitor,
|
||||||
|
};
|
||||||
|
use serde::{forward_to_deserialize_any, Deserialize, Deserializer};
|
||||||
|
|
||||||
|
#[derive(PartialEq, Debug, Deserialize)]
|
||||||
|
enum Target {
|
||||||
|
Unit,
|
||||||
|
Newtype(i32),
|
||||||
|
Tuple(i32, i32),
|
||||||
|
Struct { a: i32 },
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Enum(&'static str);
|
||||||
|
|
||||||
|
impl<'de> Deserializer<'de> for Enum {
|
||||||
|
type Error = Error;
|
||||||
|
|
||||||
|
fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: Visitor<'de>,
|
||||||
|
{
|
||||||
|
visitor.visit_enum(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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'de> EnumAccess<'de> for Enum {
|
||||||
|
type Error = Error;
|
||||||
|
type Variant = Self;
|
||||||
|
|
||||||
|
fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
|
||||||
|
where
|
||||||
|
V: DeserializeSeed<'de>,
|
||||||
|
{
|
||||||
|
let v = seed.deserialize(self.0.into_deserializer())?;
|
||||||
|
Ok((v, self))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'de> VariantAccess<'de> for Enum {
|
||||||
|
type Error = Error;
|
||||||
|
|
||||||
|
fn unit_variant(self) -> Result<(), Self::Error> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
|
||||||
|
where
|
||||||
|
T: DeserializeSeed<'de>,
|
||||||
|
{
|
||||||
|
seed.deserialize(10i32.into_deserializer())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: Visitor<'de>,
|
||||||
|
{
|
||||||
|
let seq = SeqDeserializer::new(vec![1i32, 2].into_iter());
|
||||||
|
visitor.visit_seq(seq)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn struct_variant<V>(
|
||||||
|
self,
|
||||||
|
_fields: &'static [&'static str],
|
||||||
|
visitor: V,
|
||||||
|
) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: Visitor<'de>,
|
||||||
|
{
|
||||||
|
let map = MapDeserializer::new(vec![("a", 10i32)].into_iter());
|
||||||
|
visitor.visit_map(map)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_deserialize_enum() {
|
||||||
|
// First just make sure the Deserializer impl works
|
||||||
|
assert_eq!(Target::Unit, Target::deserialize(Enum("Unit")).unwrap());
|
||||||
|
assert_eq!(
|
||||||
|
Target::Newtype(10),
|
||||||
|
Target::deserialize(Enum("Newtype")).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
Target::Tuple(1, 2),
|
||||||
|
Target::deserialize(Enum("Tuple")).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
Target::Struct { a: 10 },
|
||||||
|
Target::deserialize(Enum("Struct")).unwrap()
|
||||||
|
);
|
||||||
|
|
||||||
|
// Now try IgnoredAny
|
||||||
|
IgnoredAny::deserialize(Enum("Unit")).unwrap();
|
||||||
|
IgnoredAny::deserialize(Enum("Newtype")).unwrap();
|
||||||
|
IgnoredAny::deserialize(Enum("Tuple")).unwrap();
|
||||||
|
IgnoredAny::deserialize(Enum("Struct")).unwrap();
|
||||||
|
}
|
||||||
@@ -1466,6 +1466,34 @@ fn test_internally_tagged_struct_with_flattened_field() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_untagged_enum_with_flattened_integer_key() {
|
||||||
|
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||||
|
#[serde(untagged)]
|
||||||
|
pub enum Untagged {
|
||||||
|
Variant {
|
||||||
|
#[serde(flatten)]
|
||||||
|
map: BTreeMap<u64, String>,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_tokens(
|
||||||
|
&Untagged::Variant {
|
||||||
|
map: {
|
||||||
|
let mut map = BTreeMap::new();
|
||||||
|
map.insert(100, "BTreeMap".to_owned());
|
||||||
|
map
|
||||||
|
},
|
||||||
|
},
|
||||||
|
&[
|
||||||
|
Token::Map { len: None },
|
||||||
|
Token::U64(100),
|
||||||
|
Token::Str("BTreeMap"),
|
||||||
|
Token::MapEnd,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_enum_in_untagged_enum() {
|
fn test_enum_in_untagged_enum() {
|
||||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||||
|
|||||||
Reference in New Issue
Block a user