Factor out JSON-specific Display impl for serde:🇩🇪:Unexpected

This commit is contained in:
David Tolnay 2024-01-26 13:03:05 -08:00
parent e56cc696bd
commit 296fafb8f3
No known key found for this signature in database
GPG Key ID: F9BA143B95FF6D82

View File

@ -438,11 +438,11 @@ impl de::Error for Error {
#[cold] #[cold]
fn invalid_type(unexp: de::Unexpected, exp: &dyn de::Expected) -> Self { fn invalid_type(unexp: de::Unexpected, exp: &dyn de::Expected) -> Self {
if let de::Unexpected::Unit = unexp { Error::custom(format_args!(
Error::custom(format_args!("invalid type: null, expected {}", exp)) "invalid type: {}, expected {}",
} else { JsonUnexpected(unexp),
Error::custom(format_args!("invalid type: {}, expected {}", unexp, exp)) exp,
} ))
} }
} }
@ -453,6 +453,18 @@ impl ser::Error for Error {
} }
} }
struct JsonUnexpected<'a>(de::Unexpected<'a>);
impl<'a> Display for JsonUnexpected<'a> {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
if let de::Unexpected::Unit = self.0 {
formatter.write_str("null")
} else {
Display::fmt(&self.0, formatter)
}
}
}
// Parse our own error message that looks like "{} at line {} column {}" to work // Parse our own error message that looks like "{} at line {} column {}" to work
// around erased-serde round-tripping the error through de::Error::custom. // around erased-serde round-tripping the error through de::Error::custom.
fn make_error(mut msg: String) -> Error { fn make_error(mut msg: String) -> Error {