diff --git a/serde/build.rs b/serde/build.rs index 61376081..ca991a5d 100644 --- a/serde/build.rs +++ b/serde/build.rs @@ -71,6 +71,11 @@ fn main() { println!("cargo:rustc-cfg=num_nonzero"); } + // Current minimum supported version of serde_derive crate is Rust 1.31. + if minor >= 31 { + println!("cargo:rustc-cfg=serde_derive"); + } + // TryFrom, Atomic types, and non-zero signed integers stabilized in Rust 1.34: // https://blog.rust-lang.org/2019/04/11/Rust-1.34.0.html#tryfrom-and-tryinto // https://blog.rust-lang.org/2019/04/11/Rust-1.34.0.html#library-stabilizations diff --git a/serde/src/de/impls.rs b/serde/src/de/impls.rs index 352b6508..409f6cbc 100644 --- a/serde/src/de/impls.rs +++ b/serde/src/de/impls.rs @@ -7,10 +7,10 @@ use de::{ #[cfg(any(core_duration, feature = "std", feature = "alloc"))] use de::MapAccess; -use __private::de::InPlaceSeed; +use seed::InPlaceSeed; #[cfg(any(feature = "std", feature = "alloc"))] -use __private::de::size_hint; +use __private::size_hint; //////////////////////////////////////////////////////////////////////////////// diff --git a/serde/src/de/seed.rs b/serde/src/de/seed.rs new file mode 100644 index 00000000..13b7ea46 --- /dev/null +++ b/serde/src/de/seed.rs @@ -0,0 +1,19 @@ +use de::{Deserialize, DeserializeSeed, Deserializer}; + +/// A DeserializeSeed helper for implementing deserialize_in_place Visitors. +/// +/// Wraps a mutable reference and calls deserialize_in_place on it. +pub struct InPlaceSeed<'a, T: 'a>(pub &'a mut T); + +impl<'a, 'de, T> DeserializeSeed<'de> for InPlaceSeed<'a, T> +where + T: Deserialize<'de>, +{ + type Value = (); + fn deserialize(self, deserializer: D) -> Result + where + D: Deserializer<'de>, + { + T::deserialize_in_place(deserializer, self.0) + } +} diff --git a/serde/src/de/value.rs b/serde/src/de/value.rs index c3a55a4b..1b154c3a 100644 --- a/serde/src/de/value.rs +++ b/serde/src/de/value.rs @@ -24,7 +24,7 @@ use lib::*; use self::private::{First, Second}; -use __private::de::size_hint; +use __private::size_hint; use de::{self, Deserializer, Expected, IntoDeserializer, SeqAccess, Visitor}; use ser; diff --git a/serde/src/lib.rs b/serde/src/lib.rs index d022b0e4..9a3c510a 100644 --- a/serde/src/lib.rs +++ b/serde/src/lib.rs @@ -276,6 +276,9 @@ use self::__private as export; #[allow(unused_imports)] use self::__private as private; +#[path = "de/seed.rs"] +mod seed; + #[cfg(not(feature = "std"))] mod std_error; diff --git a/serde/src/private/de.rs b/serde/src/private/de.rs index 1b05cc74..0c2f3b82 100644 --- a/serde/src/private/de.rs +++ b/serde/src/private/de.rs @@ -1,10 +1,10 @@ use lib::*; use de::value::{BorrowedBytesDeserializer, BytesDeserializer}; -use de::{Deserialize, DeserializeSeed, Deserializer, Error, IntoDeserializer, Visitor}; +use de::{Deserialize, Deserializer, Error, IntoDeserializer, Visitor}; #[cfg(any(feature = "std", feature = "alloc"))] -use de::{MapAccess, Unexpected}; +use de::{DeserializeSeed, MapAccess, Unexpected}; #[cfg(any(feature = "std", feature = "alloc"))] pub use self::content::{ @@ -13,6 +13,8 @@ pub use self::content::{ TagOrContentField, TagOrContentFieldVisitor, TaggedContentVisitor, UntaggedUnitVisitor, }; +pub use seed::InPlaceSeed; + /// If the missing field is of type `Option` then treat is as `None`, /// otherwise it is an error. pub fn missing_field<'de, V, E>(field: &'static str) -> Result @@ -189,29 +191,6 @@ where .map(From::from) } -pub mod size_hint { - use lib::*; - - pub fn from_bounds(iter: &I) -> Option - where - I: Iterator, - { - helper(iter.size_hint()) - } - - #[inline] - pub fn cautious(hint: Option) -> usize { - cmp::min(hint.unwrap_or(0), 4096) - } - - fn helper(bounds: (usize, Option)) -> Option { - match bounds { - (lower, Some(upper)) if lower == upper => Some(upper), - _ => None, - } - } -} - #[cfg(any(feature = "std", feature = "alloc"))] mod content { // This module is private and nothing here should be used outside of @@ -226,7 +205,7 @@ mod content { use lib::*; - use super::size_hint; + use __private::size_hint; use de::{ self, Deserialize, DeserializeSeed, Deserializer, EnumAccess, Expected, IgnoredAny, MapAccess, SeqAccess, Unexpected, Visitor, @@ -2666,24 +2645,6 @@ where } } -/// A DeserializeSeed helper for implementing deserialize_in_place Visitors. -/// -/// Wraps a mutable reference and calls deserialize_in_place on it. -pub struct InPlaceSeed<'a, T: 'a>(pub &'a mut T); - -impl<'a, 'de, T> DeserializeSeed<'de> for InPlaceSeed<'a, T> -where - T: Deserialize<'de>, -{ - type Value = (); - fn deserialize(self, deserializer: D) -> Result - where - D: Deserializer<'de>, - { - T::deserialize_in_place(deserializer, self.0) - } -} - #[cfg(any(feature = "std", feature = "alloc"))] pub struct FlatMapDeserializer<'a, 'de: 'a, E>( pub &'a mut Vec, Content<'de>)>>, diff --git a/serde/src/private/mod.rs b/serde/src/private/mod.rs index 27f9d0ed..24ea84b3 100644 --- a/serde/src/private/mod.rs +++ b/serde/src/private/mod.rs @@ -1,6 +1,10 @@ +#[cfg(serde_derive)] pub mod de; +#[cfg(serde_derive)] pub mod ser; +pub mod size_hint; + // FIXME: #[cfg(doctest)] once https://github.com/rust-lang/rust/issues/67295 is fixed. pub mod doc; diff --git a/serde/src/private/size_hint.rs b/serde/src/private/size_hint.rs new file mode 100644 index 00000000..ca71e616 --- /dev/null +++ b/serde/src/private/size_hint.rs @@ -0,0 +1,21 @@ +use lib::*; + +pub fn from_bounds(iter: &I) -> Option +where + I: Iterator, +{ + helper(iter.size_hint()) +} + +#[cfg(any(feature = "std", feature = "alloc"))] +#[inline] +pub fn cautious(hint: Option) -> usize { + cmp::min(hint.unwrap_or(0), 4096) +} + +fn helper(bounds: (usize, Option)) -> Option { + match bounds { + (lower, Some(upper)) if lower == upper => Some(upper), + _ => None, + } +}