mirror of
https://github.com/rust-lang/cargo.git
synced 2025-10-01 11:30:39 +00:00
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.
This commit is contained in:
parent
5c9a126911
commit
0b5ebd445b
@ -1659,7 +1659,6 @@ pub struct TomlPackage {
|
||||
edition: Option<MaybeWorkspaceString>,
|
||||
rust_version: Option<MaybeWorkspaceRustVersion>,
|
||||
name: InternedString,
|
||||
#[serde(deserialize_with = "version_trim_whitespace")]
|
||||
version: MaybeWorkspaceSemverVersion,
|
||||
authors: Option<MaybeWorkspaceVecString>,
|
||||
build: Option<StringOrBool>,
|
||||
@ -1709,22 +1708,6 @@ impl TomlPackage {
|
||||
}
|
||||
}
|
||||
|
||||
fn version_trim_whitespace<'de, D>(deserializer: D) -> Result<MaybeWorkspaceSemverVersion, D::Error>
|
||||
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<T, W: WorkspaceInherit> MaybeWorkspace<T, W> {
|
||||
|
||||
//. This already has a `Deserialize` impl from version_trim_whitespace
|
||||
type MaybeWorkspaceSemverVersion = MaybeWorkspace<semver::Version, TomlWorkspaceField>;
|
||||
impl<'de> de::Deserialize<'de> for MaybeWorkspaceSemverVersion {
|
||||
fn deserialize<D>(d: D) -> Result<Self, D::Error>
|
||||
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<String, TomlWorkspaceField>;
|
||||
impl<'de> de::Deserialize<'de> for MaybeWorkspaceString {
|
||||
|
Loading…
x
Reference in New Issue
Block a user