zero4rs 2.0.0

zero4rs is a powerful, pragmatic, and extremely fast web framework for Rust
Documentation
use std::time::Duration;

use r2d2_redis2::RedisConnectionManager;

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

use crate::core::redis::ReidsClient;
use crate::core::redis::ReidsClientCluster;
use crate::core::redis::ReidsClientSentinel;
use crate::core::redis::ReidsClientStandalone;

use r2d2_redis_cluster2::RedisClusterConnectionManager;

pub fn create_pool(settings: &crate::core::redis::RedisSettings) -> Result<ReidsClient, Errors> {
    if settings.connect_mode.clone().unwrap() == *"standalone" {
        return Ok(ReidsClient {
            standalone_pool: Some(create_pool_with_standalone(settings).unwrap()),
            cluster_pool: None,
            sentinel_pool: None,
        });
    }

    if settings.connect_mode.clone().unwrap() == *"cluster" {
        return Ok(ReidsClient {
            standalone_pool: None,
            cluster_pool: Some(create_pool_with_cluster(settings).unwrap()),
            sentinel_pool: None,
        });
    }

    // if settings.connect_mode.clone().unwrap() == "sentinel".to_string() {
    //     return Ok(ReidsClient {
    //         standalone_pool: None,
    //         cluster_pool: None,
    //         sentinel_pool: Some(create_pool_with_sentinel(settings).unwrap()),
    //     });
    // }

    Err(Errors::GenericError("Not support redis mode".to_string()))
}

fn create_pool_with_standalone(
    settings: &crate::core::redis::RedisSettings,
) -> Result<ReidsClientStandalone, Errors> {
    let connection_string = settings.connection_string();

    let manager = RedisConnectionManager::new(connection_string.clone())
        .map_err(|e| Errors::GenericError(e.to_string()))?;

    let pool = r2d2::Pool::builder()
        .max_size(settings.max_pool_size.unwrap())
        .connection_timeout(Duration::from_secs(
            settings.connection_timeout_secs.unwrap().into(),
        ))
        .build(manager)
        .map_err(|e| Errors::GenericError(e.to_string()));

    match pool {
        Ok(p) => {
            log::info!(
                "RedisClient-Standalone: connection_string={}",
                connection_string
            );
            Ok(ReidsClientStandalone { pool: p })
        }
        Err(e) => {
            log::error!(
                "RedisClient-Standalone: connection_string={}, error={:?}",
                connection_string,
                e
            );
            Err(e)
        }
    }
}

// https://crates.io/crates/r2d2_redis_cluster
fn create_pool_with_cluster(
    settings: &crate::core::redis::RedisSettings,
) -> Result<ReidsClientCluster, Errors> {
    let redis_uri = vec![
        "redis://127.0.0.1:6379",
        "redis://127.0.0.1:6378",
        "redis://127.0.0.1:6377",
    ];

    let manager = RedisClusterConnectionManager::new(redis_uri.clone()).unwrap();

    let pool = r2d2_redis_cluster2::r2d2::Pool::builder()
        .max_size(settings.max_pool_size.unwrap())
        .connection_timeout(Duration::from_secs(
            settings.connection_timeout_secs.unwrap().into(),
        ))
        .build(manager)
        .map_err(|e| Errors::GenericError(e.to_string()));

    match pool {
        Ok(p) => {
            log::info!("RedisClient-Cluster: connection_string={:?}", redis_uri);
            Ok(ReidsClientCluster { pool: p })
        }
        Err(e) => {
            log::error!(
                "RedisClient-Cluster: connection_string={:?}, error={:?}",
                redis_uri,
                e
            );
            Err(e)
        }
    }
}

// https://docs.rs/redis/latest/redis/sentinel/index.html
fn _create_pool_with_sentinel(
    settings: &crate::core::redis::RedisSettings,
) -> Result<ReidsClientSentinel, Errors> {
    let redis_uri = vec![
        "redis://127.0.0.1:6379",
        "redis://127.0.0.1:6378",
        "redis://127.0.0.1:6377",
    ];

    let manager = RedisClusterConnectionManager::new(redis_uri.clone()).unwrap();

    let pool = r2d2_redis_cluster2::r2d2::Pool::builder()
        .max_size(settings.max_pool_size.unwrap())
        .connection_timeout(Duration::from_secs(
            settings.connection_timeout_secs.unwrap().into(),
        ))
        .build(manager)
        .map_err(|e| Errors::GenericError(e.to_string()));

    match pool {
        Ok(p) => {
            log::info!("RedisClient-Sentinel: connection_string={:?}", redis_uri);
            Ok(ReidsClientSentinel { pool: p })
        }
        Err(e) => {
            log::error!(
                "RedisClient-Sentinel: connection_string={:?}, error={:?}",
                redis_uri,
                e
            );
            Err(e)
        }
    }
}