use std::time::Duration;
use super::default_instances;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct RequestPool {
pub(crate) min_idle: u8,
pub(crate) max_size: u8,
pub(crate) max_idle: u8,
pub(crate) idle_timeout: Duration,
pub(crate) max_life: Option<Duration>,
pub(crate) max_requests: Option<u64>,
}
impl RequestPool {
pub fn elastic() -> Self {
Self::fixed(default_instances())
}
pub fn fixed(instances: u8) -> Self {
Self {
min_idle: instances,
max_size: instances,
max_idle: instances,
idle_timeout: default_idle_timeout(),
max_life: None,
max_requests: None,
}
}
pub fn min_idle(
mut self,
instances: u8,
) -> Self {
self.min_idle = instances;
self
}
pub fn max_size(
mut self,
instances: u8,
) -> Self {
self.max_size = instances;
self
}
pub fn max_idle(
mut self,
instances: u8,
) -> Self {
self.max_idle = instances;
self
}
pub fn idle_timeout(
mut self,
timeout: Duration,
) -> Self {
self.idle_timeout = timeout;
self
}
pub fn max_life(
mut self,
lifetime: Option<Duration>,
) -> Self {
self.max_life = lifetime;
self
}
pub fn max_requests(
mut self,
requests: Option<u64>,
) -> Self {
self.max_requests = requests;
self
}
pub fn validate(&self) -> Result<(), String> {
if self.min_idle == 0 {
return Err("PHP request pool min_idle must be at least 1".into());
}
if self.max_size < self.min_idle {
return Err("PHP request pool max_size must be >= min_idle".into());
}
if self.max_idle < self.min_idle || self.max_idle > self.max_size {
return Err("PHP request pool must satisfy min_idle <= max_idle <= max_size".into());
}
if self.max_life.is_some_and(|duration| duration.is_zero()) {
return Err(
"PHP request pool max_life must be positive when configured"
.into(),
);
}
if self.max_requests == Some(0) {
return Err(
"PHP request pool max_requests must be at least 1".into()
);
}
Ok(())
}
}
impl Default for RequestPool {
fn default() -> Self {
Self::fixed(default_instances())
}
}
fn default_idle_timeout() -> Duration {
Duration::from_secs(60)
}