@@ -334,32 +334,68 @@ impl Features {
334
334
///
335
335
/// If you have any trouble with this, please let us know!
336
336
#[ derive( Default , Debug , Deserialize ) ]
337
- #[ serde( default , deny_unknown_fields , rename_all="kebab-case" ) ]
337
+ #[ serde( rename_all="kebab-case" ) ]
338
338
pub struct CliUnstable {
339
+ #[ serde( deserialize_with="default_false" ) ]
339
340
pub print_im_a_teapot : bool ,
341
+ #[ serde( deserialize_with="default_false" ) ]
340
342
pub unstable_options : bool ,
343
+ #[ serde( deserialize_with="default_false" ) ]
341
344
pub no_index_update : bool ,
345
+ #[ serde( deserialize_with="default_false" ) ]
342
346
pub avoid_dev_deps : bool ,
347
+ #[ serde( deserialize_with="default_false" ) ]
343
348
pub minimal_versions : bool ,
349
+ #[ serde( deserialize_with="default_false" ) ]
344
350
pub package_features : bool ,
351
+ #[ serde( deserialize_with="default_false" ) ]
345
352
pub advanced_env : bool ,
353
+ #[ serde( deserialize_with="default_false" ) ]
346
354
pub config_include : bool ,
355
+ #[ serde( deserialize_with="default_false" ) ]
347
356
pub dual_proc_macros : bool ,
357
+ #[ serde( deserialize_with="default_false" ) ]
348
358
pub mtime_on_use : bool ,
359
+ #[ serde( deserialize_with="default_false" ) ]
349
360
pub named_profiles : bool ,
361
+ #[ serde( deserialize_with="default_false" ) ]
350
362
pub binary_dep_depinfo : bool ,
351
363
pub build_std : Option < Vec < String > > ,
352
364
pub timings : Option < Vec < String > > ,
365
+ #[ serde( deserialize_with="default_false" ) ]
353
366
pub doctest_xcompile : bool ,
367
+ #[ serde( deserialize_with="default_false" ) ]
354
368
pub panic_abort_tests : bool ,
369
+ #[ serde( deserialize_with="default_false" ) ]
355
370
pub jobserver_per_rustc : bool ,
356
371
pub features : Option < Vec < String > > ,
372
+ #[ serde( deserialize_with="default_false" ) ]
357
373
pub crate_versions : bool ,
374
+ #[ serde( deserialize_with="default_false" ) ]
358
375
pub separate_nightlies : bool ,
376
+ #[ serde( deserialize_with="default_false" ) ]
359
377
pub multitarget : bool ,
378
+ #[ serde( deserialize_with="default_false" ) ]
360
379
pub rustdoc_map : bool ,
361
380
}
362
381
382
+ /// Treat boolean Zflags as optionals for deserializing them.
383
+ /// This allows missing settings to default to disabled (effectively recreating
384
+ /// the serde `default` behavior). Our Deserializer merges multiple sources
385
+ /// inline, so the serde facilities for handling missing or additional fields
386
+ /// don't quite fit.
387
+ ///
388
+ /// TODO: This limitation can likely be removed by refactoring
389
+ /// `de::ConfigMapAccess` to iterate the union of the config and env sets.
390
+ fn default_false < ' de , D , T > ( deserializer : D ) -> Result < T , D :: Error >
391
+ where
392
+ D : serde:: Deserializer < ' de > ,
393
+ T : Deserialize < ' de > + Default ,
394
+ {
395
+ let option = Option :: deserialize ( deserializer) ?;
396
+ Ok ( option. unwrap_or_default ( ) )
397
+ }
398
+
363
399
impl CliUnstable {
364
400
pub fn parse ( & mut self , flags : & [ String ] ) -> CargoResult < ( ) > {
365
401
if !flags. is_empty ( ) && !nightly_features_allowed ( ) {
0 commit comments