simple_redis_wrapper/client/
common.rs1#![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}