get redis client from url

This commit is contained in:
Aravinth Manivannan 2021-06-08 21:22:12 +05:30
parent a50a21d33b
commit 05dd9bbbb6
Signed by: realaravinth
GPG Key ID: AD9F0F08E855ED88
2 changed files with 40 additions and 14 deletions

View File

@ -136,15 +136,16 @@ pub mod tests {
use super::*;
use crate::defense::{Level, LevelBuilder};
use crate::master::embedded::counter::tests::get_mcaptcha;
use crate::master::redis::master::{Master, Redis};
use crate::master::redis::master::{Master, Redis, RedisClient};
pub async fn connect(redis: &Redis) -> RedisConnection {
let redis = redis.connect();
match &redis {
Redis::Single(c) => {
RedisClient::Single(c) => {
let con = c.get_async_connection().await.unwrap();
RedisConnection::Single(Rc::new(RefCell::new(con)))
}
Redis::Cluster(c) => {
RedisClient::Cluster(c) => {
let con = c.get_connection().unwrap();
RedisConnection::Cluster(Rc::new(RefCell::new(con)))
}
@ -153,11 +154,12 @@ pub mod tests {
const CAPTCHA_NAME: &str = "REDIS_CAPTCHA_TEST";
const DURATION: usize = 10;
const REDIS_URL: &str = "redis://127.0.1.1/";
#[actix_rt::test]
async fn redis_master_works() {
let client = redis::Client::open("redis://127.0.0.1/").unwrap();
let r = connect(&Redis::Single(client)).await;
let r = connect(&Redis::Single(REDIS_URL.into())).await;
{
let _ = r.delete_captcha(CAPTCHA_NAME).await;
}

View File

@ -40,35 +40,58 @@ use super::connection::RedisConnection;
#[derive(Clone)]
pub enum Redis {
Single(String),
Cluster(Vec<String>),
}
impl Redis {
pub fn connect(&self) -> RedisClient {
match self {
Self::Single(url) => {
let client = Client::open("redis://127.0.0.1/").unwrap();
RedisClient::Single(client)
}
Self::Cluster(nodes) => {
let cluster_client = ClusterClient::open(nodes.to_owned()).unwrap();
RedisClient::Cluster(cluster_client)
}
}
}
}
#[derive(Clone)]
pub enum RedisClient {
Single(Client),
Cluster(ClusterClient),
}
pub struct Master {
pub redis: Redis,
pub redis: RedisClient,
pub con: Rc<RedisConnection>,
}
impl Master {
pub async fn new(redis: Redis) -> CaptchaResult<Self> {
let con = Self::connect(&redis).await;
let (redis, con) = Self::connect(redis).await;
con.is_module_loaded().await?;
let con = Rc::new(con);
let master = Self { redis, con };
Ok(master)
}
async fn connect(redis: &Redis) -> RedisConnection {
match &redis {
Redis::Single(c) => {
async fn connect(redis: Redis) -> (RedisClient, RedisConnection) {
let redis = redis.connect();
let client = match &redis {
RedisClient::Single(c) => {
let con = c.get_async_connection().await.unwrap();
RedisConnection::Single(Rc::new(RefCell::new(con)))
}
Redis::Cluster(c) => {
RedisClient::Cluster(c) => {
let con = c.get_connection().unwrap();
RedisConnection::Cluster(Rc::new(RefCell::new(con)))
}
}
};
(redis, client)
}
}
@ -122,12 +145,13 @@ mod tests {
const CAPTCHA_NAME: &str = "REDIS_MASTER_CAPTCHA_TEST";
const DURATION: usize = 10;
const REDIS_URL: &str = "redis://127.0.1.1/";
#[actix_rt::test]
async fn redis_master_works() {
let master = Master::new(Redis::Single(REDIS_URL.into())).await;
let client = redis::Client::open("redis://127.0.0.1/").unwrap();
let master = Master::new(Redis::Single(client)).await;
let client = redis::Client::open("redis://127.0.0.1/").unwrap();
let r = connect(&Redis::Single(client)).await;
let r = connect(&Redis::Single(REDIS_URL.into())).await;
assert!(master.is_ok());
let master = master.unwrap();