use crate::retry::RetryConfig;
use std::time::Duration;
#[derive(Debug, Clone)]
pub struct ClientConfig {
pub retry: Option<RetryConfig>,
pub compression: CompressionConfig,
pub timeout: Duration,
pub connect_timeout: Duration,
pub pool_idle_timeout: Duration,
pub pool_max_idle_per_host: usize,
pub user_agent: String,
pub enable_tracing: bool,
}
impl Default for ClientConfig {
fn default() -> Self {
Self {
retry: Some(RetryConfig::default()),
compression: CompressionConfig::default(),
timeout: Duration::from_secs(30),
connect_timeout: Duration::from_secs(10),
pool_idle_timeout: Duration::from_secs(90),
pool_max_idle_per_host: 10,
user_agent: crate::USER_AGENT.to_string(),
enable_tracing: true,
}
}
}
impl ClientConfig {
pub fn builder() -> ClientConfigBuilder {
ClientConfigBuilder::default()
}
}
#[derive(Debug, Default)]
pub struct ClientConfigBuilder {
config: ClientConfig,
}
impl ClientConfigBuilder {
pub fn with_retry(mut self, retry: RetryConfig) -> Self {
self.config.retry = Some(retry);
self
}
pub fn without_retry(mut self) -> Self {
self.config.retry = None;
self
}
pub fn with_compression(mut self, enabled: bool) -> Self {
self.config.compression.enabled = enabled;
self
}
pub fn with_compression_config(mut self, config: CompressionConfig) -> Self {
self.config.compression = config;
self
}
pub fn with_timeout(mut self, timeout: Duration) -> Self {
self.config.timeout = timeout;
self
}
pub fn with_connect_timeout(mut self, timeout: Duration) -> Self {
self.config.connect_timeout = timeout;
self
}
pub fn with_pool_idle_timeout(mut self, timeout: Duration) -> Self {
self.config.pool_idle_timeout = timeout;
self
}
pub fn with_pool_max_idle(mut self, max: usize) -> Self {
self.config.pool_max_idle_per_host = max;
self
}
pub fn with_user_agent(mut self, user_agent: impl Into<String>) -> Self {
self.config.user_agent = user_agent.into();
self
}
pub fn with_tracing(mut self, enabled: bool) -> Self {
self.config.enable_tracing = enabled;
self
}
pub fn build(self) -> ClientConfig {
self.config
}
}
#[derive(Debug, Clone)]
pub struct CompressionConfig {
pub enabled: bool,
pub compress_requests: bool,
pub accept_compressed: bool,
pub min_size: usize,
}
impl Default for CompressionConfig {
fn default() -> Self {
Self {
enabled: true,
compress_requests: false, accept_compressed: true, min_size: 1024, }
}
}
impl CompressionConfig {
pub fn disabled() -> Self {
Self {
enabled: false,
compress_requests: false,
accept_compressed: false,
min_size: 0,
}
}
pub fn full() -> Self {
Self {
enabled: true,
compress_requests: true,
accept_compressed: true,
min_size: 512,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_config() {
let config = ClientConfig::default();
assert!(config.retry.is_some());
assert!(config.compression.enabled);
assert_eq!(config.timeout, Duration::from_secs(30));
assert!(config.user_agent.contains("busbar-sf-api"));
}
#[test]
fn test_builder() {
let config = ClientConfig::builder()
.with_timeout(Duration::from_secs(60))
.without_retry()
.with_compression(false)
.with_user_agent("custom-agent/1.0")
.build();
assert!(config.retry.is_none());
assert!(!config.compression.enabled);
assert_eq!(config.timeout, Duration::from_secs(60));
assert_eq!(config.user_agent, "custom-agent/1.0");
}
#[test]
fn test_compression_config() {
let disabled = CompressionConfig::disabled();
assert!(!disabled.enabled);
assert!(!disabled.compress_requests);
assert!(!disabled.accept_compressed);
let full = CompressionConfig::full();
assert!(full.enabled);
assert!(full.compress_requests);
assert!(full.accept_compressed);
}
}