Skip to content

Commit a81650c

Browse files
committed
refactor(embedded): Move embedded validation to to_real_manifest
This is where a lot of the other logic like it is
1 parent dffd0fd commit a81650c

File tree

2 files changed

+89
-29
lines changed

2 files changed

+89
-29
lines changed

src/cargo/util/toml/embedded.rs

+6-29
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,6 @@ use crate::util::restricted_names;
66
use crate::CargoResult;
77
use crate::GlobalContext;
88

9-
const AUTO_FIELDS: &[&str] = &[
10-
"autolib",
11-
"autobins",
12-
"autoexamples",
13-
"autotests",
14-
"autobenches",
15-
];
16-
179
pub(super) fn expand_manifest(
1810
content: &str,
1911
path: &std::path::Path,
@@ -78,23 +70,6 @@ pub(super) fn expand_manifest(
7870
fn expand_manifest_(manifest: &str, path: &std::path::Path) -> CargoResult<toml::Table> {
7971
let mut manifest: toml::Table = toml::from_str(&manifest)?;
8072

81-
for key in ["workspace", "lib", "bin", "example", "test", "bench"] {
82-
if manifest.contains_key(key) {
83-
anyhow::bail!("`{key}` is not allowed in embedded manifests")
84-
}
85-
}
86-
87-
if let Some(package) = manifest.get("package").and_then(|v| v.as_table()) {
88-
for key in ["workspace", "build", "links"]
89-
.iter()
90-
.chain(AUTO_FIELDS.iter())
91-
{
92-
if package.contains_key(*key) {
93-
anyhow::bail!("`package.{key}` is not allowed in embedded manifests")
94-
}
95-
}
96-
}
97-
9873
// HACK: Using an absolute path while `hacked_path` is in use
9974
let bin_path = path.to_string_lossy().into_owned();
10075
let file_stem = path
@@ -107,10 +82,12 @@ fn expand_manifest_(manifest: &str, path: &std::path::Path) -> CargoResult<toml:
10782
let mut bin = toml::Table::new();
10883
bin.insert("name".to_owned(), toml::Value::String(bin_name));
10984
bin.insert("path".to_owned(), toml::Value::String(bin_path));
110-
manifest.insert(
111-
"bin".to_owned(),
112-
toml::Value::Array(vec![toml::Value::Table(bin)]),
113-
);
85+
manifest
86+
.entry("bin")
87+
.or_insert_with(|| Vec::<toml::Value>::new().into())
88+
.as_array_mut()
89+
.ok_or_else(|| anyhow::format_err!("`bin` must be an array"))?
90+
.push(toml::Value::Table(bin));
11491

11592
Ok(manifest)
11693
}

src/cargo/util/toml/mod.rs

+83
Original file line numberDiff line numberDiff line change
@@ -1333,6 +1333,89 @@ pub fn to_real_manifest(
13331333
features.require(Feature::metabuild())?;
13341334
}
13351335

1336+
if is_embedded {
1337+
let invalid_fields = [
1338+
("`workspace`", original_toml.workspace.is_some()),
1339+
("`lib`", original_toml.lib.is_some()),
1340+
(
1341+
"`bin`",
1342+
original_toml.bin.as_ref().map(|b| b.len()).unwrap_or(0) != 1,
1343+
),
1344+
("`example`", original_toml.example.is_some()),
1345+
("`test`", original_toml.test.is_some()),
1346+
("`bench`", original_toml.bench.is_some()),
1347+
(
1348+
"`package.workspace`",
1349+
original_toml
1350+
.package()
1351+
.map(|p| p.workspace.is_some())
1352+
.unwrap_or(false),
1353+
),
1354+
(
1355+
"`package.build`",
1356+
original_toml
1357+
.package()
1358+
.map(|p| p.build.is_some())
1359+
.unwrap_or(false),
1360+
),
1361+
(
1362+
"`package.links`",
1363+
original_toml
1364+
.package()
1365+
.map(|p| p.links.is_some())
1366+
.unwrap_or(false),
1367+
),
1368+
(
1369+
"`package.autolib`",
1370+
original_toml
1371+
.package()
1372+
.map(|p| p.autolib.is_some())
1373+
.unwrap_or(false),
1374+
),
1375+
(
1376+
"`package.autobins`",
1377+
original_toml
1378+
.package()
1379+
.map(|p| p.autobins.is_some())
1380+
.unwrap_or(false),
1381+
),
1382+
(
1383+
"`package.autoexamples`",
1384+
original_toml
1385+
.package()
1386+
.map(|p| p.autoexamples.is_some())
1387+
.unwrap_or(false),
1388+
),
1389+
(
1390+
"`package.autotests`",
1391+
original_toml
1392+
.package()
1393+
.map(|p| p.autotests.is_some())
1394+
.unwrap_or(false),
1395+
),
1396+
(
1397+
"`package.autobenches`",
1398+
original_toml
1399+
.package()
1400+
.map(|p| p.autobenches.is_some())
1401+
.unwrap_or(false),
1402+
),
1403+
];
1404+
let invalid_fields = invalid_fields
1405+
.into_iter()
1406+
.filter_map(|(name, invalid)| invalid.then_some(name))
1407+
.collect::<Vec<_>>();
1408+
if !invalid_fields.is_empty() {
1409+
let fields = invalid_fields.join(", ");
1410+
let are = if invalid_fields.len() == 1 {
1411+
"is"
1412+
} else {
1413+
"are"
1414+
};
1415+
anyhow::bail!("{fields} {are} not allowed in embedded manifests")
1416+
}
1417+
}
1418+
13361419
let resolve_behavior = match (
13371420
normalized_package.resolver.as_ref(),
13381421
normalized_toml

0 commit comments

Comments
 (0)