zero4rs 2.0.0

zero4rs is a powerful, pragmatic, and extremely fast web framework for Rust
Documentation
use r2d2_redis2::r2d2::PooledConnection;
use r2d2_redis2::redis::Commands;
use r2d2_redis2::{r2d2, RedisConnectionManager};

use crate::core::errors::Errors;

pub type AltR2D2PoolStandalone = r2d2::Pool<RedisConnectionManager>;
type AltR2D2PooledCon = PooledConnection<RedisConnectionManager>;

#[derive(Clone)]
pub struct ReidsClientStandalone {
    pub pool: AltR2D2PoolStandalone,
}

impl ReidsClientStandalone {
    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::SerdeError(e, None));
            }
        };

        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,
    {
        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)
    }
}