diff --git a/Cargo.lock b/Cargo.lock index ad0997e78..52bf8bfe3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2037,7 +2037,7 @@ version = "0.1.0" dependencies = [ "serde", "thiserror 2.0.17", - "toml 0.8.23", + "toml 0.9.8", ] [[package]] diff --git a/crates/metadata/Cargo.toml b/crates/metadata/Cargo.toml index dc8afdc8d..f5942d426 100644 --- a/crates/metadata/Cargo.toml +++ b/crates/metadata/Cargo.toml @@ -14,5 +14,5 @@ path = "lib.rs" [dependencies] serde = { version = "1.0", features = ["derive"] } -toml = "0.8" +toml = "0.9" thiserror = "2" diff --git a/crates/metadata/lib.rs b/crates/metadata/lib.rs index 90f0e2fb9..32e0525a5 100644 --- a/crates/metadata/lib.rs +++ b/crates/metadata/lib.rs @@ -325,10 +325,10 @@ impl std::str::FromStr for Metadata { fn from_str(manifest: &str) -> Result { use toml::value::Table; - let manifest = match manifest.parse::()? { - Value::Table(t) => Some(t), - _ => None, - }; + // the `Cargo.toml` is a full document, and: + // > A TOML document is represented with the Table type which maps + // > String to the Value enum. + let manifest = manifest.parse::()?; fn table<'a>(manifest: &'a Table, table_name: &str) -> Option<&'a Table> { match manifest.get(table_name) { @@ -337,17 +337,14 @@ impl std::str::FromStr for Metadata { } } - let plain_table = manifest - .as_ref() - .and_then(|t| table(t, "package")) - .and_then(|t| table(t, "metadata")) + let package_metadata = table(&manifest, "package").and_then(|t| table(t, "metadata")); + + let plain_table = package_metadata .and_then(|t| table(t, "docs")) .and_then(|t| table(t, "rs")); - let quoted_table = manifest - .as_ref() - .and_then(|t| table(t, "package")) - .and_then(|t| table(t, "metadata")) - .and_then(|t| table(t, "docs.rs")); + + let quoted_table = package_metadata.and_then(|t| table(t, "docs.rs")); + let mut metadata = if let Some(table) = plain_table { Value::Table(table.clone()).try_into()? } else if let Some(table) = quoted_table { @@ -356,9 +353,7 @@ impl std::str::FromStr for Metadata { Metadata::default() }; - let proc_macro = manifest - .as_ref() - .and_then(|t| table(t, "lib")) + let proc_macro = table(&manifest, "lib") .and_then(|table| table.get("proc-macro").or_else(|| table.get("proc_macro"))) .and_then(|val| val.as_bool()); if let Some(proc_macro) = proc_macro {