From 4e002ece07627dcedb148a54394836a2b4de7ab5 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sat, 23 Jan 2021 14:36:52 -0800 Subject: [PATCH 1/2] Provide list of recognized rename rules on parse error --- serde_derive/src/internals/case.rs | 17 ++++++++++++----- .../rename/container_unknown_rename_rule.stderr | 2 +- .../rename/variant_unknown_rename_rule.stderr | 2 +- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/serde_derive/src/internals/case.rs b/serde_derive/src/internals/case.rs index 199fd4bcb..a06ae5861 100644 --- a/serde_derive/src/internals/case.rs +++ b/serde_derive/src/internals/case.rs @@ -120,11 +120,18 @@ pub struct ParseError<'a> { impl<'a> Display for ParseError<'a> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!( - f, - "unknown rename rule for #[serde(rename_all = {:?})]", - self.unknown, - ) + f.write_str("unknown rename rule `rename_all = \"")?; + self.unknown.escape_debug().fmt(f)?; + f.write_str("\"`, expected one of ")?; + for (i, (name, _rule)) in RENAME_RULES.iter().enumerate() { + if i > 0 { + f.write_str(", ")?; + } + f.write_str("\"")?; + name.escape_debug().fmt(f)?; + f.write_str("\"")?; + } + Ok(()) } } diff --git a/test_suite/tests/ui/rename/container_unknown_rename_rule.stderr b/test_suite/tests/ui/rename/container_unknown_rename_rule.stderr index 728d71ca2..3fd68f3f3 100644 --- a/test_suite/tests/ui/rename/container_unknown_rename_rule.stderr +++ b/test_suite/tests/ui/rename/container_unknown_rename_rule.stderr @@ -1,4 +1,4 @@ -error: unknown rename rule for #[serde(rename_all = "abc")] +error: unknown rename rule `rename_all = "abc"`, expected one of "lowercase", "UPPERCASE", "PascalCase", "camelCase", "snake_case", "SCREAMING_SNAKE_CASE", "kebab-case", "SCREAMING-KEBAB-CASE" --> $DIR/container_unknown_rename_rule.rs:4:22 | 4 | #[serde(rename_all = "abc")] diff --git a/test_suite/tests/ui/rename/variant_unknown_rename_rule.stderr b/test_suite/tests/ui/rename/variant_unknown_rename_rule.stderr index 7a52f37a8..48f53f893 100644 --- a/test_suite/tests/ui/rename/variant_unknown_rename_rule.stderr +++ b/test_suite/tests/ui/rename/variant_unknown_rename_rule.stderr @@ -1,4 +1,4 @@ -error: unknown rename rule for #[serde(rename_all = "abc")] +error: unknown rename rule `rename_all = "abc"`, expected one of "lowercase", "UPPERCASE", "PascalCase", "camelCase", "snake_case", "SCREAMING_SNAKE_CASE", "kebab-case", "SCREAMING-KEBAB-CASE" --> $DIR/variant_unknown_rename_rule.rs:5:26 | 5 | #[serde(rename_all = "abc")] From b7bad3a1650c7232d559a9ba1efa0ff504989f57 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sat, 23 Jan 2021 14:40:43 -0800 Subject: [PATCH 2/2] Restore compatibility with rustc 1.31 in RenameRule error str::escape_debug wasn't stabilized until 1.34, whereas serde_derive currently supports an oldest version of 1.31. --- serde_derive/src/internals/case.rs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/serde_derive/src/internals/case.rs b/serde_derive/src/internals/case.rs index a06ae5861..554505160 100644 --- a/serde_derive/src/internals/case.rs +++ b/serde_derive/src/internals/case.rs @@ -5,7 +5,7 @@ #[allow(deprecated, unused_imports)] use std::ascii::AsciiExt; -use std::fmt::{self, Display}; +use std::fmt::{self, Debug, Display}; use self::RenameRule::*; @@ -120,16 +120,14 @@ pub struct ParseError<'a> { impl<'a> Display for ParseError<'a> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.write_str("unknown rename rule `rename_all = \"")?; - self.unknown.escape_debug().fmt(f)?; - f.write_str("\"`, expected one of ")?; + f.write_str("unknown rename rule `rename_all = ")?; + Debug::fmt(self.unknown, f)?; + f.write_str("`, expected one of ")?; for (i, (name, _rule)) in RENAME_RULES.iter().enumerate() { if i > 0 { f.write_str(", ")?; } - f.write_str("\"")?; - name.escape_debug().fmt(f)?; - f.write_str("\"")?; + Debug::fmt(name, f)?; } Ok(()) }