use core::fmt::Debug;
use r2d2_redis2::r2d2::PooledConnection;
use r2d2_redis_cluster2::{Commands, RedisClusterConnectionManager};
use crate::core::errors::Errors;
pub type AltR2D2PoolCluster = r2d2::Pool<RedisClusterConnectionManager>;
type AltR2D2PooledCon = PooledConnection<RedisClusterConnectionManager>;
#[derive(Clone)]
pub struct ReidsClientCluster {
pub pool: AltR2D2PoolCluster,
}
impl ReidsClientCluster {
fn create_connection(&self) -> Result<AltR2D2PooledCon, Errors> {
self.pool
.get()
.map_err(|e| Errors::UnexpectedError(anyhow::anyhow!(e)))
}
pub fn publish<T>(&self, topic: &str, data: &T) -> Result<(), Errors>
where
T: serde::Serialize,
{
let mut con = self.create_connection()?;
let serialized_data = match serde_json::to_string(data) {
Ok(val) => val,
Err(e) => {
return Err(Errors::UnexpectedError(anyhow::anyhow!(e)));
}
};
con.publish(topic, serialized_data)
.map_err(|e| Errors::UnexpectedError(anyhow::anyhow!(e)))
}
pub fn set<T>(&self, key: &str, value: &T, ttl_sec: usize) -> Result<(), Errors>
where
T: serde::Serialize,
{
let mut con = self.create_connection()?;
let serialized_data = match serde_json::to_string(value) {
Ok(val) => val,
Err(e) => {
return Err(Errors::UnexpectedError(anyhow::anyhow!(e)));
}
};
con.set_ex(key, serialized_data, ttl_sec)
.map_err(|e| Errors::UnexpectedError(anyhow::anyhow!(e)))
}
pub fn get_value(&self, key: &str) -> Result<String, Errors> {
let mut con = self.create_connection()?;
match con.get(key) {
Ok(val) => Ok(val),
Err(e) => Err(Errors::UnexpectedError(anyhow::anyhow!(e))),
}
}
pub fn get<T>(&self, key: &str) -> Result<T, Errors>
where
T: serde::de::DeserializeOwned + Debug,
{
let mut con = self.create_connection()?;
let json_str: String = match con.get(key) {
Ok(val) => val,
Err(e) => {
return Err(Errors::UnexpectedError(anyhow::anyhow!(e)));
}
};
let return_value = match serde_json::from_str(&json_str) {
Ok(val) => val,
Err(e) => {
return Err(Errors::UnexpectedError(anyhow::anyhow!(e)));
}
};
Ok(return_value)
}
}