Skip to content

Commit 610b07f

Browse files
committed
Auto merge of #9237 - yaymukund:serde-expecting, r=ehuss
Use serde's error message option to avoid implementing `Deserialize`. This is a cleanup based on serde-rs/serde#1883, which fell out of #8664 It looks like this changes the resulting error messages. I'll leave it up to you to decide if the tradeoff makes sense here. Maybe the correct answer here is to make `serde`'s error messages include more details (e.g. `invalid type: int`).
2 parents c9ce0ec + 54742ce commit 610b07f

File tree

3 files changed

+7
-80
lines changed

3 files changed

+7
-80
lines changed

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ percent-encoding = "2.0"
5252
rustfix = "0.5.0"
5353
same-file = "1"
5454
semver = { version = "0.10", features = ["serde"] }
55-
serde = { version = "1.0.82", features = ["derive"] }
55+
serde = { version = "1.0.123", features = ["derive"] }
5656
serde_ignored = "0.1.0"
5757
serde_json = { version = "1.0.30", features = ["raw_value"] }
5858
shell-escape = "0.1.4"

src/cargo/util/toml/mod.rs

+4-77
Original file line numberDiff line numberDiff line change
@@ -419,53 +419,13 @@ impl ser::Serialize for TomlOptLevel {
419419
}
420420
}
421421

422-
#[derive(Clone, Debug, Serialize, Eq, PartialEq)]
423-
#[serde(untagged)]
422+
#[derive(Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
423+
#[serde(untagged, expecting = "expected a boolean or an integer")]
424424
pub enum U32OrBool {
425425
U32(u32),
426426
Bool(bool),
427427
}
428428

429-
impl<'de> de::Deserialize<'de> for U32OrBool {
430-
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
431-
where
432-
D: de::Deserializer<'de>,
433-
{
434-
struct Visitor;
435-
436-
impl<'de> de::Visitor<'de> for Visitor {
437-
type Value = U32OrBool;
438-
439-
fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
440-
formatter.write_str("a boolean or an integer")
441-
}
442-
443-
fn visit_bool<E>(self, b: bool) -> Result<Self::Value, E>
444-
where
445-
E: de::Error,
446-
{
447-
Ok(U32OrBool::Bool(b))
448-
}
449-
450-
fn visit_i64<E>(self, u: i64) -> Result<Self::Value, E>
451-
where
452-
E: de::Error,
453-
{
454-
Ok(U32OrBool::U32(u as u32))
455-
}
456-
457-
fn visit_u64<E>(self, u: u64) -> Result<Self::Value, E>
458-
where
459-
E: de::Error,
460-
{
461-
Ok(U32OrBool::U32(u as u32))
462-
}
463-
}
464-
465-
deserializer.deserialize_any(Visitor)
466-
}
467-
}
468-
469429
#[derive(Deserialize, Serialize, Clone, Debug, Default, Eq, PartialEq)]
470430
#[serde(default, rename_all = "kebab-case")]
471431
pub struct TomlProfile {
@@ -770,46 +730,13 @@ impl<'de> de::Deserialize<'de> for StringOrVec {
770730
}
771731
}
772732

773-
#[derive(Clone, Debug, Serialize, Eq, PartialEq)]
774-
#[serde(untagged)]
733+
#[derive(Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
734+
#[serde(untagged, expecting = "expected a boolean or a string")]
775735
pub enum StringOrBool {
776736
String(String),
777737
Bool(bool),
778738
}
779739

780-
impl<'de> de::Deserialize<'de> for StringOrBool {
781-
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
782-
where
783-
D: de::Deserializer<'de>,
784-
{
785-
struct Visitor;
786-
787-
impl<'de> de::Visitor<'de> for Visitor {
788-
type Value = StringOrBool;
789-
790-
fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
791-
formatter.write_str("a boolean or a string")
792-
}
793-
794-
fn visit_bool<E>(self, b: bool) -> Result<Self::Value, E>
795-
where
796-
E: de::Error,
797-
{
798-
Ok(StringOrBool::Bool(b))
799-
}
800-
801-
fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
802-
where
803-
E: de::Error,
804-
{
805-
Ok(StringOrBool::String(s.to_string()))
806-
}
807-
}
808-
809-
deserializer.deserialize_any(Visitor)
810-
}
811-
}
812-
813740
#[derive(PartialEq, Clone, Debug, Serialize)]
814741
#[serde(untagged)]
815742
pub enum VecStringOrBool {

tests/testsuite/bad_config.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1309,7 +1309,7 @@ fn bad_debuginfo() {
13091309
error: failed to parse manifest at `[..]`
13101310
13111311
Caused by:
1312-
invalid type: string \"a\", expected a boolean or an integer for [..]
1312+
expected a boolean or an integer for [..]
13131313
",
13141314
)
13151315
.run();
@@ -1338,7 +1338,7 @@ fn bad_opt_level() {
13381338
error: failed to parse manifest at `[..]`
13391339
13401340
Caused by:
1341-
invalid type: integer `3`, expected a boolean or a string for key [..]
1341+
expected a boolean or a string for key [..]
13421342
",
13431343
)
13441344
.run();

0 commit comments

Comments
 (0)