Skip to content

Commit f09a3e2

Browse files
authored
fix: platform-specific dependencies are not shown (#259)
1 parent 670fdb5 commit f09a3e2

File tree

1 file changed

+77
-1
lines changed

1 file changed

+77
-1
lines changed

src/parsers/manifest.rs

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,18 @@ struct CargoTomlWorkspace {
3232
members: Vec<RelativePathBuf>,
3333
}
3434

35+
#[derive(Debug, Deserialize, Serialize)]
36+
pub struct CargoTomlTargetDependencies {
37+
#[serde(default)]
38+
dependencies: IndexMap<String, CargoTomlDependency>,
39+
#[serde(rename = "dev-dependencies")]
40+
#[serde(default)]
41+
dev_dependencies: IndexMap<String, CargoTomlDependency>,
42+
#[serde(rename = "build-dependencies")]
43+
#[serde(default)]
44+
build_dependencies: IndexMap<String, CargoTomlDependency>,
45+
}
46+
3547
#[derive(Serialize, Deserialize, Debug)]
3648
struct CargoToml {
3749
#[serde(default)]
@@ -46,6 +58,21 @@ struct CargoToml {
4658
#[serde(rename = "build-dependencies")]
4759
#[serde(default)]
4860
build_dependencies: IndexMap<String, CargoTomlDependency>,
61+
#[serde(default)]
62+
target: IndexMap<String, CargoTomlTargetDependencies>,
63+
}
64+
65+
fn extract_target_dependencies_into(
66+
target: IndexMap<String, CargoTomlTargetDependencies>,
67+
deps: &mut IndexMap<String, CargoTomlDependency>,
68+
dev_deps: &mut IndexMap<String, CargoTomlDependency>,
69+
build_deps: &mut IndexMap<String, CargoTomlDependency>,
70+
) {
71+
for target_deps in target.into_values() {
72+
deps.extend(target_deps.dependencies);
73+
dev_deps.extend(target_deps.dev_dependencies);
74+
build_deps.extend(target_deps.build_dependencies);
75+
}
4976
}
5077

5178
fn convert_dependency(
@@ -84,14 +111,21 @@ fn convert_dependency(
84111
}
85112

86113
pub fn parse_manifest_toml(input: &str) -> Result<CrateManifest, Error> {
87-
let cargo_toml = toml::de::from_str::<CargoToml>(input)?;
114+
let mut cargo_toml = toml::de::from_str::<CargoToml>(input)?;
88115

89116
let mut package_part = None;
90117
let mut workspace_part = None;
91118

92119
if let Some(package) = cargo_toml.package {
93120
let crate_name = package.name.parse::<CrateName>()?;
94121

122+
extract_target_dependencies_into(
123+
cargo_toml.target,
124+
&mut cargo_toml.dependencies,
125+
&mut cargo_toml.dev_dependencies,
126+
&mut cargo_toml.build_dependencies,
127+
);
128+
95129
let dependencies = cargo_toml
96130
.dependencies
97131
.into_iter()
@@ -192,3 +226,45 @@ symbolic-common_crate = { version = "2.0.6", package = "symbolic-common" }
192226
}
193227
}
194228
}
229+
230+
#[test]
231+
fn parse_manifest_with_target_dependencies() {
232+
let toml = r#"[package]
233+
name = "platform-specific"
234+
235+
[dependencies]
236+
serde = "1.0"
237+
238+
[target.'cfg(unix)'.dependencies]
239+
nix = { version = "0.28", features = ["sched"] }
240+
241+
[target.'cfg(windows)'.dev-dependencies]
242+
winapi = "0.3"
243+
244+
[target.'cfg(any(target_os = "android", target_os = "dragonfly", target_os = "freebsd", target_os = "linux"))'.build-dependencies]
245+
cc = "1.0"
246+
"#;
247+
248+
let manifest = parse_manifest_toml(toml).unwrap();
249+
250+
match manifest {
251+
CrateManifest::Package(name, deps) => {
252+
assert_eq!(name.as_ref(), "platform-specific");
253+
254+
assert_eq!(deps.main.len(), 2);
255+
let serde_name: CrateName = "serde".parse().unwrap();
256+
assert!(deps.main.get(&serde_name).is_some());
257+
let nix_name: CrateName = "nix".parse().unwrap();
258+
assert!(deps.main.get(&nix_name).is_some());
259+
260+
assert_eq!(deps.dev.len(), 1);
261+
let winapi_name: CrateName = "winapi".parse().unwrap();
262+
assert!(deps.dev.get(&winapi_name).is_some());
263+
264+
assert_eq!(deps.build.len(), 1);
265+
let cc_name: CrateName = "cc".parse().unwrap();
266+
assert!(deps.build.get(&cc_name).is_some());
267+
}
268+
_ => panic!("expected package manifest"),
269+
}
270+
}

0 commit comments

Comments
 (0)