@@ -7,16 +7,10 @@ use std::path::Path;
77/// Describes how this module can fail 
88#[ derive( Debug ,  thiserror:: Error ) ]  
99pub  enum  Error  { 
10-     #[ error( "Failed to run cargo metadata: {0:?}" ) ]  
11-     LaunchingMetadata ( #[ from]   std:: io:: Error ) , 
12-     #[ error( "Failed get output from cargo metadata: {0:?}" ) ]  
13-     GettingMetadata ( String ) , 
14-     #[ error( "Failed parse JSON output from cargo metadata: {0:?}" ) ]  
15-     ParsingJson ( #[ from]   serde_json:: Error ) , 
16-     #[ error( "Failed find expected JSON element {0} in output from cargo metadata" ) ]  
17-     MissingJsonElement ( & ' static  str ) , 
18-     #[ error( "Failed find expected JSON element {0} in output from cargo metadata for package {1}" ) ]  
19-     MissingJsonElementForPackage ( String ,  String ) , 
10+     #[ error( "I/O Error: {0:?}" ) ]  
11+     Io ( #[ from]   std:: io:: Error ) , 
12+     #[ error( "Failed get output from cargo-metadata: {0:?}" ) ]  
13+     GettingMetadata ( #[ from]   cargo_metadata:: Error ) , 
2014    #[ error( "Failed to run cargo vendor: {0:?}" ) ]  
2115    LaunchingVendor ( std:: io:: Error ) , 
2216    #[ error( "Failed to complete cargo vendor" ) ]  
@@ -88,71 +82,33 @@ pub fn get_metadata(
8882        if  manifest_path. file_name ( )  != Some ( OsStr :: new ( "Cargo.toml" ) )  { 
8983            panic ! ( "cargo_manifest::get requires a path to a Cargo.toml file" ) ; 
9084        } 
91-         let  metadata_json = get_metadata_json ( cargo,  manifest_path) ?; 
92-         let  packages = metadata_json[ "packages" ] 
93-             . as_array ( ) 
94-             . ok_or_else ( || Error :: MissingJsonElement ( "packages array" ) ) ?; 
95-         for  package in  packages { 
96-             let  package =
97-                 package. as_object ( ) . ok_or_else ( || Error :: MissingJsonElement ( "package object" ) ) ?; 
98-             let  manifest_path = package
99-                 . get ( "manifest_path" ) 
100-                 . and_then ( |v| v. as_str ( ) ) 
101-                 . map ( Path :: new) 
102-                 . ok_or_else ( || Error :: MissingJsonElement ( "package.manifest_path" ) ) ?; 
85+         let  metadata = cargo_metadata:: MetadataCommand :: new ( ) 
86+             . cargo_path ( cargo) 
87+             . env ( "RUSTC_BOOTSTRAP" ,  "1" ) 
88+             . manifest_path ( manifest_path) 
89+             . exec ( ) ?; 
90+         for  package in  metadata. packages  { 
91+             let  manifest_path = package. manifest_path . as_path ( ) ; 
10392            if  manifest_path. starts_with ( root_path)  { 
10493                // it's an in-tree dependency and reuse covers it 
10594                continue ; 
10695            } 
10796            // otherwise it's an out-of-tree dependency 
108-             let  get_string = |field_name :  & str ,  package_name :  & str | { 
109-                 package. get ( field_name) . and_then ( |v| v. as_str ( ) ) . ok_or_else ( || { 
110-                     Error :: MissingJsonElementForPackage ( 
111-                         format ! ( "package.{field_name}" ) , 
112-                         package_name. to_owned ( ) , 
113-                     ) 
114-                 } ) 
115-             } ; 
116-             let  name = get_string ( "name" ,  "unknown" ) ?; 
117-             let  license = get_string ( "license" ,  name) ?; 
118-             let  version = get_string ( "version" ,  name) ?; 
119-             let  authors_list = package
120-                 . get ( "authors" ) 
121-                 . and_then ( |v| v. as_array ( ) ) 
122-                 . ok_or_else ( || Error :: MissingJsonElement ( "package.authors" ) ) ?; 
123-             let  authors:  Vec < String >  =
124-                 authors_list. iter ( ) . filter_map ( |v| v. as_str ( ) ) . map ( |s| s. to_owned ( ) ) . collect ( ) ; 
125-             let  package = Package  {  name :  name. to_owned ( ) ,  version :  version. to_owned ( )  } ; 
97+             let  package_id = Package  {  name :  package. name ,  version :  package. version . to_string ( )  } ; 
12698            output. insert ( 
127-                 package. clone ( ) , 
128-                 PackageMetadata  {  license :  license. to_owned ( ) ,  authors,  notices :  BTreeMap :: new ( )  } , 
99+                 package_id, 
100+                 PackageMetadata  { 
101+                     license :  package. license . unwrap_or_else ( || String :: from ( "Unspecified" ) ) , 
102+                     authors :  package. authors , 
103+                     notices :  BTreeMap :: new ( ) , 
104+                 } , 
129105            ) ; 
130106        } 
131107    } 
132108
133109    Ok ( output) 
134110} 
135111
136- /// Get cargo-metdata for a package, as JSON 
137- fn  get_metadata_json ( cargo :  & Path ,  manifest_path :  & Path )  -> Result < serde_json:: Value ,  Error >  { 
138-     let  metadata_output = std:: process:: Command :: new ( cargo) 
139-         . arg ( "metadata" ) 
140-         . arg ( "--format-version=1" ) 
141-         . arg ( "--all-features" ) 
142-         . arg ( "--manifest-path" ) 
143-         . arg ( manifest_path) 
144-         . env ( "RUSTC_BOOTSTRAP" ,  "1" ) 
145-         . output ( ) 
146-         . map_err ( Error :: LaunchingMetadata ) ?; 
147-     if  !metadata_output. status . success ( )  { 
148-         return  Err ( Error :: GettingMetadata ( 
149-             String :: from_utf8 ( metadata_output. stderr ) . expect ( "UTF-8 output from cargo" ) , 
150-         ) ) ; 
151-     } 
152-     let  json = serde_json:: from_slice ( & metadata_output. stdout ) ?; 
153-     Ok ( json) 
154- } 
155- 
156112/// Run cargo-vendor, fetching into the given dir 
157113fn  run_cargo_vendor ( cargo :  & Path ,  dest :  & Path ,  manifest_paths :  & [ & Path ] )  -> Result < ( ) ,  Error >  { 
158114    let  mut  vendor_command = std:: process:: Command :: new ( cargo) ; 
0 commit comments