use crate::{
clients::{RedisClient, RedisPool},
error::{RedisError, RedisErrorKind},
prelude::ReconnectPolicy,
types::{ConnectionConfig, PerformanceConfig, RedisConfig, ServerConfig},
};
#[cfg(not(feature = "glommio"))]
use crate::clients::ExclusivePool;
#[cfg(feature = "subscriber-client")]
use crate::clients::SubscriberClient;
#[cfg(feature = "sentinel-client")]
use crate::{clients::SentinelClient, types::SentinelConfig};
#[derive(Clone, Debug)]
pub struct Builder {
config: Option<RedisConfig>,
performance: PerformanceConfig,
connection: ConnectionConfig,
policy: Option<ReconnectPolicy>,
#[cfg(feature = "sentinel-client")]
sentinel: Option<SentinelConfig>,
}
impl Default for Builder {
fn default() -> Self {
Builder {
config: None,
performance: PerformanceConfig::default(),
connection: ConnectionConfig::default(),
policy: None,
#[cfg(feature = "sentinel-client")]
sentinel: None,
}
}
}
impl Builder {
pub fn default_centralized() -> Self {
Builder {
config: Some(RedisConfig {
server: ServerConfig::default_centralized(),
..Default::default()
}),
..Default::default()
}
}
pub fn default_clustered() -> Self {
Builder {
config: Some(RedisConfig {
server: ServerConfig::default_clustered(),
..Default::default()
}),
..Default::default()
}
}
pub fn from_config(config: RedisConfig) -> Self {
Builder {
config: Some(config),
..Default::default()
}
}
pub fn get_config(&self) -> Option<&RedisConfig> {
self.config.as_ref()
}
pub fn get_policy(&self) -> Option<&ReconnectPolicy> {
self.policy.as_ref()
}
pub fn get_performance_config(&self) -> &PerformanceConfig {
&self.performance
}
pub fn get_connection_config(&self) -> &ConnectionConfig {
&self.connection
}
#[cfg(feature = "sentinel-client")]
#[cfg_attr(docsrs, doc(cfg(feature = "sentinel-client")))]
pub fn get_sentinel_config(&self) -> Option<&RedisConfig> {
self.config.as_ref()
}
pub fn set_config(&mut self, config: RedisConfig) -> &mut Self {
self.config = Some(config);
self
}
pub fn set_policy(&mut self, policy: ReconnectPolicy) -> &mut Self {
self.policy = Some(policy);
self
}
pub fn set_performance_config(&mut self, config: PerformanceConfig) -> &mut Self {
self.performance = config;
self
}
pub fn set_connection_config(&mut self, config: ConnectionConfig) -> &mut Self {
self.connection = config;
self
}
#[cfg(feature = "sentinel-client")]
#[cfg_attr(docsrs, doc(cfg(feature = "sentinel-client")))]
pub fn set_sentinel_config(&mut self, config: SentinelConfig) -> &mut Self {
self.sentinel = Some(config);
self
}
pub fn with_config<F>(&mut self, func: F) -> &mut Self
where
F: FnOnce(&mut RedisConfig),
{
if let Some(config) = self.config.as_mut() {
func(config);
} else {
let mut config = RedisConfig::default();
func(&mut config);
self.config = Some(config);
}
self
}
pub fn with_performance_config<F>(&mut self, func: F) -> &mut Self
where
F: FnOnce(&mut PerformanceConfig),
{
func(&mut self.performance);
self
}
pub fn with_connection_config<F>(&mut self, func: F) -> &mut Self
where
F: FnOnce(&mut ConnectionConfig),
{
func(&mut self.connection);
self
}
#[cfg(feature = "sentinel-client")]
#[cfg_attr(docsrs, doc(cfg(feature = "sentinel-client")))]
pub fn with_sentinel_config<F>(&mut self, func: F) -> &mut Self
where
F: FnOnce(&mut SentinelConfig),
{
if let Some(config) = self.sentinel.as_mut() {
func(config);
} else {
let mut config = SentinelConfig::default();
func(&mut config);
self.sentinel = Some(config);
}
self
}
pub fn build(&self) -> Result<RedisClient, RedisError> {
if let Some(config) = self.config.as_ref() {
Ok(RedisClient::new(
config.clone(),
Some(self.performance.clone()),
Some(self.connection.clone()),
self.policy.clone(),
))
} else {
Err(RedisError::new(RedisErrorKind::Config, "Missing client configuration."))
}
}
pub fn build_pool(&self, size: usize) -> Result<RedisPool, RedisError> {
if let Some(config) = self.config.as_ref() {
RedisPool::new(
config.clone(),
Some(self.performance.clone()),
Some(self.connection.clone()),
self.policy.clone(),
size,
)
} else {
Err(RedisError::new(RedisErrorKind::Config, "Missing client configuration."))
}
}
#[cfg(not(feature = "glommio"))]
pub fn build_exclusive_pool(&self, size: usize) -> Result<ExclusivePool, RedisError> {
if let Some(config) = self.config.as_ref() {
ExclusivePool::new(
config.clone(),
Some(self.performance.clone()),
Some(self.connection.clone()),
self.policy.clone(),
size,
)
} else {
Err(RedisError::new(RedisErrorKind::Config, "Missing client configuration."))
}
}
#[cfg(feature = "subscriber-client")]
#[cfg_attr(docsrs, doc(cfg(feature = "subscriber-client")))]
pub fn build_subscriber_client(&self) -> Result<SubscriberClient, RedisError> {
if let Some(config) = self.config.as_ref() {
Ok(SubscriberClient::new(
config.clone(),
Some(self.performance.clone()),
Some(self.connection.clone()),
self.policy.clone(),
))
} else {
Err(RedisError::new(RedisErrorKind::Config, "Missing client configuration."))
}
}
#[cfg(feature = "sentinel-client")]
#[cfg_attr(docsrs, doc(cfg(feature = "sentinel-client")))]
pub fn build_sentinel_client(&self) -> Result<SentinelClient, RedisError> {
if let Some(config) = self.sentinel.as_ref() {
Ok(SentinelClient::new(
config.clone(),
Some(self.performance.clone()),
Some(self.connection.clone()),
self.policy.clone(),
))
} else {
Err(RedisError::new(
RedisErrorKind::Config,
"Missing sentinel client configuration.",
))
}
}
}