diff --git a/serde/src/de/impls.rs b/serde/src/de/impls.rs index d872cbe6..5ea67a21 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,39 @@ where } } +macro_rules! nonzero_integers { + ( @ $( $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")), + } + } + } + )+ + }; + ( $( $T: ident, )+ ) => { + nonzero_integers!(@ $(::lib::num::$T,)+ ); + } +} + +nonzero_integers! { + // Not including signed NonZeroI* since they might be removed + NonZeroU8, + NonZeroU16, + NonZeroU32, + NonZeroU64, + // FIXME: https://github.com/serde-rs/serde/issues/1136 NonZeroU128, + NonZeroUsize, +} + //////////////////////////////////////////////////////////////////////////////// impl<'de, T, E> Deserialize<'de> for Result diff --git a/serde/src/de/mod.rs b/serde/src/de/mod.rs index cc2c6502..d3c4d649 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 727897c0..b42c0f39 100644 --- a/serde/src/lib.rs +++ b/serde/src/lib.rs @@ -211,7 +211,11 @@ mod lib { pub use std::sync::{Mutex, RwLock}; #[cfg(feature = "unstable")] + #[allow(deprecated)] pub use core::nonzero::{NonZero, Zeroable}; + + #[cfg(feature = "unstable")] + pub use core::num; } //////////////////////////////////////////////////////////////////////////////// diff --git a/serde/src/ser/impls.rs b/serde/src/ser/impls.rs index f62a3b2c..bba65a71 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,32 @@ where } } +macro_rules! nonzero_integers { + ( $( $T: ident, )+ ) => { + $( + #[cfg(feature = "unstable")] + impl Serialize for ::lib::num::$T { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + self.get().serialize(serializer) + } + } + )+ + } +} + +nonzero_integers! { + // Not including signed NonZeroI* since they might be removed + NonZeroU8, + NonZeroU16, + NonZeroU32, + NonZeroU64, + // FIXME: https://github.com/serde-rs/serde/issues/1136 NonZeroU128, + NonZeroUsize, +} + impl Serialize for Cell where T: Serialize + Copy, diff --git a/serde/src/ser/mod.rs b/serde/src/ser/mod.rs index e23ef04a..71274e36 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