@@ -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 ) ]
3648struct 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
5178fn convert_dependency (
@@ -84,14 +111,21 @@ fn convert_dependency(
84111}
85112
86113pub 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