use std::time::Duration;
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub enum AuthStrategy {
#[default]
None,
Bearer(String),
}
impl AuthStrategy {
#[must_use]
pub const fn is_configured(&self) -> bool {
!matches!(self, Self::None)
}
#[must_use]
pub const fn bearer_token(&self) -> Option<&String> {
match self {
Self::Bearer(token) => Some(token),
Self::None => None,
}
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct SdkConfig {
base_url: String,
auth: AuthStrategy,
timeout: Option<Duration>,
user_agent: Option<String>,
}
impl SdkConfig {
#[must_use]
pub fn new(base_url: impl Into<String>, auth: AuthStrategy) -> Self {
Self { base_url: base_url.into(), auth, timeout: None, user_agent: None }
}
#[must_use]
pub fn builder(base_url: impl Into<String>) -> SdkConfigBuilder<BaseUrlSet> {
SdkConfigBuilder {
base_url: base_url.into(),
auth: AuthStrategy::default(),
timeout: None,
user_agent: None,
_state: std::marker::PhantomData,
}
}
#[must_use]
pub fn base_url(&self) -> &str {
&self.base_url
}
#[must_use]
pub const fn auth(&self) -> &AuthStrategy {
&self.auth
}
#[must_use]
pub const fn timeout(&self) -> Option<Duration> {
self.timeout
}
#[must_use]
pub fn user_agent(&self) -> Option<&str> {
self.user_agent.as_deref()
}
}
#[derive(Debug, Clone, Copy)]
pub struct BaseUrlSet;
#[derive(Debug)]
pub struct SdkConfigBuilder<S> {
base_url: String,
auth: AuthStrategy,
timeout: Option<Duration>,
user_agent: Option<String>,
_state: std::marker::PhantomData<S>,
}
impl SdkConfigBuilder<BaseUrlSet> {
#[must_use]
pub fn build(self) -> SdkConfig {
SdkConfig {
base_url: self.base_url,
auth: self.auth,
timeout: self.timeout,
user_agent: self.user_agent,
}
}
}
impl<S> SdkConfigBuilder<S> {
#[must_use]
pub fn auth(mut self, auth: AuthStrategy) -> Self {
self.auth = auth;
self
}
#[must_use]
pub const fn timeout(mut self, timeout: Duration) -> Self {
self.timeout = Some(timeout);
self
}
#[must_use]
pub fn user_agent(mut self, agent: impl Into<String>) -> Self {
self.user_agent = Some(agent.into());
self
}
}
pub trait AuthStrategyExt {
fn bearer(token: impl Into<String>) -> AuthStrategy;
}
impl AuthStrategyExt for AuthStrategy {
fn bearer(token: impl Into<String>) -> Self {
Self::Bearer(token.into())
}
}