use std::{sync::Arc, time::Duration};
use derivative::Derivative;
use serde::Deserialize;
use typed_builder::TypedBuilder;
use crate::{
bson_util,
client::auth::Credential,
event::cmap::CmapEventHandler,
options::{ClientOptions, TlsOptions},
};
#[derive(Default, Deserialize, TypedBuilder, Derivative)]
#[derivative(Debug, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct ConnectionPoolOptions {
#[builder(default)]
pub app_name: Option<String>,
#[builder(default)]
#[serde(skip)]
pub connect_timeout: Option<Duration>,
#[builder(default)]
#[serde(skip)]
pub credential: Option<Credential>,
#[derivative(Debug = "ignore", PartialEq = "ignore")]
#[builder(default)]
#[serde(skip)]
pub event_handler: Option<Arc<dyn CmapEventHandler>>,
#[builder(default)]
#[serde(rename = "maxIdleTimeMS")]
#[serde(default)]
#[serde(deserialize_with = "bson_util::deserialize_duration_from_u64_millis")]
pub max_idle_time: Option<Duration>,
#[builder(default)]
pub max_pool_size: Option<u32>,
#[builder(default)]
pub min_pool_size: Option<u32>,
#[builder(default)]
#[serde(skip)]
pub tls_options: Option<TlsOptions>,
#[builder(default)]
#[serde(rename = "waitQueueTimeoutMS")]
#[serde(default)]
#[serde(deserialize_with = "bson_util::deserialize_duration_from_u64_millis")]
pub wait_queue_timeout: Option<Duration>,
}
impl ConnectionPoolOptions {
pub(crate) fn from_client_options(options: &ClientOptions) -> Self {
Self::builder()
.app_name(options.app_name.clone())
.connect_timeout(options.connect_timeout)
.credential(options.credential.clone())
.event_handler(options.cmap_event_handler.clone())
.max_idle_time(options.max_idle_time)
.max_pool_size(options.max_pool_size)
.min_pool_size(options.min_pool_size)
.tls_options(options.tls_options())
.wait_queue_timeout(options.wait_queue_timeout)
.build()
}
}