use crate::error::InitializationResult;
use crate::helpers;
use crate::Poolable;
pub use crate::activation_order::ActivationOrder;
pub use crate::backoff_strategy::BackoffStrategy;
pub use crate::error::Error;
pub use builder::Builder;
pub use config_types::*;
mod builder;
mod config_types;
#[derive(Debug, Clone)]
pub struct Config {
pub desired_pool_size: usize,
pub default_checkout_mode: DefaultPoolCheckoutMode,
pub backoff_strategy: BackoffStrategy,
pub reservation_limit: usize,
pub activation_order: ActivationOrder,
pub min_required_nodes: usize,
pub connect_to_nodes: Vec<String>,
pub pool_multiplier: u32,
pub checkout_queue_size: usize,
pub retry_on_checkout_limit: bool,
pub default_command_timeout: DefaultCommandTimeout,
}
impl Config {
pub fn desired_pool_size(mut self, v: usize) -> Self {
self.desired_pool_size = v;
self
}
pub fn default_checkout_mode<T: Into<DefaultPoolCheckoutMode>>(mut self, v: T) -> Self {
self.default_checkout_mode = v.into();
self
}
pub fn backoff_strategy(mut self, v: BackoffStrategy) -> Self {
self.backoff_strategy = v;
self
}
pub fn reservation_limit(mut self, v: usize) -> Self {
self.reservation_limit = v;
self
}
pub fn activation_order(mut self, v: ActivationOrder) -> Self {
self.activation_order = v;
self
}
pub fn min_required_nodes(mut self, v: usize) -> Self {
self.min_required_nodes = v;
self
}
pub fn connect_to_nodes(mut self, v: Vec<String>) -> Self {
self.connect_to_nodes = v;
self
}
pub fn connect_to_node<T: Into<String>>(mut self, v: T) -> Self {
self.connect_to_nodes = vec![v.into()];
self
}
pub fn checkout_queue_size(mut self, v: usize) -> Self {
self.checkout_queue_size = v;
self
}
pub fn retry_on_checkout_limit(mut self, v: bool) -> Self {
self.retry_on_checkout_limit = v;
self
}
pub fn pool_multiplier(mut self, v: u32) -> Self {
self.pool_multiplier = v;
self
}
pub fn default_command_timeout<T: Into<DefaultCommandTimeout>>(mut self, v: T) -> Self {
self.default_command_timeout = v.into();
self
}
pub fn update_from_environment(&mut self, prefix: Option<&str>) -> InitializationResult<()> {
helpers::set_desired_pool_size(prefix, |v| {
self.desired_pool_size = v;
})?;
helpers::set_default_checkout_mode(prefix, |v| {
self.default_checkout_mode = v;
})?;
helpers::set_reservation_limit(prefix, |v| {
self.reservation_limit = v;
})?;
helpers::set_activation_order(prefix, |v| {
self.activation_order = v;
})?;
helpers::set_min_required_nodes(prefix, |v| {
self.min_required_nodes = v;
})?;
if let Some(v) = helpers::get_connect_to(prefix)? {
self.connect_to_nodes = v;
};
helpers::set_pool_multiplier(prefix, |v| {
self.pool_multiplier = v;
})?;
helpers::set_checkout_queue_size(prefix, |v| {
self.checkout_queue_size = v;
})?;
helpers::set_retry_on_checkout_limit(prefix, |v| {
self.retry_on_checkout_limit = v;
})?;
helpers::set_default_command_timeout(prefix, |v| {
self.default_command_timeout = v;
})?;
Ok(())
}
pub fn builder(&self) -> Builder {
Builder::default()
.desired_pool_size(self.desired_pool_size)
.default_checkout_mode(self.default_checkout_mode)
.backoff_strategy(self.backoff_strategy)
.reservation_limit(self.reservation_limit)
.min_required_nodes(self.min_required_nodes)
.connect_to_nodes(self.connect_to_nodes.clone())
.pool_multiplier(self.pool_multiplier)
.checkout_queue_size(self.checkout_queue_size)
.retry_on_checkout_limit(self.retry_on_checkout_limit)
.default_command_timeout(self.default_command_timeout)
}
}
impl Default for Config {
fn default() -> Self {
Self {
desired_pool_size: 50,
default_checkout_mode: DefaultPoolCheckoutMode::default(),
backoff_strategy: BackoffStrategy::default(),
reservation_limit: 50,
activation_order: ActivationOrder::default(),
min_required_nodes: 1,
connect_to_nodes: Vec::new(),
pool_multiplier: 1,
checkout_queue_size: 100,
retry_on_checkout_limit: true,
default_command_timeout: DefaultCommandTimeout::default(),
}
}
}