1+ use serde:: ser:: { self , Serialize } ;
2+
13use core:: resolver:: Resolve ;
2- use core:: { Package , PackageId , PackageSet , Workspace } ;
3- use core:: dependency;
4+ use core:: { Package , PackageId , Workspace } ;
45use ops:: { self , Packages } ;
56use util:: CargoResult ;
67
@@ -55,19 +56,18 @@ fn metadata_full(ws: &Workspace, opt: &OutputMetadataOptions) -> CargoResult<Exp
5556 ) ?;
5657 let ( packages, resolve) = deps;
5758
58- let resolve = MetadataResolve :: new (
59- & packages,
60- & resolve,
61- ws. current_opt ( ) . map ( |pkg| pkg. package_id ( ) . clone ( ) ) ,
62- ) ;
6359 let packages = packages
6460 . package_ids ( )
6561 . map ( |i| packages. get ( i) . map ( |p| p. clone ( ) ) )
6662 . collect :: < CargoResult < Vec < _ > > > ( ) ?;
63+
6764 Ok ( ExportInfo {
6865 packages,
6966 workspace_members : ws. members ( ) . map ( |pkg| pkg. package_id ( ) . clone ( ) ) . collect ( ) ,
70- resolve : Some ( resolve) ,
67+ resolve : Some ( MetadataResolve {
68+ resolve,
69+ root : ws. current_opt ( ) . map ( |pkg| pkg. package_id ( ) . clone ( ) ) ,
70+ } ) ,
7171 target_directory : ws. target_dir ( ) . display ( ) . to_string ( ) ,
7272 version : VERSION ,
7373 workspace_root : ws. root ( ) . display ( ) . to_string ( ) ,
@@ -76,91 +76,42 @@ fn metadata_full(ws: &Workspace, opt: &OutputMetadataOptions) -> CargoResult<Exp
7676
7777#[ derive( Serialize ) ]
7878pub struct ExportInfo {
79- /// All packages for this project, with dependencies.
8079 packages : Vec < Package > ,
81- /// Packages which are direct members of the current project.
8280 workspace_members : Vec < PackageId > ,
83- /// A graph of the dependencies between packages.
8481 resolve : Option < MetadataResolve > ,
85- /// The directory where intermediate build artifacts will be stored.
8682 target_directory : String ,
87- /// Version of this JSON format
8883 version : u32 ,
89- /// Path to the directory with the project.
9084 workspace_root : String ,
9185}
9286
93- // The serialization format is different from lockfile, because
94- // here we use different format for `PackageId`s, and give more
95- // information about dependencies.
87+ /// Newtype wrapper to provide a custom `Serialize` implementation.
88+ /// The one from lockfile does not fit because it uses a non-standard
89+ /// format for `PackageId`s
9690#[ derive( Serialize ) ]
9791struct MetadataResolve {
98- /// Dependencies for each package from `ExportInfo::package`.
99- nodes : Vec < Node > ,
100- /// Deprecated, use `ExportInfo::workspace_members`.
92+ #[ serde( rename = "nodes" , serialize_with = "serialize_resolve" ) ]
93+ resolve : Resolve ,
10194 root : Option < PackageId > ,
10295}
10396
104- /// Describes dependencies of a single package.
105- #[ derive( Serialize ) ]
106- struct Node {
107- /// The id of the package.
108- id : PackageId ,
109- /// Deprecated, use `deps` field.
110- dependencies : Vec < PackageId > ,
111- /// Dependencies of this package.
112- deps : Vec < Dependency > ,
113- /// Features, enabled for this package.
114- features : Vec < String > ,
115- }
116-
117- /// Describes a single dependency.
118- #[ derive( Serialize ) ]
119- struct Dependency {
120- /// The id of the dependency.
121- id : PackageId ,
122- /// The name used for `extern crate` declaration of this dependency.
123- name : String ,
124- /// Is this normal, dev or build dependency
125- kind : dependency:: Kind ,
126- }
127-
128- impl MetadataResolve {
129- pub fn new (
130- packages : & PackageSet ,
131- resolve : & Resolve ,
132- root : Option < PackageId > ,
133- ) -> MetadataResolve {
134- let nodes = resolve
135- . iter ( )
136- . map ( |pkg| {
137- Node {
138- id : pkg. clone ( ) ,
139- dependencies : resolve. deps ( pkg) . map ( |( dep, _) | dep. clone ( ) ) . collect ( ) ,
140- deps : resolve
141- . deps ( pkg)
142- . flat_map ( |( id, deps) | {
143- let dep_name = packages. get ( id) . unwrap ( )
144- . lib_target ( ) . unwrap ( )
145- . crate_name ( ) ;
146- deps. iter ( ) . map ( |dep| {
147- Dependency {
148- id : id. clone ( ) ,
149- name : dep. rename ( ) . unwrap_or ( & dep_name)
150- . to_owned ( ) ,
151- kind : dep. kind ( ) ,
152- }
153- } ) . collect :: < Vec < _ > > ( ) . into_iter ( )
154- } )
155- . collect ( ) ,
156- features : resolve
157- . features_sorted ( pkg)
158- . into_iter ( )
159- . map ( |s| s. to_string ( ) )
160- . collect ( ) ,
161- }
162- } )
163- . collect ( ) ;
164- MetadataResolve { nodes, root }
97+ fn serialize_resolve < S > ( resolve : & Resolve , s : S ) -> Result < S :: Ok , S :: Error >
98+ where
99+ S : ser:: Serializer ,
100+ {
101+ #[ derive( Serialize ) ]
102+ struct Node < ' a > {
103+ id : & ' a PackageId ,
104+ dependencies : Vec < & ' a PackageId > ,
105+ features : Vec < & ' a str > ,
165106 }
107+
108+ resolve
109+ . iter ( )
110+ . map ( |id| Node {
111+ id,
112+ dependencies : resolve. deps ( id) . map ( |p| p. 0 ) . collect ( ) ,
113+ features : resolve. features_sorted ( id) ,
114+ } )
115+ . collect :: < Vec < _ > > ( )
116+ . serialize ( s)
166117}
0 commit comments