use std::time::Duration;
use crate::KitError;
use crate::config::RetryPolicy;
use crate::error::ValidationViolation;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct TransportConfig {
request_timeout: Duration,
connect_timeout: Duration,
pool_idle_timeout: Duration,
retry: RetryPolicy,
}
impl Default for TransportConfig {
fn default() -> Self {
Self {
request_timeout: Duration::from_secs(120),
connect_timeout: Duration::from_secs(15),
pool_idle_timeout: Duration::from_secs(90),
retry: RetryPolicy::default(),
}
}
}
impl TransportConfig {
pub fn new(
request_timeout: Duration,
connect_timeout: Duration,
pool_idle_timeout: Duration,
retry: RetryPolicy,
) -> Result<Self, KitError> {
let now = std::time::Instant::now();
for (field, timeout) in [
("transport.request_timeout", request_timeout),
("transport.connect_timeout", connect_timeout),
("transport.pool_idle_timeout", pool_idle_timeout),
] {
if timeout.is_zero() {
return Err(KitError::config(
ValidationViolation::OutOfRange {
field,
rule: "must be positive",
},
"transport timeouts must be non-zero",
));
}
if now.checked_add(timeout).is_none() {
return Err(KitError::config(
ValidationViolation::OutOfRange {
field,
rule: "must fit the monotonic clock range",
},
"transport timeout exceeds the supported clock range",
));
}
}
Ok(Self {
request_timeout,
connect_timeout,
pool_idle_timeout,
retry,
})
}
#[must_use]
pub(crate) const fn request_timeout(&self) -> Duration {
self.request_timeout
}
#[must_use]
pub(crate) const fn connect_timeout(&self) -> Duration {
self.connect_timeout
}
#[must_use]
pub(crate) const fn pool_idle_timeout(&self) -> Duration {
self.pool_idle_timeout
}
#[must_use]
pub(crate) const fn retry(&self) -> &RetryPolicy {
&self.retry
}
}