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 = { 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 }

View File

@ -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,

View File

@ -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": [{