mirror of
https://github.com/rust-lang/cargo.git
synced 2025-09-28 11:20:36 +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 = { version = "1.0.123", features = ["derive"] }
|
||||||
serde_ignored = "0.1.0"
|
serde_ignored = "0.1.0"
|
||||||
serde_json = { version = "1.0.30", features = ["raw_value"] }
|
serde_json = { version = "1.0.30", features = ["raw_value"] }
|
||||||
|
serde-value = "0.7.0"
|
||||||
shell-escape = "0.1.4"
|
shell-escape = "0.1.4"
|
||||||
strip-ansi-escapes = "0.1.0"
|
strip-ansi-escapes = "0.1.0"
|
||||||
tar = { version = "0.4.38", default-features = false }
|
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
|
/// 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
|
/// 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)]
|
#[serde(untagged)]
|
||||||
pub enum MaybeWorkspace<T> {
|
pub enum MaybeWorkspace<T> {
|
||||||
Workspace(TomlWorkspaceField),
|
Workspace(TomlWorkspaceField),
|
||||||
Defined(T),
|
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> {
|
impl<T> MaybeWorkspace<T> {
|
||||||
fn resolve<'a>(
|
fn resolve<'a>(
|
||||||
self,
|
self,
|
||||||
|
@ -1730,6 +1730,30 @@ Caused by:
|
|||||||
.run();
|
.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#"
|
const MANIFEST_OUTPUT: &str = r#"
|
||||||
{
|
{
|
||||||
"packages": [{
|
"packages": [{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user