use super::common::{
BackoffStrategy, ClientIdentity, NodeAddress, ProtocolVersion, PubSubSubscriptions, ReadFrom,
ServerCredentials, TlsConfig, credentials_from_info, duration_as_millis_u32,
from_redis_protocol, impl_common_config_builders, split_connection_addr,
};
use glide_core::client::ConnectionRequest;
use std::time::Duration;
#[derive(Debug, Clone)]
pub struct GlideClientConfiguration {
pub addresses: Vec<NodeAddress>,
pub tls: TlsConfig,
pub credentials: Option<ServerCredentials>,
pub read_from: ReadFrom,
pub request_timeout: Option<Duration>,
pub connection_timeout: Option<Duration>,
pub reconnect_strategy: Option<BackoffStrategy>,
pub database_id: i64,
pub client_name: Option<String>,
pub protocol: ProtocolVersion,
pub inflight_requests_limit: Option<u32>,
pub lazy_connect: bool,
pub pubsub_subscriptions: Option<PubSubSubscriptions>,
pub force_pubsub_channel: bool,
pub root_certs: Vec<Vec<u8>>,
pub client_identity: Option<ClientIdentity>,
}
impl_common_config_builders!(GlideClientConfiguration);
impl GlideClientConfiguration {
pub fn new(addresses: Vec<NodeAddress>) -> Self {
GlideClientConfiguration {
addresses,
tls: TlsConfig::NoTls,
credentials: None,
read_from: ReadFrom::Primary,
request_timeout: None,
connection_timeout: None,
reconnect_strategy: None,
database_id: 0,
client_name: None,
protocol: ProtocolVersion::default(),
inflight_requests_limit: None,
lazy_connect: false,
pubsub_subscriptions: None,
force_pubsub_channel: false,
root_certs: Vec::new(),
client_identity: None,
}
}
pub fn from_url(url: &str) -> crate::error::Result<Self> {
Self::from_connection_info(url)
}
pub fn from_connection_info<T: redis::IntoConnectionInfo>(
info: T,
) -> crate::error::Result<Self> {
let info = info
.into_connection_info()
.map_err(|e| crate::error::GlideError::Configuration(e.to_string()))?;
let (address, tls) = split_connection_addr(info.addr)?;
let mut cfg = Self::new(vec![address]).tls(tls);
cfg.database_id = info.redis.db;
cfg.protocol = from_redis_protocol(info.redis.protocol);
cfg.client_name = info.redis.client_name;
cfg.credentials = credentials_from_info(info.redis.username, info.redis.password);
Ok(cfg)
}
pub fn database_id(mut self, db: i64) -> Self {
self.database_id = db;
self
}
pub(crate) fn to_request(&self) -> ConnectionRequest {
let mut req = self.common_request();
req.cluster_mode_enabled = false;
req.database_id = self.database_id;
req
}
}