From 3cb723220e516edae57930206cf3faffaa1b8e5b Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Tue, 24 Dec 2024 20:24:26 -0500 Subject: [PATCH] Remove `anyhow::Result` for lock serialization (#10151) --- Cargo.lock | 1 + crates/uv-resolver/src/lock/mod.rs | 21 ++++++++++++++------- crates/uv/Cargo.toml | 1 + crates/uv/src/commands/project/mod.rs | 3 +++ 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index adff71785704..b4d0317d05d3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4454,6 +4454,7 @@ dependencies = [ "thiserror 2.0.9", "tokio", "toml", + "toml_edit", "tracing", "tracing-durations-export", "tracing-subscriber", diff --git a/crates/uv-resolver/src/lock/mod.rs b/crates/uv-resolver/src/lock/mod.rs index e9040a9bd924..2283e6776365 100644 --- a/crates/uv-resolver/src/lock/mod.rs +++ b/crates/uv-resolver/src/lock/mod.rs @@ -11,6 +11,7 @@ use itertools::Itertools; use petgraph::graph::NodeIndex; use petgraph::visit::EdgeRef; use rustc_hash::{FxHashMap, FxHashSet}; +use serde::Serializer; use toml_edit::{value, Array, ArrayOfTables, InlineTable, Item, Table, Value}; use url::Url; @@ -617,7 +618,7 @@ impl Lock { } /// Returns the TOML representation of this lockfile. - pub fn to_toml(&self) -> anyhow::Result { + pub fn to_toml(&self) -> Result { // We construct a TOML document manually instead of going through Serde to enable // the use of inline tables. let mut doc = toml_edit::DocumentMut::new(); @@ -2085,7 +2086,7 @@ impl Package { &self, requires_python: &RequiresPython, dist_count_by_name: &FxHashMap, - ) -> anyhow::Result { + ) -> Result { let mut table = Table::new(); self.id.to_toml(None, &mut table); @@ -2149,7 +2150,7 @@ impl Package { self.wheels .iter() .map(Wheel::to_toml) - .collect::>>()? + .collect::, _>>()? .into_iter(), ); table.insert("wheels", value(wheels)); @@ -3224,7 +3225,7 @@ enum SourceDistWire { impl SourceDist { /// Returns the TOML representation of this source distribution. - fn to_toml(&self) -> anyhow::Result { + fn to_toml(&self) -> Result { let mut table = InlineTable::new(); match &self { SourceDist::Metadata { .. } => {} @@ -3239,7 +3240,10 @@ impl SourceDist { table.insert("hash", Value::from(hash.to_string())); } if let Some(size) = self.size() { - table.insert("size", Value::from(i64::try_from(size)?)); + table.insert( + "size", + toml_edit::ser::ValueSerializer::new().serialize_u64(size)?, + ); } Ok(table) } @@ -3612,7 +3616,7 @@ enum WheelWireSource { impl Wheel { /// Returns the TOML representation of this wheel. - fn to_toml(&self) -> anyhow::Result { + fn to_toml(&self) -> Result { let mut table = InlineTable::new(); match &self.url { WheelWireSource::Url { url } => { @@ -3629,7 +3633,10 @@ impl Wheel { table.insert("hash", Value::from(hash.to_string())); } if let Some(size) = self.size { - table.insert("size", Value::from(i64::try_from(size)?)); + table.insert( + "size", + toml_edit::ser::ValueSerializer::new().serialize_u64(size)?, + ); } Ok(table) } diff --git a/crates/uv/Cargo.toml b/crates/uv/Cargo.toml index cb994808be6f..52b37ea70449 100644 --- a/crates/uv/Cargo.toml +++ b/crates/uv/Cargo.toml @@ -88,6 +88,7 @@ textwrap = { workspace = true } thiserror = { workspace = true } tokio = { workspace = true } toml = { workspace = true } +toml_edit = { workspace = true } tracing = { workspace = true } tracing-durations-export = { workspace = true, features = ["plot"], optional = true } tracing-subscriber = { workspace = true, features = ["json"] } diff --git a/crates/uv/src/commands/project/mod.rs b/crates/uv/src/commands/project/mod.rs index c7d2f0e70758..d3506c6164f8 100644 --- a/crates/uv/src/commands/project/mod.rs +++ b/crates/uv/src/commands/project/mod.rs @@ -78,6 +78,9 @@ pub(crate) enum ProjectError { #[error("Failed to parse `uv.lock`, which uses an unsupported schema version (v{1}, but only v{0} is supported). Downgrade to a compatible uv version, or remove the `uv.lock` prior to running `uv lock` or `uv sync`.")] UnparsableLockVersion(u32, u32, #[source] toml::de::Error), + #[error("Failed to serialize `uv.lock`")] + LockSerialization(#[from] toml_edit::ser::Error), + #[error("The current Python version ({0}) is not compatible with the locked Python requirement: `{1}`")] LockedPythonIncompatibility(Version, RequiresPython),