@@ -2,7 +2,7 @@ use crate::error::Result;
2
2
use failure:: err_msg;
3
3
use std:: collections:: HashSet ;
4
4
use std:: path:: Path ;
5
- use toml:: Value ;
5
+ use toml:: { map :: Map , Value } ;
6
6
7
7
/// Metadata for custom builds
8
8
///
@@ -83,21 +83,25 @@ impl Metadata {
83
83
return Ok ( Metadata :: from_manifest ( manifest_path) ) ;
84
84
}
85
85
}
86
+
86
87
Err ( err_msg ( "Manifest not found" ) )
87
88
}
88
89
89
90
fn from_manifest < P : AsRef < Path > > ( path : P ) -> Metadata {
90
- use std:: fs:: File ;
91
- use std:: io:: Read ;
92
- let mut f = match File :: open ( path) {
93
- Ok ( f) => f,
94
- Err ( _) => return Metadata :: default ( ) ,
91
+ use std:: { fs:: File , io:: Read } ;
92
+
93
+ let mut file = if let Ok ( file) = File :: open ( path) {
94
+ file
95
+ } else {
96
+ return Metadata :: default ( ) ;
95
97
} ;
96
- let mut s = String :: new ( ) ;
97
- if f. read_to_string ( & mut s) . is_err ( ) {
98
+
99
+ let mut meta = String :: new ( ) ;
100
+ if file. read_to_string ( & mut meta) . is_err ( ) {
98
101
return Metadata :: default ( ) ;
99
102
}
100
- Metadata :: from_str ( & s)
103
+
104
+ Metadata :: from_str ( & meta)
101
105
}
102
106
103
107
// This is similar to Default trait but it's private
@@ -116,53 +120,67 @@ impl Metadata {
116
120
fn from_str ( manifest : & str ) -> Metadata {
117
121
let mut metadata = Metadata :: default ( ) ;
118
122
119
- let manifest = match manifest. parse :: < Value > ( ) {
120
- Ok ( m) => m,
121
- Err ( _) => return metadata,
123
+ let manifest = if let Ok ( manifest) = manifest. parse :: < Value > ( ) {
124
+ manifest
125
+ } else {
126
+ return metadata;
122
127
} ;
123
128
124
- if let Some ( table) = manifest
125
- . get ( "package" )
126
- . and_then ( |p| p. as_table ( ) )
127
- . and_then ( |p| p. get ( "metadata" ) )
128
- . and_then ( |p| p. as_table ( ) )
129
- . and_then ( |p| p. get ( "docs" ) )
130
- . and_then ( |p| p. as_table ( ) )
131
- . and_then ( |p| p. get ( "rs" ) )
132
- . and_then ( |p| p. as_table ( ) )
133
- {
129
+ fn fetch_manifest_tables < ' a > ( manifest : & ' a Value ) -> Option < & ' a Map < String , Value > > {
130
+ manifest
131
+ . get ( "package" ) ?
132
+ . as_table ( ) ?
133
+ . get ( "metadata" ) ?
134
+ . as_table ( ) ?
135
+ . get ( "docs" ) ?
136
+ . as_table ( ) ?
137
+ . get ( "rs" ) ?
138
+ . as_table ( )
139
+ }
140
+
141
+ if let Some ( table) = fetch_manifest_tables ( & manifest) {
142
+ let collect_into_array =
143
+ |f : & Vec < Value > | f. iter ( ) . map ( |v| v. as_str ( ) . map ( |v| v. to_owned ( ) ) ) . collect ( ) ;
144
+
134
145
metadata. features = table
135
146
. get ( "features" )
136
147
. and_then ( |f| f. as_array ( ) )
137
- . and_then ( |f| f. iter ( ) . map ( |v| v. as_str ( ) . map ( |v| v. to_owned ( ) ) ) . collect ( ) ) ;
148
+ . and_then ( collect_into_array) ;
149
+
138
150
metadata. no_default_features = table
139
151
. get ( "no-default-features" )
140
152
. and_then ( |v| v. as_bool ( ) )
141
153
. unwrap_or ( metadata. no_default_features ) ;
154
+
142
155
metadata. all_features = table
143
156
. get ( "all-features" )
144
157
. and_then ( |v| v. as_bool ( ) )
145
158
. unwrap_or ( metadata. all_features ) ;
159
+
146
160
metadata. default_target = table
147
161
. get ( "default-target" )
148
162
. and_then ( |v| v. as_str ( ) )
149
163
. map ( |v| v. to_owned ( ) ) ;
164
+
150
165
metadata. targets = table
151
166
. get ( "targets" )
152
167
. and_then ( |f| f. as_array ( ) )
153
- . and_then ( |f| f. iter ( ) . map ( |v| v. as_str ( ) . map ( |v| v. to_owned ( ) ) ) . collect ( ) ) ;
168
+ . and_then ( collect_into_array) ;
169
+
154
170
metadata. rustc_args = table
155
171
. get ( "rustc-args" )
156
172
. and_then ( |f| f. as_array ( ) )
157
- . and_then ( |f| f. iter ( ) . map ( |v| v. as_str ( ) . map ( |v| v. to_owned ( ) ) ) . collect ( ) ) ;
173
+ . and_then ( collect_into_array) ;
174
+
158
175
metadata. rustdoc_args = table
159
176
. get ( "rustdoc-args" )
160
177
. and_then ( |f| f. as_array ( ) )
161
- . and_then ( |f| f . iter ( ) . map ( |v| v . as_str ( ) . map ( |v| v . to_owned ( ) ) ) . collect ( ) ) ;
178
+ . and_then ( collect_into_array ) ;
162
179
}
163
180
164
181
metadata
165
182
}
183
+
166
184
pub ( super ) fn targets ( & self ) -> BuildTargets < ' _ > {
167
185
use super :: rustwide_builder:: { HOST_TARGET , TARGETS } ;
168
186
@@ -282,16 +300,19 @@ mod test {
282
300
use crate :: docbuilder:: rustwide_builder:: { HOST_TARGET , TARGETS } ;
283
301
284
302
let mut metadata = Metadata :: default ( ) ;
303
+
285
304
// unchanged default_target, targets not specified
286
305
let BuildTargets {
287
306
default_target : default,
288
307
other_targets : tier_one,
289
308
} = metadata. targets ( ) ;
290
309
assert_eq ! ( default , HOST_TARGET ) ;
310
+
291
311
// should be equal to TARGETS \ {HOST_TARGET}
292
312
for actual in & tier_one {
293
313
assert ! ( TARGETS . contains( actual) ) ;
294
314
}
315
+
295
316
for expected in TARGETS {
296
317
if * expected == HOST_TARGET {
297
318
assert ! ( !tier_one. contains( & HOST_TARGET ) ) ;
@@ -302,10 +323,12 @@ mod test {
302
323
303
324
// unchanged default_target, targets specified to be empty
304
325
metadata. targets = Some ( Vec :: new ( ) ) ;
326
+
305
327
let BuildTargets {
306
328
default_target : default,
307
329
other_targets : others,
308
330
} = metadata. targets ( ) ;
331
+
309
332
assert_eq ! ( default , HOST_TARGET ) ;
310
333
assert ! ( others. is_empty( ) ) ;
311
334
@@ -314,10 +337,12 @@ mod test {
314
337
"i686-pc-windows-msvc" . into( ) ,
315
338
"i686-apple-darwin" . into( ) ,
316
339
] ) ;
340
+
317
341
let BuildTargets {
318
342
default_target : default,
319
343
other_targets : others,
320
344
} = metadata. targets ( ) ;
345
+
321
346
assert_eq ! ( default , "i686-pc-windows-msvc" ) ;
322
347
assert_eq ! ( others. len( ) , 1 ) ;
323
348
assert ! ( others. contains( & "i686-apple-darwin" ) ) ;
@@ -328,6 +353,7 @@ mod test {
328
353
default_target : default,
329
354
other_targets : others,
330
355
} = metadata. targets ( ) ;
356
+
331
357
assert_eq ! ( default , HOST_TARGET ) ;
332
358
assert ! ( others. is_empty( ) ) ;
333
359
@@ -336,10 +362,12 @@ mod test {
336
362
"i686-pc-windows-msvc" . into( ) ,
337
363
"i686-pc-windows-msvc" . into( ) ,
338
364
] ) ;
365
+
339
366
let BuildTargets {
340
367
default_target : default,
341
368
other_targets : others,
342
369
} = metadata. targets ( ) ;
370
+
343
371
assert_eq ! ( default , "i686-pc-windows-msvc" ) ;
344
372
assert ! ( others. is_empty( ) ) ;
345
373
@@ -349,6 +377,7 @@ mod test {
349
377
default_target : default,
350
378
other_targets : others,
351
379
} = metadata. targets ( ) ;
380
+
352
381
assert_eq ! ( default , "i686-apple-darwin" ) ;
353
382
assert_eq ! ( others. len( ) , 1 ) ;
354
383
assert ! ( others. contains( & "i686-pc-windows-msvc" ) ) ;
@@ -359,6 +388,7 @@ mod test {
359
388
default_target : default,
360
389
other_targets : others,
361
390
} = metadata. targets ( ) ;
391
+
362
392
assert_eq ! ( default , "i686-apple-darwin" ) ;
363
393
assert ! ( others. is_empty( ) ) ;
364
394
@@ -368,12 +398,14 @@ mod test {
368
398
default_target : default,
369
399
other_targets : others,
370
400
} = metadata. targets ( ) ;
401
+
371
402
assert_eq ! ( default , "i686-apple-darwin" ) ;
372
403
let tier_one_targets_no_default = TARGETS
373
404
. iter ( )
374
405
. filter ( |& & t| t != "i686-apple-darwin" )
375
406
. copied ( )
376
407
. collect ( ) ;
408
+
377
409
assert_eq ! ( others, tier_one_targets_no_default) ;
378
410
}
379
411
}
0 commit comments