From 54742ce7263ec91d869e96196a7b51bcfae44835 Mon Sep 17 00:00:00 2001 From: Mukund Lakshman Date: Fri, 19 Mar 2021 23:22:39 +0000 Subject: [PATCH] Use serde's error message option to avoid implementing `Deserialize`. --- Cargo.toml | 2 +- src/cargo/util/toml/mod.rs | 81 ++--------------------------------- tests/testsuite/bad_config.rs | 4 +- 3 files changed, 7 insertions(+), 80 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 85d99c1ae..32f1c839e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -52,7 +52,7 @@ percent-encoding = "2.0" rustfix = "0.5.0" same-file = "1" semver = { version = "0.10", features = ["serde"] } -serde = { version = "1.0.82", features = ["derive"] } +serde = { version = "1.0.123", features = ["derive"] } serde_ignored = "0.1.0" serde_json = { version = "1.0.30", features = ["raw_value"] } shell-escape = "0.1.4" diff --git a/src/cargo/util/toml/mod.rs b/src/cargo/util/toml/mod.rs index 7f7aadb4c..b0bf31736 100644 --- a/src/cargo/util/toml/mod.rs +++ b/src/cargo/util/toml/mod.rs @@ -419,53 +419,13 @@ impl ser::Serialize for TomlOptLevel { } } -#[derive(Clone, Debug, Serialize, Eq, PartialEq)] -#[serde(untagged)] +#[derive(Clone, Debug, Deserialize, Serialize, Eq, PartialEq)] +#[serde(untagged, expecting = "expected a boolean or an integer")] pub enum U32OrBool { U32(u32), Bool(bool), } -impl<'de> de::Deserialize<'de> for U32OrBool { - fn deserialize(deserializer: D) -> Result - where - D: de::Deserializer<'de>, - { - struct Visitor; - - impl<'de> de::Visitor<'de> for Visitor { - type Value = U32OrBool; - - fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { - formatter.write_str("a boolean or an integer") - } - - fn visit_bool(self, b: bool) -> Result - where - E: de::Error, - { - Ok(U32OrBool::Bool(b)) - } - - fn visit_i64(self, u: i64) -> Result - where - E: de::Error, - { - Ok(U32OrBool::U32(u as u32)) - } - - fn visit_u64(self, u: u64) -> Result - where - E: de::Error, - { - Ok(U32OrBool::U32(u as u32)) - } - } - - deserializer.deserialize_any(Visitor) - } -} - #[derive(Deserialize, Serialize, Clone, Debug, Default, Eq, PartialEq)] #[serde(default, rename_all = "kebab-case")] pub struct TomlProfile { @@ -770,46 +730,13 @@ impl<'de> de::Deserialize<'de> for StringOrVec { } } -#[derive(Clone, Debug, Serialize, Eq, PartialEq)] -#[serde(untagged)] +#[derive(Clone, Debug, Deserialize, Serialize, Eq, PartialEq)] +#[serde(untagged, expecting = "expected a boolean or a string")] pub enum StringOrBool { String(String), Bool(bool), } -impl<'de> de::Deserialize<'de> for StringOrBool { - fn deserialize(deserializer: D) -> Result - where - D: de::Deserializer<'de>, - { - struct Visitor; - - impl<'de> de::Visitor<'de> for Visitor { - type Value = StringOrBool; - - fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { - formatter.write_str("a boolean or a string") - } - - fn visit_bool(self, b: bool) -> Result - where - E: de::Error, - { - Ok(StringOrBool::Bool(b)) - } - - fn visit_str(self, s: &str) -> Result - where - E: de::Error, - { - Ok(StringOrBool::String(s.to_string())) - } - } - - deserializer.deserialize_any(Visitor) - } -} - #[derive(PartialEq, Clone, Debug, Serialize)] #[serde(untagged)] pub enum VecStringOrBool { diff --git a/tests/testsuite/bad_config.rs b/tests/testsuite/bad_config.rs index e7a6b01c0..2b598485a 100644 --- a/tests/testsuite/bad_config.rs +++ b/tests/testsuite/bad_config.rs @@ -1309,7 +1309,7 @@ fn bad_debuginfo() { error: failed to parse manifest at `[..]` Caused by: - invalid type: string \"a\", expected a boolean or an integer for [..] + expected a boolean or an integer for [..] ", ) .run(); @@ -1338,7 +1338,7 @@ fn bad_opt_level() { error: failed to parse manifest at `[..]` Caused by: - invalid type: integer `3`, expected a boolean or a string for key [..] + expected a boolean or a string for key [..] ", ) .run();