mirror of
https://github.com/rust-lang/cargo
synced 2024-10-05 23:39:47 +00:00
Improve errors for TOML fields that support workspace inheritance
This commit is contained in:
parent
8dea81918b
commit
06c31de972
|
@ -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 }
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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": [{
|
||||
|
|
Loading…
Reference in a new issue