1use crate::config::RedisConfig;
2use crate::error::{AppError, AppResult, ErrorCode};
3
4pub type RedisConnection = ::redis::aio::ConnectionManager;
5
6pub async fn connect_redis(config: &RedisConfig) -> AppResult<Option<RedisConnection>> {
7 let Some(url) = config.url.as_deref() else {
8 return Ok(None);
9 };
10
11 let client = ::redis::Client::open(url).map_err(map_redis_error)?;
12 let connection = ::redis::aio::ConnectionManager::new(client)
13 .await
14 .map_err(map_redis_error)?;
15 Ok(Some(connection))
16}
17
18fn map_redis_error(source: ::redis::RedisError) -> AppError {
19 AppError::new(ErrorCode::ExternalDependency, "Redis connection failed")
20 .with_source(source)
21 .retryable()
22}