use http::{HeaderMap, HeaderName, HeaderValue};
use std::time::Duration;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct BasicAuth {
pub username: String,
pub password: String,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct RetryPolicy {
pub max_retries: usize,
pub initial_backoff: Duration,
}
impl RetryPolicy {
pub fn new(max_retries: usize, initial_backoff: Duration) -> Self {
Self {
max_retries,
initial_backoff,
}
}
}
impl Default for RetryPolicy {
fn default() -> Self {
Self {
max_retries: 2,
initial_backoff: Duration::from_millis(200),
}
}
}
#[derive(Clone, Debug)]
pub struct ClientConfig {
pub endpoint: String,
pub api_version: Option<String>,
pub basic_auth: Option<BasicAuth>,
pub timeout: Duration,
pub retry_policy: RetryPolicy,
pub headers: HeaderMap,
}
impl ClientConfig {
pub fn new(endpoint: impl Into<String>) -> Self {
Self {
endpoint: endpoint.into(),
api_version: None,
basic_auth: None,
timeout: Duration::from_secs(15),
retry_policy: RetryPolicy::default(),
headers: HeaderMap::new(),
}
}
pub fn with_api_version(mut self, version: impl Into<String>) -> Self {
self.api_version = Some(version.into());
self
}
pub fn with_basic_auth(
mut self,
username: impl Into<String>,
password: impl Into<String>,
) -> Self {
self.basic_auth = Some(BasicAuth {
username: username.into(),
password: password.into(),
});
self
}
pub fn with_timeout(mut self, timeout: Duration) -> Self {
self.timeout = timeout;
self
}
pub fn with_retry_policy(mut self, retry_policy: RetryPolicy) -> Self {
self.retry_policy = retry_policy;
self
}
pub fn without_retries(mut self) -> Self {
self.retry_policy = RetryPolicy::new(0, Duration::ZERO);
self
}
pub fn with_header(
mut self,
name: impl AsRef<str>,
value: impl AsRef<str>,
) -> Result<Self, http::Error> {
let name = HeaderName::from_bytes(name.as_ref().as_bytes())?;
let value = HeaderValue::from_str(value.as_ref())?;
self.headers.insert(name, value);
Ok(self)
}
}