From fe89a0d1d2bb5749acc72a515db39c36d16d267d Mon Sep 17 00:00:00 2001 From: tabVersion Date: Mon, 9 Jan 2023 18:13:39 +0800 Subject: [PATCH] add feature: key to lowercase Signed-off-by: tabVersion --- Cargo.toml | 2 ++ src/value.rs | 15 ++++++++++----- src/value/owned.rs | 9 +++++++-- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 2f51f1d5..49684b08 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -57,6 +57,8 @@ value-no-dup-keys = [] # Support for 128 bit integers 128bit = ["value-trait/128bit"] +key-to-lowercase = [] + # used for enabeling known keys in favour of a slower # hasher that is not protected against hash collision # attacks diff --git a/src/value.rs b/src/value.rs index 858af11e..637af76a 100644 --- a/src/value.rs +++ b/src/value.rs @@ -83,7 +83,7 @@ pub use value_trait::*; pub fn deserialize<'de, Value, Key>(s: &'de mut [u8]) -> Result where Value: Builder<'de> + From> + From> + 'de, - Key: Hash + Eq + From<&'de str>, + Key: Hash + Eq + From<&'de str> + From, { match Deserializer::from_slice(s) { Ok(de) => Ok(ValueDeserializer::from_deserializer(de).parse()), @@ -94,7 +94,7 @@ where struct ValueDeserializer<'de, Value, Key> where Value: Builder<'de> + From> + From> + 'de, - Key: Hash + Eq + From<&'de str>, + Key: Hash + Eq + From<&'de str> + From, { de: Deserializer<'de>, _marker: PhantomData<(Value, Key)>, @@ -103,7 +103,7 @@ where impl<'de, Value, Key> ValueDeserializer<'de, Value, Key> where Value: Builder<'de> + From<&'de str> + From> + From> + 'de, - Key: Hash + Eq + From<&'de str>, + Key: Hash + Eq + From<&'de str> + From, { pub fn from_deserializer(de: Deserializer<'de>) -> Self { Self { @@ -146,10 +146,15 @@ where // element so we eat this for _ in 0..len { if let Node::String(key) = unsafe { self.de.next_() } { + #[cfg(feature = "key-to-lowercase")] + let k = Key::from(key.to_ascii_lowercase()); + #[cfg(not(feature = "key-to-lowercase"))] + let k = Key::from(key); + #[cfg(not(feature = "value-no-dup-keys"))] - res.insert_nocheck(key.into(), self.parse()); + res.insert_nocheck(k, self.parse()); #[cfg(feature = "value-no-dup-keys")] - res.insert(key.into(), self.parse()); + res.insert(k, self.parse()); } else { unreachable!(); } diff --git a/src/value/owned.rs b/src/value/owned.rs index 72523682..b5023402 100644 --- a/src/value/owned.rs +++ b/src/value/owned.rs @@ -362,10 +362,15 @@ impl<'de> OwnedDeserializer<'de> { for _ in 0..len { if let Node::String(key) = unsafe { self.de.next_() } { + #[cfg(feature = "key-to-lowercase")] + let k = key.to_ascii_lowercase(); + #[cfg(not(feature = "key-to-lowercase"))] + let k = key.to_string(); + #[cfg(not(feature = "value-no-dup-keys"))] - res.insert_nocheck(key.into(), self.parse()); + res.insert_nocheck(k, self.parse()); #[cfg(feature = "value-no-dup-keys")] - res.insert(key.into(), self.parse()); + res.insert(k, self.parse()); } else { unreachable!(); }