Skip to content

Commit 9809f8f

Browse files
committed
Auto merge of #10944 - kcrimson-ar:master, r=epage
Improve error message for an array value in the manifest Fixes #10942 The error message will be: ``` error: failed to parse manifest at `/Users/..` Caused by: invalid type: string "Ky", expected an array for key `package.authors` ```
2 parents 5a7ba9c + 8f1a75d commit 9809f8f

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

src/cargo/util/toml/mod.rs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1041,6 +1041,43 @@ impl<T> MaybeWorkspace<T> {
10411041
}
10421042
}
10431043

1044+
fn maybe_workspace_vec_string<'de, D>(
1045+
deserializer: D,
1046+
) -> Result<Option<MaybeWorkspace<Vec<String>>>, D::Error>
1047+
where
1048+
D: de::Deserializer<'de>,
1049+
{
1050+
struct Visitor;
1051+
1052+
impl<'de> de::Visitor<'de> for Visitor {
1053+
type Value = Option<MaybeWorkspace<Vec<String>>>;
1054+
1055+
fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
1056+
formatter.write_str("vector of strings")
1057+
}
1058+
1059+
fn visit_seq<V>(self, v: V) -> Result<Self::Value, V::Error>
1060+
where
1061+
V: de::SeqAccess<'de>,
1062+
{
1063+
let seq = de::value::SeqAccessDeserializer::new(v);
1064+
let defined = Vec::<String>::deserialize(seq).map(MaybeWorkspace::Defined)?;
1065+
Ok(Some(defined))
1066+
}
1067+
1068+
fn visit_map<V>(self, map: V) -> Result<Self::Value, V::Error>
1069+
where
1070+
V: de::MapAccess<'de>,
1071+
{
1072+
let mvd = de::value::MapAccessDeserializer::new(map);
1073+
let workspace = TomlWorkspaceField::deserialize(mvd).map(MaybeWorkspace::Workspace)?;
1074+
Ok(Some(workspace))
1075+
}
1076+
}
1077+
1078+
deserializer.deserialize_any(Visitor)
1079+
}
1080+
10441081
#[derive(Deserialize, Serialize, Clone, Debug)]
10451082
pub struct TomlWorkspaceField {
10461083
workspace: bool,
@@ -1060,6 +1097,8 @@ pub struct TomlProject {
10601097
name: InternedString,
10611098
#[serde(deserialize_with = "version_trim_whitespace")]
10621099
version: MaybeWorkspace<semver::Version>,
1100+
#[serde(default)]
1101+
#[serde(deserialize_with = "maybe_workspace_vec_string")]
10631102
authors: Option<MaybeWorkspace<Vec<String>>>,
10641103
build: Option<StringOrBool>,
10651104
metabuild: Option<StringOrVec>,
@@ -1068,7 +1107,11 @@ pub struct TomlProject {
10681107
#[serde(rename = "forced-target")]
10691108
forced_target: Option<String>,
10701109
links: Option<String>,
1110+
#[serde(default)]
1111+
#[serde(deserialize_with = "maybe_workspace_vec_string")]
10711112
exclude: Option<MaybeWorkspace<Vec<String>>>,
1113+
#[serde(default)]
1114+
#[serde(deserialize_with = "maybe_workspace_vec_string")]
10721115
include: Option<MaybeWorkspace<Vec<String>>>,
10731116
publish: Option<MaybeWorkspace<VecStringOrBool>>,
10741117
workspace: Option<String>,
@@ -1084,7 +1127,11 @@ pub struct TomlProject {
10841127
homepage: Option<MaybeWorkspace<String>>,
10851128
documentation: Option<MaybeWorkspace<String>>,
10861129
readme: Option<MaybeWorkspace<StringOrBool>>,
1130+
#[serde(default)]
1131+
#[serde(deserialize_with = "maybe_workspace_vec_string")]
10871132
keywords: Option<MaybeWorkspace<Vec<String>>>,
1133+
#[serde(default)]
1134+
#[serde(deserialize_with = "maybe_workspace_vec_string")]
10881135
categories: Option<MaybeWorkspace<Vec<String>>>,
10891136
license: Option<MaybeWorkspace<String>>,
10901137
license_file: Option<MaybeWorkspace<String>>,

tests/testsuite/metadata.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1706,6 +1706,30 @@ Caused by:
17061706
.run();
17071707
}
17081708

1709+
#[cargo_test]
1710+
fn cargo_metadata_with_invalid_authors_field() {
1711+
let p = project()
1712+
.file("src/foo.rs", "")
1713+
.file(
1714+
"Cargo.toml",
1715+
r#"
1716+
[package]
1717+
authors = ""
1718+
"#,
1719+
)
1720+
.build();
1721+
1722+
p.cargo("metadata")
1723+
.with_status(101)
1724+
.with_stderr(
1725+
r#"[ERROR] failed to parse manifest at `[..]`
1726+
1727+
Caused by:
1728+
invalid type: string "", expected vector of strings for key `package.authors`"#,
1729+
)
1730+
.run();
1731+
}
1732+
17091733
const MANIFEST_OUTPUT: &str = r#"
17101734
{
17111735
"packages": [{

0 commit comments

Comments
 (0)