From a16893429bdf560f616ba27f44181d91d1ed3dd5 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sat, 13 Sep 2025 12:01:59 -0700 Subject: [PATCH 1/5] Make module for Content-related private code --- serde_core/src/lib.rs | 3 +-- serde_core/src/{private.rs => private/content.rs} | 0 serde_core/src/private/mod.rs | 6 ++++++ 3 files changed, 7 insertions(+), 2 deletions(-) rename serde_core/src/{private.rs => private/content.rs} (100%) create mode 100644 serde_core/src/private/mod.rs diff --git a/serde_core/src/lib.rs b/serde_core/src/lib.rs index 50fa971e..e3bc9278 100644 --- a/serde_core/src/lib.rs +++ b/serde_core/src/lib.rs @@ -263,9 +263,8 @@ pub use crate::ser::{Serialize, Serializer}; pub use lib::from_utf8_lossy; // Used by generated code. Not public API. -#[cfg(all(not(no_serde_derive), any(feature = "std", feature = "alloc")))] #[doc(hidden)] -#[path = "private.rs"] +#[path = "private/mod.rs"] pub mod __private; #[cfg(all(not(no_serde_derive), any(feature = "std", feature = "alloc")))] use self::__private as private; diff --git a/serde_core/src/private.rs b/serde_core/src/private/content.rs similarity index 100% rename from serde_core/src/private.rs rename to serde_core/src/private/content.rs diff --git a/serde_core/src/private/mod.rs b/serde_core/src/private/mod.rs new file mode 100644 index 00000000..c27198ca --- /dev/null +++ b/serde_core/src/private/mod.rs @@ -0,0 +1,6 @@ +#[cfg(all(not(no_serde_derive), any(feature = "std", feature = "alloc")))] +mod content; + +#[cfg(all(not(no_serde_derive), any(feature = "std", feature = "alloc")))] +#[doc(hidden)] +pub use self::content::{Content, ContentVisitor}; From 7f831225a9343f622a4a6693bda33d48e33e83c3 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sat, 13 Sep 2025 09:55:41 -0700 Subject: [PATCH 2/5] Make from_utf8_lossy private --- serde/src/private/mod.rs | 6 +----- serde_core/src/de/impls.rs | 13 ++++++++----- serde_core/src/lib.rs | 26 -------------------------- serde_core/src/private/mod.rs | 3 +++ serde_core/src/private/string.rs | 23 +++++++++++++++++++++++ 5 files changed, 35 insertions(+), 36 deletions(-) create mode 100644 serde_core/src/private/string.rs diff --git a/serde/src/private/mod.rs b/serde/src/private/mod.rs index 7202677d..1d4d494e 100644 --- a/serde/src/private/mod.rs +++ b/serde/src/private/mod.rs @@ -15,11 +15,7 @@ pub use crate::lib::option::Option::{self, None, Some}; pub use crate::lib::ptr; pub use crate::lib::result::Result::{self, Err, Ok}; -pub use self::string::from_utf8_lossy; +pub use serde_core::__private::string::from_utf8_lossy; #[cfg(any(feature = "alloc", feature = "std"))] pub use crate::lib::{ToString, Vec}; - -mod string { - pub use serde_core::from_utf8_lossy; -} diff --git a/serde_core/src/de/impls.rs b/serde_core/src/de/impls.rs index 7f1962ff..4bd7e0f6 100644 --- a/serde_core/src/de/impls.rs +++ b/serde_core/src/de/impls.rs @@ -4,7 +4,7 @@ use crate::de::{ Deserialize, Deserializer, EnumAccess, Error, MapAccess, SeqAccess, Unexpected, VariantAccess, Visitor, }; - +use crate::private; use crate::seed::InPlaceSeed; #[cfg(any(feature = "std", feature = "alloc"))] @@ -2174,7 +2174,7 @@ impl<'de> Deserialize<'de> for Duration { b"secs" => Ok(Field::Secs), b"nanos" => Ok(Field::Nanos), _ => { - let value = crate::lib::from_utf8_lossy(value); + let value = private::string::from_utf8_lossy(value); Err(Error::unknown_field(&*value, FIELDS)) } } @@ -2465,6 +2465,7 @@ mod range { use crate::lib::*; use crate::de::{Deserialize, Deserializer, Error, MapAccess, SeqAccess, Visitor}; + use crate::private; pub const FIELDS: &[&str] = &["start", "end"]; @@ -2510,7 +2511,7 @@ mod range { b"start" => Ok(Field::Start), b"end" => Ok(Field::End), _ => { - let value = crate::lib::from_utf8_lossy(value); + let value = private::string::from_utf8_lossy(value); Err(Error::unknown_field(&*value, FIELDS)) } } @@ -2623,6 +2624,7 @@ mod range_from { use crate::lib::*; use crate::de::{Deserialize, Deserializer, Error, MapAccess, SeqAccess, Visitor}; + use crate::private; pub const FIELDS: &[&str] = &["start"]; @@ -2665,7 +2667,7 @@ mod range_from { match value { b"start" => Ok(Field::Start), _ => { - let value = crate::lib::from_utf8_lossy(value); + let value = private::string::from_utf8_lossy(value); Err(Error::unknown_field(&*value, FIELDS)) } } @@ -2761,6 +2763,7 @@ mod range_to { use crate::lib::*; use crate::de::{Deserialize, Deserializer, Error, MapAccess, SeqAccess, Visitor}; + use crate::private; pub const FIELDS: &[&str] = &["end"]; @@ -2803,7 +2806,7 @@ mod range_to { match value { b"end" => Ok(Field::End), _ => { - let value = crate::lib::from_utf8_lossy(value); + let value = private::string::from_utf8_lossy(value); Err(Error::unknown_field(&*value, FIELDS)) } } diff --git a/serde_core/src/lib.rs b/serde_core/src/lib.rs index e3bc9278..8956e763 100644 --- a/serde_core/src/lib.rs +++ b/serde_core/src/lib.rs @@ -103,7 +103,6 @@ mod lib { pub use self::core::{cmp, mem}; pub use self::core::cell::{Cell, RefCell}; - pub use self::core::cmp::Reverse; pub use self::core::fmt::{self, Debug, Display, Write as FmtWrite}; pub use self::core::marker::PhantomData; @@ -203,27 +202,6 @@ mod lib { #[cfg(not(no_core_num_saturating))] pub use self::core::num::Saturating; - #[cfg(any(feature = "std", feature = "alloc"))] - #[doc(hidden)] - pub fn from_utf8_lossy(bytes: &[u8]) -> Cow<'_, str> { - String::from_utf8_lossy(bytes) - } - - // The generated code calls this like: - // - // let value = &_serde::__private::from_utf8_lossy(bytes); - // Err(_serde::de::Error::unknown_variant(value, VARIANTS)) - // - // so it is okay for the return type to be different from the std case as long - // as the above works. - #[cfg(not(any(feature = "std", feature = "alloc")))] - #[doc(hidden)] - pub fn from_utf8_lossy(bytes: &[u8]) -> &str { - // Three unicode replacement characters if it fails. They look like a - // white-on-black question mark. The user will recognize it as invalid - // UTF-8. - str::from_utf8(bytes).unwrap_or("\u{fffd}\u{fffd}\u{fffd}") - } } // None of this crate's error handling needs the `From::from` error conversion @@ -259,14 +237,10 @@ pub use crate::de::{Deserialize, Deserializer}; #[doc(inline)] pub use crate::ser::{Serialize, Serializer}; -#[doc(hidden)] -pub use lib::from_utf8_lossy; - // Used by generated code. Not public API. #[doc(hidden)] #[path = "private/mod.rs"] pub mod __private; -#[cfg(all(not(no_serde_derive), any(feature = "std", feature = "alloc")))] use self::__private as private; #[path = "de/seed.rs"] diff --git a/serde_core/src/private/mod.rs b/serde_core/src/private/mod.rs index c27198ca..f2c8649b 100644 --- a/serde_core/src/private/mod.rs +++ b/serde_core/src/private/mod.rs @@ -1,6 +1,9 @@ #[cfg(all(not(no_serde_derive), any(feature = "std", feature = "alloc")))] mod content; +#[doc(hidden)] +pub mod string; + #[cfg(all(not(no_serde_derive), any(feature = "std", feature = "alloc")))] #[doc(hidden)] pub use self::content::{Content, ContentVisitor}; diff --git a/serde_core/src/private/string.rs b/serde_core/src/private/string.rs new file mode 100644 index 00000000..c8121a0d --- /dev/null +++ b/serde_core/src/private/string.rs @@ -0,0 +1,23 @@ +use crate::lib::*; + +#[cfg(any(feature = "std", feature = "alloc"))] +#[doc(hidden)] +pub fn from_utf8_lossy(bytes: &[u8]) -> Cow<'_, str> { + String::from_utf8_lossy(bytes) +} + +// The generated code calls this like: +// +// let value = &_serde::__private::from_utf8_lossy(bytes); +// Err(_serde::de::Error::unknown_variant(value, VARIANTS)) +// +// so it is okay for the return type to be different from the std case as long +// as the above works. +#[cfg(not(any(feature = "std", feature = "alloc")))] +#[doc(hidden)] +pub fn from_utf8_lossy(bytes: &[u8]) -> &str { + // Three unicode replacement characters if it fails. They look like a + // white-on-black question mark. The user will recognize it as invalid + // UTF-8. + str::from_utf8(bytes).unwrap_or("\u{fffd}\u{fffd}\u{fffd}") +} From f916ec6baa2f442c0d74707f8f7bba42302bfb0c Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sat, 13 Sep 2025 12:12:05 -0700 Subject: [PATCH 3/5] Make size_hint private --- serde/src/private/de.rs | 6 +++--- serde_core/src/de/impls.rs | 2 +- serde_core/src/de/mod.rs | 1 - serde_core/src/de/value.rs | 3 ++- serde_core/src/private/content.rs | 5 ++--- serde_core/src/private/mod.rs | 3 +++ serde_core/src/{de => private}/size_hint.rs | 3 --- 7 files changed, 11 insertions(+), 12 deletions(-) rename serde_core/src/{de => private}/size_hint.rs (71%) diff --git a/serde/src/private/de.rs b/serde/src/private/de.rs index 804bed2e..c54f1307 100644 --- a/serde/src/private/de.rs +++ b/serde/src/private/de.rs @@ -209,11 +209,11 @@ mod content { use crate::lib::*; use crate::de::{ - self, size_hint, Deserialize, DeserializeSeed, Deserializer, EnumAccess, Expected, - IgnoredAny, MapAccess, SeqAccess, Unexpected, Visitor, + self, Deserialize, DeserializeSeed, Deserializer, EnumAccess, Expected, IgnoredAny, + MapAccess, SeqAccess, Unexpected, Visitor, }; pub use serde_core::__private::Content; - use serde_core::__private::ContentVisitor; + use serde_core::__private::{size_hint, ContentVisitor}; pub fn content_as_str<'a, 'de>(content: &'a Content<'de>) -> Option<&'a str> { match *content { diff --git a/serde_core/src/de/impls.rs b/serde_core/src/de/impls.rs index 4bd7e0f6..90b1bf6e 100644 --- a/serde_core/src/de/impls.rs +++ b/serde_core/src/de/impls.rs @@ -8,7 +8,7 @@ use crate::private; use crate::seed::InPlaceSeed; #[cfg(any(feature = "std", feature = "alloc"))] -use crate::de::size_hint; +use crate::private::size_hint; //////////////////////////////////////////////////////////////////////////////// diff --git a/serde_core/src/de/mod.rs b/serde_core/src/de/mod.rs index fa1fecdf..dc5c4495 100644 --- a/serde_core/src/de/mod.rs +++ b/serde_core/src/de/mod.rs @@ -120,7 +120,6 @@ pub mod value; mod ignored_any; mod impls; -pub mod size_hint; pub use self::ignored_any::IgnoredAny; pub use crate::seed::InPlaceSeed; diff --git a/serde_core/src/de/value.rs b/serde_core/src/de/value.rs index 8f9c0b48..3d5475de 100644 --- a/serde_core/src/de/value.rs +++ b/serde_core/src/de/value.rs @@ -24,7 +24,8 @@ use crate::lib::*; use self::private::{First, Second}; -use crate::de::{self, size_hint, Deserializer, Expected, IntoDeserializer, SeqAccess, Visitor}; +use crate::de::{self, Deserializer, Expected, IntoDeserializer, SeqAccess, Visitor}; +use crate::private::size_hint; use crate::ser; //////////////////////////////////////////////////////////////////////////////// diff --git a/serde_core/src/private/content.rs b/serde_core/src/private/content.rs index 7abdee7d..8052d1d4 100644 --- a/serde_core/src/private/content.rs +++ b/serde_core/src/private/content.rs @@ -1,7 +1,6 @@ -use crate::de::{ - self, size_hint, Deserialize, Deserializer, EnumAccess, MapAccess, SeqAccess, Visitor, -}; +use crate::de::{self, Deserialize, Deserializer, EnumAccess, MapAccess, SeqAccess, Visitor}; use crate::lib::*; +use crate::private::size_hint; // Used from generated code to buffer the contents of the Deserializer when // deserializing untagged enums and internally tagged enums. diff --git a/serde_core/src/private/mod.rs b/serde_core/src/private/mod.rs index f2c8649b..a8016f48 100644 --- a/serde_core/src/private/mod.rs +++ b/serde_core/src/private/mod.rs @@ -1,6 +1,9 @@ #[cfg(all(not(no_serde_derive), any(feature = "std", feature = "alloc")))] mod content; +#[doc(hidden)] +pub mod size_hint; + #[doc(hidden)] pub mod string; diff --git a/serde_core/src/de/size_hint.rs b/serde_core/src/private/size_hint.rs similarity index 71% rename from serde_core/src/de/size_hint.rs rename to serde_core/src/private/size_hint.rs index 92d19270..783281b4 100644 --- a/serde_core/src/de/size_hint.rs +++ b/serde_core/src/private/size_hint.rs @@ -1,8 +1,6 @@ -//! Provides helpers for creating size hints for container deserialization. #[cfg(any(feature = "std", feature = "alloc"))] use crate::lib::*; -/// Extracts the exact size of an iterator if it has a known upper bound and it matches the lower bound. pub fn from_bounds(iter: &I) -> Option where I: Iterator, @@ -10,7 +8,6 @@ where helper(iter.size_hint()) } -/// Returns conservative size estimate for a container, clamping the result to a maximum size. #[cfg(any(feature = "std", feature = "alloc"))] pub fn cautious(hint: Option) -> usize { const MAX_PREALLOC_BYTES: usize = 1024 * 1024; From 5ac3d84d999532a26ee036620fdc84760ba05c45 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sat, 13 Sep 2025 12:22:47 -0700 Subject: [PATCH 4/5] Make InPlaceSeed private --- serde/src/private/de.rs | 2 +- serde_core/src/de/impls.rs | 3 +-- serde_core/src/de/mod.rs | 2 +- serde_core/src/lib.rs | 3 --- serde_core/src/private/mod.rs | 3 +++ serde_core/src/{de => private}/seed.rs | 0 6 files changed, 6 insertions(+), 7 deletions(-) rename serde_core/src/{de => private}/seed.rs (100%) diff --git a/serde/src/private/de.rs b/serde/src/private/de.rs index c54f1307..4b96f628 100644 --- a/serde/src/private/de.rs +++ b/serde/src/private/de.rs @@ -16,7 +16,7 @@ pub use self::content::{ TagOrContentField, TagOrContentFieldVisitor, TaggedContentVisitor, UntaggedUnitVisitor, }; -pub use serde_core::de::InPlaceSeed; +pub use serde_core::__private::InPlaceSeed; /// If the missing field is of type `Option` then treat is as `None`, /// otherwise it is an error. diff --git a/serde_core/src/de/impls.rs b/serde_core/src/de/impls.rs index 90b1bf6e..ab1a893c 100644 --- a/serde_core/src/de/impls.rs +++ b/serde_core/src/de/impls.rs @@ -4,8 +4,7 @@ use crate::de::{ Deserialize, Deserializer, EnumAccess, Error, MapAccess, SeqAccess, Unexpected, VariantAccess, Visitor, }; -use crate::private; -use crate::seed::InPlaceSeed; +use crate::private::{self, InPlaceSeed}; #[cfg(any(feature = "std", feature = "alloc"))] use crate::private::size_hint; diff --git a/serde_core/src/de/mod.rs b/serde_core/src/de/mod.rs index dc5c4495..b036f478 100644 --- a/serde_core/src/de/mod.rs +++ b/serde_core/src/de/mod.rs @@ -122,7 +122,7 @@ mod ignored_any; mod impls; pub use self::ignored_any::IgnoredAny; -pub use crate::seed::InPlaceSeed; +pub use crate::private::InPlaceSeed; #[cfg(all(not(feature = "std"), no_core_error))] #[doc(no_inline)] pub use crate::std_error::Error as StdError; diff --git a/serde_core/src/lib.rs b/serde_core/src/lib.rs index 8956e763..f5aa51fb 100644 --- a/serde_core/src/lib.rs +++ b/serde_core/src/lib.rs @@ -243,9 +243,6 @@ pub use crate::ser::{Serialize, Serializer}; pub mod __private; use self::__private as private; -#[path = "de/seed.rs"] -mod seed; - #[cfg(all(not(feature = "std"), no_core_error))] mod std_error; diff --git a/serde_core/src/private/mod.rs b/serde_core/src/private/mod.rs index a8016f48..cbfcdd5c 100644 --- a/serde_core/src/private/mod.rs +++ b/serde_core/src/private/mod.rs @@ -1,5 +1,6 @@ #[cfg(all(not(no_serde_derive), any(feature = "std", feature = "alloc")))] mod content; +mod seed; #[doc(hidden)] pub mod size_hint; @@ -10,3 +11,5 @@ pub mod string; #[cfg(all(not(no_serde_derive), any(feature = "std", feature = "alloc")))] #[doc(hidden)] pub use self::content::{Content, ContentVisitor}; +#[doc(hidden)] +pub use self::seed::InPlaceSeed; diff --git a/serde_core/src/de/seed.rs b/serde_core/src/private/seed.rs similarity index 100% rename from serde_core/src/de/seed.rs rename to serde_core/src/private/seed.rs From a9150aad74c767467f50d3920ff6137bd0b28783 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sat, 13 Sep 2025 12:24:26 -0700 Subject: [PATCH 5/5] Make serde_core::Result private --- serde_core/src/lib.rs | 2 -- serde_core/src/macros.rs | 2 +- serde_core/src/private/mod.rs | 2 ++ 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/serde_core/src/lib.rs b/serde_core/src/lib.rs index f5aa51fb..c45435a2 100644 --- a/serde_core/src/lib.rs +++ b/serde_core/src/lib.rs @@ -221,8 +221,6 @@ macro_rules! tri { #[macro_use] mod macros; -#[doc(hidden)] -pub use crate::lib::result::Result; #[macro_use] mod integer128; diff --git a/serde_core/src/macros.rs b/serde_core/src/macros.rs index 8bf2d442..b9567305 100644 --- a/serde_core/src/macros.rs +++ b/serde_core/src/macros.rs @@ -122,7 +122,7 @@ macro_rules! forward_to_deserialize_any { macro_rules! forward_to_deserialize_any_method { ($func:ident<$l:tt, $v:ident>($($arg:ident : $ty:ty),*)) => { #[inline] - fn $func<$v>(self, $($arg: $ty,)* visitor: $v) -> $crate::Result<$v::Value, >::Error> + fn $func<$v>(self, $($arg: $ty,)* visitor: $v) -> $crate::__private::Result<$v::Value, >::Error> where $v: $crate::de::Visitor<$l>, { diff --git a/serde_core/src/private/mod.rs b/serde_core/src/private/mod.rs index cbfcdd5c..745f40d6 100644 --- a/serde_core/src/private/mod.rs +++ b/serde_core/src/private/mod.rs @@ -13,3 +13,5 @@ pub mod string; pub use self::content::{Content, ContentVisitor}; #[doc(hidden)] pub use self::seed::InPlaceSeed; +#[doc(hidden)] +pub use crate::lib::result::Result;