1
1
use crate :: error:: Result ;
2
+ use failure:: ResultExt ;
2
3
use rustwide:: { cmd:: Command , Toolchain , Workspace } ;
3
4
use serde:: { Deserialize , Serialize } ;
4
5
use std:: collections:: { HashMap , HashSet } ;
5
6
use std:: path:: Path ;
6
7
7
8
pub ( crate ) struct CargoMetadata {
8
- packages : HashMap < String , Package > ,
9
+ packages : HashMap < String , :: cargo_metadata :: Package > ,
9
10
deps_graph : HashMap < String , HashSet < String > > ,
10
11
root_id : String ,
11
12
}
@@ -22,33 +23,46 @@ impl CargoMetadata {
22
23
. log_output ( false )
23
24
. run_capture ( ) ?;
24
25
26
+ let metadata = cargo_metadata:: MetadataCommand :: parse ( & res. stdout_lines ( ) . join ( "\n " ) )
27
+ . context ( "invalid output returned by `cargo metadata`" ) ?;
28
+ /*
25
29
let mut iter = res.stdout_lines().iter();
26
30
let metadata = if let (Some(serialized), None) = (iter.next(), iter.next()) {
27
31
serde_json::from_str::<DeserializedMetadata>(serialized)?
28
32
} else {
29
33
return Err(::failure::err_msg(
30
- "invalid output returned by `cargo metadata`" ,
31
34
));
32
35
};
36
+ */
33
37
38
+ let resolve = metadata
39
+ . resolve
40
+ . ok_or ( failure:: err_msg ( "expected resolve metadata" ) ) ?;
34
41
// Convert from Vecs to HashMaps and HashSets to get more efficient lookups
35
42
Ok ( CargoMetadata {
36
43
packages : metadata
37
44
. packages
38
45
. into_iter ( )
39
- . map ( |pkg| ( pkg. id . clone ( ) , pkg) )
46
+ . map ( |pkg| ( pkg. id . to_string ( ) , pkg) )
40
47
. collect ( ) ,
41
- deps_graph : metadata
42
- . resolve
48
+ deps_graph : resolve
43
49
. nodes
44
50
. into_iter ( )
45
- . map ( |node| ( node. id , node. deps . into_iter ( ) . map ( |d| d. pkg ) . collect ( ) ) )
51
+ . map ( |node| {
52
+ (
53
+ node. id . to_string ( ) ,
54
+ node. deps . into_iter ( ) . map ( |d| d. pkg . to_string ( ) ) . collect ( ) ,
55
+ )
56
+ } )
46
57
. collect ( ) ,
47
- root_id : metadata. resolve . root ,
58
+ root_id : resolve
59
+ . root
60
+ . ok_or ( failure:: err_msg ( "expected resolve root" ) ) ?
61
+ . to_string ( ) ,
48
62
} )
49
63
}
50
64
51
- pub ( crate ) fn root_dependencies ( & self ) -> Vec < & Package > {
65
+ pub ( crate ) fn root_dependencies ( & self ) -> Vec < & cargo_metadata :: Package > {
52
66
let ids = & self . deps_graph [ & self . root_id ] ;
53
67
self . packages
54
68
. iter ( )
@@ -57,7 +71,7 @@ impl CargoMetadata {
57
71
. collect ( )
58
72
}
59
73
60
- pub ( crate ) fn root ( & self ) -> & Package {
74
+ pub ( crate ) fn root ( & self ) -> & cargo_metadata :: Package {
61
75
& self . packages [ & self . root_id ]
62
76
}
63
77
}
0 commit comments