simple_redis_wrapper/client/
common.rs

1#![allow(async_fn_in_trait)]
2
3use crate::types::{EvictionPolicy, Key, Namespace, Prefix};
4use anyhow::anyhow;
5use serde::Serialize;
6use serde::de::DeserializeOwned;
7
8pub trait RedisAsyncClientTrait<TSelf> {
9    async fn new(url: Option<String>, namespace: Namespace) -> anyhow::Result<TSelf>;
10    async fn set_eviction_policy(&self, eviction_policy: EvictionPolicy) -> anyhow::Result<String>;
11    async fn get_eviction_policy(&self) -> anyhow::Result<String>;
12    fn key(&self, prefix: &Prefix, key: &Key) -> String;
13    async fn get(&self, key: &str) -> anyhow::Result<Option<String>>;
14    async fn set_ex(&self, key: &str, value: &str, expiry: Option<u64>) -> anyhow::Result<()>;
15    async fn get_all(&self) -> anyhow::Result<Vec<(String, String)>>;
16    async fn remove(&self, key: Vec<String>) -> anyhow::Result<()>;
17    async fn get_entity<T>(&self, prefix: &Prefix, key: &Key) -> anyhow::Result<Option<T>>
18    where
19        T: DeserializeOwned + Serialize,
20    {
21        let redis_str: Option<String> = self.get(&self.key(prefix, key)).await?;
22        match redis_str {
23            Some(s) => Ok(Self::des_entity(&s)?),
24            None => Ok(None),
25        }
26    }
27
28    async fn save_entity<T>(
29        &self,
30        prefix: &Prefix,
31        key: &Key,
32        value: &T,
33        expiry: Option<u64>,
34    ) -> anyhow::Result<()>
35    where
36        T: DeserializeOwned + Serialize,
37    {
38        let value_str = Self::ser_entity(value)?;
39        self.set_ex(&self.key(prefix, key), &value_str, expiry)
40            .await?;
41        Ok(())
42    }
43    async fn remove_entity<T>(&self, prefix: &Prefix, key: &Key) -> anyhow::Result<()> {
44        self.remove(vec![self.key(prefix, key)]).await?;
45        Ok(())
46    }
47    async fn scan<T>(
48        &self,
49        pattern: &str,
50        chunk_size: Option<usize>,
51        limit: Option<usize>,
52    ) -> anyhow::Result<Vec<T>>
53    where
54        T: DeserializeOwned + Serialize;
55
56    fn des_entity<E>(redis_str: &str) -> anyhow::Result<E>
57    where
58        E: DeserializeOwned + Serialize,
59    {
60        let redis_entity: E = serde_json::from_str(&redis_str)
61            .map_err(|e| anyhow!("get_entity serde_json error: {}", e))?;
62        Ok(redis_entity)
63    }
64
65    fn ser_entity<E>(entity: &E) -> anyhow::Result<String>
66    where
67        E: DeserializeOwned + Serialize,
68    {
69        let value_str = serde_json::to_string(&entity)
70            .map_err(|e| anyhow!("save_entity serde_json error: {}", e))?;
71        Ok(value_str)
72    }
73}