use std::time::Duration;
pub const DEFAULT_TIMEOUT: Duration = Duration::from_secs(30);
pub const DEFAULT_MAX_REDIRECTS: u8 = 5;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct ClientConfig {
enforce_https: bool,
timeout: Duration,
max_redirects: u8,
}
impl Default for ClientConfig {
#[inline]
fn default() -> Self {
Self {
enforce_https: true,
timeout: DEFAULT_TIMEOUT,
max_redirects: DEFAULT_MAX_REDIRECTS,
}
}
}
impl ClientConfig {
#[inline]
pub fn new() -> Self {
Self::default()
}
#[inline]
pub fn require_https(mut self, required: bool) -> Self {
self.enforce_https = required;
self
}
#[inline]
pub fn with_timeout(mut self, timeout: Duration) -> Self {
self.timeout = timeout;
self
}
#[inline]
pub fn with_max_redirects(mut self, max_redirects: u8) -> Self {
self.max_redirects = max_redirects;
self
}
#[inline]
pub fn enforce_https(&self) -> bool {
self.enforce_https
}
#[inline]
pub fn timeout(&self) -> Duration {
self.timeout
}
#[inline]
pub fn max_redirects(&self) -> u8 {
self.max_redirects
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_defaults_to_safe_policy() {
let config = ClientConfig::new();
assert!(config.enforce_https());
assert_eq!(config.timeout(), DEFAULT_TIMEOUT);
assert_eq!(config.max_redirects(), DEFAULT_MAX_REDIRECTS);
}
#[test]
fn it_builds_custom_policy() {
let config = ClientConfig::new()
.require_https(false)
.with_timeout(Duration::from_secs(5))
.with_max_redirects(0);
assert!(!config.enforce_https());
assert_eq!(config.timeout(), Duration::from_secs(5));
assert_eq!(config.max_redirects(), 0);
}
}