spring_redis/
lib.rs

1//! [![spring-rs](https://img.shields.io/github/stars/spring-rs/spring-rs)](https://spring-rs.github.io/docs/plugins/spring-redis)
2#![doc(html_favicon_url = "https://spring-rs.github.io/favicon.ico")]
3#![doc(html_logo_url = "https://spring-rs.github.io/logo.svg")]
4
5pub mod config;
6
7pub use redis;
8
9use anyhow::Context;
10use config::RedisConfig;
11use redis::{aio::ConnectionManagerConfig, Client};
12use spring::async_trait;
13use spring::config::ConfigRegistry;
14use spring::plugin::MutableComponentRegistry;
15use spring::{app::AppBuilder, error::Result, plugin::Plugin};
16use std::time::Duration;
17
18pub type Redis = redis::aio::ConnectionManager;
19
20pub struct RedisPlugin;
21
22#[async_trait]
23impl Plugin for RedisPlugin {
24    async fn build(&self, app: &mut AppBuilder) {
25        let config = app
26            .get_config::<RedisConfig>()
27            .expect("redis plugin config load failed");
28
29        let connect: Redis = Self::connect(config).await.expect("redis connect failed");
30        app.add_component(connect);
31    }
32}
33
34impl RedisPlugin {
35    async fn connect(config: RedisConfig) -> Result<Redis> {
36        let url = config.uri;
37        let client = Client::open(url.clone())
38            .with_context(|| format!("redis connect failed:{}", url.clone()))?;
39
40        let mut conn_config = ConnectionManagerConfig::new();
41
42        if let Some(exponent_base) = config.exponent_base {
43            conn_config = conn_config.set_exponent_base(exponent_base);
44        }
45        if let Some(factor) = config.factor {
46            conn_config = conn_config.set_factor(factor);
47        }
48        if let Some(number_of_retries) = config.number_of_retries {
49            conn_config = conn_config.set_number_of_retries(number_of_retries);
50        }
51        if let Some(max_delay) = config.max_delay {
52            conn_config = conn_config.set_max_delay(max_delay);
53        }
54        if let Some(response_timeout) = config.response_timeout {
55            conn_config = conn_config.set_response_timeout(Duration::from_millis(response_timeout));
56        }
57        if let Some(connection_timeout) = config.connection_timeout {
58            conn_config =
59                conn_config.set_connection_timeout(Duration::from_millis(connection_timeout));
60        }
61
62        Ok(client
63            .get_connection_manager_with_config(conn_config)
64            .await
65            .with_context(|| format!("redis connect failed:{}", url.clone()))?)
66    }
67}