From c24c649f99ec1dca9eba2763d47b4d0e64fd64af Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Sat, 24 Mar 2018 10:39:40 +0100 Subject: [PATCH] impl Serialize and Deserialize for std::num::NonZero* MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit … gated on the `unstable` Cargo feature. These are new standard library types. Tracking issue: https://github.com/rust-lang/rust/issues/49137 --- serde/Cargo.toml | 2 +- serde/src/de/impls.rs | 33 +++++++++++++++++++++++++++++++++ serde/src/de/mod.rs | 1 + serde/src/lib.rs | 3 ++- serde/src/ser/impls.rs | 26 ++++++++++++++++++++++++++ serde/src/ser/mod.rs | 1 + 6 files changed, 64 insertions(+), 2 deletions(-) diff --git a/serde/Cargo.toml b/serde/Cargo.toml index db29c60e3a..1d26f0a707 100644 --- a/serde/Cargo.toml +++ b/serde/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "serde" -version = "1.0.34" # remember to update html_root_url +version = "1.0.35" # remember to update html_root_url authors = ["Erick Tryzelaar ", "David Tolnay "] license = "MIT/Apache-2.0" description = "A generic serialization/deserialization framework" diff --git a/serde/src/de/impls.rs b/serde/src/de/impls.rs index d872cbe61e..a5b111734e 100644 --- a/serde/src/de/impls.rs +++ b/serde/src/de/impls.rs @@ -1918,6 +1918,7 @@ where //////////////////////////////////////////////////////////////////////////////// #[cfg(feature = "unstable")] +#[allow(deprecated)] impl<'de, T> Deserialize<'de> for NonZero where T: Deserialize<'de> + Zeroable, @@ -1934,6 +1935,38 @@ where } } +macro_rules! nonzero_integers { + ( $( $T: ident, )+ ) => { + nonzero_integers!(@ $(::std::num::$T,)+); + }; + ( @ $( $T: ty, )+ ) => { + $( + #[cfg(feature = "unstable")] + impl<'de> Deserialize<'de> for $T { + fn deserialize(deserializer: D) -> Result<$T, D::Error> + where + D: Deserializer<'de>, + { + let value = try!(Deserialize::deserialize(deserializer)); + match <$T>::new(value) { + Some(nonzero) => Ok(nonzero), + None => Err(Error::custom("expected a non-zero value")), + } + } + } + )+ + } +} + +nonzero_integers! { + NonZeroU8, NonZeroI8, + NonZeroU16, NonZeroI16, + NonZeroU32, NonZeroI32, + NonZeroU64, NonZeroI64, + // FIXME: https://github.com/serde-rs/serde/issues/1136 NonZeroU128, NonZeroI128, + NonZeroUsize, NonZeroIsize, +} + //////////////////////////////////////////////////////////////////////////////// impl<'de, T, E> Deserialize<'de> for Result diff --git a/serde/src/de/mod.rs b/serde/src/de/mod.rs index cc2c650240..d3c4d64929 100644 --- a/serde/src/de/mod.rs +++ b/serde/src/de/mod.rs @@ -99,6 +99,7 @@ //! - PathBuf //! - Range\ //! - NonZero\ (unstable) +//! - num::NonZero* (unstable) //! - **Net types**: //! - IpAddr //! - Ipv4Addr diff --git a/serde/src/lib.rs b/serde/src/lib.rs index 727897c0db..a079417452 100644 --- a/serde/src/lib.rs +++ b/serde/src/lib.rs @@ -79,7 +79,7 @@ //////////////////////////////////////////////////////////////////////////////// // Serde types in rustdoc of other crates get linked to here. -#![doc(html_root_url = "https://docs.rs/serde/1.0.34")] +#![doc(html_root_url = "https://docs.rs/serde/1.0.35")] // Support using Serde without the standard library! #![cfg_attr(not(feature = "std"), no_std)] // Unstable functionality only if the user asks for it. For tracking and @@ -211,6 +211,7 @@ mod lib { pub use std::sync::{Mutex, RwLock}; #[cfg(feature = "unstable")] + #[allow(deprecated)] pub use core::nonzero::{NonZero, Zeroable}; } diff --git a/serde/src/ser/impls.rs b/serde/src/ser/impls.rs index f62a3b2cb0..1b5fe3f575 100644 --- a/serde/src/ser/impls.rs +++ b/serde/src/ser/impls.rs @@ -351,6 +351,7 @@ deref_impl!(<'a, T: ?Sized> Serialize for Cow<'a, T> where T: Serialize + ToOwne //////////////////////////////////////////////////////////////////////////////// #[cfg(feature = "unstable")] +#[allow(deprecated)] impl Serialize for NonZero where T: Serialize + Zeroable + Clone, @@ -363,6 +364,31 @@ where } } +macro_rules! nonzero_integers { + ( $( $T: ident, )+ ) => { + $( + #[cfg(feature = "unstable")] + impl Serialize for ::std::num::$T { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + self.clone().get().serialize(serializer) + } + } + )+ + } +} + +nonzero_integers! { + NonZeroU8, NonZeroI8, + NonZeroU16, NonZeroI16, + NonZeroU32, NonZeroI32, + NonZeroU64, NonZeroI64, + // FIXME: https://github.com/serde-rs/serde/issues/1136 NonZeroU128, NonZeroI128, + NonZeroUsize, NonZeroIsize, +} + impl Serialize for Cell where T: Serialize + Copy, diff --git a/serde/src/ser/mod.rs b/serde/src/ser/mod.rs index e23ef04aaa..71274e3654 100644 --- a/serde/src/ser/mod.rs +++ b/serde/src/ser/mod.rs @@ -94,6 +94,7 @@ //! - PathBuf //! - Range\ //! - NonZero\ (unstable) +//! - num::NonZero* (unstable) //! - **Net types**: //! - IpAddr //! - Ipv4Addr