use std::time::Duration;
#[derive(Debug, Clone)]
pub struct PoolConfiguration<T> {
pub max_pool_size: usize,
pub max_active_objects: Option<usize>,
pub validate_on_return: bool,
pub validation_function: Option<fn(&T) -> bool>,
pub operation_timeout: Option<Duration>,
pub time_to_live: Option<Duration>,
pub idle_timeout: Option<Duration>,
pub warmup_size: Option<usize>,
pub enable_circuit_breaker: bool,
pub circuit_breaker_threshold: usize,
pub circuit_breaker_timeout: Duration,
}
impl<T> Default for PoolConfiguration<T> {
fn default() -> Self {
Self {
max_pool_size: 100,
max_active_objects: None,
validate_on_return: false,
validation_function: None,
operation_timeout: Some(Duration::from_secs(30)),
time_to_live: None,
idle_timeout: None,
warmup_size: None,
enable_circuit_breaker: false,
circuit_breaker_threshold: 5,
circuit_breaker_timeout: Duration::from_secs(60),
}
}
}
impl<T> PoolConfiguration<T> {
pub fn new() -> Self {
Self::default()
}
pub fn with_max_pool_size(mut self, size: usize) -> Self {
self.max_pool_size = size;
self
}
pub fn with_max_active_objects(mut self, count: usize) -> Self {
self.max_active_objects = Some(count);
self
}
pub fn with_validation(mut self, func: fn(&T) -> bool) -> Self {
self.validate_on_return = true;
self.validation_function = Some(func);
self
}
pub fn with_timeout(mut self, timeout: Duration) -> Self {
self.operation_timeout = Some(timeout);
self
}
pub fn with_ttl(mut self, ttl: Duration) -> Self {
self.time_to_live = Some(ttl);
self
}
pub fn with_idle_timeout(mut self, timeout: Duration) -> Self {
self.idle_timeout = Some(timeout);
self
}
pub fn with_warmup(mut self, size: usize) -> Self {
self.warmup_size = Some(size);
self
}
pub fn with_circuit_breaker(mut self, threshold: usize, timeout: Duration) -> Self {
self.enable_circuit_breaker = true;
self.circuit_breaker_threshold = threshold;
self.circuit_breaker_timeout = timeout;
self
}
}