use std::{hash::Hash, time::Duration};
use reqwest::ClientBuilder;
use serde::Deserialize;
use crate::{address::Address, credentials::Credentials, timeoutsmap::TimeoutsMapConfig, Scheme};
#[cfg(feature = "pinger")]
use crate::ping;
#[derive(Debug, Deserialize, Clone, Default)]
pub struct HostConfig<K: Eq + Hash + Default> {
#[serde(default, flatten)]
pub credentials: Option<Credentials>,
#[serde(default)]
pub target: Address,
#[serde(default)]
pub scheme: Scheme,
#[serde(default)]
pub timeouts: TimeoutsMapConfig<K>,
#[cfg(feature = "pinger")]
#[serde(default)]
pub ping: Option<ping::Config>,
#[serde(default)]
pub extras: Option<ExtraSettings>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct ExtraSettings {
#[serde(default)]
pub connect_timeout: Option<Duration>,
#[serde(default = "ExtraSettings::def_connection_verbose")]
pub connection_verbose: bool,
#[serde(default)]
pub pool_idle_timeout: Option<Duration>,
#[serde(default = "ExtraSettings::def_pool_max_idle_per_host")]
pub pool_max_idle_per_host: usize,
#[serde(default)]
pub tcp_keepalive: Option<Duration>,
#[serde(default = "ExtraSettings::def_tcp_nodelay")]
pub tcp_nodelay: bool,
}
impl ExtraSettings {
fn def_connection_verbose() -> bool {
false
}
fn def_pool_max_idle_per_host() -> usize {
usize::MAX
}
fn def_tcp_nodelay() -> bool {
true
}
pub fn apply(self, mut builder: ClientBuilder) -> ClientBuilder {
if let Some(timeout) = self.connect_timeout {
builder = builder.connect_timeout(timeout);
}
builder
.connection_verbose(self.connection_verbose)
.pool_idle_timeout(self.pool_idle_timeout)
.pool_max_idle_per_host(self.pool_max_idle_per_host)
.tcp_keepalive(self.tcp_keepalive)
.tcp_nodelay(self.tcp_nodelay)
}
}
impl Default for ExtraSettings {
fn default() -> Self {
Self {
connect_timeout: Default::default(),
connection_verbose: Self::def_connection_verbose(),
pool_idle_timeout: Default::default(),
pool_max_idle_per_host: Self::def_pool_max_idle_per_host(),
tcp_keepalive: Default::default(),
tcp_nodelay: Self::def_tcp_nodelay(),
}
}
}