From 0b5ebd445b71d209b1ef3f8cad42b82ac3ad1be9 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Wed, 4 Oct 2023 12:23:46 -0500 Subject: [PATCH] refactor(toml): Use explicit deserialize Unsure if we want to generalize the trim policy but this will make it much easier to support an optional version field in future commits since we can just wrap the type in `Option` Strangely, `UntaggedEnumDeserializer` isn't causing bad error messages, so we can keep using it. --- src/cargo/util/toml/mod.rs | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/cargo/util/toml/mod.rs b/src/cargo/util/toml/mod.rs index 425625843..0191576ce 100644 --- a/src/cargo/util/toml/mod.rs +++ b/src/cargo/util/toml/mod.rs @@ -1659,7 +1659,6 @@ pub struct TomlPackage { edition: Option, rust_version: Option, name: InternedString, - #[serde(deserialize_with = "version_trim_whitespace")] version: MaybeWorkspaceSemverVersion, authors: Option, build: Option, @@ -1709,22 +1708,6 @@ impl TomlPackage { } } -fn version_trim_whitespace<'de, D>(deserializer: D) -> Result -where - D: de::Deserializer<'de>, -{ - UntaggedEnumVisitor::new() - .expecting("SemVer version") - .string( - |value| match value.trim().parse().map_err(de::Error::custom) { - Ok(parsed) => Ok(MaybeWorkspace::Defined(parsed)), - Err(e) => Err(e), - }, - ) - .map(|value| value.deserialize().map(MaybeWorkspace::Workspace)) - .deserialize(deserializer) -} - /// This Trait exists to make [`MaybeWorkspace::Workspace`] generic. It makes deserialization of /// [`MaybeWorkspace`] much easier, as well as making error messages for /// [`MaybeWorkspace::resolve`] much nicer @@ -1793,6 +1776,23 @@ impl MaybeWorkspace { //. This already has a `Deserialize` impl from version_trim_whitespace type MaybeWorkspaceSemverVersion = MaybeWorkspace; +impl<'de> de::Deserialize<'de> for MaybeWorkspaceSemverVersion { + fn deserialize(d: D) -> Result + where + D: de::Deserializer<'de>, + { + UntaggedEnumVisitor::new() + .expecting("SemVer version") + .string( + |value| match value.trim().parse().map_err(de::Error::custom) { + Ok(parsed) => Ok(MaybeWorkspace::Defined(parsed)), + Err(e) => Err(e), + }, + ) + .map(|value| value.deserialize().map(MaybeWorkspace::Workspace)) + .deserialize(d) + } +} type MaybeWorkspaceString = MaybeWorkspace; impl<'de> de::Deserialize<'de> for MaybeWorkspaceString {