use std::time::Duration;
use crate::client::{Client, Headers};
use crate::error::Result;
#[derive(Debug, Clone, Default)]
pub struct ClientBuilder {
base_url: Option<String>,
token: Option<String>,
timeout: Option<Duration>,
max_retries: Option<u32>,
headers: Headers,
}
impl ClientBuilder {
const DEFAULT_BASE_URL: &str = "http://localhost:3000";
const DEFAULT_MAX_RETRIES: u32 = 3;
pub fn with_base_url(mut self, base_url: impl Into<String>) -> Self {
self.base_url = Some(base_url.into());
self
}
pub fn with_token(mut self, token: impl Into<String>) -> Self {
self.token = Some(token.into());
self
}
pub fn with_timeout(mut self, timeout: impl Into<Duration>) -> Self {
self.timeout = Some(timeout.into());
self
}
pub fn with_max_retries(mut self, max_retries: impl Into<u32>) -> Self {
self.max_retries = Some(max_retries.into());
self
}
pub fn with_header(mut self, name: impl AsRef<str>, value: impl AsRef<str>) -> Self {
self.headers.insert(name, value);
self
}
pub fn with_user_agent(self, value: impl AsRef<str>) -> Self {
self.with_header("user-agent", value)
}
pub fn build(self) -> Result<Client> {
let base_url = self
.base_url
.unwrap_or_else(|| Self::DEFAULT_BASE_URL.to_owned());
let max_retries = self.max_retries.unwrap_or(Self::DEFAULT_MAX_RETRIES);
let headers = self.headers.into_map()?;
Client::assemble(base_url, self.token, self.timeout, max_retries, headers)
}
}