Improve errors for TOML fields that support workspace inheritance

This commit is contained in:
Robert DiMartino 2022-09-19 23:41:20 -04:00
parent 8dea81918b
commit 06c31de972
3 changed files with 43 additions and 1 deletions

View file

@ -52,6 +52,7 @@ semver = { version = "1.0.3", features = ["serde"] }
serde = { version = "1.0.123", features = ["derive"] }
serde_ignored = "0.1.0"
serde_json = { version = "1.0.30", features = ["raw_value"] }
serde-value = "0.7.0"
shell-escape = "0.1.4"
strip-ansi-escapes = "0.1.0"
tar = { version = "0.4.38", default-features = false }

View file

@ -1007,13 +1007,30 @@ where
/// Enum that allows for the parsing of `field.workspace = true` in a Cargo.toml
///
/// It allows for things to be inherited from a workspace or defined as needed
#[derive(Deserialize, Serialize, Clone, Debug)]
#[derive(Serialize, Clone, Debug)]
#[serde(untagged)]
pub enum MaybeWorkspace<T> {
Workspace(TomlWorkspaceField),
Defined(T),
}
impl<'de, T: Deserialize<'de>> de::Deserialize<'de> for MaybeWorkspace<T> {
fn deserialize<D>(deserializer: D) -> Result<MaybeWorkspace<T>, D::Error>
where
D: de::Deserializer<'de>,
{
let value = serde_value::Value::deserialize(deserializer)?;
if let Ok(workspace) = TomlWorkspaceField::deserialize(serde_value::ValueDeserializer::<
D::Error,
>::new(value.clone()))
{
return Ok(MaybeWorkspace::Workspace(workspace));
}
T::deserialize(serde_value::ValueDeserializer::<D::Error>::new(value))
.map(MaybeWorkspace::Defined)
}
}
impl<T> MaybeWorkspace<T> {
fn resolve<'a>(
self,

View file

@ -1730,6 +1730,30 @@ Caused by:
.run();
}
#[cargo_test]
fn cargo_metadata_with_invalid_version_field() {
let p = project()
.file("src/foo.rs", "")
.file(
"Cargo.toml",
r#"
[package]
version = 1
"#,
)
.build();
p.cargo("metadata")
.with_status(101)
.with_stderr(
r#"[ERROR] failed to parse manifest at `[..]`
Caused by:
invalid type: integer `1`, expected SemVer version for key `package.version`"#,
)
.run();
}
const MANIFEST_OUTPUT: &str = r#"
{
"packages": [{