From a27e0c850dde5aee60c08742e9e5af0ddb4a7cc9 Mon Sep 17 00:00:00 2001 From: William Woodruff Date: Mon, 5 Jan 2026 17:57:35 -0500 Subject: [PATCH] Use Cow for deserialization everywhere (#17330) --- crates/uv-build-backend/src/metadata.rs | 8 ++++++-- crates/uv-build-backend/src/serde_verbatim.rs | 8 ++++++-- crates/uv-fs/src/path.rs | 4 ++-- crates/uv-normalize/src/group_name.rs | 3 +-- crates/uv-pypi-types/src/identifier.rs | 3 +-- crates/uv-python/src/discovery.rs | 2 +- crates/uv-resolver/src/exclude_newer.rs | 3 +-- 7 files changed, 18 insertions(+), 13 deletions(-) diff --git a/crates/uv-build-backend/src/metadata.rs b/crates/uv-build-backend/src/metadata.rs index e45670a6e..8752cc15b 100644 --- a/crates/uv-build-backend/src/metadata.rs +++ b/crates/uv-build-backend/src/metadata.rs @@ -1,3 +1,4 @@ +use std::borrow::Cow; use std::collections::{BTreeMap, Bound}; use std::ffi::OsStr; use std::fmt::Display; @@ -123,9 +124,12 @@ impl<'de> Deserialize<'de> for VerbatimPackageName { where D: Deserializer<'de>, { - let given = String::deserialize(deserializer)?; + let given = >::deserialize(deserializer)?; let normalized = PackageName::from_str(&given).map_err(serde::de::Error::custom)?; - Ok(Self { given, normalized }) + Ok(Self { + given: given.to_string(), + normalized, + }) } } diff --git a/crates/uv-build-backend/src/serde_verbatim.rs b/crates/uv-build-backend/src/serde_verbatim.rs index fc7a9b3ff..7050ebd6a 100644 --- a/crates/uv-build-backend/src/serde_verbatim.rs +++ b/crates/uv-build-backend/src/serde_verbatim.rs @@ -1,4 +1,5 @@ use serde::{Deserialize, Deserializer, Serialize, Serializer}; +use std::borrow::Cow; use std::fmt::{Display, Formatter}; use std::ops::Deref; use std::str::FromStr; @@ -38,9 +39,12 @@ where where D: Deserializer<'de>, { - let verbatim = String::deserialize(deserializer)?; + let verbatim = >::deserialize(deserializer)?; let inner = T::from_str(&verbatim).map_err(serde::de::Error::custom)?; - Ok(Self { verbatim, inner }) + Ok(Self { + verbatim: verbatim.to_string(), + inner, + }) } } diff --git a/crates/uv-fs/src/path.rs b/crates/uv-fs/src/path.rs index d3993cd99..231255f87 100644 --- a/crates/uv-fs/src/path.rs +++ b/crates/uv-fs/src/path.rs @@ -430,11 +430,11 @@ impl<'de> serde::de::Deserialize<'de> for PortablePathBuf { where D: serde::de::Deserializer<'de>, { - let s = String::deserialize(deserializer)?; + let s = >::deserialize(deserializer)?; if s == "." { Ok(Self(PathBuf::new().into_boxed_path())) } else { - Ok(Self(PathBuf::from(s).into_boxed_path())) + Ok(Self(PathBuf::from(s.as_ref()).into_boxed_path())) } } } diff --git a/crates/uv-normalize/src/group_name.rs b/crates/uv-normalize/src/group_name.rs index 405907c1f..10bd94b55 100644 --- a/crates/uv-normalize/src/group_name.rs +++ b/crates/uv-normalize/src/group_name.rs @@ -1,4 +1,3 @@ -#[cfg(feature = "schemars")] use std::borrow::Cow; use std::fmt::{Display, Formatter}; use std::path::PathBuf; @@ -148,7 +147,7 @@ impl<'de> Deserialize<'de> for PipGroupName { where D: Deserializer<'de>, { - let s = String::deserialize(deserializer)?; + let s = >::deserialize(deserializer)?; Self::from_str(&s).map_err(serde::de::Error::custom) } } diff --git a/crates/uv-pypi-types/src/identifier.rs b/crates/uv-pypi-types/src/identifier.rs index 7ce496ff0..c3adfa8f6 100644 --- a/crates/uv-pypi-types/src/identifier.rs +++ b/crates/uv-pypi-types/src/identifier.rs @@ -1,5 +1,4 @@ use serde::{Serialize, Serializer}; -#[cfg(feature = "schemars")] use std::borrow::Cow; use std::fmt::Display; use std::str::FromStr; @@ -85,7 +84,7 @@ impl<'de> serde::de::Deserialize<'de> for Identifier { where D: serde::de::Deserializer<'de>, { - let s = String::deserialize(deserializer)?; + let s = >::deserialize(deserializer)?; Self::from_str(&s).map_err(serde::de::Error::custom) } } diff --git a/crates/uv-python/src/discovery.rs b/crates/uv-python/src/discovery.rs index 29659116c..c40fe894b 100644 --- a/crates/uv-python/src/discovery.rs +++ b/crates/uv-python/src/discovery.rs @@ -74,7 +74,7 @@ impl<'a> serde::Deserialize<'a> for PythonRequest { where D: serde::Deserializer<'a>, { - let s = String::deserialize(deserializer)?; + let s = >::deserialize(deserializer)?; Ok(Self::parse(&s)) } } diff --git a/crates/uv-resolver/src/exclude_newer.rs b/crates/uv-resolver/src/exclude_newer.rs index 913b3f22d..c7986c0ce 100644 --- a/crates/uv-resolver/src/exclude_newer.rs +++ b/crates/uv-resolver/src/exclude_newer.rs @@ -1,4 +1,3 @@ -#[cfg(feature = "schemars")] use std::borrow::Cow; use std::{ ops::{Deref, DerefMut}, @@ -197,7 +196,7 @@ impl<'de> serde::Deserialize<'de> for ExcludeNewerSpan { where D: serde::Deserializer<'de>, { - let s = String::deserialize(deserializer)?; + let s = >::deserialize(deserializer)?; let span: Span = s.parse().map_err(serde::de::Error::custom)?; Ok(Self(span)) }