serde_redis/
lib.rs

1// `encode` and `decode` are used instead of `ser` and `de` to avoid confusion with the serder
2// Serializer and Deserializer traits which occupy a similar namespace.
3mod cow_iter;
4pub mod decode;
5pub mod encode;
6mod into_cow;
7
8pub use crate::decode::Deserializer;
9pub use crate::encode::Serializer;
10pub use crate::into_cow::IntoCow;
11
12/// Use serde Deserialize to build `T` from a `redis::Value`
13pub fn from_redis_value<'a, 'de, T, RV>(rv: RV) -> decode::Result<T>
14where
15    T: serde::de::Deserialize<'de>,
16    RV: IntoCow<'a>,
17{
18    let value = rv.into_cow();
19    serde::de::Deserialize::deserialize(Deserializer::new(value))
20}
21
22pub trait RedisDeserialize<'de, T>
23where
24    T: serde::de::Deserialize<'de>,
25{
26    fn deserialize(&'de self) -> decode::Result<T>;
27}
28
29impl<'de, T> RedisDeserialize<'de, T> for redis::Value
30where
31    T: serde::de::Deserialize<'de>,
32{
33    fn deserialize(&'de self) -> decode::Result<T> {
34        serde::de::Deserialize::deserialize(Deserializer::new(self))
35    }
36}
37
38#[cfg(test)]
39mod tests {
40    use super::*;
41    use redis::Value;
42
43    #[test]
44    fn chain_deserialize_works() {
45        let v = Value::Bulk(vec![Value::Int(5), Value::Data(b"hello".to_vec())]);
46
47        let actual: (u8, String) = v.deserialize().unwrap();
48        let expected = (5, "hello".into());
49
50        assert_eq!(expected, actual);
51    }
52
53    #[test]
54    fn from_redis_value_works_with_owned() {
55        let v = Value::Bulk(vec![Value::Int(5), Value::Data(b"hello".to_vec())]);
56
57        let actual: (u8, String) = from_redis_value(v).unwrap();
58        let expected = (5, "hello".into());
59
60        assert_eq!(expected, actual);
61    }
62
63    #[test]
64    fn from_redis_value_works_with_borrow() {
65        let v = Value::Bulk(vec![Value::Int(5), Value::Data(b"hello".to_vec())]);
66
67        let actual: (u8, String) = from_redis_value(&v).unwrap();
68        let expected = (5, "hello".into());
69
70        assert_eq!(expected, actual);
71    }
72}