use std::time::Duration;
use crate::error::IamError;
pub(crate) const DEFAULT_TIMEOUT: Duration = Duration::from_secs(2);
#[derive(Debug, Clone)]
pub(crate) struct Config {
pub base_url: String,
pub token: Option<String>,
pub timeout: Duration,
pub issuer: Option<String>,
pub audience: Option<String>,
}
#[derive(Debug, Clone, Default)]
pub struct IamClientBuilder {
base_url: Option<String>,
token: Option<String>,
timeout: Option<Duration>,
issuer: Option<String>,
audience: Option<String>,
}
impl IamClientBuilder {
#[must_use]
pub fn base_url(mut self, base_url: impl Into<String>) -> Self {
self.base_url = Some(base_url.into());
self
}
#[must_use]
pub fn token(mut self, token: impl Into<String>) -> Self {
self.token = Some(token.into());
self
}
#[must_use]
pub fn timeout(mut self, timeout: Duration) -> Self {
self.timeout = Some(timeout);
self
}
#[must_use]
pub fn issuer(mut self, issuer: impl Into<String>) -> Self {
self.issuer = Some(issuer.into());
self
}
#[must_use]
pub fn audience(mut self, audience: impl Into<String>) -> Self {
self.audience = Some(audience.into());
self
}
pub(crate) fn finish(self) -> Result<Config, IamError> {
let base_url = self
.base_url
.map(|u| u.trim_end_matches('/').to_string())
.filter(|u| !u.is_empty())
.ok_or_else(|| IamError::Config("a non-empty base_url is required".to_string()))?;
Ok(Config {
base_url,
token: self.token,
timeout: self.timeout.unwrap_or(DEFAULT_TIMEOUT),
issuer: self.issuer,
audience: self.audience,
})
}
}