@@ -32,6 +32,18 @@ struct CargoTomlWorkspace {
32
32
members : Vec < RelativePathBuf > ,
33
33
}
34
34
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
+
35
47
#[ derive( Serialize , Deserialize , Debug ) ]
36
48
struct CargoToml {
37
49
#[ serde( default ) ]
@@ -46,6 +58,21 @@ struct CargoToml {
46
58
#[ serde( rename = "build-dependencies" ) ]
47
59
#[ serde( default ) ]
48
60
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
+ }
49
76
}
50
77
51
78
fn convert_dependency (
@@ -84,14 +111,21 @@ fn convert_dependency(
84
111
}
85
112
86
113
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) ?;
88
115
89
116
let mut package_part = None ;
90
117
let mut workspace_part = None ;
91
118
92
119
if let Some ( package) = cargo_toml. package {
93
120
let crate_name = package. name . parse :: < CrateName > ( ) ?;
94
121
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
+
95
129
let dependencies = cargo_toml
96
130
. dependencies
97
131
. into_iter ( )
@@ -192,3 +226,45 @@ symbolic-common_crate = { version = "2.0.6", package = "symbolic-common" }
192
226
}
193
227
}
194
228
}
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