use crate::{
clients::{Client, Pool},
error::{Error, ErrorKind},
prelude::ReconnectPolicy,
types::config::{Config, ConnectionConfig, PerformanceConfig, ServerConfig},
};
#[cfg(not(feature = "glommio"))]
use crate::clients::ExclusivePool;
#[cfg(feature = "subscriber-client")]
use crate::clients::SubscriberClient;
#[cfg(feature = "dynamic-pool")]
use crate::{clients::DynamicPool, types::config::DynamicPoolConfig};
#[cfg(feature = "sentinel-client")]
use crate::{clients::SentinelClient, types::config::SentinelConfig};
#[derive(Clone, Debug)]
pub struct Builder {
config: Option<Config>,
performance: PerformanceConfig,
connection: ConnectionConfig,
policy: Option<ReconnectPolicy>,
#[cfg(feature = "sentinel-client")]
sentinel: Option<SentinelConfig>,
#[cfg(feature = "dynamic-pool")]
pool_config: Option<DynamicPoolConfig>,
}
impl Default for Builder {
fn default() -> Self {
Builder {
config: None,
performance: PerformanceConfig::default(),
connection: ConnectionConfig::default(),
policy: None,
#[cfg(feature = "sentinel-client")]
sentinel: None,
#[cfg(feature = "dynamic-pool")]
pool_config: None,
}
}
}
impl Builder {
pub fn default_centralized() -> Self {
Builder {
config: Some(Config {
server: ServerConfig::default_centralized(),
..Default::default()
}),
..Default::default()
}
}
pub fn default_clustered() -> Self {
Builder {
config: Some(Config {
server: ServerConfig::default_clustered(),
..Default::default()
}),
..Default::default()
}
}
pub fn from_config(config: Config) -> Self {
Builder {
config: Some(config),
..Default::default()
}
}
pub fn get_config(&self) -> Option<&Config> {
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<&Config> {
self.config.as_ref()
}
#[cfg(feature = "dynamic-pool")]
#[cfg_attr(docsrs, doc(cfg(feature = "dynamic-pool")))]
pub fn get_pool_config(&self) -> Option<&DynamicPoolConfig> {
self.pool_config.as_ref()
}
pub fn set_config(&mut self, config: Config) -> &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
}
#[cfg(feature = "dynamic-pool")]
#[cfg_attr(docsrs, doc(cfg(feature = "dynamic-pool")))]
pub fn set_pool_config(&mut self, config: DynamicPoolConfig) -> &mut Self {
self.pool_config = Some(config);
self
}
pub fn with_config<F>(&mut self, func: F) -> &mut Self
where
F: FnOnce(&mut Config),
{
if let Some(config) = self.config.as_mut() {
func(config);
} else {
let mut config = Config::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
}
#[cfg(feature = "dynamic-pool")]
#[cfg_attr(docsrs, doc(cfg(feature = "dynamic-pool")))]
pub fn with_pool_config<F>(&mut self, func: F) -> &mut Self
where
F: FnOnce(&mut DynamicPoolConfig),
{
if let Some(config) = self.pool_config.as_mut() {
func(config);
} else {
let mut config = DynamicPoolConfig::default();
func(&mut config);
self.pool_config = Some(config);
}
self
}
pub fn build(&self) -> Result<Client, Error> {
if let Some(config) = self.config.as_ref() {
Ok(Client::new(
config.clone(),
Some(self.performance.clone()),
Some(self.connection.clone()),
self.policy.clone(),
))
} else {
Err(Error::new(ErrorKind::Config, "Missing client configuration."))
}
}
pub fn build_pool(&self, size: usize) -> Result<Pool, Error> {
if let Some(config) = self.config.as_ref() {
Pool::new(
config.clone(),
Some(self.performance.clone()),
Some(self.connection.clone()),
self.policy.clone(),
size,
)
} else {
Err(Error::new(ErrorKind::Config, "Missing client configuration."))
}
}
#[cfg(not(feature = "glommio"))]
pub fn build_exclusive_pool(&self, size: usize) -> Result<ExclusivePool, Error> {
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(Error::new(ErrorKind::Config, "Missing client configuration."))
}
}
#[cfg(feature = "dynamic-pool")]
#[cfg_attr(docsrs, doc(cfg(feature = "dynamic-pool")))]
pub fn build_dynamic_pool(&self) -> Result<DynamicPool, Error> {
let config = match self.config.as_ref() {
Some(config) => config.clone(),
None => return Err(Error::new(ErrorKind::Config, "Missing client configuration.")),
};
let pool_config = self.pool_config.as_ref().cloned().unwrap_or_default();
DynamicPool::new(
config,
Some(self.performance.clone()),
Some(self.connection.clone()),
self.policy.clone(),
pool_config,
)
}
#[cfg(feature = "subscriber-client")]
#[cfg_attr(docsrs, doc(cfg(feature = "subscriber-client")))]
pub fn build_subscriber_client(&self) -> Result<SubscriberClient, Error> {
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(Error::new(ErrorKind::Config, "Missing client configuration."))
}
}
#[cfg(feature = "sentinel-client")]
#[cfg_attr(docsrs, doc(cfg(feature = "sentinel-client")))]
pub fn build_sentinel_client(&self) -> Result<SentinelClient, Error> {
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(Error::new(ErrorKind::Config, "Missing sentinel client configuration."))
}
}
}