Skip to content

Commit c532c49

Browse files
committed
Treat all CliUnstable values as default-false
This is a workaround in case y'all would like to land this change before I'm able to finish up a Deserializer refactor.
1 parent 14c32d4 commit c532c49

File tree

1 file changed

+37
-1
lines changed

1 file changed

+37
-1
lines changed

src/cargo/core/features.rs

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,32 +334,68 @@ impl Features {
334334
///
335335
/// If you have any trouble with this, please let us know!
336336
#[derive(Default, Debug, Deserialize)]
337-
#[serde(default, deny_unknown_fields, rename_all="kebab-case")]
337+
#[serde(rename_all="kebab-case")]
338338
pub struct CliUnstable {
339+
#[serde(deserialize_with="default_false")]
339340
pub print_im_a_teapot: bool,
341+
#[serde(deserialize_with="default_false")]
340342
pub unstable_options: bool,
343+
#[serde(deserialize_with="default_false")]
341344
pub no_index_update: bool,
345+
#[serde(deserialize_with="default_false")]
342346
pub avoid_dev_deps: bool,
347+
#[serde(deserialize_with="default_false")]
343348
pub minimal_versions: bool,
349+
#[serde(deserialize_with="default_false")]
344350
pub package_features: bool,
351+
#[serde(deserialize_with="default_false")]
345352
pub advanced_env: bool,
353+
#[serde(deserialize_with="default_false")]
346354
pub config_include: bool,
355+
#[serde(deserialize_with="default_false")]
347356
pub dual_proc_macros: bool,
357+
#[serde(deserialize_with="default_false")]
348358
pub mtime_on_use: bool,
359+
#[serde(deserialize_with="default_false")]
349360
pub named_profiles: bool,
361+
#[serde(deserialize_with="default_false")]
350362
pub binary_dep_depinfo: bool,
351363
pub build_std: Option<Vec<String>>,
352364
pub timings: Option<Vec<String>>,
365+
#[serde(deserialize_with="default_false")]
353366
pub doctest_xcompile: bool,
367+
#[serde(deserialize_with="default_false")]
354368
pub panic_abort_tests: bool,
369+
#[serde(deserialize_with="default_false")]
355370
pub jobserver_per_rustc: bool,
356371
pub features: Option<Vec<String>>,
372+
#[serde(deserialize_with="default_false")]
357373
pub crate_versions: bool,
374+
#[serde(deserialize_with="default_false")]
358375
pub separate_nightlies: bool,
376+
#[serde(deserialize_with="default_false")]
359377
pub multitarget: bool,
378+
#[serde(deserialize_with="default_false")]
360379
pub rustdoc_map: bool,
361380
}
362381

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+
363399
impl CliUnstable {
364400
pub fn parse(&mut self, flags: &[String]) -> CargoResult<()> {
365401
if !flags.is_empty() && !nightly_features_allowed() {

0 commit comments

Comments
 (0)