From 92295679a852d77c2e39bd5f383c56c19adffb0c Mon Sep 17 00:00:00 2001 From: Prabhpreet Dua <615318+prabhpreet@users.noreply.github.com> Date: Fri, 22 Sep 2023 20:43:11 +0530 Subject: [PATCH 1/2] Support RedisDeserialize trait for HashMap --- src/lib.rs | 23 +++++++++++++++++++++++ tests/de.rs | 26 ++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 3ba8571..83ab1ef 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,6 +9,8 @@ pub use crate::decode::Deserializer; pub use crate::encode::Serializer; pub use crate::into_cow::IntoCow; +use std::collections::HashMap; + /// Use serde Deserialize to build `T` from a `redis::Value` pub fn from_redis_value<'a, 'de, T, RV>(rv: RV) -> decode::Result where @@ -35,6 +37,27 @@ where } } +impl<'de, T> RedisDeserialize<'de, T> for HashMap +where + T: serde::de::Deserialize<'de>, +{ + fn deserialize(&'de self) -> decode::Result { + use redis::Value; + + let mut values_vec = vec![]; + + for (key, value) in self.iter() { + values_vec.push(Value::Data(key.as_bytes().to_vec())); + values_vec.push(value.clone()); + } + + let value = Value::Bulk(values_vec); + + + serde::de::Deserialize::deserialize(Deserializer::new(value)) + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/tests/de.rs b/tests/de.rs index c033976..b161227 100644 --- a/tests/de.rs +++ b/tests/de.rs @@ -510,3 +510,29 @@ fn deserialize_nested_item() { let de = Deserializer::new(&value); let _hellos: Vec = Deserialize::deserialize(de).unwrap(); } + +#[test] +fn deserialize_values_wrapped_in_hashmap() { + use serde_redis::RedisDeserialize; + + let mut data = HashMap::new(); + + data.insert("a".to_string(),Value::Data(b"apple".to_vec())); + data.insert("b".to_string(),Value::Data(b"banana".to_vec())); + + #[derive(Debug, Deserialize, PartialEq)] + struct Simple { + a: String, + b: String, + } + + let actual: Simple = data.deserialize().unwrap(); + + let expected = Simple { + a: "apple".to_owned(), + b: "banana".to_owned(), + }; + + assert_eq!(expected, actual); +} + From 18f11de57c7cae9b813bf3e7395afbfcebc63e86 Mon Sep 17 00:00:00 2001 From: Prabhpreet Dua <615318+prabhpreet@users.noreply.github.com> Date: Sat, 23 Sep 2023 14:23:17 +0530 Subject: [PATCH 2/2] Update redis-rs, add from_hashmap_value fn --- Cargo.toml | 2 +- src/lib.rs | 8 ++++++++ tests/de.rs | 1 - 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 35d51a6..26b2207 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ documentation = "https://docs.rs/serde-redis" edition = "2018" [dependencies] -redis = "0.22.3" +redis= "0.23.3" serde = "1.0" [dev-dependencies] diff --git a/src/lib.rs b/src/lib.rs index 83ab1ef..f5dcec4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -21,6 +21,14 @@ where serde::de::Deserialize::deserialize(Deserializer::new(value)) } +/// Use serde Deserialize to build `T` from a `HashMap` +pub fn from_hashmap_value<'de, T>(rv: &'de HashMap) -> decode::Result +where + T: serde::de::Deserialize<'de>, +{ + RedisDeserialize::deserialize(rv) +} + pub trait RedisDeserialize<'de, T> where T: serde::de::Deserialize<'de>, diff --git a/tests/de.rs b/tests/de.rs index b161227..b387e2e 100644 --- a/tests/de.rs +++ b/tests/de.rs @@ -535,4 +535,3 @@ fn deserialize_values_wrapped_in_hashmap() { assert_eq!(expected, actual); } -