use std::time::Duration;
use crate::compression::CompressionConfig;
#[cfg(feature = "iam")]
use crate::iam::ServiceType;
#[derive(Default, Clone, Debug)]
pub struct ConnectionRequest {
pub read_from: Option<ReadFrom>,
pub client_name: Option<String>,
pub lib_name: Option<String>,
pub authentication_info: Option<AuthenticationInfo>,
pub database_id: i64,
pub protocol: Option<crate::value::ProtocolVersion>,
pub tls_mode: Option<TlsMode>,
pub addresses: Vec<NodeAddress>,
pub cluster_mode_enabled: bool,
pub request_timeout: Option<u32>,
pub connection_timeout: Option<u32>,
pub connection_retry_strategy: Option<ConnectionRetryStrategy>,
pub periodic_checks: Option<PeriodicCheck>,
pub pubsub_subscriptions: Option<crate::connection::info::PubSubSubscriptionInfo>,
pub inflight_requests_limit: Option<u32>,
pub lazy_connect: bool,
pub refresh_topology_from_initial_nodes: bool,
pub root_certs: Vec<Vec<u8>>,
pub client_cert: Vec<u8>,
pub client_key: Vec<u8>,
pub compression_config: Option<CompressionConfig>,
pub tcp_nodelay: bool,
pub pubsub_reconciliation_interval_ms: Option<u32>,
pub read_only: bool,
pub blocking_cmd_timeout_extension: Option<Duration>,
}
pub const DEFAULT_CONNECTION_TIMEOUT: Duration = Duration::from_millis(2000);
impl ConnectionRequest {
pub(crate) fn get_connection_timeout(&self) -> Duration {
self.connection_timeout
.map(|val| Duration::from_millis(val as u64))
.unwrap_or(DEFAULT_CONNECTION_TIMEOUT)
}
}
#[derive(PartialEq, Eq, Clone, Default, Debug)]
pub struct AuthenticationInfo {
pub username: Option<String>,
pub password: Option<String>,
#[cfg(feature = "iam")]
pub iam_config: Option<IamAuthenticationConfig>,
}
#[cfg(feature = "iam")]
#[derive(PartialEq, Eq, Clone, Debug)]
pub struct IamAuthenticationConfig {
pub cluster_name: String,
pub region: String,
pub service_type: ServiceType,
pub refresh_interval_seconds: Option<u32>,
}
#[derive(Default, Clone, Copy, Debug)]
pub enum PeriodicCheck {
#[default]
Enabled,
Disabled,
ManualInterval(Duration),
}
#[derive(Clone, Debug)]
pub struct NodeAddress {
pub host: String,
pub port: u16,
}
impl ::std::fmt::Display for NodeAddress {
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
write!(f, "Host: `{}`, Port: {}", self.host, self.port)
}
}
#[derive(Clone, Debug)]
pub struct OTelMetadata {
pub address: NodeAddress,
pub db_namespace: String,
}
#[derive(PartialEq, Eq, Clone, Default, Debug)]
pub enum ReadFrom {
#[default]
Primary,
PreferReplica,
AZAffinity(String),
AZAffinityReplicasAndPrimary(String),
}
#[derive(PartialEq, Eq, Clone, Copy, Default, Debug)]
pub enum TlsMode {
#[default]
NoTls,
InsecureTls,
SecureTls,
}
#[derive(PartialEq, Eq, Clone, Copy, Debug, Default)]
pub struct ConnectionRetryStrategy {
pub exponent_base: u32,
pub factor: u32,
pub number_of_retries: u32,
pub jitter_percent: Option<u32>,
}