diff --git a/crates/cargo-util-schemas/src/manifest/mod.rs b/crates/cargo-util-schemas/src/manifest/mod.rs index 563b7d329c7..0527a48e9b7 100644 --- a/crates/cargo-util-schemas/src/manifest/mod.rs +++ b/crates/cargo-util-schemas/src/manifest/mod.rs @@ -776,12 +776,26 @@ impl<'de, P: Deserialize<'de> + Clone> de::Deserialize<'de> for TomlDependency

, { + use serde::de::Error as _; + let expected = "a version string like \"0.9.8\" or a \ + detailed dependency like { version = \"0.9.8\" }"; UntaggedEnumVisitor::new() - .expecting( - "a version string like \"0.9.8\" or a \ - detailed dependency like { version = \"0.9.8\" }", - ) + .expecting(expected) .string(|value| Ok(TomlDependency::Simple(value.to_owned()))) + .bool(|value| { + let expected = format!("invalid type: boolean `{value}`, expected {expected}"); + let err = if value { + format!( + "{expected}\n\ + note: if you meant to use a workspace member, you can write\n \ + dep.workspace = {value}" + ) + } else { + expected + }; + + Err(serde_untagged::de::Error::custom(err)) + }) .map(|value| value.deserialize().map(TomlDependency::Detailed)) .deserialize(deserializer) } diff --git a/tests/testsuite/bad_config.rs b/tests/testsuite/bad_config.rs index 8e7316dd246..92d3c026750 100644 --- a/tests/testsuite/bad_config.rs +++ b/tests/testsuite/bad_config.rs @@ -2647,6 +2647,41 @@ fn bad_dependency() { .run(); } +#[cargo_test] +fn bad_dependency_true_literal() { + let p = project() + .file( + "Cargo.toml", + r#" + [package] + name = "foo" + version = "0.0.0" + edition = "2015" + authors = [] + + [dependencies] + bar = true + "#, + ) + .file("src/lib.rs", "") + .build(); + + p.cargo("check") + .with_status(101) + .with_stderr_data(str![[r#" +[ERROR] invalid type: boolean `true`, expected a version string like "0.9.8" or a detailed dependency like { version = "0.9.8" } +[NOTE] if you meant to use a workspace member, you can write + dep.workspace = true + --> Cargo.toml:9:23 + | +9 | bar = true + | ^^^^ + | + +"#]]) + .run(); +} + #[cargo_test] fn bad_debuginfo() { let p = project()