1
+ use serde:: ser:: { self , Serialize } ;
2
+
1
3
use core:: resolver:: Resolve ;
2
- use core:: { Package , PackageId , PackageSet , Workspace } ;
3
- use core:: dependency;
4
+ use core:: { Package , PackageId , Workspace } ;
4
5
use ops:: { self , Packages } ;
5
6
use util:: CargoResult ;
6
7
@@ -55,19 +56,18 @@ fn metadata_full(ws: &Workspace, opt: &OutputMetadataOptions) -> CargoResult<Exp
55
56
) ?;
56
57
let ( packages, resolve) = deps;
57
58
58
- let resolve = MetadataResolve :: new (
59
- & packages,
60
- & resolve,
61
- ws. current_opt ( ) . map ( |pkg| pkg. package_id ( ) . clone ( ) ) ,
62
- ) ;
63
59
let packages = packages
64
60
. package_ids ( )
65
61
. map ( |i| packages. get ( i) . map ( |p| p. clone ( ) ) )
66
62
. collect :: < CargoResult < Vec < _ > > > ( ) ?;
63
+
67
64
Ok ( ExportInfo {
68
65
packages,
69
66
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
+ } ) ,
71
71
target_directory : ws. target_dir ( ) . display ( ) . to_string ( ) ,
72
72
version : VERSION ,
73
73
workspace_root : ws. root ( ) . display ( ) . to_string ( ) ,
@@ -76,91 +76,42 @@ fn metadata_full(ws: &Workspace, opt: &OutputMetadataOptions) -> CargoResult<Exp
76
76
77
77
#[ derive( Serialize ) ]
78
78
pub struct ExportInfo {
79
- /// All packages for this project, with dependencies.
80
79
packages : Vec < Package > ,
81
- /// Packages which are direct members of the current project.
82
80
workspace_members : Vec < PackageId > ,
83
- /// A graph of the dependencies between packages.
84
81
resolve : Option < MetadataResolve > ,
85
- /// The directory where intermediate build artifacts will be stored.
86
82
target_directory : String ,
87
- /// Version of this JSON format
88
83
version : u32 ,
89
- /// Path to the directory with the project.
90
84
workspace_root : String ,
91
85
}
92
86
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
96
90
#[ derive( Serialize ) ]
97
91
struct 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 ,
101
94
root : Option < PackageId > ,
102
95
}
103
96
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 > ,
165
106
}
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)
166
117
}
0 commit comments