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