mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-04-26 02:47:56 +00:00
Compare commits
74 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| db6aaf5110 | |||
| c4a4501d71 | |||
| a3ae14d090 | |||
| dc4bb0bf08 | |||
| c69a3e083f | |||
| c790bd2a69 | |||
| 60cbbacdb3 | |||
| befc7edc17 | |||
| 3897ccb3f9 | |||
| 11c5fd78ad | |||
| cbfdba3826 | |||
| 5985b7edaf | |||
| d28a0e66c8 | |||
| 0ca4db1616 | |||
| 72b3438dfc | |||
| c7051ac748 | |||
| a065db9838 | |||
| 24c4df7831 | |||
| a077ae039e | |||
| 20b34d3b43 | |||
| b5451d1905 | |||
| e26960f7f8 | |||
| 228b5a4a63 | |||
| 28db9d4989 | |||
| 5fff0d936d | |||
| 8eb195edf0 | |||
| 8b2e6baf78 | |||
| 3ca0597a7e | |||
| 4e54aaf796 | |||
| 4cddcbe194 | |||
| 54b6798ef6 | |||
| 229a9d90ba | |||
| 3bcd568c86 | |||
| dc56077aac | |||
| 46bd36e17c | |||
| 5dee9118c7 | |||
| a916aa9420 | |||
| d9c63d0784 | |||
| 41dcb969e8 | |||
| 6dbaea34ba | |||
| ce17301b8b | |||
| b0e78c6be4 | |||
| 898f65fa46 | |||
| 84e384196d | |||
| d827b101d9 | |||
| c45ab6b304 | |||
| cc9d85b293 | |||
| 02493d83be | |||
| a1280c672a | |||
| a740f76772 | |||
| a887db398b | |||
| e1ae3c71f3 | |||
| d094209774 | |||
| 485a64aaf9 | |||
| 3e57cd5917 | |||
| b6c4cfec37 | |||
| 94853752a1 | |||
| bd366f675e | |||
| 22b1af7eb3 | |||
| fd6178cad6 | |||
| 338fb67853 | |||
| 0a71fe329c | |||
| a4acc83282 | |||
| 57de28744c | |||
| 6d31ec521b | |||
| 7ad3d17e59 | |||
| 05e931b9a5 | |||
| 2db2b53bbf | |||
| d5ec3efe49 | |||
| 71fc318474 | |||
| 5ee2fc0562 | |||
| ca53daf697 | |||
| c3b9ee314b | |||
| 993710eb16 |
+6
-2
@@ -4,11 +4,15 @@ cache: cargo
|
|||||||
|
|
||||||
# run builds for all the trains (and more)
|
# run builds for all the trains (and more)
|
||||||
rust:
|
rust:
|
||||||
- 1.13.0
|
|
||||||
- 1.15.0
|
|
||||||
- stable
|
- stable
|
||||||
- beta
|
- beta
|
||||||
- nightly
|
- nightly
|
||||||
|
- 1.13.0
|
||||||
|
- 1.15.0
|
||||||
|
- 1.20.0
|
||||||
|
- 1.21.0
|
||||||
|
- 1.25.0
|
||||||
|
- 1.26.0
|
||||||
|
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
|
|||||||
@@ -79,12 +79,13 @@ fn main() {
|
|||||||
|
|
||||||
## Getting help
|
## Getting help
|
||||||
|
|
||||||
Serde developers live in the #serde channel on
|
Serde developers live in the #serde channel on [`irc.mozilla.org`][irc]. The
|
||||||
[`irc.mozilla.org`](https://wiki.mozilla.org/IRC). The #rust channel is also a
|
\#rust channel is also a good resource with generally faster response time but
|
||||||
good resource with generally faster response time but less specific knowledge
|
less specific knowledge about Serde. If IRC is not your thing or you don't get a
|
||||||
about Serde. If IRC is not your thing or you don't get a good response, we are
|
good response, we are happy to respond to [GitHub issues][issues] as well.
|
||||||
happy to respond to [GitHub issues](https://github.com/serde-rs/serde/issues/new)
|
|
||||||
as well.
|
[irc]: https://wiki.mozilla.org/IRC
|
||||||
|
[issues]: https://github.com/serde-rs/serde/issues/new/choose
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
|||||||
+7
-6
@@ -47,9 +47,10 @@ fn main() {
|
|||||||
|
|
||||||
## Getting help
|
## Getting help
|
||||||
|
|
||||||
Serde developers live in the #serde channel on
|
Serde developers live in the #serde channel on [`irc.mozilla.org`][irc]. The
|
||||||
[`irc.mozilla.org`](https://wiki.mozilla.org/IRC). The #rust channel is also a
|
\#rust channel is also a good resource with generally faster response time but
|
||||||
good resource with generally faster response time but less specific knowledge
|
less specific knowledge about Serde. If IRC is not your thing or you don't get a
|
||||||
about Serde. If IRC is not your thing or you don't get a good response, we are
|
good response, we are happy to respond to [GitHub issues][issues] as well.
|
||||||
happy to respond to [GitHub issues](https://github.com/serde-rs/serde/issues/new)
|
|
||||||
as well.
|
[irc]: https://wiki.mozilla.org/IRC
|
||||||
|
[issues]: https://github.com/serde-rs/serde/issues/new/choose
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
version = "1.0.64" # remember to update html_root_url
|
version = "1.0.73" # 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/Apache-2.0"
|
license = "MIT/Apache-2.0"
|
||||||
description = "A generic serialization/deserialization framework"
|
description = "A generic serialization/deserialization framework"
|
||||||
|
|||||||
@@ -24,12 +24,24 @@ fn main() {
|
|||||||
println!("cargo:rustc-cfg=de_rc_dst");
|
println!("cargo:rustc-cfg=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=core_duration");
|
||||||
|
}
|
||||||
|
|
||||||
// 128-bit integers stabilized in Rust 1.26:
|
// 128-bit integers stabilized in Rust 1.26:
|
||||||
// https://blog.rust-lang.org/2018/05/10/Rust-1.26.html
|
// https://blog.rust-lang.org/2018/05/10/Rust-1.26.html
|
||||||
if minor >= 26 {
|
if minor >= 26 {
|
||||||
println!("cargo:rustc-cfg=integer128");
|
println!("cargo:rustc-cfg=integer128");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Inclusive ranges methods stabilized in Rust 1.27:
|
||||||
|
// https://github.com/rust-lang/rust/pull/50758
|
||||||
|
if minor >= 27 {
|
||||||
|
println!("cargo:rustc-cfg=range_inclusive");
|
||||||
|
}
|
||||||
|
|
||||||
// Non-zero integers stabilized in Rust 1.28:
|
// Non-zero integers stabilized in Rust 1.28:
|
||||||
// https://github.com/rust-lang/rust/pull/50808
|
// https://github.com/rust-lang/rust/pull/50808
|
||||||
if minor >= 28 {
|
if minor >= 28 {
|
||||||
|
|||||||
@@ -20,7 +20,9 @@ use de::{Deserialize, Deserializer, Error, MapAccess, SeqAccess, Visitor};
|
|||||||
/// use std::fmt;
|
/// use std::fmt;
|
||||||
/// use std::marker::PhantomData;
|
/// use std::marker::PhantomData;
|
||||||
///
|
///
|
||||||
/// use serde::de::{self, Deserialize, DeserializeSeed, Deserializer, Visitor, SeqAccess, IgnoredAny};
|
/// use serde::de::{
|
||||||
|
/// self, Deserialize, DeserializeSeed, Deserializer, IgnoredAny, SeqAccess, Visitor,
|
||||||
|
/// };
|
||||||
///
|
///
|
||||||
/// /// A seed that can be used to deserialize only the `n`th element of a sequence
|
/// /// A seed that can be used to deserialize only the `n`th element of a sequence
|
||||||
/// /// while efficiently discarding elements of any type before or after index `n`.
|
/// /// while efficiently discarding elements of any type before or after index `n`.
|
||||||
@@ -51,7 +53,11 @@ use de::{Deserialize, Deserializer, Error, MapAccess, SeqAccess, Visitor};
|
|||||||
/// type Value = T;
|
/// type Value = T;
|
||||||
///
|
///
|
||||||
/// fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
/// fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
||||||
/// write!(formatter, "a sequence in which we care about element {}", self.n)
|
/// write!(
|
||||||
|
/// formatter,
|
||||||
|
/// "a sequence in which we care about element {}",
|
||||||
|
/// self.n
|
||||||
|
/// )
|
||||||
/// }
|
/// }
|
||||||
///
|
///
|
||||||
/// fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
|
/// fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
|
||||||
|
|||||||
+273
-149
@@ -12,7 +12,7 @@ use de::{
|
|||||||
Deserialize, Deserializer, EnumAccess, Error, SeqAccess, Unexpected, VariantAccess, Visitor,
|
Deserialize, Deserializer, EnumAccess, Error, SeqAccess, Unexpected, VariantAccess, Visitor,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[cfg(any(feature = "std", feature = "alloc"))]
|
#[cfg(any(core_duration, feature = "std", feature = "alloc"))]
|
||||||
use de::MapAccess;
|
use de::MapAccess;
|
||||||
|
|
||||||
use de::from_primitive::FromPrimitive;
|
use de::from_primitive::FromPrimitive;
|
||||||
@@ -49,6 +49,16 @@ impl<'de> Deserialize<'de> for () {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "unstable")]
|
||||||
|
impl<'de> Deserialize<'de> for ! {
|
||||||
|
fn deserialize<D>(_deserializer: D) -> Result<Self, D::Error>
|
||||||
|
where
|
||||||
|
D: Deserializer<'de>,
|
||||||
|
{
|
||||||
|
Err(Error::custom("cannot deserialize `!`"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
struct BoolVisitor;
|
struct BoolVisitor;
|
||||||
@@ -1172,15 +1182,31 @@ map_impl!(
|
|||||||
|
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
macro_rules! parse_ip_impl {
|
macro_rules! parse_ip_impl {
|
||||||
($ty:ty; $size:expr) => {
|
($expecting:tt $ty:ty; $size:tt) => {
|
||||||
impl<'de> Deserialize<'de> for $ty {
|
impl<'de> Deserialize<'de> for $ty {
|
||||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||||
where
|
where
|
||||||
D: Deserializer<'de>,
|
D: Deserializer<'de>,
|
||||||
{
|
{
|
||||||
if deserializer.is_human_readable() {
|
if deserializer.is_human_readable() {
|
||||||
let s = try!(String::deserialize(deserializer));
|
struct IpAddrVisitor;
|
||||||
s.parse().map_err(Error::custom)
|
|
||||||
|
impl<'de> Visitor<'de> for IpAddrVisitor {
|
||||||
|
type Value = $ty;
|
||||||
|
|
||||||
|
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
formatter.write_str($expecting)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
|
||||||
|
where
|
||||||
|
E: Error,
|
||||||
|
{
|
||||||
|
s.parse().map_err(Error::custom)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
deserializer.deserialize_str(IpAddrVisitor)
|
||||||
} else {
|
} else {
|
||||||
<[u8; $size]>::deserialize(deserializer).map(<$ty>::from)
|
<[u8; $size]>::deserialize(deserializer).map(<$ty>::from)
|
||||||
}
|
}
|
||||||
@@ -1308,8 +1334,24 @@ impl<'de> Deserialize<'de> for net::IpAddr {
|
|||||||
D: Deserializer<'de>,
|
D: Deserializer<'de>,
|
||||||
{
|
{
|
||||||
if deserializer.is_human_readable() {
|
if deserializer.is_human_readable() {
|
||||||
let s = try!(String::deserialize(deserializer));
|
struct IpAddrVisitor;
|
||||||
s.parse().map_err(Error::custom)
|
|
||||||
|
impl<'de> Visitor<'de> for IpAddrVisitor {
|
||||||
|
type Value = net::IpAddr;
|
||||||
|
|
||||||
|
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
formatter.write_str("IP address")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
|
||||||
|
where
|
||||||
|
E: Error,
|
||||||
|
{
|
||||||
|
s.parse().map_err(Error::custom)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
deserializer.deserialize_str(IpAddrVisitor)
|
||||||
} else {
|
} else {
|
||||||
use lib::net::IpAddr;
|
use lib::net::IpAddr;
|
||||||
deserialize_enum!{
|
deserialize_enum!{
|
||||||
@@ -1322,22 +1364,38 @@ impl<'de> Deserialize<'de> for net::IpAddr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
parse_ip_impl!(net::Ipv4Addr; 4);
|
parse_ip_impl!("IPv4 address" net::Ipv4Addr; 4);
|
||||||
|
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
parse_ip_impl!(net::Ipv6Addr; 16);
|
parse_ip_impl!("IPv6 address" net::Ipv6Addr; 16);
|
||||||
|
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
macro_rules! parse_socket_impl {
|
macro_rules! parse_socket_impl {
|
||||||
($ty:ty, $new:expr) => {
|
($expecting:tt $ty:ty, $new:expr) => {
|
||||||
impl<'de> Deserialize<'de> for $ty {
|
impl<'de> Deserialize<'de> for $ty {
|
||||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||||
where
|
where
|
||||||
D: Deserializer<'de>,
|
D: Deserializer<'de>,
|
||||||
{
|
{
|
||||||
if deserializer.is_human_readable() {
|
if deserializer.is_human_readable() {
|
||||||
let s = try!(String::deserialize(deserializer));
|
struct SocketAddrVisitor;
|
||||||
s.parse().map_err(Error::custom)
|
|
||||||
|
impl<'de> Visitor<'de> for SocketAddrVisitor {
|
||||||
|
type Value = $ty;
|
||||||
|
|
||||||
|
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
formatter.write_str($expecting)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
|
||||||
|
where
|
||||||
|
E: Error,
|
||||||
|
{
|
||||||
|
s.parse().map_err(Error::custom)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
deserializer.deserialize_str(SocketAddrVisitor)
|
||||||
} else {
|
} else {
|
||||||
<(_, u16)>::deserialize(deserializer).map(|(ip, port)| $new(ip, port))
|
<(_, u16)>::deserialize(deserializer).map(|(ip, port)| $new(ip, port))
|
||||||
}
|
}
|
||||||
@@ -1353,8 +1411,24 @@ impl<'de> Deserialize<'de> for net::SocketAddr {
|
|||||||
D: Deserializer<'de>,
|
D: Deserializer<'de>,
|
||||||
{
|
{
|
||||||
if deserializer.is_human_readable() {
|
if deserializer.is_human_readable() {
|
||||||
let s = try!(String::deserialize(deserializer));
|
struct SocketAddrVisitor;
|
||||||
s.parse().map_err(Error::custom)
|
|
||||||
|
impl<'de> Visitor<'de> for SocketAddrVisitor {
|
||||||
|
type Value = net::SocketAddr;
|
||||||
|
|
||||||
|
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
formatter.write_str("socket address")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
|
||||||
|
where
|
||||||
|
E: Error,
|
||||||
|
{
|
||||||
|
s.parse().map_err(Error::custom)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
deserializer.deserialize_str(SocketAddrVisitor)
|
||||||
} else {
|
} else {
|
||||||
use lib::net::SocketAddr;
|
use lib::net::SocketAddr;
|
||||||
deserialize_enum!{
|
deserialize_enum!{
|
||||||
@@ -1367,10 +1441,10 @@ impl<'de> Deserialize<'de> for net::SocketAddr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
parse_socket_impl!(net::SocketAddrV4, net::SocketAddrV4::new);
|
parse_socket_impl!("IPv4 socket address" net::SocketAddrV4, net::SocketAddrV4::new);
|
||||||
|
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
parse_socket_impl!(net::SocketAddrV6, |ip, port| net::SocketAddrV6::new(
|
parse_socket_impl!("IPv6 socket address" net::SocketAddrV6, |ip, port| net::SocketAddrV6::new(
|
||||||
ip, port, 0, 0
|
ip, port, 0, 0
|
||||||
));
|
));
|
||||||
|
|
||||||
@@ -1528,7 +1602,11 @@ forwarded_impl!((T), Box<[T]>, Vec::into_boxed_slice);
|
|||||||
#[cfg(any(feature = "std", feature = "alloc"))]
|
#[cfg(any(feature = "std", feature = "alloc"))]
|
||||||
forwarded_impl!((), Box<str>, String::into_boxed_str);
|
forwarded_impl!((), Box<str>, String::into_boxed_str);
|
||||||
|
|
||||||
#[cfg(all(not(de_rc_dst), feature = "rc", any(feature = "std", feature = "alloc")))]
|
#[cfg(all(
|
||||||
|
not(de_rc_dst),
|
||||||
|
feature = "rc",
|
||||||
|
any(feature = "std", feature = "alloc")
|
||||||
|
))]
|
||||||
forwarded_impl! {
|
forwarded_impl! {
|
||||||
/// This impl requires the [`"rc"`] Cargo feature of Serde.
|
/// This impl requires the [`"rc"`] Cargo feature of Serde.
|
||||||
///
|
///
|
||||||
@@ -1540,7 +1618,11 @@ forwarded_impl! {
|
|||||||
(T), Arc<T>, Arc::new
|
(T), Arc<T>, Arc::new
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(all(not(de_rc_dst), feature = "rc", any(feature = "std", feature = "alloc")))]
|
#[cfg(all(
|
||||||
|
not(de_rc_dst),
|
||||||
|
feature = "rc",
|
||||||
|
any(feature = "std", feature = "alloc")
|
||||||
|
))]
|
||||||
forwarded_impl! {
|
forwarded_impl! {
|
||||||
/// This impl requires the [`"rc"`] Cargo feature of Serde.
|
/// This impl requires the [`"rc"`] Cargo feature of Serde.
|
||||||
///
|
///
|
||||||
@@ -1607,7 +1689,11 @@ where
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#[cfg(all(de_rc_dst, feature = "rc", any(feature = "std", feature = "alloc")))]
|
#[cfg(all(
|
||||||
|
de_rc_dst,
|
||||||
|
feature = "rc",
|
||||||
|
any(feature = "std", feature = "alloc")
|
||||||
|
))]
|
||||||
macro_rules! box_forwarded_impl {
|
macro_rules! box_forwarded_impl {
|
||||||
(
|
(
|
||||||
$(#[doc = $doc:tt])*
|
$(#[doc = $doc:tt])*
|
||||||
@@ -1628,7 +1714,11 @@ macro_rules! box_forwarded_impl {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(all(de_rc_dst, feature = "rc", any(feature = "std", feature = "alloc")))]
|
#[cfg(all(
|
||||||
|
de_rc_dst,
|
||||||
|
feature = "rc",
|
||||||
|
any(feature = "std", feature = "alloc")
|
||||||
|
))]
|
||||||
box_forwarded_impl! {
|
box_forwarded_impl! {
|
||||||
/// This impl requires the [`"rc"`] Cargo feature of Serde.
|
/// This impl requires the [`"rc"`] Cargo feature of Serde.
|
||||||
///
|
///
|
||||||
@@ -1640,7 +1730,11 @@ box_forwarded_impl! {
|
|||||||
Rc
|
Rc
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(all(de_rc_dst, feature = "rc", any(feature = "std", feature = "alloc")))]
|
#[cfg(all(
|
||||||
|
de_rc_dst,
|
||||||
|
feature = "rc",
|
||||||
|
any(feature = "std", feature = "alloc")
|
||||||
|
))]
|
||||||
box_forwarded_impl! {
|
box_forwarded_impl! {
|
||||||
/// This impl requires the [`"rc"`] Cargo feature of Serde.
|
/// This impl requires the [`"rc"`] Cargo feature of Serde.
|
||||||
///
|
///
|
||||||
@@ -1684,7 +1778,7 @@ forwarded_impl!((T), RwLock<T>, RwLock::new);
|
|||||||
// secs: u64,
|
// secs: u64,
|
||||||
// nanos: u32,
|
// nanos: u32,
|
||||||
// }
|
// }
|
||||||
#[cfg(feature = "std")]
|
#[cfg(any(core_duration, feature = "std"))]
|
||||||
impl<'de> Deserialize<'de> for Duration {
|
impl<'de> Deserialize<'de> for Duration {
|
||||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||||
where
|
where
|
||||||
@@ -1732,7 +1826,7 @@ impl<'de> Deserialize<'de> for Duration {
|
|||||||
b"secs" => Ok(Field::Secs),
|
b"secs" => Ok(Field::Secs),
|
||||||
b"nanos" => Ok(Field::Nanos),
|
b"nanos" => Ok(Field::Nanos),
|
||||||
_ => {
|
_ => {
|
||||||
let value = String::from_utf8_lossy(value);
|
let value = ::export::from_utf8_lossy(value);
|
||||||
Err(Error::unknown_field(&value, FIELDS))
|
Err(Error::unknown_field(&value, FIELDS))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1950,8 +2044,7 @@ impl<'de> Deserialize<'de> for SystemTime {
|
|||||||
// start: u64,
|
// start: u64,
|
||||||
// end: u32,
|
// end: u32,
|
||||||
// }
|
// }
|
||||||
#[cfg(feature = "std")]
|
impl<'de, Idx> Deserialize<'de> for Range<Idx>
|
||||||
impl<'de, Idx> Deserialize<'de> for ops::Range<Idx>
|
|
||||||
where
|
where
|
||||||
Idx: Deserialize<'de>,
|
Idx: Deserialize<'de>,
|
||||||
{
|
{
|
||||||
@@ -1959,134 +2052,165 @@ where
|
|||||||
where
|
where
|
||||||
D: Deserializer<'de>,
|
D: Deserializer<'de>,
|
||||||
{
|
{
|
||||||
// If this were outside of the serde crate, it would just use:
|
let (start, end) = deserializer.deserialize_struct(
|
||||||
//
|
|
||||||
// #[derive(Deserialize)]
|
|
||||||
// #[serde(field_identifier, rename_all = "lowercase")]
|
|
||||||
enum Field {
|
|
||||||
Start,
|
|
||||||
End,
|
|
||||||
};
|
|
||||||
|
|
||||||
impl<'de> Deserialize<'de> for Field {
|
|
||||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
|
||||||
where
|
|
||||||
D: Deserializer<'de>,
|
|
||||||
{
|
|
||||||
struct FieldVisitor;
|
|
||||||
|
|
||||||
impl<'de> Visitor<'de> for FieldVisitor {
|
|
||||||
type Value = Field;
|
|
||||||
|
|
||||||
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
formatter.write_str("`start` or `end`")
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
|
|
||||||
where
|
|
||||||
E: Error,
|
|
||||||
{
|
|
||||||
match value {
|
|
||||||
"start" => Ok(Field::Start),
|
|
||||||
"end" => Ok(Field::End),
|
|
||||||
_ => Err(Error::unknown_field(value, FIELDS)),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E>
|
|
||||||
where
|
|
||||||
E: Error,
|
|
||||||
{
|
|
||||||
match value {
|
|
||||||
b"start" => Ok(Field::Start),
|
|
||||||
b"end" => Ok(Field::End),
|
|
||||||
_ => {
|
|
||||||
let value = String::from_utf8_lossy(value);
|
|
||||||
Err(Error::unknown_field(&value, FIELDS))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
deserializer.deserialize_identifier(FieldVisitor)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct RangeVisitor<Idx> {
|
|
||||||
phantom: PhantomData<Idx>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'de, Idx> Visitor<'de> for RangeVisitor<Idx>
|
|
||||||
where
|
|
||||||
Idx: Deserialize<'de>,
|
|
||||||
{
|
|
||||||
type Value = ops::Range<Idx>;
|
|
||||||
|
|
||||||
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
formatter.write_str("struct Range")
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
|
|
||||||
where
|
|
||||||
A: SeqAccess<'de>,
|
|
||||||
{
|
|
||||||
let start: Idx = match try!(seq.next_element()) {
|
|
||||||
Some(value) => value,
|
|
||||||
None => {
|
|
||||||
return Err(Error::invalid_length(0, &self));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
let end: Idx = match try!(seq.next_element()) {
|
|
||||||
Some(value) => value,
|
|
||||||
None => {
|
|
||||||
return Err(Error::invalid_length(1, &self));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
Ok(start..end)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
|
|
||||||
where
|
|
||||||
A: MapAccess<'de>,
|
|
||||||
{
|
|
||||||
let mut start: Option<Idx> = None;
|
|
||||||
let mut end: Option<Idx> = None;
|
|
||||||
while let Some(key) = try!(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()));
|
|
||||||
}
|
|
||||||
Field::End => {
|
|
||||||
if end.is_some() {
|
|
||||||
return Err(<A::Error as Error>::duplicate_field("end"));
|
|
||||||
}
|
|
||||||
end = Some(try!(map.next_value()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let start = match start {
|
|
||||||
Some(start) => start,
|
|
||||||
None => return Err(<A::Error as Error>::missing_field("start")),
|
|
||||||
};
|
|
||||||
let end = match end {
|
|
||||||
Some(end) => end,
|
|
||||||
None => return Err(<A::Error as Error>::missing_field("end")),
|
|
||||||
};
|
|
||||||
Ok(start..end)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const FIELDS: &'static [&'static str] = &["start", "end"];
|
|
||||||
deserializer.deserialize_struct(
|
|
||||||
"Range",
|
"Range",
|
||||||
FIELDS,
|
range::FIELDS,
|
||||||
RangeVisitor {
|
range::RangeVisitor {
|
||||||
|
expecting: "struct Range",
|
||||||
phantom: PhantomData,
|
phantom: PhantomData,
|
||||||
},
|
},
|
||||||
)
|
)?;
|
||||||
|
Ok(start..end)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(range_inclusive)]
|
||||||
|
impl<'de, Idx> Deserialize<'de> for RangeInclusive<Idx>
|
||||||
|
where
|
||||||
|
Idx: Deserialize<'de>,
|
||||||
|
{
|
||||||
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||||
|
where
|
||||||
|
D: Deserializer<'de>,
|
||||||
|
{
|
||||||
|
let (start, end) = deserializer.deserialize_struct(
|
||||||
|
"RangeInclusive",
|
||||||
|
range::FIELDS,
|
||||||
|
range::RangeVisitor {
|
||||||
|
expecting: "struct RangeInclusive",
|
||||||
|
phantom: PhantomData,
|
||||||
|
},
|
||||||
|
)?;
|
||||||
|
Ok(RangeInclusive::new(start, end))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mod range {
|
||||||
|
use lib::*;
|
||||||
|
|
||||||
|
use de::{Deserialize, Deserializer, Error, MapAccess, SeqAccess, Visitor};
|
||||||
|
|
||||||
|
pub const FIELDS: &'static [&'static str] = &["start", "end"];
|
||||||
|
|
||||||
|
// If this were outside of the serde crate, it would just use:
|
||||||
|
//
|
||||||
|
// #[derive(Deserialize)]
|
||||||
|
// #[serde(field_identifier, rename_all = "lowercase")]
|
||||||
|
enum Field {
|
||||||
|
Start,
|
||||||
|
End,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'de> Deserialize<'de> for Field {
|
||||||
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||||
|
where
|
||||||
|
D: Deserializer<'de>,
|
||||||
|
{
|
||||||
|
struct FieldVisitor;
|
||||||
|
|
||||||
|
impl<'de> Visitor<'de> for FieldVisitor {
|
||||||
|
type Value = Field;
|
||||||
|
|
||||||
|
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
formatter.write_str("`start` or `end`")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
|
||||||
|
where
|
||||||
|
E: Error,
|
||||||
|
{
|
||||||
|
match value {
|
||||||
|
"start" => Ok(Field::Start),
|
||||||
|
"end" => Ok(Field::End),
|
||||||
|
_ => Err(Error::unknown_field(value, FIELDS)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E>
|
||||||
|
where
|
||||||
|
E: Error,
|
||||||
|
{
|
||||||
|
match value {
|
||||||
|
b"start" => Ok(Field::Start),
|
||||||
|
b"end" => Ok(Field::End),
|
||||||
|
_ => {
|
||||||
|
let value = ::export::from_utf8_lossy(value);
|
||||||
|
Err(Error::unknown_field(&value, FIELDS))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
deserializer.deserialize_identifier(FieldVisitor)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct RangeVisitor<Idx> {
|
||||||
|
pub expecting: &'static str,
|
||||||
|
pub phantom: PhantomData<Idx>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'de, Idx> Visitor<'de> for RangeVisitor<Idx>
|
||||||
|
where
|
||||||
|
Idx: Deserialize<'de>,
|
||||||
|
{
|
||||||
|
type Value = (Idx, Idx);
|
||||||
|
|
||||||
|
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
formatter.write_str(self.expecting)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
|
||||||
|
where
|
||||||
|
A: SeqAccess<'de>,
|
||||||
|
{
|
||||||
|
let start: Idx = match try!(seq.next_element()) {
|
||||||
|
Some(value) => value,
|
||||||
|
None => {
|
||||||
|
return Err(Error::invalid_length(0, &self));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let end: Idx = match try!(seq.next_element()) {
|
||||||
|
Some(value) => value,
|
||||||
|
None => {
|
||||||
|
return Err(Error::invalid_length(1, &self));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Ok((start, end))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
|
||||||
|
where
|
||||||
|
A: MapAccess<'de>,
|
||||||
|
{
|
||||||
|
let mut start: Option<Idx> = None;
|
||||||
|
let mut end: Option<Idx> = None;
|
||||||
|
while let Some(key) = try!(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()));
|
||||||
|
}
|
||||||
|
Field::End => {
|
||||||
|
if end.is_some() {
|
||||||
|
return Err(<A::Error as Error>::duplicate_field("end"));
|
||||||
|
}
|
||||||
|
end = Some(try!(map.next_value()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let start = match start {
|
||||||
|
Some(start) => start,
|
||||||
|
None => return Err(<A::Error as Error>::missing_field("start")),
|
||||||
|
};
|
||||||
|
let end = match end {
|
||||||
|
Some(end) => end,
|
||||||
|
None => return Err(<A::Error as Error>::missing_field("end")),
|
||||||
|
};
|
||||||
|
Ok((start, end))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+32
-32
@@ -24,8 +24,7 @@
|
|||||||
//!
|
//!
|
||||||
//! Additionally, Serde provides a procedural macro called [`serde_derive`] to
|
//! Additionally, Serde provides a procedural macro called [`serde_derive`] to
|
||||||
//! automatically generate [`Deserialize`] implementations for structs and enums
|
//! automatically generate [`Deserialize`] implementations for structs and enums
|
||||||
//! in your program. See the [codegen section of the manual] for how to use
|
//! in your program. See the [derive section of the manual] for how to use this.
|
||||||
//! this.
|
|
||||||
//!
|
//!
|
||||||
//! In rare cases it may be necessary to implement [`Deserialize`] manually for
|
//! In rare cases it may be necessary to implement [`Deserialize`] manually for
|
||||||
//! some type in your program. See the [Implementing `Deserialize`] section of
|
//! some type in your program. See the [Implementing `Deserialize`] section of
|
||||||
@@ -97,7 +96,9 @@
|
|||||||
//! - Path
|
//! - Path
|
||||||
//! - PathBuf
|
//! - PathBuf
|
||||||
//! - Range\<T\>
|
//! - Range\<T\>
|
||||||
|
//! - RangeInclusive\<T\>
|
||||||
//! - num::NonZero*
|
//! - num::NonZero*
|
||||||
|
//! - `!` *(unstable)*
|
||||||
//! - **Net types**:
|
//! - **Net types**:
|
||||||
//! - IpAddr
|
//! - IpAddr
|
||||||
//! - Ipv4Addr
|
//! - Ipv4Addr
|
||||||
@@ -115,7 +116,7 @@
|
|||||||
//! [`serde_derive`]: https://crates.io/crates/serde_derive
|
//! [`serde_derive`]: https://crates.io/crates/serde_derive
|
||||||
//! [`serde_json`]: https://github.com/serde-rs/json
|
//! [`serde_json`]: https://github.com/serde-rs/json
|
||||||
//! [`serde_yaml`]: https://github.com/dtolnay/serde-yaml
|
//! [`serde_yaml`]: https://github.com/dtolnay/serde-yaml
|
||||||
//! [codegen section of the manual]: https://serde.rs/codegen.html
|
//! [derive section of the manual]: https://serde.rs/derive.html
|
||||||
//! [data formats]: https://serde.rs/#data-formats
|
//! [data formats]: https://serde.rs/#data-formats
|
||||||
|
|
||||||
use lib::*;
|
use lib::*;
|
||||||
@@ -496,7 +497,7 @@ impl<'a> Display for Expected + 'a {
|
|||||||
///
|
///
|
||||||
/// Additionally, Serde provides a procedural macro called `serde_derive` to
|
/// Additionally, Serde provides a procedural macro called `serde_derive` to
|
||||||
/// automatically generate `Deserialize` implementations for structs and enums
|
/// automatically generate `Deserialize` implementations for structs and enums
|
||||||
/// in your program. See the [codegen section of the manual][codegen] for how to
|
/// in your program. See the [derive section of the manual][derive] for how to
|
||||||
/// use this.
|
/// use this.
|
||||||
///
|
///
|
||||||
/// In rare cases it may be necessary to implement `Deserialize` manually for
|
/// In rare cases it may be necessary to implement `Deserialize` manually for
|
||||||
@@ -509,7 +510,7 @@ impl<'a> Display for Expected + 'a {
|
|||||||
/// provides an implementation of `Deserialize` for it.
|
/// provides an implementation of `Deserialize` for it.
|
||||||
///
|
///
|
||||||
/// [de]: https://docs.serde.rs/serde/de/index.html
|
/// [de]: https://docs.serde.rs/serde/de/index.html
|
||||||
/// [codegen]: https://serde.rs/codegen.html
|
/// [derive]: https://serde.rs/derive.html
|
||||||
/// [impl-deserialize]: https://serde.rs/impl-deserialize.html
|
/// [impl-deserialize]: https://serde.rs/impl-deserialize.html
|
||||||
///
|
///
|
||||||
/// # Lifetime
|
/// # Lifetime
|
||||||
@@ -592,11 +593,7 @@ pub trait Deserialize<'de>: Sized {
|
|||||||
///
|
///
|
||||||
/// [Understanding deserializer lifetimes]: https://serde.rs/lifetimes.html
|
/// [Understanding deserializer lifetimes]: https://serde.rs/lifetimes.html
|
||||||
pub trait DeserializeOwned: for<'de> Deserialize<'de> {}
|
pub trait DeserializeOwned: for<'de> Deserialize<'de> {}
|
||||||
impl<T> DeserializeOwned for T
|
impl<T> DeserializeOwned for T where T: for<'de> Deserialize<'de> {}
|
||||||
where
|
|
||||||
T: for<'de> Deserialize<'de>,
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// `DeserializeSeed` is the stateful form of the `Deserialize` trait. If you
|
/// `DeserializeSeed` is the stateful form of the `Deserialize` trait. If you
|
||||||
/// ever find yourself looking for a way to pass data into a `Deserialize` impl,
|
/// ever find yourself looking for a way to pass data into a `Deserialize` impl,
|
||||||
@@ -662,7 +659,7 @@ where
|
|||||||
/// use std::fmt;
|
/// use std::fmt;
|
||||||
/// use std::marker::PhantomData;
|
/// use std::marker::PhantomData;
|
||||||
///
|
///
|
||||||
/// use serde::de::{Deserialize, DeserializeSeed, Deserializer, Visitor, SeqAccess};
|
/// use serde::de::{Deserialize, DeserializeSeed, Deserializer, SeqAccess, Visitor};
|
||||||
///
|
///
|
||||||
/// // A DeserializeSeed implementation that uses stateful deserialization to
|
/// // A DeserializeSeed implementation that uses stateful deserialization to
|
||||||
/// // append array elements onto the end of an existing vector. The preexisting
|
/// // append array elements onto the end of an existing vector. The preexisting
|
||||||
@@ -809,16 +806,16 @@ where
|
|||||||
/// - When serializing, all strings are handled equally. When deserializing,
|
/// - When serializing, all strings are handled equally. When deserializing,
|
||||||
/// there are three flavors of strings: transient, owned, and borrowed.
|
/// there are three flavors of strings: transient, owned, and borrowed.
|
||||||
/// - **byte array** - \[u8\]
|
/// - **byte array** - \[u8\]
|
||||||
/// - Similar to strings, during deserialization byte arrays can be transient,
|
/// - Similar to strings, during deserialization byte arrays can be
|
||||||
/// owned, or borrowed.
|
/// transient, owned, or borrowed.
|
||||||
/// - **option**
|
/// - **option**
|
||||||
/// - Either none or some value.
|
/// - Either none or some value.
|
||||||
/// - **unit**
|
/// - **unit**
|
||||||
/// - The type of `()` in Rust. It represents an anonymous value containing no
|
/// - The type of `()` in Rust. It represents an anonymous value containing
|
||||||
/// data.
|
/// no data.
|
||||||
/// - **unit_struct**
|
/// - **unit_struct**
|
||||||
/// - For example `struct Unit` or `PhantomData<T>`. It represents a named value
|
/// - For example `struct Unit` or `PhantomData<T>`. It represents a named
|
||||||
/// containing no data.
|
/// value containing no data.
|
||||||
/// - **unit_variant**
|
/// - **unit_variant**
|
||||||
/// - For example the `E::A` and `E::B` in `enum E { A, B }`.
|
/// - For example the `E::A` and `E::B` in `enum E { A, B }`.
|
||||||
/// - **newtype_struct**
|
/// - **newtype_struct**
|
||||||
@@ -826,14 +823,15 @@ where
|
|||||||
/// - **newtype_variant**
|
/// - **newtype_variant**
|
||||||
/// - For example the `E::N` in `enum E { N(u8) }`.
|
/// - For example the `E::N` in `enum E { N(u8) }`.
|
||||||
/// - **seq**
|
/// - **seq**
|
||||||
/// - A variably sized heterogeneous sequence of values, for example `Vec<T>` or
|
/// - A variably sized heterogeneous sequence of values, for example `Vec<T>`
|
||||||
/// `HashSet<T>`. When serializing, the length may or may not be known before
|
/// or `HashSet<T>`. When serializing, the length may or may not be known
|
||||||
/// iterating through all the data. When deserializing, the length is determined
|
/// before iterating through all the data. When deserializing, the length
|
||||||
/// by looking at the serialized data.
|
/// is determined by looking at the serialized data.
|
||||||
/// - **tuple**
|
/// - **tuple**
|
||||||
/// - A statically sized heterogeneous sequence of values for which the length
|
/// - A statically sized heterogeneous sequence of values for which the
|
||||||
/// will be known at deserialization time without looking at the serialized
|
/// length will be known at deserialization time without looking at the
|
||||||
/// data, for example `(u8,)` or `(String, u64, Vec<T>)` or `[u64; 10]`.
|
/// serialized data, for example `(u8,)` or `(String, u64, Vec<T>)` or
|
||||||
|
/// `[u64; 10]`.
|
||||||
/// - **tuple_struct**
|
/// - **tuple_struct**
|
||||||
/// - A named tuple, for example `struct Rgb(u8, u8, u8)`.
|
/// - A named tuple, for example `struct Rgb(u8, u8, u8)`.
|
||||||
/// - **tuple_variant**
|
/// - **tuple_variant**
|
||||||
@@ -841,9 +839,9 @@ where
|
|||||||
/// - **map**
|
/// - **map**
|
||||||
/// - A heterogeneous key-value pairing, for example `BTreeMap<K, V>`.
|
/// - A heterogeneous key-value pairing, for example `BTreeMap<K, V>`.
|
||||||
/// - **struct**
|
/// - **struct**
|
||||||
/// - A heterogeneous key-value pairing in which the keys are strings and will be
|
/// - A heterogeneous key-value pairing in which the keys are strings and
|
||||||
/// known at deserialization time without looking at the serialized data, for
|
/// will be known at deserialization time without looking at the serialized
|
||||||
/// example `struct S { r: u8, g: u8, b: u8 }`.
|
/// data, for example `struct S { r: u8, g: u8, b: u8 }`.
|
||||||
/// - **struct_variant**
|
/// - **struct_variant**
|
||||||
/// - For example the `E::S` in `enum E { S { r: u8, g: u8, b: u8 } }`.
|
/// - For example the `E::S` in `enum E { S { r: u8, g: u8, b: u8 } }`.
|
||||||
///
|
///
|
||||||
@@ -858,7 +856,8 @@ where
|
|||||||
/// type it sees in the input. JSON uses this approach when deserializing
|
/// type it sees in the input. JSON uses this approach when deserializing
|
||||||
/// `serde_json::Value` which is an enum that can represent any JSON
|
/// `serde_json::Value` which is an enum that can represent any JSON
|
||||||
/// document. Without knowing what is in a JSON document, we can deserialize
|
/// document. Without knowing what is in a JSON document, we can deserialize
|
||||||
/// it to `serde_json::Value` by going through `Deserializer::deserialize_any`.
|
/// it to `serde_json::Value` by going through
|
||||||
|
/// `Deserializer::deserialize_any`.
|
||||||
///
|
///
|
||||||
/// 2. The various `deserialize_*` methods. Non-self-describing formats like
|
/// 2. The various `deserialize_*` methods. Non-self-describing formats like
|
||||||
/// Bincode need to be told what is in the input in order to deserialize it.
|
/// Bincode need to be told what is in the input in order to deserialize it.
|
||||||
@@ -868,10 +867,11 @@ where
|
|||||||
/// `Deserializer::deserialize_any`.
|
/// `Deserializer::deserialize_any`.
|
||||||
///
|
///
|
||||||
/// When implementing `Deserialize`, you should avoid relying on
|
/// When implementing `Deserialize`, you should avoid relying on
|
||||||
/// `Deserializer::deserialize_any` unless you need to be told by the Deserializer
|
/// `Deserializer::deserialize_any` unless you need to be told by the
|
||||||
/// what type is in the input. Know that relying on `Deserializer::deserialize_any`
|
/// Deserializer what type is in the input. Know that relying on
|
||||||
/// means your data type will be able to deserialize from self-describing
|
/// `Deserializer::deserialize_any` means your data type will be able to
|
||||||
/// formats only, ruling out Bincode and many others.
|
/// deserialize from self-describing formats only, ruling out Bincode and many
|
||||||
|
/// others.
|
||||||
///
|
///
|
||||||
/// [Serde data model]: https://serde.rs/data-model.html
|
/// [Serde data model]: https://serde.rs/data-model.html
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -176,6 +176,48 @@ where
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/// A deserializer that cannot be instantiated.
|
||||||
|
#[cfg(feature = "unstable")]
|
||||||
|
pub struct NeverDeserializer<E> {
|
||||||
|
never: !,
|
||||||
|
marker: PhantomData<E>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "unstable")]
|
||||||
|
impl<'de, E> IntoDeserializer<'de, E> for !
|
||||||
|
where
|
||||||
|
E: de::Error,
|
||||||
|
{
|
||||||
|
type Deserializer = NeverDeserializer<E>;
|
||||||
|
|
||||||
|
fn into_deserializer(self) -> Self::Deserializer {
|
||||||
|
self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "unstable")]
|
||||||
|
impl<'de, E> de::Deserializer<'de> for NeverDeserializer<E>
|
||||||
|
where
|
||||||
|
E: de::Error,
|
||||||
|
{
|
||||||
|
type Error = E;
|
||||||
|
|
||||||
|
fn deserialize_any<V>(self, _visitor: V) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
self.never
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
macro_rules! primitive_deserializer {
|
macro_rules! primitive_deserializer {
|
||||||
($ty:ty, $doc:tt, $name:ident, $method:ident $($cast:tt)*) => {
|
($ty:ty, $doc:tt, $name:ident, $method:ident $($cast:tt)*) => {
|
||||||
#[doc = "A deserializer holding"]
|
#[doc = "A deserializer holding"]
|
||||||
|
|||||||
+27
-9
@@ -82,22 +82,29 @@
|
|||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// 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.64")]
|
#![doc(html_root_url = "https://docs.rs/serde/1.0.73")]
|
||||||
// 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
|
||||||
// discussion of these features please refer to this issue:
|
// discussion of these features please refer to this issue:
|
||||||
//
|
//
|
||||||
// https://github.com/serde-rs/serde/issues/812
|
// https://github.com/serde-rs/serde/issues/812
|
||||||
#![cfg_attr(feature = "unstable", feature(specialization))]
|
#![cfg_attr(feature = "unstable", feature(specialization, never_type))]
|
||||||
#![cfg_attr(feature = "alloc", feature(alloc))]
|
#![cfg_attr(feature = "alloc", feature(alloc))]
|
||||||
#![cfg_attr(feature = "cargo-clippy", deny(clippy, clippy_pedantic))]
|
#![cfg_attr(feature = "cargo-clippy", deny(clippy, clippy_pedantic))]
|
||||||
// Whitelisted clippy lints
|
// Whitelisted clippy lints
|
||||||
#![cfg_attr(
|
#![cfg_attr(
|
||||||
feature = "cargo-clippy",
|
feature = "cargo-clippy",
|
||||||
allow(
|
allow(
|
||||||
cast_lossless, const_static_lifetime, doc_markdown, linkedlist, needless_pass_by_value,
|
cast_lossless,
|
||||||
redundant_field_names, type_complexity, unreadable_literal, zero_prefixed_literal
|
const_static_lifetime,
|
||||||
|
doc_markdown,
|
||||||
|
linkedlist,
|
||||||
|
needless_pass_by_value,
|
||||||
|
redundant_field_names,
|
||||||
|
type_complexity,
|
||||||
|
unreadable_literal,
|
||||||
|
zero_prefixed_literal
|
||||||
)
|
)
|
||||||
)]
|
)]
|
||||||
// Whitelisted clippy_pedantic lints
|
// Whitelisted clippy_pedantic lints
|
||||||
@@ -118,6 +125,7 @@
|
|||||||
stutter,
|
stutter,
|
||||||
use_self,
|
use_self,
|
||||||
// not practical
|
// not practical
|
||||||
|
indexing_slicing,
|
||||||
many_single_char_names,
|
many_single_char_names,
|
||||||
missing_docs_in_private_items,
|
missing_docs_in_private_items,
|
||||||
similar_names,
|
similar_names,
|
||||||
@@ -126,7 +134,10 @@
|
|||||||
use_debug,
|
use_debug,
|
||||||
))]
|
))]
|
||||||
// Blacklisted Rust lints.
|
// Blacklisted Rust lints.
|
||||||
#![deny(missing_docs, unused_imports)]
|
//
|
||||||
|
// Compiler bug involving unused_imports:
|
||||||
|
// https://github.com/rust-lang/rust/issues/51661
|
||||||
|
#![deny(missing_docs, /*unused_imports*/)]
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@@ -144,7 +155,7 @@ mod lib {
|
|||||||
pub use std::*;
|
pub use std::*;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub use self::core::{cmp, iter, mem, num, ops, slice, str};
|
pub use self::core::{cmp, iter, mem, num, slice, str};
|
||||||
pub use self::core::{f32, f64};
|
pub use self::core::{f32, f64};
|
||||||
pub use self::core::{i16, i32, i64, i8, isize};
|
pub use self::core::{i16, i32, i64, i8, isize};
|
||||||
pub use self::core::{u16, u32, u64, u8, usize};
|
pub use self::core::{u16, u32, u64, u8, usize};
|
||||||
@@ -155,6 +166,7 @@ mod lib {
|
|||||||
pub use self::core::default::{self, Default};
|
pub use self::core::default::{self, Default};
|
||||||
pub use self::core::fmt::{self, Debug, Display};
|
pub use self::core::fmt::{self, Debug, Display};
|
||||||
pub use self::core::marker::{self, PhantomData};
|
pub use self::core::marker::{self, PhantomData};
|
||||||
|
pub use self::core::ops::Range;
|
||||||
pub use self::core::option::{self, Option};
|
pub use self::core::option::{self, Option};
|
||||||
pub use self::core::result::{self, Result};
|
pub use self::core::result::{self, Result};
|
||||||
|
|
||||||
@@ -184,12 +196,12 @@ mod lib {
|
|||||||
pub use std::rc::{Rc, Weak as RcWeak};
|
pub use std::rc::{Rc, Weak as RcWeak};
|
||||||
|
|
||||||
#[cfg(all(feature = "rc", feature = "alloc", not(feature = "std")))]
|
#[cfg(all(feature = "rc", feature = "alloc", not(feature = "std")))]
|
||||||
pub use alloc::arc::{Arc, Weak as ArcWeak};
|
pub use alloc::sync::{Arc, Weak as ArcWeak};
|
||||||
#[cfg(all(feature = "rc", feature = "std"))]
|
#[cfg(all(feature = "rc", feature = "std"))]
|
||||||
pub use std::sync::{Arc, Weak as ArcWeak};
|
pub use std::sync::{Arc, Weak as ArcWeak};
|
||||||
|
|
||||||
#[cfg(all(feature = "alloc", not(feature = "std")))]
|
#[cfg(all(feature = "alloc", not(feature = "std")))]
|
||||||
pub use alloc::{BTreeMap, BTreeSet, BinaryHeap, LinkedList, VecDeque};
|
pub use alloc::collections::{BTreeMap, BTreeSet, BinaryHeap, LinkedList, VecDeque};
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
pub use std::collections::{BTreeMap, BTreeSet, BinaryHeap, LinkedList, VecDeque};
|
pub use std::collections::{BTreeMap, BTreeSet, BinaryHeap, LinkedList, VecDeque};
|
||||||
|
|
||||||
@@ -211,7 +223,13 @@ mod lib {
|
|||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
pub use std::sync::{Mutex, RwLock};
|
pub use std::sync::{Mutex, RwLock};
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
pub use std::time::{Duration, SystemTime, UNIX_EPOCH};
|
pub use std::time::{SystemTime, UNIX_EPOCH};
|
||||||
|
|
||||||
|
#[cfg(any(core_duration, feature = "std"))]
|
||||||
|
pub use self::core::time::Duration;
|
||||||
|
|
||||||
|
#[cfg(range_inclusive)]
|
||||||
|
pub use self::core::ops::RangeInclusive;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
+2
-2
@@ -128,7 +128,7 @@
|
|||||||
/// [`Deserializer`]: trait.Deserializer.html
|
/// [`Deserializer`]: trait.Deserializer.html
|
||||||
/// [`Visitor`]: de/trait.Visitor.html
|
/// [`Visitor`]: de/trait.Visitor.html
|
||||||
/// [`Deserializer::deserialize_any`]: trait.Deserializer.html#tymethod.deserialize_any
|
/// [`Deserializer::deserialize_any`]: trait.Deserializer.html#tymethod.deserialize_any
|
||||||
#[macro_export]
|
#[macro_export(local_inner_macros)]
|
||||||
macro_rules! forward_to_deserialize_any {
|
macro_rules! forward_to_deserialize_any {
|
||||||
(<$visitor:ident: Visitor<$lifetime:tt>> $($func:ident)*) => {
|
(<$visitor:ident: Visitor<$lifetime:tt>> $($func:ident)*) => {
|
||||||
$(forward_to_deserialize_any_helper!{$func<$lifetime, $visitor>})*
|
$(forward_to_deserialize_any_helper!{$func<$lifetime, $visitor>})*
|
||||||
@@ -157,7 +157,7 @@ macro_rules! forward_to_deserialize_any_method {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
#[macro_export]
|
#[macro_export(local_inner_macros)]
|
||||||
macro_rules! forward_to_deserialize_any_helper {
|
macro_rules! forward_to_deserialize_any_helper {
|
||||||
(bool<$l:tt, $v:ident>) => {
|
(bool<$l:tt, $v:ident>) => {
|
||||||
forward_to_deserialize_any_method!{deserialize_bool<$l, $v>()}
|
forward_to_deserialize_any_method!{deserialize_bool<$l, $v>()}
|
||||||
|
|||||||
+67
-21
@@ -832,8 +832,8 @@ mod content {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'de, T> TaggedContentVisitor<'de, T> {
|
impl<'de, T> TaggedContentVisitor<'de, T> {
|
||||||
/// Visitor for the content of an internally tagged enum with the given tag
|
/// Visitor for the content of an internally tagged enum with the given
|
||||||
/// name.
|
/// tag name.
|
||||||
pub fn new(name: &'static str) -> Self {
|
pub fn new(name: &'static str) -> Self {
|
||||||
TaggedContentVisitor {
|
TaggedContentVisitor {
|
||||||
tag_name: name,
|
tag_name: name,
|
||||||
@@ -1075,8 +1075,8 @@ mod content {
|
|||||||
Ok(value)
|
Ok(value)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Used when deserializing an internally tagged enum because the content will
|
/// Used when deserializing an internally tagged enum because the content
|
||||||
/// be used exactly once.
|
/// will be used exactly once.
|
||||||
impl<'de, E> Deserializer<'de> for ContentDeserializer<'de, E>
|
impl<'de, E> Deserializer<'de> for ContentDeserializer<'de, E>
|
||||||
where
|
where
|
||||||
E: de::Error,
|
E: de::Error,
|
||||||
@@ -1790,8 +1790,8 @@ mod content {
|
|||||||
Ok(value)
|
Ok(value)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Used when deserializing an untagged enum because the content may need to be
|
/// Used when deserializing an untagged enum because the content may need
|
||||||
/// used more than once.
|
/// to be used more than once.
|
||||||
impl<'de, 'a, E> Deserializer<'de> for ContentRefDeserializer<'a, 'de, E>
|
impl<'de, 'a, E> Deserializer<'de> for ContentRefDeserializer<'a, 'de, E>
|
||||||
where
|
where
|
||||||
E: de::Error,
|
E: de::Error,
|
||||||
@@ -2723,7 +2723,7 @@ where
|
|||||||
where
|
where
|
||||||
V: Visitor<'de>,
|
V: Visitor<'de>,
|
||||||
{
|
{
|
||||||
visitor.visit_map(FlatMapAccess::new(self.0.iter_mut(), None))
|
visitor.visit_map(FlatMapAccess::new(self.0.iter()))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn deserialize_struct<V>(
|
fn deserialize_struct<V>(
|
||||||
@@ -2735,7 +2735,7 @@ where
|
|||||||
where
|
where
|
||||||
V: Visitor<'de>,
|
V: Visitor<'de>,
|
||||||
{
|
{
|
||||||
visitor.visit_map(FlatMapAccess::new(self.0.iter_mut(), Some(fields)))
|
visitor.visit_map(FlatStructAccess::new(self.0.iter_mut(), fields))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn deserialize_newtype_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value, Self::Error>
|
fn deserialize_newtype_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
@@ -2784,22 +2784,19 @@ where
|
|||||||
|
|
||||||
#[cfg(any(feature = "std", feature = "alloc"))]
|
#[cfg(any(feature = "std", feature = "alloc"))]
|
||||||
pub struct FlatMapAccess<'a, 'de: 'a, E> {
|
pub struct FlatMapAccess<'a, 'de: 'a, E> {
|
||||||
iter: slice::IterMut<'a, Option<(Content<'de>, Content<'de>)>>,
|
iter: slice::Iter<'a, Option<(Content<'de>, Content<'de>)>>,
|
||||||
pending_content: Option<Content<'de>>,
|
pending_content: Option<&'a Content<'de>>,
|
||||||
fields: Option<&'static [&'static str]>,
|
|
||||||
_marker: PhantomData<E>,
|
_marker: PhantomData<E>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(any(feature = "std", feature = "alloc"))]
|
#[cfg(any(feature = "std", feature = "alloc"))]
|
||||||
impl<'a, 'de, E> FlatMapAccess<'a, 'de, E> {
|
impl<'a, 'de, E> FlatMapAccess<'a, 'de, E> {
|
||||||
fn new(
|
fn new(
|
||||||
iter: slice::IterMut<'a, Option<(Content<'de>, Content<'de>)>>,
|
iter: slice::Iter<'a, Option<(Content<'de>, Content<'de>)>>,
|
||||||
fields: Option<&'static [&'static str]>,
|
|
||||||
) -> FlatMapAccess<'a, 'de, E> {
|
) -> FlatMapAccess<'a, 'de, E> {
|
||||||
FlatMapAccess {
|
FlatMapAccess {
|
||||||
iter: iter,
|
iter: iter,
|
||||||
pending_content: None,
|
pending_content: None,
|
||||||
fields: fields,
|
|
||||||
_marker: PhantomData,
|
_marker: PhantomData,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2812,6 +2809,61 @@ where
|
|||||||
{
|
{
|
||||||
type Error = E;
|
type Error = E;
|
||||||
|
|
||||||
|
fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
|
||||||
|
where
|
||||||
|
T: DeserializeSeed<'de>,
|
||||||
|
{
|
||||||
|
while let Some(item) = self.iter.next() {
|
||||||
|
// Items in the vector are nulled out when used by a struct.
|
||||||
|
if let Some((ref key, ref content)) = *item {
|
||||||
|
self.pending_content = Some(content);
|
||||||
|
return seed.deserialize(ContentRefDeserializer::new(key)).map(Some);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(None)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error>
|
||||||
|
where
|
||||||
|
T: DeserializeSeed<'de>,
|
||||||
|
{
|
||||||
|
match self.pending_content.take() {
|
||||||
|
Some(value) => seed.deserialize(ContentRefDeserializer::new(value)),
|
||||||
|
None => Err(Error::custom("value is missing")),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(any(feature = "std", feature = "alloc"))]
|
||||||
|
pub struct FlatStructAccess<'a, 'de: 'a, E> {
|
||||||
|
iter: slice::IterMut<'a, Option<(Content<'de>, Content<'de>)>>,
|
||||||
|
pending_content: Option<Content<'de>>,
|
||||||
|
fields: &'static [&'static str],
|
||||||
|
_marker: PhantomData<E>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(any(feature = "std", feature = "alloc"))]
|
||||||
|
impl<'a, 'de, E> FlatStructAccess<'a, 'de, E> {
|
||||||
|
fn new(
|
||||||
|
iter: slice::IterMut<'a, Option<(Content<'de>, Content<'de>)>>,
|
||||||
|
fields: &'static [&'static str],
|
||||||
|
) -> FlatStructAccess<'a, 'de, E> {
|
||||||
|
FlatStructAccess {
|
||||||
|
iter: iter,
|
||||||
|
pending_content: None,
|
||||||
|
fields: fields,
|
||||||
|
_marker: PhantomData,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(any(feature = "std", feature = "alloc"))]
|
||||||
|
impl<'a, 'de, E> MapAccess<'de> for FlatStructAccess<'a, 'de, E>
|
||||||
|
where
|
||||||
|
E: Error,
|
||||||
|
{
|
||||||
|
type Error = E;
|
||||||
|
|
||||||
fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
|
fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
|
||||||
where
|
where
|
||||||
T: DeserializeSeed<'de>,
|
T: DeserializeSeed<'de>,
|
||||||
@@ -2822,13 +2874,7 @@ where
|
|||||||
// about. In case we do not know which fields we want, we take them all.
|
// about. In case we do not know which fields we want, we take them all.
|
||||||
let use_item = match *item {
|
let use_item = match *item {
|
||||||
None => false,
|
None => false,
|
||||||
Some((ref c, _)) => c.as_str().map_or(self.fields.is_none(), |key| {
|
Some((ref c, _)) => c.as_str().map_or(false, |key| self.fields.contains(&key)),
|
||||||
match self.fields {
|
|
||||||
None => true,
|
|
||||||
Some(fields) if fields.contains(&key) => true,
|
|
||||||
_ => false,
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if use_item {
|
if use_item {
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ macro_rules! __private_deserialize {
|
|||||||
|
|
||||||
/// Used only by Serde doc tests. Not public API.
|
/// Used only by Serde doc tests. Not public API.
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
#[macro_export]
|
#[macro_export(local_inner_macros)]
|
||||||
macro_rules! __serialize_unimplemented {
|
macro_rules! __serialize_unimplemented {
|
||||||
($($func:ident)*) => {
|
($($func:ident)*) => {
|
||||||
$(
|
$(
|
||||||
@@ -52,7 +52,7 @@ macro_rules! __serialize_unimplemented_method {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
#[macro_export]
|
#[macro_export(local_inner_macros)]
|
||||||
macro_rules! __serialize_unimplemented_helper {
|
macro_rules! __serialize_unimplemented_helper {
|
||||||
(bool) => {
|
(bool) => {
|
||||||
__serialize_unimplemented_method!(serialize_bool(bool) -> Ok);
|
__serialize_unimplemented_method!(serialize_bool(bool) -> Ok);
|
||||||
|
|||||||
+45
-8
@@ -8,10 +8,7 @@
|
|||||||
|
|
||||||
use lib::*;
|
use lib::*;
|
||||||
|
|
||||||
use ser::{Serialize, SerializeTuple, Serializer};
|
use ser::{Error, Serialize, SerializeTuple, Serializer};
|
||||||
|
|
||||||
#[cfg(feature = "std")]
|
|
||||||
use ser::Error;
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@@ -72,6 +69,15 @@ impl Serialize for String {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'a> Serialize for fmt::Arguments<'a> {
|
||||||
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
|
where
|
||||||
|
S: Serializer,
|
||||||
|
{
|
||||||
|
serializer.collect_str(self)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
@@ -221,8 +227,7 @@ seq_impl!(VecDeque<T>);
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#[cfg(feature = "std")]
|
impl<Idx> Serialize for Range<Idx>
|
||||||
impl<Idx> Serialize for ops::Range<Idx>
|
|
||||||
where
|
where
|
||||||
Idx: Serialize,
|
Idx: Serialize,
|
||||||
{
|
{
|
||||||
@@ -240,6 +245,25 @@ where
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#[cfg(range_inclusive)]
|
||||||
|
impl<Idx> Serialize for RangeInclusive<Idx>
|
||||||
|
where
|
||||||
|
Idx: Serialize,
|
||||||
|
{
|
||||||
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
|
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()));
|
||||||
|
state.end()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
impl Serialize for () {
|
impl Serialize for () {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
@@ -250,6 +274,16 @@ impl Serialize for () {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "unstable")]
|
||||||
|
impl Serialize for ! {
|
||||||
|
fn serialize<S>(&self, _serializer: S) -> Result<S::Ok, S::Error>
|
||||||
|
where
|
||||||
|
S: Serializer,
|
||||||
|
{
|
||||||
|
*self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
macro_rules! tuple_impls {
|
macro_rules! tuple_impls {
|
||||||
@@ -459,7 +493,10 @@ where
|
|||||||
where
|
where
|
||||||
S: Serializer,
|
S: Serializer,
|
||||||
{
|
{
|
||||||
self.borrow().serialize(serializer)
|
match self.try_borrow() {
|
||||||
|
Ok(value) => value.serialize(serializer),
|
||||||
|
Err(_) => Err(S::Error::custom("already mutably borrowed")),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -517,7 +554,7 @@ where
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#[cfg(feature = "std")]
|
#[cfg(any(core_duration, feature = "std"))]
|
||||||
impl Serialize for Duration {
|
impl Serialize for Duration {
|
||||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
where
|
where
|
||||||
|
|||||||
+46
-36
@@ -24,8 +24,7 @@
|
|||||||
//!
|
//!
|
||||||
//! Additionally, Serde provides a procedural macro called [`serde_derive`] to
|
//! Additionally, Serde provides a procedural macro called [`serde_derive`] to
|
||||||
//! automatically generate [`Serialize`] implementations for structs and enums
|
//! automatically generate [`Serialize`] implementations for structs and enums
|
||||||
//! in your program. See the [codegen section of the manual] for how to use
|
//! in your program. See the [derive section of the manual] for how to use this.
|
||||||
//! this.
|
|
||||||
//!
|
//!
|
||||||
//! In rare cases it may be necessary to implement [`Serialize`] manually for
|
//! In rare cases it may be necessary to implement [`Serialize`] manually for
|
||||||
//! some type in your program. See the [Implementing `Serialize`] section of the
|
//! some type in your program. See the [Implementing `Serialize`] section of the
|
||||||
@@ -92,7 +91,9 @@
|
|||||||
//! - Path
|
//! - Path
|
||||||
//! - PathBuf
|
//! - PathBuf
|
||||||
//! - Range\<T\>
|
//! - Range\<T\>
|
||||||
|
//! - RangeInclusive\<T\>
|
||||||
//! - num::NonZero*
|
//! - num::NonZero*
|
||||||
|
//! - `!` *(unstable)*
|
||||||
//! - **Net types**:
|
//! - **Net types**:
|
||||||
//! - IpAddr
|
//! - IpAddr
|
||||||
//! - Ipv4Addr
|
//! - Ipv4Addr
|
||||||
@@ -110,7 +111,7 @@
|
|||||||
//! [`serde_derive`]: https://crates.io/crates/serde_derive
|
//! [`serde_derive`]: https://crates.io/crates/serde_derive
|
||||||
//! [`serde_json`]: https://github.com/serde-rs/json
|
//! [`serde_json`]: https://github.com/serde-rs/json
|
||||||
//! [`serde_yaml`]: https://github.com/dtolnay/serde-yaml
|
//! [`serde_yaml`]: https://github.com/dtolnay/serde-yaml
|
||||||
//! [codegen section of the manual]: https://serde.rs/codegen.html
|
//! [derive section of the manual]: https://serde.rs/derive.html
|
||||||
//! [data formats]: https://serde.rs/#data-formats
|
//! [data formats]: https://serde.rs/#data-formats
|
||||||
|
|
||||||
use lib::*;
|
use lib::*;
|
||||||
@@ -194,7 +195,7 @@ declare_error_trait!(Error: Sized + Debug + Display);
|
|||||||
///
|
///
|
||||||
/// Additionally, Serde provides a procedural macro called [`serde_derive`] to
|
/// Additionally, Serde provides a procedural macro called [`serde_derive`] to
|
||||||
/// automatically generate `Serialize` implementations for structs and enums in
|
/// automatically generate `Serialize` implementations for structs and enums in
|
||||||
/// your program. See the [codegen section of the manual] for how to use this.
|
/// your program. See the [derive section of the manual] for how to use this.
|
||||||
///
|
///
|
||||||
/// In rare cases it may be necessary to implement `Serialize` manually for some
|
/// In rare cases it may be necessary to implement `Serialize` manually for some
|
||||||
/// type in your program. See the [Implementing `Serialize`] section of the
|
/// type in your program. See the [Implementing `Serialize`] section of the
|
||||||
@@ -209,7 +210,7 @@ declare_error_trait!(Error: Sized + Debug + Display);
|
|||||||
/// [`LinkedHashMap<K, V>`]: https://docs.rs/linked-hash-map/*/linked_hash_map/struct.LinkedHashMap.html
|
/// [`LinkedHashMap<K, V>`]: https://docs.rs/linked-hash-map/*/linked_hash_map/struct.LinkedHashMap.html
|
||||||
/// [`linked-hash-map`]: https://crates.io/crates/linked-hash-map
|
/// [`linked-hash-map`]: https://crates.io/crates/linked-hash-map
|
||||||
/// [`serde_derive`]: https://crates.io/crates/serde_derive
|
/// [`serde_derive`]: https://crates.io/crates/serde_derive
|
||||||
/// [codegen section of the manual]: https://serde.rs/codegen.html
|
/// [derive section of the manual]: https://serde.rs/derive.html
|
||||||
/// [ser]: https://docs.serde.rs/serde/ser/index.html
|
/// [ser]: https://docs.serde.rs/serde/ser/index.html
|
||||||
pub trait Serialize {
|
pub trait Serialize {
|
||||||
/// Serialize this value into the given Serde serializer.
|
/// Serialize this value into the given Serde serializer.
|
||||||
@@ -218,7 +219,7 @@ pub trait Serialize {
|
|||||||
/// information about how to implement this method.
|
/// information about how to implement this method.
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust
|
||||||
/// use serde::ser::{Serialize, Serializer, SerializeStruct};
|
/// use serde::ser::{Serialize, SerializeStruct, Serializer};
|
||||||
///
|
///
|
||||||
/// struct Person {
|
/// struct Person {
|
||||||
/// name: String,
|
/// name: String,
|
||||||
@@ -272,16 +273,16 @@ pub trait Serialize {
|
|||||||
/// - When serializing, all strings are handled equally. When deserializing,
|
/// - When serializing, all strings are handled equally. When deserializing,
|
||||||
/// there are three flavors of strings: transient, owned, and borrowed.
|
/// there are three flavors of strings: transient, owned, and borrowed.
|
||||||
/// - **byte array** - \[u8\]
|
/// - **byte array** - \[u8\]
|
||||||
/// - Similar to strings, during deserialization byte arrays can be transient,
|
/// - Similar to strings, during deserialization byte arrays can be
|
||||||
/// owned, or borrowed.
|
/// transient, owned, or borrowed.
|
||||||
/// - **option**
|
/// - **option**
|
||||||
/// - Either none or some value.
|
/// - Either none or some value.
|
||||||
/// - **unit**
|
/// - **unit**
|
||||||
/// - The type of `()` in Rust. It represents an anonymous value containing no
|
/// - The type of `()` in Rust. It represents an anonymous value containing
|
||||||
/// data.
|
/// no data.
|
||||||
/// - **unit_struct**
|
/// - **unit_struct**
|
||||||
/// - For example `struct Unit` or `PhantomData<T>`. It represents a named value
|
/// - For example `struct Unit` or `PhantomData<T>`. It represents a named
|
||||||
/// containing no data.
|
/// value containing no data.
|
||||||
/// - **unit_variant**
|
/// - **unit_variant**
|
||||||
/// - For example the `E::A` and `E::B` in `enum E { A, B }`.
|
/// - For example the `E::A` and `E::B` in `enum E { A, B }`.
|
||||||
/// - **newtype_struct**
|
/// - **newtype_struct**
|
||||||
@@ -289,14 +290,15 @@ pub trait Serialize {
|
|||||||
/// - **newtype_variant**
|
/// - **newtype_variant**
|
||||||
/// - For example the `E::N` in `enum E { N(u8) }`.
|
/// - For example the `E::N` in `enum E { N(u8) }`.
|
||||||
/// - **seq**
|
/// - **seq**
|
||||||
/// - A variably sized heterogeneous sequence of values, for example `Vec<T>` or
|
/// - A variably sized heterogeneous sequence of values, for example
|
||||||
/// `HashSet<T>`. When serializing, the length may or may not be known before
|
/// `Vec<T>` or `HashSet<T>`. When serializing, the length may or may not
|
||||||
/// iterating through all the data. When deserializing, the length is determined
|
/// be known before iterating through all the data. When deserializing,
|
||||||
/// by looking at the serialized data.
|
/// the length is determined by looking at the serialized data.
|
||||||
/// - **tuple**
|
/// - **tuple**
|
||||||
/// - A statically sized heterogeneous sequence of values for which the length
|
/// - A statically sized heterogeneous sequence of values for which the
|
||||||
/// will be known at deserialization time without looking at the serialized
|
/// length will be known at deserialization time without looking at the
|
||||||
/// data, for example `(u8,)` or `(String, u64, Vec<T>)` or `[u64; 10]`.
|
/// serialized data, for example `(u8,)` or `(String, u64, Vec<T>)` or
|
||||||
|
/// `[u64; 10]`.
|
||||||
/// - **tuple_struct**
|
/// - **tuple_struct**
|
||||||
/// - A named tuple, for example `struct Rgb(u8, u8, u8)`.
|
/// - A named tuple, for example `struct Rgb(u8, u8, u8)`.
|
||||||
/// - **tuple_variant**
|
/// - **tuple_variant**
|
||||||
@@ -304,9 +306,9 @@ pub trait Serialize {
|
|||||||
/// - **map**
|
/// - **map**
|
||||||
/// - A heterogeneous key-value pairing, for example `BTreeMap<K, V>`.
|
/// - A heterogeneous key-value pairing, for example `BTreeMap<K, V>`.
|
||||||
/// - **struct**
|
/// - **struct**
|
||||||
/// - A heterogeneous key-value pairing in which the keys are strings and will be
|
/// - A heterogeneous key-value pairing in which the keys are strings and
|
||||||
/// known at deserialization time without looking at the serialized data, for
|
/// will be known at deserialization time without looking at the
|
||||||
/// example `struct S { r: u8, g: u8, b: u8 }`.
|
/// serialized data, for example `struct S { r: u8, g: u8, b: u8 }`.
|
||||||
/// - **struct_variant**
|
/// - **struct_variant**
|
||||||
/// - For example the `E::S` in `enum E { S { r: u8, g: u8, b: u8 } }`.
|
/// - For example the `E::S` in `enum E { S { r: u8, g: u8, b: u8 } }`.
|
||||||
///
|
///
|
||||||
@@ -1109,7 +1111,7 @@ pub trait Serializer: Sized {
|
|||||||
/// ```
|
/// ```
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust
|
||||||
/// use serde::ser::{Serialize, Serializer, SerializeTuple};
|
/// use serde::ser::{Serialize, SerializeTuple, Serializer};
|
||||||
///
|
///
|
||||||
/// const VRAM_SIZE: usize = 386;
|
/// const VRAM_SIZE: usize = 386;
|
||||||
/// struct Vram([u16; VRAM_SIZE]);
|
/// struct Vram([u16; VRAM_SIZE]);
|
||||||
@@ -1137,7 +1139,7 @@ pub trait Serializer: Sized {
|
|||||||
/// of data fields that will be serialized.
|
/// of data fields that will be serialized.
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust
|
||||||
/// use serde::ser::{Serialize, Serializer, SerializeTupleStruct};
|
/// use serde::ser::{Serialize, SerializeTupleStruct, Serializer};
|
||||||
///
|
///
|
||||||
/// struct Rgb(u8, u8, u8);
|
/// struct Rgb(u8, u8, u8);
|
||||||
///
|
///
|
||||||
@@ -1169,7 +1171,7 @@ pub trait Serializer: Sized {
|
|||||||
/// and the `len` is the number of data fields that will be serialized.
|
/// and the `len` is the number of data fields that will be serialized.
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust
|
||||||
/// use serde::ser::{Serialize, Serializer, SerializeTupleVariant};
|
/// use serde::ser::{Serialize, SerializeTupleVariant, Serializer};
|
||||||
///
|
///
|
||||||
/// enum E {
|
/// enum E {
|
||||||
/// T(u8, u8),
|
/// T(u8, u8),
|
||||||
@@ -1263,7 +1265,7 @@ pub trait Serializer: Sized {
|
|||||||
/// data fields that will be serialized.
|
/// data fields that will be serialized.
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust
|
||||||
/// use serde::ser::{Serialize, Serializer, SerializeStruct};
|
/// use serde::ser::{Serialize, SerializeStruct, Serializer};
|
||||||
///
|
///
|
||||||
/// struct Rgb {
|
/// struct Rgb {
|
||||||
/// r: u8,
|
/// r: u8,
|
||||||
@@ -1299,10 +1301,10 @@ pub trait Serializer: Sized {
|
|||||||
/// and the `len` is the number of data fields that will be serialized.
|
/// and the `len` is the number of data fields that will be serialized.
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust
|
||||||
/// use serde::ser::{Serialize, Serializer, SerializeStructVariant};
|
/// use serde::ser::{Serialize, SerializeStructVariant, Serializer};
|
||||||
///
|
///
|
||||||
/// enum E {
|
/// enum E {
|
||||||
/// S { r: u8, g: u8, b: u8 }
|
/// S { r: u8, g: u8, b: u8 },
|
||||||
/// }
|
/// }
|
||||||
///
|
///
|
||||||
/// impl Serialize for E {
|
/// impl Serialize for E {
|
||||||
@@ -1311,7 +1313,11 @@ pub trait Serializer: Sized {
|
|||||||
/// S: Serializer,
|
/// S: Serializer,
|
||||||
/// {
|
/// {
|
||||||
/// match *self {
|
/// match *self {
|
||||||
/// E::S { ref r, ref g, ref b } => {
|
/// E::S {
|
||||||
|
/// ref r,
|
||||||
|
/// ref g,
|
||||||
|
/// ref b,
|
||||||
|
/// } => {
|
||||||
/// let mut sv = serializer.serialize_struct_variant("E", 0, "S", 3)?;
|
/// let mut sv = serializer.serialize_struct_variant("E", 0, "S", 3)?;
|
||||||
/// sv.serialize_field("r", r)?;
|
/// sv.serialize_field("r", r)?;
|
||||||
/// sv.serialize_field("g", g)?;
|
/// sv.serialize_field("g", g)?;
|
||||||
@@ -1374,8 +1380,8 @@ pub trait Serializer: Sized {
|
|||||||
/// method.
|
/// method.
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust
|
||||||
/// use std::collections::BTreeSet;
|
|
||||||
/// use serde::{Serialize, Serializer};
|
/// use serde::{Serialize, Serializer};
|
||||||
|
/// use std::collections::BTreeSet;
|
||||||
///
|
///
|
||||||
/// struct MapToUnit {
|
/// struct MapToUnit {
|
||||||
/// keys: BTreeSet<i32>,
|
/// keys: BTreeSet<i32>,
|
||||||
@@ -1703,7 +1709,7 @@ pub trait SerializeTuple {
|
|||||||
/// # Example use
|
/// # Example use
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust
|
||||||
/// use serde::ser::{Serialize, Serializer, SerializeTupleStruct};
|
/// use serde::ser::{Serialize, SerializeTupleStruct, Serializer};
|
||||||
///
|
///
|
||||||
/// struct Rgb(u8, u8, u8);
|
/// struct Rgb(u8, u8, u8);
|
||||||
///
|
///
|
||||||
@@ -1748,7 +1754,7 @@ pub trait SerializeTupleStruct {
|
|||||||
/// # Example use
|
/// # Example use
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust
|
||||||
/// use serde::ser::{Serialize, Serializer, SerializeTupleVariant};
|
/// use serde::ser::{Serialize, SerializeTupleVariant, Serializer};
|
||||||
///
|
///
|
||||||
/// enum E {
|
/// enum E {
|
||||||
/// T(u8, u8),
|
/// T(u8, u8),
|
||||||
@@ -1917,7 +1923,7 @@ pub trait SerializeMap {
|
|||||||
/// # Example use
|
/// # Example use
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust
|
||||||
/// use serde::ser::{Serialize, Serializer, SerializeStruct};
|
/// use serde::ser::{Serialize, SerializeStruct, Serializer};
|
||||||
///
|
///
|
||||||
/// struct Rgb {
|
/// struct Rgb {
|
||||||
/// r: u8,
|
/// r: u8,
|
||||||
@@ -1977,10 +1983,10 @@ pub trait SerializeStruct {
|
|||||||
/// # Example use
|
/// # Example use
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust
|
||||||
/// use serde::ser::{Serialize, Serializer, SerializeStructVariant};
|
/// use serde::ser::{Serialize, SerializeStructVariant, Serializer};
|
||||||
///
|
///
|
||||||
/// enum E {
|
/// enum E {
|
||||||
/// S { r: u8, g: u8, b: u8 }
|
/// S { r: u8, g: u8, b: u8 },
|
||||||
/// }
|
/// }
|
||||||
///
|
///
|
||||||
/// impl Serialize for E {
|
/// impl Serialize for E {
|
||||||
@@ -1989,7 +1995,11 @@ pub trait SerializeStruct {
|
|||||||
/// S: Serializer,
|
/// S: Serializer,
|
||||||
/// {
|
/// {
|
||||||
/// match *self {
|
/// match *self {
|
||||||
/// E::S { ref r, ref g, ref b } => {
|
/// E::S {
|
||||||
|
/// ref r,
|
||||||
|
/// ref g,
|
||||||
|
/// ref b,
|
||||||
|
/// } => {
|
||||||
/// let mut sv = serializer.serialize_struct_variant("E", 0, "S", 3)?;
|
/// let mut sv = serializer.serialize_struct_variant("E", 0, "S", 3)?;
|
||||||
/// sv.serialize_field("r", r)?;
|
/// sv.serialize_field("r", r)?;
|
||||||
/// sv.serialize_field("g", g)?;
|
/// sv.serialize_field("g", g)?;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "serde_derive"
|
name = "serde_derive"
|
||||||
version = "1.0.64" # remember to update html_root_url
|
version = "1.0.73" # 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/Apache-2.0"
|
license = "MIT/Apache-2.0"
|
||||||
description = "Macros 1.1 implementation of #[derive(Serialize, Deserialize)]"
|
description = "Macros 1.1 implementation of #[derive(Serialize, Deserialize)]"
|
||||||
@@ -13,6 +13,7 @@ include = ["Cargo.toml", "src/**/*.rs", "crates-io.md", "README.md", "LICENSE-AP
|
|||||||
|
|
||||||
[badges]
|
[badges]
|
||||||
travis-ci = { repository = "serde-rs/serde" }
|
travis-ci = { repository = "serde-rs/serde" }
|
||||||
|
appveyor = { repository = "serde-rs/serde" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = []
|
default = []
|
||||||
|
|||||||
+13
-16
@@ -32,8 +32,7 @@ pub fn without_defaults(generics: &syn::Generics) -> syn::Generics {
|
|||||||
..param.clone()
|
..param.clone()
|
||||||
}),
|
}),
|
||||||
_ => param.clone(),
|
_ => param.clone(),
|
||||||
})
|
}).collect(),
|
||||||
.collect(),
|
|
||||||
..generics.clone()
|
..generics.clone()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -91,7 +90,8 @@ pub fn with_where_predicates_from_variants(
|
|||||||
// Puts the given bound on any generic type parameters that are used in fields
|
// Puts the given bound on any generic type parameters that are used in fields
|
||||||
// for which filter returns true.
|
// for which filter returns true.
|
||||||
//
|
//
|
||||||
// For example, the following struct needs the bound `A: Serialize, B: Serialize`.
|
// For example, the following struct needs the bound `A: Serialize, B:
|
||||||
|
// Serialize`.
|
||||||
//
|
//
|
||||||
// struct S<'b, A, B: 'b, C> {
|
// struct S<'b, A, B: 'b, C> {
|
||||||
// a: A,
|
// a: A,
|
||||||
@@ -193,14 +193,13 @@ pub fn with_bound(
|
|||||||
.map(|id| syn::TypePath {
|
.map(|id| syn::TypePath {
|
||||||
qself: None,
|
qself: None,
|
||||||
path: id.into(),
|
path: id.into(),
|
||||||
})
|
}).chain(associated_type_usage.into_iter().cloned())
|
||||||
.chain(associated_type_usage.into_iter().cloned())
|
|
||||||
.map(|bounded_ty| {
|
.map(|bounded_ty| {
|
||||||
syn::WherePredicate::Type(syn::PredicateType {
|
syn::WherePredicate::Type(syn::PredicateType {
|
||||||
lifetimes: None,
|
lifetimes: None,
|
||||||
// the type parameter that is being bounded e.g. T
|
// the type parameter that is being bounded e.g. T
|
||||||
bounded_ty: syn::Type::Path(bounded_ty),
|
bounded_ty: syn::Type::Path(bounded_ty),
|
||||||
colon_token: Default::default(),
|
colon_token: <Token![:]>::default(),
|
||||||
// the bound e.g. Serialize
|
// the bound e.g. Serialize
|
||||||
bounds: vec![syn::TypeParamBound::Trait(syn::TraitBound {
|
bounds: vec![syn::TypeParamBound::Trait(syn::TraitBound {
|
||||||
paren_token: None,
|
paren_token: None,
|
||||||
@@ -208,7 +207,7 @@ pub fn with_bound(
|
|||||||
lifetimes: None,
|
lifetimes: None,
|
||||||
path: bound.clone(),
|
path: bound.clone(),
|
||||||
})].into_iter()
|
})].into_iter()
|
||||||
.collect(),
|
.collect(),
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -233,7 +232,7 @@ pub fn with_self_bound(
|
|||||||
lifetimes: None,
|
lifetimes: None,
|
||||||
// the type that is being bounded e.g. MyStruct<'a, T>
|
// the type that is being bounded e.g. MyStruct<'a, T>
|
||||||
bounded_ty: type_of_item(cont),
|
bounded_ty: type_of_item(cont),
|
||||||
colon_token: Default::default(),
|
colon_token: <Token![:]>::default(),
|
||||||
// the bound e.g. Default
|
// the bound e.g. Default
|
||||||
bounds: vec![syn::TypeParamBound::Trait(syn::TraitBound {
|
bounds: vec![syn::TypeParamBound::Trait(syn::TraitBound {
|
||||||
paren_token: None,
|
paren_token: None,
|
||||||
@@ -241,7 +240,7 @@ pub fn with_self_bound(
|
|||||||
lifetimes: None,
|
lifetimes: None,
|
||||||
path: bound.clone(),
|
path: bound.clone(),
|
||||||
})].into_iter()
|
})].into_iter()
|
||||||
.collect(),
|
.collect(),
|
||||||
}));
|
}));
|
||||||
generics
|
generics
|
||||||
}
|
}
|
||||||
@@ -270,8 +269,7 @@ pub fn with_lifetime_bound(generics: &syn::Generics, lifetime: &str) -> syn::Gen
|
|||||||
syn::GenericParam::Const(_) => {}
|
syn::GenericParam::Const(_) => {}
|
||||||
}
|
}
|
||||||
param
|
param
|
||||||
}))
|
})).collect();
|
||||||
.collect();
|
|
||||||
|
|
||||||
syn::Generics {
|
syn::Generics {
|
||||||
params: params,
|
params: params,
|
||||||
@@ -289,7 +287,7 @@ fn type_of_item(cont: &Container) -> syn::Type {
|
|||||||
arguments: syn::PathArguments::AngleBracketed(
|
arguments: syn::PathArguments::AngleBracketed(
|
||||||
syn::AngleBracketedGenericArguments {
|
syn::AngleBracketedGenericArguments {
|
||||||
colon2_token: None,
|
colon2_token: None,
|
||||||
lt_token: Default::default(),
|
lt_token: <Token![<]>::default(),
|
||||||
args: cont
|
args: cont
|
||||||
.generics
|
.generics
|
||||||
.params
|
.params
|
||||||
@@ -307,13 +305,12 @@ fn type_of_item(cont: &Container) -> syn::Type {
|
|||||||
syn::GenericParam::Const(_) => {
|
syn::GenericParam::Const(_) => {
|
||||||
panic!("Serde does not support const generics yet");
|
panic!("Serde does not support const generics yet");
|
||||||
}
|
}
|
||||||
})
|
}).collect(),
|
||||||
.collect(),
|
gt_token: <Token![>]>::default(),
|
||||||
gt_token: Default::default(),
|
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
}].into_iter()
|
}].into_iter()
|
||||||
.collect(),
|
.collect(),
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
+16
-10
@@ -30,8 +30,9 @@ pub fn expand_derive_deserialize(input: &syn::DeriveInput) -> Result<TokenStream
|
|||||||
let ident = &cont.ident;
|
let ident = &cont.ident;
|
||||||
let params = Parameters::new(&cont);
|
let params = Parameters::new(&cont);
|
||||||
let (de_impl_generics, _, ty_generics, where_clause) = split_with_de_lifetime(¶ms);
|
let (de_impl_generics, _, ty_generics, where_clause) = split_with_de_lifetime(¶ms);
|
||||||
|
let suffix = ident.to_string().trim_left_matches("r#").to_owned();
|
||||||
let dummy_const = Ident::new(
|
let dummy_const = Ident::new(
|
||||||
&format!("_IMPL_DESERIALIZE_FOR_{}", ident),
|
&format!("_IMPL_DESERIALIZE_FOR_{}", suffix),
|
||||||
Span::call_site(),
|
Span::call_site(),
|
||||||
);
|
);
|
||||||
let body = Stmts(deserialize_body(&cont, ¶ms));
|
let body = Stmts(deserialize_body(&cont, ¶ms));
|
||||||
@@ -73,6 +74,9 @@ pub fn expand_derive_deserialize(input: &syn::DeriveInput) -> Result<TokenStream
|
|||||||
let generated = quote! {
|
let generated = quote! {
|
||||||
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications)]
|
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications)]
|
||||||
const #dummy_const: () = {
|
const #dummy_const: () = {
|
||||||
|
#[allow(unknown_lints)]
|
||||||
|
#[cfg_attr(feature = "cargo-clippy", allow(useless_attribute))]
|
||||||
|
#[allow(rust_2018_idioms)]
|
||||||
extern crate serde as _serde;
|
extern crate serde as _serde;
|
||||||
#try_replacement
|
#try_replacement
|
||||||
#impl_block
|
#impl_block
|
||||||
@@ -201,7 +205,9 @@ fn build_generics(cont: &Container, borrowed: &BorrowedLifetimes) -> syn::Generi
|
|||||||
// All other fields may need a `T: Deserialize` bound where T is the type of the
|
// All other fields may need a `T: Deserialize` bound where T is the type of the
|
||||||
// field.
|
// field.
|
||||||
fn needs_deserialize_bound(field: &attr::Field, variant: Option<&attr::Variant>) -> bool {
|
fn needs_deserialize_bound(field: &attr::Field, variant: Option<&attr::Variant>) -> bool {
|
||||||
!field.skip_deserializing() && field.deserialize_with().is_none() && field.de_bound().is_none()
|
!field.skip_deserializing()
|
||||||
|
&& field.deserialize_with().is_none()
|
||||||
|
&& field.de_bound().is_none()
|
||||||
&& variant.map_or(true, |variant| {
|
&& variant.map_or(true, |variant| {
|
||||||
!variant.skip_deserializing()
|
!variant.skip_deserializing()
|
||||||
&& variant.deserialize_with().is_none()
|
&& variant.deserialize_with().is_none()
|
||||||
@@ -832,7 +838,8 @@ fn deserialize_newtype_struct(
|
|||||||
|
|
||||||
#[cfg(feature = "deserialize_in_place")]
|
#[cfg(feature = "deserialize_in_place")]
|
||||||
fn deserialize_newtype_struct_in_place(params: &Parameters, field: &Field) -> TokenStream {
|
fn deserialize_newtype_struct_in_place(params: &Parameters, field: &Field) -> TokenStream {
|
||||||
// We do not generate deserialize_in_place if every field has a deserialize_with.
|
// We do not generate deserialize_in_place if every field has a
|
||||||
|
// deserialize_with.
|
||||||
assert!(field.attrs.deserialize_with().is_none());
|
assert!(field.attrs.deserialize_with().is_none());
|
||||||
|
|
||||||
let delife = params.borrowed.de_lifetime();
|
let delife = params.borrowed.de_lifetime();
|
||||||
@@ -936,8 +943,8 @@ fn deserialize_struct(
|
|||||||
quote!(mut __seq)
|
quote!(mut __seq)
|
||||||
};
|
};
|
||||||
|
|
||||||
// untagged struct variants do not get a visit_seq method. The same applies to structs that
|
// untagged struct variants do not get a visit_seq method. The same applies to
|
||||||
// only have a map representation.
|
// structs that only have a map representation.
|
||||||
let visit_seq = match *untagged {
|
let visit_seq = match *untagged {
|
||||||
Untagged::No if !cattrs.has_flatten() => Some(quote! {
|
Untagged::No if !cattrs.has_flatten() => Some(quote! {
|
||||||
#[inline]
|
#[inline]
|
||||||
@@ -1347,8 +1354,7 @@ fn deserialize_adjacently_tagged_enum(
|
|||||||
quote! {
|
quote! {
|
||||||
__Field::#variant_index => #block
|
__Field::#variant_index => #block
|
||||||
}
|
}
|
||||||
})
|
}).collect();
|
||||||
.collect();
|
|
||||||
|
|
||||||
let expecting = format!("adjacently tagged enum {}", params.type_name());
|
let expecting = format!("adjacently tagged enum {}", params.type_name());
|
||||||
let type_name = cattrs.name().deserialize_name();
|
let type_name = cattrs.name().deserialize_name();
|
||||||
@@ -1936,8 +1942,7 @@ fn deserialize_custom_identifier(
|
|||||||
variant.attrs.name().deserialize_name(),
|
variant.attrs.name().deserialize_name(),
|
||||||
variant.ident.clone(),
|
variant.ident.clone(),
|
||||||
)
|
)
|
||||||
})
|
}).collect();
|
||||||
.collect();
|
|
||||||
|
|
||||||
let names = names_idents.iter().map(|&(ref name, _)| name);
|
let names = names_idents.iter().map(|&(ref name, _)| name);
|
||||||
|
|
||||||
@@ -2544,7 +2549,8 @@ fn deserialize_map_in_place(
|
|||||||
.map(|(i, field)| (field, field_i(i)))
|
.map(|(i, field)| (field, field_i(i)))
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
// For deserialize_in_place, declare booleans for each field that will be deserialized.
|
// For deserialize_in_place, declare booleans for each field that will be
|
||||||
|
// deserialized.
|
||||||
let let_flags = fields_names
|
let let_flags = fields_names
|
||||||
.iter()
|
.iter()
|
||||||
.filter(|&&(field, _)| !field.attrs.skip_deserializing())
|
.filter(|&&(field, _)| !field.attrs.skip_deserializing())
|
||||||
|
|||||||
@@ -129,8 +129,7 @@ fn enum_from_ast<'a>(
|
|||||||
style: style,
|
style: style,
|
||||||
fields: fields,
|
fields: fields,
|
||||||
}
|
}
|
||||||
})
|
}).collect()
|
||||||
.collect()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn struct_from_ast<'a>(
|
fn struct_from_ast<'a>(
|
||||||
@@ -173,6 +172,5 @@ fn fields_from_ast<'a>(
|
|||||||
attrs: attr::Field::from_ast(cx, i, field, attrs, container_default),
|
attrs: attr::Field::from_ast(cx, i, field, attrs, container_default),
|
||||||
ty: &field.ty,
|
ty: &field.ty,
|
||||||
original: field,
|
original: field,
|
||||||
})
|
}).collect()
|
||||||
.collect()
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -90,6 +90,10 @@ pub struct Name {
|
|||||||
deserialize: String,
|
deserialize: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn unraw(ident: &Ident) -> String {
|
||||||
|
ident.to_string().trim_left_matches("r#").to_owned()
|
||||||
|
}
|
||||||
|
|
||||||
impl Name {
|
impl Name {
|
||||||
/// Return the container name for the container when serializing.
|
/// Return the container name for the container when serializing.
|
||||||
pub fn serialize_name(&self) -> String {
|
pub fn serialize_name(&self) -> String {
|
||||||
@@ -272,7 +276,7 @@ impl Container {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse `#[serde(bound = "D: Serialize")]`
|
// Parse `#[serde(bound = "T: SomeBound")]`
|
||||||
Meta(NameValue(ref m)) if m.ident == "bound" => {
|
Meta(NameValue(ref m)) if m.ident == "bound" => {
|
||||||
if let Ok(where_predicates) =
|
if let Ok(where_predicates) =
|
||||||
parse_lit_into_where(cx, &m.ident, &m.ident, &m.lit)
|
parse_lit_into_where(cx, &m.ident, &m.ident, &m.lit)
|
||||||
@@ -282,7 +286,7 @@ impl Container {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse `#[serde(bound(serialize = "D: Serialize", deserialize = "D: Deserialize"))]`
|
// Parse `#[serde(bound(serialize = "...", deserialize = "..."))]`
|
||||||
Meta(List(ref m)) if m.ident == "bound" => {
|
Meta(List(ref m)) if m.ident == "bound" => {
|
||||||
if let Ok((ser, de)) = get_where_predicates(cx, &m.nested) {
|
if let Ok((ser, de)) = get_where_predicates(cx, &m.nested) {
|
||||||
ser_bound.set_opt(ser);
|
ser_bound.set_opt(ser);
|
||||||
@@ -380,8 +384,8 @@ impl Container {
|
|||||||
|
|
||||||
Container {
|
Container {
|
||||||
name: Name {
|
name: Name {
|
||||||
serialize: ser_name.get().unwrap_or_else(|| item.ident.to_string()),
|
serialize: ser_name.get().unwrap_or_else(|| unraw(&item.ident)),
|
||||||
deserialize: de_name.get().unwrap_or_else(|| item.ident.to_string()),
|
deserialize: de_name.get().unwrap_or_else(|| unraw(&item.ident)),
|
||||||
},
|
},
|
||||||
transparent: transparent.get(),
|
transparent: transparent.get(),
|
||||||
deny_unknown_fields: deny_unknown_fields.get(),
|
deny_unknown_fields: deny_unknown_fields.get(),
|
||||||
@@ -617,7 +621,7 @@ impl Variant {
|
|||||||
other.set_true();
|
other.set_true();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse `#[serde(bound = "D: Serialize")]`
|
// Parse `#[serde(bound = "T: SomeBound")]`
|
||||||
Meta(NameValue(ref m)) if m.ident == "bound" => {
|
Meta(NameValue(ref m)) if m.ident == "bound" => {
|
||||||
if let Ok(where_predicates) =
|
if let Ok(where_predicates) =
|
||||||
parse_lit_into_where(cx, &m.ident, &m.ident, &m.lit)
|
parse_lit_into_where(cx, &m.ident, &m.ident, &m.lit)
|
||||||
@@ -627,7 +631,7 @@ impl Variant {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse `#[serde(bound(serialize = "D: Serialize", deserialize = "D: Deserialize"))]`
|
// Parse `#[serde(bound(serialize = "...", deserialize = "..."))]`
|
||||||
Meta(List(ref m)) if m.ident == "bound" => {
|
Meta(List(ref m)) if m.ident == "bound" => {
|
||||||
if let Ok((ser, de)) = get_where_predicates(cx, &m.nested) {
|
if let Ok((ser, de)) = get_where_predicates(cx, &m.nested) {
|
||||||
ser_bound.set_opt(ser);
|
ser_bound.set_opt(ser);
|
||||||
@@ -697,8 +701,8 @@ impl Variant {
|
|||||||
let de_renamed = de_name.is_some();
|
let de_renamed = de_name.is_some();
|
||||||
Variant {
|
Variant {
|
||||||
name: Name {
|
name: Name {
|
||||||
serialize: ser_name.unwrap_or_else(|| variant.ident.to_string()),
|
serialize: ser_name.unwrap_or_else(|| unraw(&variant.ident)),
|
||||||
deserialize: de_name.unwrap_or_else(|| variant.ident.to_string()),
|
deserialize: de_name.unwrap_or_else(|| unraw(&variant.ident)),
|
||||||
},
|
},
|
||||||
ser_renamed: ser_renamed,
|
ser_renamed: ser_renamed,
|
||||||
de_renamed: de_renamed,
|
de_renamed: de_renamed,
|
||||||
@@ -822,7 +826,7 @@ impl Field {
|
|||||||
let mut flatten = BoolAttr::none(cx, "flatten");
|
let mut flatten = BoolAttr::none(cx, "flatten");
|
||||||
|
|
||||||
let ident = match field.ident {
|
let ident = match field.ident {
|
||||||
Some(ref ident) => ident.to_string(),
|
Some(ref ident) => unraw(ident),
|
||||||
None => index.to_string(),
|
None => index.to_string(),
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -921,7 +925,7 @@ impl Field {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse `#[serde(bound = "D: Serialize")]`
|
// Parse `#[serde(bound = "T: SomeBound")]`
|
||||||
Meta(NameValue(ref m)) if m.ident == "bound" => {
|
Meta(NameValue(ref m)) if m.ident == "bound" => {
|
||||||
if let Ok(where_predicates) =
|
if let Ok(where_predicates) =
|
||||||
parse_lit_into_where(cx, &m.ident, &m.ident, &m.lit)
|
parse_lit_into_where(cx, &m.ident, &m.ident, &m.lit)
|
||||||
@@ -931,7 +935,7 @@ impl Field {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse `#[serde(bound(serialize = "D: Serialize", deserialize = "D: Deserialize"))]`
|
// Parse `#[serde(bound(serialize = "...", deserialize = "..."))]`
|
||||||
Meta(List(ref m)) if m.ident == "bound" => {
|
Meta(List(ref m)) if m.ident == "bound" => {
|
||||||
if let Ok((ser, de)) = get_where_predicates(cx, &m.nested) {
|
if let Ok((ser, de)) = get_where_predicates(cx, &m.nested) {
|
||||||
ser_bound.set_opt(ser);
|
ser_bound.set_opt(ser);
|
||||||
@@ -989,9 +993,9 @@ impl Field {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Is skip_deserializing, initialize the field to Default::default() unless a different
|
// Is skip_deserializing, initialize the field to Default::default() unless a
|
||||||
// default is specified by `#[serde(default = "...")]` on ourselves or our container (e.g.
|
// different default is specified by `#[serde(default = "...")]` on
|
||||||
// the struct we are in).
|
// ourselves or our container (e.g. the struct we are in).
|
||||||
if let Default::None = *container_default {
|
if let Default::None = *container_default {
|
||||||
if skip_deserializing.0.value.is_some() {
|
if skip_deserializing.0.value.is_some() {
|
||||||
default.set_if_none(Default::Default);
|
default.set_if_none(Default::Default);
|
||||||
|
|||||||
@@ -22,13 +22,16 @@ pub enum RenameRule {
|
|||||||
LowerCase,
|
LowerCase,
|
||||||
/// Rename direct children to "UPPERCASE" style.
|
/// Rename direct children to "UPPERCASE" style.
|
||||||
UPPERCASE,
|
UPPERCASE,
|
||||||
/// Rename direct children to "PascalCase" style, as typically used for enum variants.
|
/// Rename direct children to "PascalCase" style, as typically used for
|
||||||
|
/// enum variants.
|
||||||
PascalCase,
|
PascalCase,
|
||||||
/// Rename direct children to "camelCase" style.
|
/// Rename direct children to "camelCase" style.
|
||||||
CamelCase,
|
CamelCase,
|
||||||
/// Rename direct children to "snake_case" style, as commonly used for fields.
|
/// Rename direct children to "snake_case" style, as commonly used for
|
||||||
|
/// fields.
|
||||||
SnakeCase,
|
SnakeCase,
|
||||||
/// Rename direct children to "SCREAMING_SNAKE_CASE" style, as commonly used for constants.
|
/// Rename direct children to "SCREAMING_SNAKE_CASE" style, as commonly
|
||||||
|
/// used for constants.
|
||||||
ScreamingSnakeCase,
|
ScreamingSnakeCase,
|
||||||
/// Rename direct children to "kebab-case" style.
|
/// Rename direct children to "kebab-case" style.
|
||||||
KebabCase,
|
KebabCase,
|
||||||
|
|||||||
+29
-12
@@ -22,22 +22,35 @@
|
|||||||
//!
|
//!
|
||||||
//! [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.64")]
|
#![doc(html_root_url = "https://docs.rs/serde_derive/1.0.73")]
|
||||||
#![cfg_attr(feature = "cargo-clippy", deny(clippy, clippy_pedantic))]
|
#![cfg_attr(feature = "cargo-clippy", deny(clippy, clippy_pedantic))]
|
||||||
// Whitelisted clippy lints
|
// Whitelisted clippy lints
|
||||||
#![cfg_attr(
|
#![cfg_attr(
|
||||||
feature = "cargo-clippy",
|
feature = "cargo-clippy",
|
||||||
allow(
|
allow(
|
||||||
enum_variant_names, redundant_field_names, too_many_arguments, used_underscore_binding,
|
enum_variant_names,
|
||||||
cyclomatic_complexity
|
redundant_field_names,
|
||||||
|
too_many_arguments,
|
||||||
|
used_underscore_binding,
|
||||||
|
cyclomatic_complexity,
|
||||||
|
needless_pass_by_value
|
||||||
)
|
)
|
||||||
)]
|
)]
|
||||||
// Whitelisted clippy_pedantic lints
|
// Whitelisted clippy_pedantic lints
|
||||||
#![cfg_attr(
|
#![cfg_attr(
|
||||||
feature = "cargo-clippy",
|
feature = "cargo-clippy",
|
||||||
allow(
|
allow(
|
||||||
items_after_statements, doc_markdown, stutter, similar_names, use_self, single_match_else,
|
items_after_statements,
|
||||||
enum_glob_use, match_same_arms, filter_map, cast_possible_truncation
|
doc_markdown,
|
||||||
|
stutter,
|
||||||
|
similar_names,
|
||||||
|
use_self,
|
||||||
|
single_match_else,
|
||||||
|
enum_glob_use,
|
||||||
|
match_same_arms,
|
||||||
|
filter_map,
|
||||||
|
cast_possible_truncation,
|
||||||
|
indexing_slicing,
|
||||||
)
|
)
|
||||||
)]
|
)]
|
||||||
// The `quote!` macro requires deep recursion.
|
// The `quote!` macro requires deep recursion.
|
||||||
@@ -69,17 +82,21 @@ mod try;
|
|||||||
#[proc_macro_derive(Serialize, attributes(serde))]
|
#[proc_macro_derive(Serialize, attributes(serde))]
|
||||||
pub fn derive_serialize(input: TokenStream) -> TokenStream {
|
pub fn derive_serialize(input: TokenStream) -> TokenStream {
|
||||||
let input: DeriveInput = syn::parse(input).unwrap();
|
let input: DeriveInput = syn::parse(input).unwrap();
|
||||||
match ser::expand_derive_serialize(&input) {
|
ser::expand_derive_serialize(&input)
|
||||||
Ok(expanded) => expanded.into(),
|
.unwrap_or_else(compile_error)
|
||||||
Err(msg) => panic!(msg),
|
.into()
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[proc_macro_derive(Deserialize, attributes(serde))]
|
#[proc_macro_derive(Deserialize, attributes(serde))]
|
||||||
pub fn derive_deserialize(input: TokenStream) -> TokenStream {
|
pub fn derive_deserialize(input: TokenStream) -> TokenStream {
|
||||||
let input: DeriveInput = syn::parse(input).unwrap();
|
let input: DeriveInput = syn::parse(input).unwrap();
|
||||||
match de::expand_derive_deserialize(&input) {
|
de::expand_derive_deserialize(&input)
|
||||||
Ok(expanded) => expanded.into(),
|
.unwrap_or_else(compile_error)
|
||||||
Err(msg) => panic!(msg),
|
.into()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn compile_error(message: String) -> proc_macro2::TokenStream {
|
||||||
|
quote! {
|
||||||
|
compile_error!(#message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,8 +62,7 @@ fn pretend_fields_used(cont: &Container) -> TokenStream {
|
|||||||
Some(quote!(#type_ident::#variant_ident #pat))
|
Some(quote!(#type_ident::#variant_ident #pat))
|
||||||
}
|
}
|
||||||
_ => None,
|
_ => None,
|
||||||
})
|
}).collect::<Vec<_>>(),
|
||||||
.collect::<Vec<_>>(),
|
|
||||||
Data::Struct(Style::Struct, ref fields) => {
|
Data::Struct(Style::Struct, ref fields) => {
|
||||||
let pat = struct_pattern(fields);
|
let pat = struct_pattern(fields);
|
||||||
vec![quote!(#type_ident #pat)]
|
vec![quote!(#type_ident #pat)]
|
||||||
|
|||||||
+16
-18
@@ -26,7 +26,8 @@ pub fn expand_derive_serialize(input: &syn::DeriveInput) -> Result<TokenStream,
|
|||||||
let ident = &cont.ident;
|
let ident = &cont.ident;
|
||||||
let params = Parameters::new(&cont);
|
let params = Parameters::new(&cont);
|
||||||
let (impl_generics, ty_generics, where_clause) = params.generics.split_for_impl();
|
let (impl_generics, ty_generics, where_clause) = params.generics.split_for_impl();
|
||||||
let dummy_const = Ident::new(&format!("_IMPL_SERIALIZE_FOR_{}", ident), Span::call_site());
|
let suffix = ident.to_string().trim_left_matches("r#").to_owned();
|
||||||
|
let dummy_const = Ident::new(&format!("_IMPL_SERIALIZE_FOR_{}", suffix), Span::call_site());
|
||||||
let body = Stmts(serialize_body(&cont, ¶ms));
|
let body = Stmts(serialize_body(&cont, ¶ms));
|
||||||
|
|
||||||
let impl_block = if let Some(remote) = cont.attrs.remote() {
|
let impl_block = if let Some(remote) = cont.attrs.remote() {
|
||||||
@@ -61,6 +62,9 @@ pub fn expand_derive_serialize(input: &syn::DeriveInput) -> Result<TokenStream,
|
|||||||
let generated = quote! {
|
let generated = quote! {
|
||||||
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications)]
|
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications)]
|
||||||
const #dummy_const: () = {
|
const #dummy_const: () = {
|
||||||
|
#[allow(unknown_lints)]
|
||||||
|
#[cfg_attr(feature = "cargo-clippy", allow(useless_attribute))]
|
||||||
|
#[allow(rust_2018_idioms)]
|
||||||
extern crate serde as _serde;
|
extern crate serde as _serde;
|
||||||
#try_replacement
|
#try_replacement
|
||||||
#impl_block
|
#impl_block
|
||||||
@@ -157,7 +161,9 @@ fn build_generics(cont: &Container) -> syn::Generics {
|
|||||||
// attribute specify their own bound so we do not generate one. All other fields
|
// attribute specify their own bound so we do not generate one. All other fields
|
||||||
// may need a `T: Serialize` bound where T is the type of the field.
|
// may need a `T: Serialize` bound where T is the type of the field.
|
||||||
fn needs_serialize_bound(field: &attr::Field, variant: Option<&attr::Variant>) -> bool {
|
fn needs_serialize_bound(field: &attr::Field, variant: Option<&attr::Variant>) -> bool {
|
||||||
!field.skip_serializing() && field.serialize_with().is_none() && field.ser_bound().is_none()
|
!field.skip_serializing()
|
||||||
|
&& field.serialize_with().is_none()
|
||||||
|
&& field.ser_bound().is_none()
|
||||||
&& variant.map_or(true, |variant| {
|
&& variant.map_or(true, |variant| {
|
||||||
!variant.skip_serializing()
|
!variant.skip_serializing()
|
||||||
&& variant.serialize_with().is_none()
|
&& variant.serialize_with().is_none()
|
||||||
@@ -279,8 +285,7 @@ fn serialize_tuple_struct(
|
|||||||
let field_expr = get_member(params, field, &Member::Unnamed(index));
|
let field_expr = get_member(params, field, &Member::Unnamed(index));
|
||||||
quote!(if #path(#field_expr) { 0 } else { 1 })
|
quote!(if #path(#field_expr) { 0 } else { 1 })
|
||||||
}
|
}
|
||||||
})
|
}).fold(quote!(0), |sum, expr| quote!(#sum + #expr));
|
||||||
.fold(quote!(0), |sum, expr| quote!(#sum + #expr));
|
|
||||||
|
|
||||||
quote_block! {
|
quote_block! {
|
||||||
let #let_mut __serde_state = try!(_serde::Serializer::serialize_tuple_struct(__serializer, #type_name, #len));
|
let #let_mut __serde_state = try!(_serde::Serializer::serialize_tuple_struct(__serializer, #type_name, #len));
|
||||||
@@ -323,8 +328,7 @@ fn serialize_struct_as_struct(
|
|||||||
let field_expr = get_member(params, field, &field.member);
|
let field_expr = get_member(params, field, &field.member);
|
||||||
quote!(if #path(#field_expr) { 0 } else { 1 })
|
quote!(if #path(#field_expr) { 0 } else { 1 })
|
||||||
}
|
}
|
||||||
})
|
}).fold(quote!(0), |sum, expr| quote!(#sum + #expr));
|
||||||
.fold(quote!(0), |sum, expr| quote!(#sum + #expr));
|
|
||||||
|
|
||||||
quote_block! {
|
quote_block! {
|
||||||
let #let_mut __serde_state = try!(_serde::Serializer::serialize_struct(__serializer, #type_name, #len));
|
let #let_mut __serde_state = try!(_serde::Serializer::serialize_struct(__serializer, #type_name, #len));
|
||||||
@@ -358,8 +362,7 @@ fn serialize_struct_as_map(
|
|||||||
let field_expr = get_member(params, field, &field.member);
|
let field_expr = get_member(params, field, &field.member);
|
||||||
quote!(if #path(#field_expr) { 0 } else { 1 })
|
quote!(if #path(#field_expr) { 0 } else { 1 })
|
||||||
}
|
}
|
||||||
})
|
}).fold(quote!(0), |sum, expr| quote!(#sum + #expr));
|
||||||
.fold(quote!(0), |sum, expr| quote!(#sum + #expr));
|
|
||||||
quote!(_serde::export::Some(#len))
|
quote!(_serde::export::Some(#len))
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -380,8 +383,7 @@ fn serialize_enum(params: &Parameters, variants: &[Variant], cattrs: &attr::Cont
|
|||||||
.enumerate()
|
.enumerate()
|
||||||
.map(|(variant_index, variant)| {
|
.map(|(variant_index, variant)| {
|
||||||
serialize_variant(params, variant, variant_index as u32, cattrs)
|
serialize_variant(params, variant, variant_index as u32, cattrs)
|
||||||
})
|
}).collect();
|
||||||
.collect();
|
|
||||||
|
|
||||||
quote_expr! {
|
quote_expr! {
|
||||||
match *#self_var {
|
match *#self_var {
|
||||||
@@ -785,8 +787,7 @@ fn serialize_tuple_variant(
|
|||||||
let field_expr = Ident::new(&format!("__field{}", i), Span::call_site());
|
let field_expr = Ident::new(&format!("__field{}", i), Span::call_site());
|
||||||
quote!(if #path(#field_expr) { 0 } else { 1 })
|
quote!(if #path(#field_expr) { 0 } else { 1 })
|
||||||
}
|
}
|
||||||
})
|
}).fold(quote!(0), |sum, expr| quote!(#sum + #expr));
|
||||||
.fold(quote!(0), |sum, expr| quote!(#sum + #expr));
|
|
||||||
|
|
||||||
match context {
|
match context {
|
||||||
TupleVariant::ExternallyTagged {
|
TupleVariant::ExternallyTagged {
|
||||||
@@ -863,8 +864,7 @@ fn serialize_struct_variant<'a>(
|
|||||||
Some(path) => quote!(if #path(#member) { 0 } else { 1 }),
|
Some(path) => quote!(if #path(#member) { 0 } else { 1 }),
|
||||||
None => quote!(1),
|
None => quote!(1),
|
||||||
}
|
}
|
||||||
})
|
}).fold(quote!(0), |sum, expr| quote!(#sum + #expr));
|
||||||
.fold(quote!(0), |sum, expr| quote!(#sum + #expr));
|
|
||||||
|
|
||||||
match context {
|
match context {
|
||||||
StructVariant::ExternallyTagged {
|
StructVariant::ExternallyTagged {
|
||||||
@@ -1043,8 +1043,7 @@ fn serialize_tuple_struct_visitor(
|
|||||||
None => ser,
|
None => ser,
|
||||||
Some(skip) => quote!(if !#skip { #ser }),
|
Some(skip) => quote!(if !#skip { #ser }),
|
||||||
}
|
}
|
||||||
})
|
}).collect()
|
||||||
.collect()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn serialize_struct_visitor(
|
fn serialize_struct_visitor(
|
||||||
@@ -1138,8 +1137,7 @@ fn wrap_serialize_variant_with(
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
quote!(#id)
|
quote!(#id)
|
||||||
})
|
}).collect();
|
||||||
.collect();
|
|
||||||
wrap_serialize_with(
|
wrap_serialize_with(
|
||||||
params,
|
params,
|
||||||
serialize_with,
|
serialize_with,
|
||||||
|
|||||||
@@ -20,3 +20,4 @@ syn = { version = "0.14", default-features = false, features = ["derive", "parsi
|
|||||||
|
|
||||||
[badges]
|
[badges]
|
||||||
travis-ci = { repository = "serde-rs/serde" }
|
travis-ci = { repository = "serde-rs/serde" }
|
||||||
|
appveyor = { repository = "serde-rs/serde" }
|
||||||
|
|||||||
@@ -9,7 +9,12 @@
|
|||||||
#![doc(html_root_url = "https://docs.rs/serde_derive_internals/0.23.1")]
|
#![doc(html_root_url = "https://docs.rs/serde_derive_internals/0.23.1")]
|
||||||
#![cfg_attr(
|
#![cfg_attr(
|
||||||
feature = "cargo-clippy",
|
feature = "cargo-clippy",
|
||||||
allow(cyclomatic_complexity, doc_markdown, match_same_arms, redundant_field_names)
|
allow(
|
||||||
|
cyclomatic_complexity,
|
||||||
|
doc_markdown,
|
||||||
|
match_same_arms,
|
||||||
|
redundant_field_names
|
||||||
|
)
|
||||||
)]
|
)]
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "serde_test"
|
name = "serde_test"
|
||||||
version = "1.0.64" # remember to update html_root_url
|
version = "1.0.73" # 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/Apache-2.0"
|
license = "MIT/Apache-2.0"
|
||||||
description = "Token De/Serializer for testing De/Serialize implementations"
|
description = "Token De/Serializer for testing De/Serialize implementations"
|
||||||
@@ -20,3 +20,4 @@ serde_derive = { version = "1.0", path = "../serde_derive" }
|
|||||||
|
|
||||||
[badges]
|
[badges]
|
||||||
travis-ci = { repository = "serde-rs/serde" }
|
travis-ci = { repository = "serde-rs/serde" }
|
||||||
|
appveyor = { repository = "serde-rs/serde" }
|
||||||
|
|||||||
@@ -95,7 +95,8 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Asserts that `value` serializes to the given `tokens`, and then yields `error`.
|
/// Asserts that `value` serializes to the given `tokens`, and then yields
|
||||||
|
/// `error`.
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust
|
||||||
/// # #[macro_use]
|
/// # #[macro_use]
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ pub struct Compact<T: ?Sized>(T);
|
|||||||
/// extern crate serde_test;
|
/// extern crate serde_test;
|
||||||
///
|
///
|
||||||
/// use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
/// use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
||||||
/// use serde_test::{Configure, Token, assert_tokens};
|
/// use serde_test::{assert_tokens, Configure, Token};
|
||||||
///
|
///
|
||||||
/// #[derive(Debug, PartialEq)]
|
/// #[derive(Debug, PartialEq)]
|
||||||
/// struct Example(u8, u8);
|
/// struct Example(u8, u8);
|
||||||
@@ -67,12 +67,7 @@ pub struct Compact<T: ?Sized>(T);
|
|||||||
/// Token::TupleEnd,
|
/// Token::TupleEnd,
|
||||||
/// ],
|
/// ],
|
||||||
/// );
|
/// );
|
||||||
/// assert_tokens(
|
/// assert_tokens(&Example(1, 0).readable(), &[Token::Str("1.0")]);
|
||||||
/// &Example(1, 0).readable(),
|
|
||||||
/// &[
|
|
||||||
/// Token::Str("1.0"),
|
|
||||||
/// ],
|
|
||||||
/// );
|
|
||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
pub trait Configure {
|
pub trait Configure {
|
||||||
|
|||||||
@@ -253,7 +253,8 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
|
|||||||
Token::UnitVariant { name: n, .. }
|
Token::UnitVariant { name: n, .. }
|
||||||
| Token::NewtypeVariant { name: n, .. }
|
| Token::NewtypeVariant { name: n, .. }
|
||||||
| Token::TupleVariant { name: n, .. }
|
| Token::TupleVariant { name: n, .. }
|
||||||
| Token::StructVariant { name: n, .. } if name == n =>
|
| Token::StructVariant { name: n, .. }
|
||||||
|
if name == n =>
|
||||||
{
|
{
|
||||||
visitor.visit_enum(DeserializerEnumVisitor { de: self })
|
visitor.visit_enum(DeserializerEnumVisitor { de: self })
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -161,7 +161,7 @@
|
|||||||
//! # }
|
//! # }
|
||||||
//! ```
|
//! ```
|
||||||
|
|
||||||
#![doc(html_root_url = "https://docs.rs/serde_test/1.0.64")]
|
#![doc(html_root_url = "https://docs.rs/serde_test/1.0.73")]
|
||||||
#![cfg_attr(feature = "cargo-clippy", deny(clippy, clippy_pedantic))]
|
#![cfg_attr(feature = "cargo-clippy", deny(clippy, clippy_pedantic))]
|
||||||
// Whitelisted clippy lints
|
// Whitelisted clippy lints
|
||||||
#![cfg_attr(feature = "cargo-clippy", allow(float_cmp))]
|
#![cfg_attr(feature = "cargo-clippy", allow(float_cmp))]
|
||||||
@@ -169,8 +169,12 @@
|
|||||||
#![cfg_attr(
|
#![cfg_attr(
|
||||||
feature = "cargo-clippy",
|
feature = "cargo-clippy",
|
||||||
allow(
|
allow(
|
||||||
empty_line_after_outer_attr, missing_docs_in_private_items, redundant_field_names, stutter,
|
empty_line_after_outer_attr,
|
||||||
use_debug, use_self
|
missing_docs_in_private_items,
|
||||||
|
redundant_field_names,
|
||||||
|
stutter,
|
||||||
|
use_debug,
|
||||||
|
use_self
|
||||||
)
|
)
|
||||||
)]
|
)]
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,8 @@ use serde::{ser, Serialize};
|
|||||||
use error::Error;
|
use error::Error;
|
||||||
use token::Token;
|
use token::Token;
|
||||||
|
|
||||||
/// A `Serializer` that ensures that a value serializes to a given list of tokens.
|
/// A `Serializer` that ensures that a value serializes to a given list of
|
||||||
|
/// tokens.
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Serializer<'a> {
|
pub struct Serializer<'a> {
|
||||||
tokens: &'a [Token],
|
tokens: &'a [Token],
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
#![feature(lang_items, start)]
|
#![feature(lang_items, start, panic_implementation)]
|
||||||
#![no_std]
|
#![no_std]
|
||||||
|
|
||||||
extern crate libc;
|
extern crate libc;
|
||||||
@@ -20,13 +20,8 @@ fn start(_argc: isize, _argv: *const *const u8) -> isize {
|
|||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn rust_eh_personality() {}
|
pub extern "C" fn rust_eh_personality() {}
|
||||||
|
|
||||||
#[lang = "panic_fmt"]
|
#[panic_implementation]
|
||||||
#[no_mangle]
|
fn panic(_info: &core::panic::PanicInfo) -> ! {
|
||||||
pub extern "C" fn rust_begin_panic(
|
|
||||||
_msg: core::fmt::Arguments,
|
|
||||||
_file: &'static str,
|
|
||||||
_line: u32,
|
|
||||||
) -> ! {
|
|
||||||
unsafe {
|
unsafe {
|
||||||
libc::abort();
|
libc::abort();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,9 +9,10 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Deserialize)]
|
||||||
struct Test<'a> {
|
struct Test<'a> {
|
||||||
#[serde(borrow = "zzz")] //~^^ HELP: failed to parse borrowed lifetimes: "zzz"
|
#[serde(borrow = "zzz")]
|
||||||
|
//~^^^ ERROR: failed to parse borrowed lifetimes: "zzz"
|
||||||
s: &'a str,
|
s: &'a str,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,9 +9,10 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Deserialize)]
|
||||||
struct Test<'a> {
|
struct Test<'a> {
|
||||||
#[serde(borrow = "'a + 'a")] //~^^ HELP: duplicate borrowed lifetime `'a`
|
#[serde(borrow = "'a + 'a")]
|
||||||
|
//~^^^ ERROR: duplicate borrowed lifetime `'a`
|
||||||
s: &'a str,
|
s: &'a str,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,10 +12,11 @@ extern crate serde_derive;
|
|||||||
#[derive(Deserialize)]
|
#[derive(Deserialize)]
|
||||||
struct Str<'a>(&'a str);
|
struct Str<'a>(&'a str);
|
||||||
|
|
||||||
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Deserialize)]
|
||||||
enum Test<'a> {
|
enum Test<'a> {
|
||||||
#[serde(borrow)] //~^^ HELP: duplicate serde attribute `borrow`
|
#[serde(borrow)]
|
||||||
S(#[serde(borrow)] Str<'a>)
|
//~^^^ ERROR: duplicate serde attribute `borrow`
|
||||||
|
S(#[serde(borrow)] Str<'a>),
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|||||||
@@ -9,9 +9,10 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Deserialize)]
|
||||||
struct Test<'a> {
|
struct Test<'a> {
|
||||||
#[serde(borrow = "")] //~^^ HELP: at least one lifetime must be borrowed
|
#[serde(borrow = "")]
|
||||||
|
//~^^^ ERROR: at least one lifetime must be borrowed
|
||||||
s: &'a str,
|
s: &'a str,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,9 +9,10 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Deserialize)]
|
||||||
struct Test {
|
struct Test {
|
||||||
#[serde(borrow)] //~^^ HELP: field `s` has no lifetimes to borrow
|
#[serde(borrow)]
|
||||||
|
//~^^^ ERROR: field `s` has no lifetimes to borrow
|
||||||
s: String,
|
s: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,10 +12,11 @@ extern crate serde_derive;
|
|||||||
#[derive(Deserialize)]
|
#[derive(Deserialize)]
|
||||||
struct Str<'a>(&'a str);
|
struct Str<'a>(&'a str);
|
||||||
|
|
||||||
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Deserialize)]
|
||||||
enum Test<'a> {
|
enum Test<'a> {
|
||||||
#[serde(borrow)] //~^^ HELP: #[serde(borrow)] may only be used on newtype variants
|
#[serde(borrow)]
|
||||||
S { s: Str<'a> }
|
//~^^^ ERROR: #[serde(borrow)] may only be used on newtype variants
|
||||||
|
S { s: Str<'a> },
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|||||||
@@ -9,9 +9,10 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Deserialize)]
|
||||||
struct Test<'a> {
|
struct Test<'a> {
|
||||||
#[serde(borrow = "'b")] //~^^ HELP: field `s` does not have lifetime 'b
|
#[serde(borrow = "'b")]
|
||||||
|
//~^^^ ERROR: field `s` does not have lifetime 'b
|
||||||
s: &'a str,
|
s: &'a str,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,9 +9,9 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
#[serde(tag = "conflict", content = "conflict")]
|
#[serde(tag = "conflict", content = "conflict")]
|
||||||
//~^^ HELP: enum tags `conflict` for type and content conflict with each other
|
//~^^ ERROR: enum tags `conflict` for type and content conflict with each other
|
||||||
enum E {
|
enum E {
|
||||||
A,
|
A,
|
||||||
B,
|
B,
|
||||||
|
|||||||
@@ -9,8 +9,8 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
//~^ HELP: #[serde(flatten)] cannot be used on newtype structs
|
|
||||||
struct Foo(#[serde(flatten)] HashMap<String, String>);
|
struct Foo(#[serde(flatten)] HashMap<String, String>);
|
||||||
|
//~^^ ERROR: #[serde(flatten)] cannot be used on newtype structs
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|||||||
@@ -9,16 +9,16 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Deserialize)]
|
||||||
//~^ HELP: #[serde(flatten] can not be combined with #[serde(skip_deserializing)]
|
|
||||||
struct Foo {
|
struct Foo {
|
||||||
#[serde(flatten, skip_deserializing)]
|
#[serde(flatten, skip_deserializing)]
|
||||||
|
//~^^^ ERROR: #[serde(flatten] can not be combined with #[serde(skip_deserializing)]
|
||||||
other: Other,
|
other: Other,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize)]
|
#[derive(Deserialize)]
|
||||||
struct Other {
|
struct Other {
|
||||||
x: u32
|
x: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|||||||
@@ -9,16 +9,16 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
//~^ HELP: #[serde(flatten] can not be combined with #[serde(skip_serializing_if = "...")]
|
|
||||||
struct Foo {
|
struct Foo {
|
||||||
#[serde(flatten, skip_serializing_if="Option::is_none")]
|
#[serde(flatten, skip_serializing_if = "Option::is_none")]
|
||||||
|
//~^^^ ERROR: #[serde(flatten] can not be combined with #[serde(skip_serializing_if = "...")]
|
||||||
other: Option<Other>,
|
other: Option<Other>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize)]
|
#[derive(Serialize)]
|
||||||
struct Other {
|
struct Other {
|
||||||
x: u32
|
x: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|||||||
@@ -9,16 +9,16 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
//~^ HELP: #[serde(flatten] can not be combined with #[serde(skip_serializing)]
|
|
||||||
struct Foo {
|
struct Foo {
|
||||||
#[serde(flatten, skip_serializing)]
|
#[serde(flatten, skip_serializing)]
|
||||||
|
//~^^^ ERROR: #[serde(flatten] can not be combined with #[serde(skip_serializing)]
|
||||||
other: Other,
|
other: Other,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize)]
|
#[derive(Serialize)]
|
||||||
struct Other {
|
struct Other {
|
||||||
x: u32
|
x: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|||||||
@@ -9,8 +9,8 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
//~^ HELP: #[serde(flatten)] cannot be used on tuple structs
|
|
||||||
struct Foo(u32, #[serde(flatten)] HashMap<String, String>);
|
struct Foo(u32, #[serde(flatten)] HashMap<String, String>);
|
||||||
|
//~^^ ERROR: #[serde(flatten)] cannot be used on tuple structs
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|||||||
@@ -9,9 +9,9 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
#[serde(tag = "conflict")]
|
#[serde(tag = "conflict")]
|
||||||
//~^^ HELP: variant field name `conflict` conflicts with internal tag
|
//~^^ ERROR: variant field name `conflict` conflicts with internal tag
|
||||||
enum E {
|
enum E {
|
||||||
A {
|
A {
|
||||||
#[serde(rename = "conflict")]
|
#[serde(rename = "conflict")]
|
||||||
|
|||||||
@@ -9,8 +9,9 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Deserialize)]
|
||||||
#[serde(default)] //~^ HELP: #[serde(default)] can only be used on structs
|
#[serde(default)]
|
||||||
|
//~^^ ERROR: #[serde(default)] can only be used on structs
|
||||||
enum E {
|
enum E {
|
||||||
S { f: u8 },
|
S { f: u8 },
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,8 +9,9 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Deserialize)]
|
||||||
#[serde(default)] //~^ HELP: #[serde(default)] can only be used on structs
|
#[serde(default)]
|
||||||
|
//~^^ ERROR: #[serde(default)] can only be used on structs
|
||||||
struct T(u8, u8);
|
struct T(u8, u8);
|
||||||
|
|
||||||
fn main() { }
|
fn main() {}
|
||||||
|
|||||||
@@ -9,9 +9,10 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
struct S {
|
struct S {
|
||||||
#[serde(rename="x", serialize="y")] //~^^ HELP: unknown serde field attribute `serialize`
|
#[serde(rename = "x", serialize = "y")]
|
||||||
|
//~^^^ ERROR: unknown serde field attribute `serialize`
|
||||||
x: (),
|
x: (),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,10 +9,11 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
struct S {
|
struct S {
|
||||||
#[serde(rename="x")]
|
#[serde(rename = "x")]
|
||||||
#[serde(rename(deserialize="y"))] //~^^^ HELP: duplicate serde attribute `rename`
|
#[serde(rename(deserialize = "y"))]
|
||||||
|
//~^^^^ ERROR: duplicate serde attribute `rename`
|
||||||
x: (),
|
x: (),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,9 +9,10 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
struct S {
|
struct S {
|
||||||
#[serde(rename(serialize="x"), rename(serialize="y"))] //~^^ HELP: duplicate serde attribute `rename`
|
#[serde(rename(serialize = "x"), rename(serialize = "y"))]
|
||||||
|
//~^^^ ERROR: duplicate serde attribute `rename`
|
||||||
x: (),
|
x: (),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,10 +9,11 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
struct S {
|
struct S {
|
||||||
#[serde(rename(serialize="x"))]
|
#[serde(rename(serialize = "x"))]
|
||||||
#[serde(rename="y")] //~^^^ HELP: duplicate serde attribute `rename`
|
#[serde(rename = "y")]
|
||||||
|
//~^^^^ ERROR: duplicate serde attribute `rename`
|
||||||
x: (),
|
x: (),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,9 +9,10 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
struct S {
|
struct S {
|
||||||
#[serde(rename(serialize="x", serialize="y"))] //~^^ HELP: duplicate serde attribute `rename`
|
#[serde(rename(serialize = "x", serialize = "y"))]
|
||||||
|
//~^^^ ERROR: duplicate serde attribute `rename`
|
||||||
x: (),
|
x: (),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,10 +9,11 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
struct S {
|
struct S {
|
||||||
#[serde(rename(serialize="x"))]
|
#[serde(rename(serialize = "x"))]
|
||||||
#[serde(rename(serialize="y"))] //~^^^ HELP: duplicate serde attribute `rename`
|
#[serde(rename(serialize = "y"))]
|
||||||
|
//~^^^^ ERROR: duplicate serde attribute `rename`
|
||||||
x: (),
|
x: (),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,9 +9,10 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
struct S {
|
struct S {
|
||||||
#[serde(with = "w", serialize_with = "s")] //~^^ HELP: duplicate serde attribute `serialize_with`
|
#[serde(with = "w", serialize_with = "s")]
|
||||||
|
//~^^^ ERROR: duplicate serde attribute `serialize_with`
|
||||||
x: (),
|
x: (),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,8 +9,9 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
#[serde(tag = "type")] //~^ HELP: #[serde(tag = "...")] cannot be used with tuple variants
|
#[serde(tag = "type")]
|
||||||
|
//~^^ ERROR: #[serde(tag = "...")] cannot be used with tuple variants
|
||||||
enum E {
|
enum E {
|
||||||
Tuple(u8, u8),
|
Tuple(u8, u8),
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,8 +9,9 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
#[serde(tag = "type")] //~^ HELP: #[serde(tag = "...")] can only be used on enums
|
#[serde(tag = "type")]
|
||||||
|
//~^^ ERROR: #[serde(tag = "...")] can only be used on enums
|
||||||
struct S;
|
struct S;
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|||||||
@@ -9,9 +9,10 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
#[serde(untagged)]
|
#[serde(untagged)]
|
||||||
#[serde(tag = "type")] //~^^ HELP: enum cannot be both untagged and internally tagged
|
#[serde(tag = "type")]
|
||||||
|
//~^^^ ERROR: enum cannot be both untagged and internally tagged
|
||||||
enum E {
|
enum E {
|
||||||
A(u8),
|
A(u8),
|
||||||
B(String),
|
B(String),
|
||||||
|
|||||||
@@ -9,8 +9,9 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
#[serde(untagged)] //~^ HELP: #[serde(untagged)] can only be used on enums
|
#[serde(untagged)]
|
||||||
|
//~^^ ERROR: #[serde(untagged)] can only be used on enums
|
||||||
struct S;
|
struct S;
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|||||||
@@ -9,8 +9,9 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Deserialize)]
|
||||||
#[serde(field_identifier, variant_identifier)] //~^ HELP: `field_identifier` and `variant_identifier` cannot both be set
|
#[serde(field_identifier, variant_identifier)]
|
||||||
|
//~^^ ERROR: `field_identifier` and `variant_identifier` cannot both be set
|
||||||
enum F {
|
enum F {
|
||||||
A,
|
A,
|
||||||
B,
|
B,
|
||||||
|
|||||||
@@ -9,8 +9,9 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Deserialize)]
|
||||||
#[serde(field_identifier)]
|
#[serde(field_identifier)]
|
||||||
struct S; //~^^ HELP: `field_identifier` can only be used on an enum
|
//~^^ ERROR: `field_identifier` can only be used on an enum
|
||||||
|
struct S;
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|||||||
@@ -9,11 +9,12 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Deserialize)]
|
||||||
#[serde(field_identifier)]
|
#[serde(field_identifier)]
|
||||||
enum F {
|
enum F {
|
||||||
A,
|
A,
|
||||||
B(u8, u8), //~^^^^ HELP: field_identifier may only contain unit variants
|
B(u8, u8),
|
||||||
|
//~^^^^^ ERROR: field_identifier may only contain unit variants
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|||||||
@@ -9,11 +9,12 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Deserialize)]
|
||||||
#[serde(field_identifier)]
|
#[serde(field_identifier)]
|
||||||
enum F {
|
enum F {
|
||||||
A,
|
A,
|
||||||
Other(String), //~^^^^ HELP: `Other` must be the last variant
|
Other(String),
|
||||||
|
//~^^^^^ ERROR: `Other` must be the last variant
|
||||||
B,
|
B,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,10 +9,11 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Deserialize)]
|
||||||
enum F {
|
enum F {
|
||||||
A,
|
A,
|
||||||
#[serde(other)] //~^^^ HELP: #[serde(other)] may only be used inside a field_identifier
|
#[serde(other)]
|
||||||
|
//~^^^^ ERROR: #[serde(other)] may only be used inside a field_identifier
|
||||||
B,
|
B,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,11 +9,12 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Deserialize)]
|
||||||
#[serde(field_identifier)]
|
#[serde(field_identifier)]
|
||||||
enum F {
|
enum F {
|
||||||
A,
|
A,
|
||||||
#[serde(other)] //~^^^^ HELP: #[serde(other)] must be on a unit variant
|
#[serde(other)]
|
||||||
|
//~^^^^^ ERROR: #[serde(other)] must be on a unit variant
|
||||||
Other(u8, u8),
|
Other(u8, u8),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,11 +9,12 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Deserialize)]
|
||||||
#[serde(field_identifier)]
|
#[serde(field_identifier)]
|
||||||
enum F {
|
enum F {
|
||||||
A,
|
A,
|
||||||
#[serde(other)] //~^^^^ HELP: #[serde(other)] must be the last variant
|
#[serde(other)]
|
||||||
|
//~^^^^^ ERROR: #[serde(other)] must be the last variant
|
||||||
Other,
|
Other,
|
||||||
B,
|
B,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,8 +9,9 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
#[serde(field_identifier)] //~^ HELP: field identifiers cannot be serialized
|
#[serde(field_identifier)]
|
||||||
|
//~^^ ERROR: field identifiers cannot be serialized
|
||||||
enum F {
|
enum F {
|
||||||
A,
|
A,
|
||||||
B,
|
B,
|
||||||
|
|||||||
@@ -9,8 +9,9 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Deserialize)]
|
||||||
#[serde(variant_identifier)]
|
#[serde(variant_identifier)]
|
||||||
struct S; //~^^ HELP: `variant_identifier` can only be used on an enum
|
//~^^ ERROR: `variant_identifier` can only be used on an enum
|
||||||
|
struct S;
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|||||||
@@ -9,11 +9,12 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Deserialize)]
|
||||||
#[serde(variant_identifier)]
|
#[serde(variant_identifier)]
|
||||||
enum F {
|
enum F {
|
||||||
A,
|
A,
|
||||||
B(u8, u8), //~^^^^ HELP: variant_identifier may only contain unit variants
|
B(u8, u8),
|
||||||
|
//~^^^^^ ERROR: variant_identifier may only contain unit variants
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|||||||
@@ -9,7 +9,8 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Deserialize)]
|
||||||
struct S<'de> {
|
struct S<'de> {
|
||||||
s: &'de str, //~^^ HELP: cannot deserialize when there is a lifetime parameter called 'de
|
//~^^ ERROR: cannot deserialize when there is a lifetime parameter called 'de
|
||||||
|
s: &'de str,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,8 +9,9 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Deserialize)]
|
||||||
struct S {
|
struct S {
|
||||||
string: String,
|
string: String,
|
||||||
slice: [u8], //~^^^ HELP: cannot deserialize a dynamically sized struct
|
slice: [u8],
|
||||||
|
//~^^^^ ERROR: cannot deserialize a dynamically sized struct
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,10 +15,11 @@ mod remote {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
#[serde(remote = "remote::S")]
|
#[serde(remote = "remote::S")]
|
||||||
struct S {
|
struct S {
|
||||||
#[serde(getter = "~~~")] //~^^^ HELP: failed to parse path: "~~~"
|
#[serde(getter = "~~~")]
|
||||||
|
//~^^^^ ERROR: failed to parse path: "~~~"
|
||||||
a: u8,
|
a: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,8 +15,9 @@ mod remote {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
#[serde(remote = "~~~")] //~^ HELP: failed to parse path: "~~~"
|
#[serde(remote = "~~~")]
|
||||||
|
//~^^ ERROR: failed to parse path: "~~~"
|
||||||
struct S {
|
struct S {
|
||||||
a: u8,
|
a: u8,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,17 +11,18 @@ extern crate serde_derive;
|
|||||||
|
|
||||||
mod remote {
|
mod remote {
|
||||||
pub enum E {
|
pub enum E {
|
||||||
A { a: u8 }
|
A { a: u8 },
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
#[serde(remote = "remote::E")]
|
#[serde(remote = "remote::E")]
|
||||||
pub enum E {
|
pub enum E {
|
||||||
A {
|
A {
|
||||||
#[serde(getter = "get_a")] //~^^^^ HELP: #[serde(getter = "...")] is not allowed in an enum
|
#[serde(getter = "get_a")]
|
||||||
|
//~^^^^^ ERROR: #[serde(getter = "...")] is not allowed in an enum
|
||||||
a: u8,
|
a: u8,
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|||||||
@@ -19,7 +19,8 @@ mod remote {
|
|||||||
#[derive(Serialize, Deserialize)]
|
#[derive(Serialize, Deserialize)]
|
||||||
#[serde(remote = "remote::S")]
|
#[serde(remote = "remote::S")]
|
||||||
struct S {
|
struct S {
|
||||||
a: u8, //~^^^ ERROR: missing field `b` in initializer of `remote::S`
|
a: u8,
|
||||||
|
//~^^^^ ERROR: missing field `b` in initializer of `remote::S`
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|||||||
@@ -9,9 +9,10 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
struct S {
|
struct S {
|
||||||
#[serde(getter = "S::get")] //~^^ HELP: #[serde(getter = "...")] can only be used in structs that have #[serde(remote = "...")]
|
#[serde(getter = "S::get")]
|
||||||
|
//~^^^ ERROR: #[serde(getter = "...")] can only be used in structs that have #[serde(remote = "...")]
|
||||||
a: u8,
|
a: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,8 @@ mod remote {
|
|||||||
#[serde(remote = "remote::S")]
|
#[serde(remote = "remote::S")]
|
||||||
struct S {
|
struct S {
|
||||||
//~^^^ ERROR: struct `remote::S` has no field named `b`
|
//~^^^ ERROR: struct `remote::S` has no field named `b`
|
||||||
b: u8, //~^^^^ ERROR: no field `b` on type `&remote::S`
|
b: u8,
|
||||||
|
//~^^^^^ ERROR: no field `b` on type `&remote::S`
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|||||||
@@ -13,8 +13,10 @@ mod remote {
|
|||||||
pub struct S(pub u16);
|
pub struct S(pub u16);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize)] //~ ERROR: mismatched types
|
#[derive(Deserialize)]
|
||||||
#[serde(remote = "remote::S")]
|
#[serde(remote = "remote::S")]
|
||||||
struct S(u8); //~^^ expected u16, found u8
|
struct S(u8);
|
||||||
|
//~^^^ ERROR: mismatched types
|
||||||
|
//~^^^^ expected u16, found u8
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|||||||
@@ -21,11 +21,13 @@ mod remote {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: mismatched types
|
#[derive(Serialize)]
|
||||||
#[serde(remote = "remote::S")]
|
#[serde(remote = "remote::S")]
|
||||||
struct S {
|
struct S {
|
||||||
#[serde(getter = "remote::S::get")]
|
#[serde(getter = "remote::S::get")]
|
||||||
a: u8, //~^^^^ expected u8, found u16
|
//~^^^^ ERROR: mismatched types
|
||||||
|
a: u8,
|
||||||
|
//~^^^^^^ expected u8, found u16
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|||||||
@@ -15,10 +15,12 @@ mod remote {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: mismatched types
|
#[derive(Serialize)]
|
||||||
#[serde(remote = "remote::S")]
|
#[serde(remote = "remote::S")]
|
||||||
struct S {
|
struct S {
|
||||||
a: u8, //~^^^ expected u8, found u16
|
a: u8,
|
||||||
|
//~^^^^ ERROR: mismatched types
|
||||||
|
//~^^^^^ expected u8, found u16
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|||||||
@@ -9,10 +9,10 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
#[serde(transparent)]
|
#[serde(transparent)]
|
||||||
|
//~^^ ERROR: #[serde(transparent)] requires struct to have at most one transparent field
|
||||||
struct S {
|
struct S {
|
||||||
//~^^^ HELP: #[serde(transparent)] requires struct to have at most one transparent field
|
|
||||||
a: u8,
|
a: u8,
|
||||||
b: u8,
|
b: u8,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,10 +9,10 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Deserialize)]
|
||||||
#[serde(transparent)]
|
#[serde(transparent)]
|
||||||
|
//~^^ ERROR: #[serde(transparent)] requires at least one field that is neither skipped nor has a default
|
||||||
struct S {
|
struct S {
|
||||||
//~^^^ HELP: #[serde(transparent)] requires at least one field that is neither skipped nor has a default
|
|
||||||
#[serde(skip)]
|
#[serde(skip)]
|
||||||
a: u8,
|
a: u8,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
|
|||||||
@@ -9,10 +9,10 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
#[serde(transparent)]
|
#[serde(transparent)]
|
||||||
|
//~^^ ERROR: #[serde(transparent)] requires at least one field that is not skipped
|
||||||
struct S {
|
struct S {
|
||||||
//~^^^ HELP: #[serde(transparent)] requires at least one field that is not skipped
|
|
||||||
#[serde(skip)]
|
#[serde(skip)]
|
||||||
a: u8,
|
a: u8,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,8 +9,9 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Deserialize)]
|
||||||
#[serde(from = "Option<T")] //~^ HELP: failed to parse type: from = "Option<T"
|
#[serde(from = "Option<T")]
|
||||||
|
//~^^ ERROR: failed to parse type: from = "Option<T"
|
||||||
enum TestOne {
|
enum TestOne {
|
||||||
Testing,
|
Testing,
|
||||||
One,
|
One,
|
||||||
|
|||||||
@@ -9,8 +9,9 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
#[serde(into = "Option<T")] //~^ HELP: failed to parse type: into = "Option<T"
|
#[serde(into = "Option<T")]
|
||||||
|
//~^^ ERROR: failed to parse type: into = "Option<T"
|
||||||
enum TestOne {
|
enum TestOne {
|
||||||
Testing,
|
Testing,
|
||||||
One,
|
One,
|
||||||
|
|||||||
@@ -9,10 +9,11 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
#[serde(abc="xyz")] //~^ HELP: unknown serde container attribute `abc`
|
#[serde(abc = "xyz")]
|
||||||
|
//~^^ ERROR: unknown serde container attribute `abc`
|
||||||
struct A {
|
struct A {
|
||||||
x: u32,
|
x: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() { }
|
fn main() {}
|
||||||
|
|||||||
@@ -9,10 +9,11 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
struct C {
|
struct C {
|
||||||
#[serde(abc="xyz")] //~^^ HELP: unknown serde field attribute `abc`
|
#[serde(abc = "xyz")]
|
||||||
|
//~^^^ ERROR: unknown serde field attribute `abc`
|
||||||
x: u32,
|
x: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() { }
|
fn main() {}
|
||||||
|
|||||||
@@ -9,10 +9,11 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
enum E {
|
enum E {
|
||||||
#[serde(abc="xyz")] //~^^ HELP: unknown serde variant attribute `abc`
|
#[serde(abc = "xyz")]
|
||||||
|
//~^^^ ERROR: unknown serde variant attribute `abc`
|
||||||
V,
|
V,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() { }
|
fn main() {}
|
||||||
|
|||||||
@@ -9,11 +9,11 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Deserialize)]
|
||||||
//~^ HELP: variant `Newtype` cannot have both #[serde(deserialize_with)] and a field 0 marked with #[serde(skip_deserializing)]
|
|
||||||
enum Enum {
|
enum Enum {
|
||||||
#[serde(deserialize_with = "deserialize_some_newtype_variant")]
|
#[serde(deserialize_with = "deserialize_some_newtype_variant")]
|
||||||
|
//~^^^ ERROR: variant `Newtype` cannot have both #[serde(deserialize_with)] and a field 0 marked with #[serde(skip_deserializing)]
|
||||||
Newtype(#[serde(skip_deserializing)] String),
|
Newtype(#[serde(skip_deserializing)] String),
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() { }
|
fn main() {}
|
||||||
|
|||||||
@@ -9,10 +9,10 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Deserialize)]
|
||||||
//~^ HELP: variant `Struct` cannot have both #[serde(deserialize_with)] and a field `f1` marked with #[serde(skip_deserializing)]
|
|
||||||
enum Enum {
|
enum Enum {
|
||||||
#[serde(deserialize_with = "deserialize_some_other_variant")]
|
#[serde(deserialize_with = "deserialize_some_other_variant")]
|
||||||
|
//~^^^ ERROR: variant `Struct` cannot have both #[serde(deserialize_with)] and a field `f1` marked with #[serde(skip_deserializing)]
|
||||||
Struct {
|
Struct {
|
||||||
#[serde(skip_deserializing)]
|
#[serde(skip_deserializing)]
|
||||||
f1: String,
|
f1: String,
|
||||||
@@ -20,4 +20,4 @@ enum Enum {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() { }
|
fn main() {}
|
||||||
|
|||||||
@@ -9,11 +9,11 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Deserialize)]
|
||||||
//~^ HELP: variant `Tuple` cannot have both #[serde(deserialize_with)] and a field 0 marked with #[serde(skip_deserializing)]
|
|
||||||
enum Enum {
|
enum Enum {
|
||||||
#[serde(deserialize_with = "deserialize_some_other_variant")]
|
#[serde(deserialize_with = "deserialize_some_other_variant")]
|
||||||
|
//~^^^ ERROR: variant `Tuple` cannot have both #[serde(deserialize_with)] and a field 0 marked with #[serde(skip_deserializing)]
|
||||||
Tuple(#[serde(skip_deserializing)] String, u8),
|
Tuple(#[serde(skip_deserializing)] String, u8),
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() { }
|
fn main() {}
|
||||||
|
|||||||
@@ -9,12 +9,12 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Deserialize)]
|
||||||
//~^ HELP: variant `Unit` cannot have both #[serde(deserialize_with)] and #[serde(skip_deserializing)]
|
|
||||||
enum Enum {
|
enum Enum {
|
||||||
#[serde(deserialize_with = "deserialize_some_unit_variant")]
|
#[serde(deserialize_with = "deserialize_some_unit_variant")]
|
||||||
#[serde(skip_deserializing)]
|
#[serde(skip_deserializing)]
|
||||||
|
//~^^^^ ERROR: variant `Unit` cannot have both #[serde(deserialize_with)] and #[serde(skip_deserializing)]
|
||||||
Unit,
|
Unit,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() { }
|
fn main() {}
|
||||||
|
|||||||
@@ -9,11 +9,11 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
//~^ HELP: variant `Newtype` cannot have both #[serde(serialize_with)] and a field 0 marked with #[serde(skip_serializing)]
|
|
||||||
enum Enum {
|
enum Enum {
|
||||||
#[serde(serialize_with = "serialize_some_newtype_variant")]
|
#[serde(serialize_with = "serialize_some_newtype_variant")]
|
||||||
|
//~^^^ ERROR: variant `Newtype` cannot have both #[serde(serialize_with)] and a field 0 marked with #[serde(skip_serializing)]
|
||||||
Newtype(#[serde(skip_serializing)] String),
|
Newtype(#[serde(skip_serializing)] String),
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() { }
|
fn main() {}
|
||||||
|
|||||||
@@ -9,11 +9,11 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
//~^ HELP: variant `Newtype` cannot have both #[serde(serialize_with)] and a field 0 marked with #[serde(skip_serializing_if)]
|
|
||||||
enum Enum {
|
enum Enum {
|
||||||
#[serde(serialize_with = "serialize_some_newtype_variant")]
|
#[serde(serialize_with = "serialize_some_newtype_variant")]
|
||||||
|
//~^^^ ERROR: variant `Newtype` cannot have both #[serde(serialize_with)] and a field 0 marked with #[serde(skip_serializing_if)]
|
||||||
Newtype(#[serde(skip_serializing_if = "always")] String),
|
Newtype(#[serde(skip_serializing_if = "always")] String),
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() { }
|
fn main() {}
|
||||||
|
|||||||
@@ -9,10 +9,10 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
//~^ HELP: variant `Struct` cannot have both #[serde(serialize_with)] and a field `f1` marked with #[serde(skip_serializing)]
|
|
||||||
enum Enum {
|
enum Enum {
|
||||||
#[serde(serialize_with = "serialize_some_other_variant")]
|
#[serde(serialize_with = "serialize_some_other_variant")]
|
||||||
|
//~^^^ ERROR: variant `Struct` cannot have both #[serde(serialize_with)] and a field `f1` marked with #[serde(skip_serializing)]
|
||||||
Struct {
|
Struct {
|
||||||
#[serde(skip_serializing)]
|
#[serde(skip_serializing)]
|
||||||
f1: String,
|
f1: String,
|
||||||
@@ -20,4 +20,4 @@ enum Enum {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() { }
|
fn main() {}
|
||||||
|
|||||||
@@ -9,10 +9,10 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
//~^ HELP: variant `Struct` cannot have both #[serde(serialize_with)] and a field `f1` marked with #[serde(skip_serializing_if)]
|
|
||||||
enum Enum {
|
enum Enum {
|
||||||
#[serde(serialize_with = "serialize_some_newtype_variant")]
|
#[serde(serialize_with = "serialize_some_newtype_variant")]
|
||||||
|
//~^^^ ERROR: variant `Struct` cannot have both #[serde(serialize_with)] and a field `f1` marked with #[serde(skip_serializing_if)]
|
||||||
Struct {
|
Struct {
|
||||||
#[serde(skip_serializing_if = "always")]
|
#[serde(skip_serializing_if = "always")]
|
||||||
f1: String,
|
f1: String,
|
||||||
@@ -20,4 +20,4 @@ enum Enum {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() { }
|
fn main() {}
|
||||||
|
|||||||
@@ -9,11 +9,11 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
//~^ HELP: variant `Tuple` cannot have both #[serde(serialize_with)] and a field 0 marked with #[serde(skip_serializing)]
|
|
||||||
enum Enum {
|
enum Enum {
|
||||||
#[serde(serialize_with = "serialize_some_other_variant")]
|
#[serde(serialize_with = "serialize_some_other_variant")]
|
||||||
|
//~^^^ ERROR: variant `Tuple` cannot have both #[serde(serialize_with)] and a field 0 marked with #[serde(skip_serializing)]
|
||||||
Tuple(#[serde(skip_serializing)] String, u8),
|
Tuple(#[serde(skip_serializing)] String, u8),
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() { }
|
fn main() {}
|
||||||
|
|||||||
@@ -9,11 +9,11 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
//~^ HELP: variant `Tuple` cannot have both #[serde(serialize_with)] and a field 0 marked with #[serde(skip_serializing_if)]
|
|
||||||
enum Enum {
|
enum Enum {
|
||||||
#[serde(serialize_with = "serialize_some_other_variant")]
|
#[serde(serialize_with = "serialize_some_other_variant")]
|
||||||
|
//~^^^ ERROR: variant `Tuple` cannot have both #[serde(serialize_with)] and a field 0 marked with #[serde(skip_serializing_if)]
|
||||||
Tuple(#[serde(skip_serializing_if = "always")] String, u8),
|
Tuple(#[serde(skip_serializing_if = "always")] String, u8),
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() { }
|
fn main() {}
|
||||||
|
|||||||
@@ -9,12 +9,12 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
|
#[derive(Serialize)]
|
||||||
//~^ HELP: variant `Unit` cannot have both #[serde(serialize_with)] and #[serde(skip_serializing)]
|
|
||||||
enum Enum {
|
enum Enum {
|
||||||
#[serde(serialize_with = "serialize_some_unit_variant")]
|
#[serde(serialize_with = "serialize_some_unit_variant")]
|
||||||
#[serde(skip_serializing)]
|
#[serde(skip_serializing)]
|
||||||
|
//~^^^^ ERROR: variant `Unit` cannot have both #[serde(serialize_with)] and #[serde(skip_serializing)]
|
||||||
Unit,
|
Unit,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() { }
|
fn main() {}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user