zero4rs 2.0.0

zero4rs is a powerful, pragmatic, and extremely fast web framework for Rust
Documentation
use redis::AsyncCommands;

#[derive(Clone)]
pub struct ReidsClientCluster {
    pub client: redis::cluster::ClusterClient,
}

impl ReidsClientCluster {
    pub async fn get_connection(&self) -> Result<impl redis::aio::ConnectionLike, anyhow::Error> {
        Ok(self.client.get_async_connection().await?)
    }

    pub async fn ttl(&self, key: &str) -> Result<i32, anyhow::Error> {
        Ok(self.get_connection().await?.ttl(key).await?)
    }

    pub async fn exists(&self, key: &str) -> Result<bool, anyhow::Error> {
        Ok(self.get_connection().await?.exists(key).await?)
    }

    pub async fn set<T>(&self, key: &str, value: &T) -> Result<(), anyhow::Error>
    where
        T: serde::Serialize,
    {
        let serialized_data = serde_json::to_string(value)?;

        self.get_connection()
            .await?
            .set(key, serialized_data)
            .await?;

        Ok(())
    }

    pub async fn set_ex<T>(&self, key: &str, value: &T, seconds: u64) -> Result<(), anyhow::Error>
    where
        T: serde::Serialize,
    {
        let serialized_data = serde_json::to_string(value)?;

        self.get_connection()
            .await?
            .set_ex(key, serialized_data, seconds)
            .await?;

        Ok(())
    }

    pub async fn get<T>(&self, key: &str) -> Result<Option<T>, anyhow::Error>
    where
        T: serde::de::DeserializeOwned,
    {
        let mut conn = self.get_connection().await?;

        if !conn.exists(key).await? {
            return Ok(None);
        }

        let json_str: String = match conn.get(key).await {
            Ok(v) => v,
            Err(e) => {
                return Err(e.into());
            }
        };

        let return_value = serde_json::from_str(&json_str)?;

        Ok(Some(return_value))
    }
}