use std::time::Duration;
use bytes::Bytes;
use crate::client::{ClientConfig, IronflowClient};
use crate::rate_limit::RateLimiter;
use crate::retry::RetryConfig;
#[derive(Debug, Clone)]
pub struct ArtifactDownload {
pub bytes: Bytes,
pub content_type: String,
pub sha256: String,
}
pub struct ClientBuilder {
config: ClientConfig,
retry: RetryConfig,
rate_limit_enabled: bool,
}
impl ClientBuilder {
pub fn new(base_url: &str, api_key: &str) -> Self {
Self {
config: ClientConfig {
base_url: base_url.trim_end_matches('/').to_string(),
api_key: api_key.to_string(),
timeout: Duration::from_secs(30),
},
retry: RetryConfig::default(),
rate_limit_enabled: true,
}
}
pub fn with_max_retries(mut self, n: u32) -> Self {
self.retry.max_retries = n;
self
}
pub fn with_timeout(mut self, timeout: Duration) -> Self {
self.config.timeout = timeout;
self
}
pub fn with_rate_limit(mut self, enabled: bool) -> Self {
self.rate_limit_enabled = enabled;
self
}
pub fn build(self) -> IronflowClient {
let rate_limiter = if self.rate_limit_enabled {
RateLimiter::new()
} else {
RateLimiter::disabled()
};
IronflowClient::from_config_with_retry(self.config, self.retry, rate_limiter)
}
}