@@ -56,7 +56,7 @@ use rustc_hash::FxHashMap;
56
56
use serde:: { de, Deserialize } ;
57
57
use std:: path:: PathBuf ;
58
58
59
- use crate :: cfg_flag:: CfgFlag ;
59
+ use crate :: { cfg_flag:: CfgFlag , TargetKind } ;
60
60
61
61
/// Roots and crates that compose this Rust project.
62
62
#[ derive( Clone , Debug , Eq , PartialEq ) ]
@@ -73,20 +73,37 @@ pub struct ProjectJson {
73
73
/// useful in creating the crate graph.
74
74
#[ derive( Clone , Debug , Eq , PartialEq ) ]
75
75
pub struct Crate {
76
- pub ( crate ) display_name : Option < CrateDisplayName > ,
77
- pub ( crate ) root_module : AbsPathBuf ,
78
- pub ( crate ) edition : Edition ,
79
- pub ( crate ) version : Option < String > ,
80
- pub ( crate ) deps : Vec < Dependency > ,
81
- pub ( crate ) cfg : Vec < CfgFlag > ,
82
- pub ( crate ) target : Option < String > ,
83
- pub ( crate ) env : FxHashMap < String , String > ,
84
- pub ( crate ) proc_macro_dylib_path : Option < AbsPathBuf > ,
85
- pub ( crate ) is_workspace_member : bool ,
86
- pub ( crate ) include : Vec < AbsPathBuf > ,
87
- pub ( crate ) exclude : Vec < AbsPathBuf > ,
88
- pub ( crate ) is_proc_macro : bool ,
89
- pub ( crate ) repository : Option < String > ,
76
+ pub display_name : Option < CrateDisplayName > ,
77
+ pub root_module : AbsPathBuf ,
78
+ pub edition : Edition ,
79
+ pub version : Option < String > ,
80
+ pub deps : Vec < Dependency > ,
81
+ pub cfg : Vec < CfgFlag > ,
82
+ pub target : Option < String > ,
83
+ pub env : FxHashMap < String , String > ,
84
+ pub proc_macro_dylib_path : Option < AbsPathBuf > ,
85
+ pub is_workspace_member : bool ,
86
+ pub include : Vec < AbsPathBuf > ,
87
+ pub exclude : Vec < AbsPathBuf > ,
88
+ pub is_proc_macro : bool ,
89
+ pub repository : Option < String > ,
90
+ pub target_spec : Option < TargetSpec > ,
91
+ }
92
+
93
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
94
+ pub struct TargetSpec {
95
+ pub manifest_file : AbsPathBuf ,
96
+ pub target_label : String ,
97
+ pub target_kind : TargetKind ,
98
+ pub runnables : Runnables ,
99
+ pub flycheck_command : Vec < String > ,
100
+ }
101
+
102
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
103
+ pub struct Runnables {
104
+ pub check : Vec < String > ,
105
+ pub run : Vec < String > ,
106
+ pub test : Vec < String > ,
90
107
}
91
108
92
109
impl ProjectJson {
@@ -121,6 +138,20 @@ impl ProjectJson {
121
138
None => ( vec ! [ root_module. parent( ) . unwrap( ) . to_path_buf( ) ] , Vec :: new ( ) ) ,
122
139
} ;
123
140
141
+ let target_spec = match crate_data. target_spec {
142
+ Some ( spec) => {
143
+ let spec = TargetSpec {
144
+ manifest_file : absolutize_on_base ( spec. manifest_file ) ,
145
+ target_label : spec. target_label ,
146
+ target_kind : spec. target_kind . into ( ) ,
147
+ runnables : spec. runnables . into ( ) ,
148
+ flycheck_command : spec. flycheck_command ,
149
+ } ;
150
+ Some ( spec)
151
+ }
152
+ None => None ,
153
+ } ;
154
+
124
155
Crate {
125
156
display_name : crate_data
126
157
. display_name
@@ -150,6 +181,7 @@ impl ProjectJson {
150
181
exclude,
151
182
is_proc_macro : crate_data. is_proc_macro ,
152
183
repository : crate_data. repository ,
184
+ target_spec,
153
185
}
154
186
} )
155
187
. collect ( ) ,
@@ -173,6 +205,15 @@ impl ProjectJson {
173
205
pub fn path ( & self ) -> & AbsPath {
174
206
& self . project_root
175
207
}
208
+
209
+ pub fn crate_by_root ( & self , root : & AbsPath ) -> Option < Crate > {
210
+ self . crates
211
+ . iter ( )
212
+ . filter ( |krate| krate. is_workspace_member )
213
+ . find ( |krate| & krate. root_module == root)
214
+ . map ( |krate| krate)
215
+ . cloned ( )
216
+ }
176
217
}
177
218
178
219
#[ derive( Deserialize , Debug , Clone ) ]
@@ -202,6 +243,8 @@ struct CrateData {
202
243
is_proc_macro : bool ,
203
244
#[ serde( default ) ]
204
245
repository : Option < String > ,
246
+ #[ serde( default ) ]
247
+ target_spec : Option < TargetSpecData > ,
205
248
}
206
249
207
250
#[ derive( Deserialize , Debug , Clone ) ]
@@ -217,6 +260,55 @@ enum EditionData {
217
260
Edition2024 ,
218
261
}
219
262
263
+ #[ derive( Deserialize , Debug , Clone ) ]
264
+ pub struct TargetSpecData {
265
+ manifest_file : PathBuf ,
266
+ target_label : String ,
267
+ target_kind : TargetKindData ,
268
+ runnables : RunnablesData ,
269
+ flycheck_command : Vec < String > ,
270
+ }
271
+
272
+ #[ derive( Deserialize , Debug , Clone ) ]
273
+ pub struct RunnablesData {
274
+ check : Vec < String > ,
275
+ run : Vec < String > ,
276
+ test : Vec < String > ,
277
+ }
278
+
279
+ #[ derive( Debug , Clone , Copy , PartialEq , Eq , serde:: Deserialize ) ]
280
+ #[ serde( rename_all = "camelCase" ) ]
281
+ pub enum TargetKindData {
282
+ Bin ,
283
+ /// Any kind of Cargo lib crate-type (dylib, rlib, proc-macro, ...).
284
+ Lib ,
285
+ Example ,
286
+ Test ,
287
+ Bench ,
288
+ BuildScript ,
289
+ Other ,
290
+ }
291
+
292
+ impl From < TargetKindData > for TargetKind {
293
+ fn from ( value : TargetKindData ) -> Self {
294
+ match value {
295
+ TargetKindData :: Bin => TargetKind :: Bin ,
296
+ TargetKindData :: Lib => TargetKind :: Lib ,
297
+ TargetKindData :: Example => TargetKind :: Example ,
298
+ TargetKindData :: Test => TargetKind :: Test ,
299
+ TargetKindData :: Bench => TargetKind :: Bench ,
300
+ TargetKindData :: BuildScript => TargetKind :: BuildScript ,
301
+ TargetKindData :: Other => TargetKind :: Other ,
302
+ }
303
+ }
304
+ }
305
+
306
+ impl From < RunnablesData > for Runnables {
307
+ fn from ( value : RunnablesData ) -> Self {
308
+ Runnables { check : value. check , run : value. run , test : value. test }
309
+ }
310
+ }
311
+
220
312
impl From < EditionData > for Edition {
221
313
fn from ( data : EditionData ) -> Self {
222
314
match data {
0 commit comments