From 067efb50cd476d77d48d2054be98124e64e0d5a9 Mon Sep 17 00:00:00 2001 From: Dion Dokter Date: Mon, 27 Jul 2020 09:16:45 +0200 Subject: [PATCH 1/3] Added deserialization from index. --- src/serde.rs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/serde.rs b/src/serde.rs index efc9f14..1fde882 100644 --- a/src/serde.rs +++ b/src/serde.rs @@ -60,6 +60,17 @@ impl<'de> Deserialize<'de> for Level { self.visit_str(variant) } + + fn visit_u64(self, v: u64) -> Result + where + E: Error, + { + let variant: &str = LOG_LEVEL_NAMES[1..] + .get(v as usize) + .ok_or_else(|| Error::invalid_value(Unexpected::Unsigned(v), &self))?; + + self.visit_str(variant) + } } impl<'de> DeserializeSeed<'de> for LevelIdentifier { @@ -144,6 +155,17 @@ impl<'de> Deserialize<'de> for LevelFilter { self.visit_str(variant) } + + fn visit_u64(self, v: u64) -> Result + where + E: Error, + { + let variant: &str = LOG_LEVEL_NAMES + .get(v as usize) + .ok_or_else(|| Error::invalid_value(Unexpected::Unsigned(v), &self))?; + + self.visit_str(variant) + } } impl<'de> DeserializeSeed<'de> for LevelFilterIdentifier { From 2d66fe4ce37d4d529ccb41f2bc1ff5d50dba2673 Mon Sep 17 00:00:00 2001 From: Dion Dokter Date: Mon, 27 Jul 2020 09:41:04 +0200 Subject: [PATCH 2/3] Made the variants deserialize as u32 because that's the type that is given when serializing. Added tests --- src/serde.rs | 61 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 55 insertions(+), 6 deletions(-) diff --git a/src/serde.rs b/src/serde.rs index 1fde882..3cccb27 100644 --- a/src/serde.rs +++ b/src/serde.rs @@ -61,13 +61,13 @@ impl<'de> Deserialize<'de> for Level { self.visit_str(variant) } - fn visit_u64(self, v: u64) -> Result + fn visit_u32(self, v: u32) -> Result where E: Error, { - let variant: &str = LOG_LEVEL_NAMES[1..] + let variant = LOG_LEVEL_NAMES[1..] .get(v as usize) - .ok_or_else(|| Error::invalid_value(Unexpected::Unsigned(v), &self))?; + .ok_or_else(|| Error::invalid_value(Unexpected::Unsigned(v as u64), &self))?; self.visit_str(variant) } @@ -156,13 +156,13 @@ impl<'de> Deserialize<'de> for LevelFilter { self.visit_str(variant) } - fn visit_u64(self, v: u64) -> Result + fn visit_u32(self, v: u32) -> Result where E: Error, { - let variant: &str = LOG_LEVEL_NAMES + let variant = LOG_LEVEL_NAMES .get(v as usize) - .ok_or_else(|| Error::invalid_value(Unexpected::Unsigned(v), &self))?; + .ok_or_else(|| Error::invalid_value(Unexpected::Unsigned(v as u64), &self))?; self.visit_str(variant) } @@ -225,6 +225,14 @@ mod tests { ] } + fn level_variant_tokens(variant: u32) -> [Token; 3] { + [ + Token::Enum { name: "Level" }, + Token::U32(variant), + Token::Unit, + ] + } + fn level_filter_token(variant: &'static str) -> Token { Token::UnitVariant { name: "LevelFilter", @@ -242,6 +250,16 @@ mod tests { ] } + fn level_filter_variant_tokens(variant: u32) -> [Token; 3] { + [ + Token::Enum { + name: "LevelFilter", + }, + Token::U32(variant), + Token::Unit, + ] + } + #[test] fn test_level_ser_de() { let cases = [ @@ -287,6 +305,21 @@ mod tests { } } + #[test] + fn test_level_de_variant_index() { + let cases = [ + (Level::Error, level_variant_tokens(0)), + (Level::Warn, level_variant_tokens(1)), + (Level::Info, level_variant_tokens(2)), + (Level::Debug, level_variant_tokens(3)), + (Level::Trace, level_variant_tokens(4)), + ]; + + for &(value, tokens) in &cases { + assert_de_tokens(&value, &tokens); + } + } + #[test] fn test_level_de_error() { let msg = "unknown variant `errorx`, expected one of \ @@ -342,6 +375,22 @@ mod tests { } } + #[test] + fn test_level_filter_de_variant_index() { + let cases = [ + (LevelFilter::Off, level_filter_variant_tokens(0)), + (LevelFilter::Error, level_filter_variant_tokens(1)), + (LevelFilter::Warn, level_filter_variant_tokens(2)), + (LevelFilter::Info, level_filter_variant_tokens(3)), + (LevelFilter::Debug, level_filter_variant_tokens(4)), + (LevelFilter::Trace, level_filter_variant_tokens(5)), + ]; + + for &(value, tokens) in &cases { + assert_de_tokens(&value, &tokens); + } + } + #[test] fn test_level_filter_de_error() { let msg = "unknown variant `errorx`, expected one of \ From caaa559a235ccde65ef10a0559fc85753270b188 Mon Sep 17 00:00:00 2001 From: Dion Dokter Date: Tue, 28 Jul 2020 08:17:18 +0200 Subject: [PATCH 3/3] Back to u64 --- src/serde.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/serde.rs b/src/serde.rs index 3cccb27..5012833 100644 --- a/src/serde.rs +++ b/src/serde.rs @@ -61,13 +61,13 @@ impl<'de> Deserialize<'de> for Level { self.visit_str(variant) } - fn visit_u32(self, v: u32) -> Result + fn visit_u64(self, v: u64) -> Result where E: Error, { let variant = LOG_LEVEL_NAMES[1..] .get(v as usize) - .ok_or_else(|| Error::invalid_value(Unexpected::Unsigned(v as u64), &self))?; + .ok_or_else(|| Error::invalid_value(Unexpected::Unsigned(v), &self))?; self.visit_str(variant) } @@ -156,13 +156,13 @@ impl<'de> Deserialize<'de> for LevelFilter { self.visit_str(variant) } - fn visit_u32(self, v: u32) -> Result + fn visit_u64(self, v: u64) -> Result where E: Error, { let variant = LOG_LEVEL_NAMES .get(v as usize) - .ok_or_else(|| Error::invalid_value(Unexpected::Unsigned(v as u64), &self))?; + .ok_or_else(|| Error::invalid_value(Unexpected::Unsigned(v), &self))?; self.visit_str(variant) }