use std::time::Duration;
pub const DEFAULT_BASE_URL: &str = "https://drive-api.proton.me/";
pub const DEFAULT_REFRESH_REDIRECT_URI: &str = "https://proton.me";
pub const DEFAULT_TIMEOUT: Duration = Duration::from_secs(30);
pub const DEFAULT_MAX_RETRIES: u32 = 3;
pub const DEFAULT_RETRY_BASE_DELAY: Duration = Duration::from_millis(500);
pub const DEFAULT_RETRY_MAX_DELAY: Duration = Duration::from_secs(30);
#[derive(Debug, Clone)]
pub struct RetryPolicy {
pub max_retries: u32,
pub base_delay: Duration,
pub max_delay: Duration,
}
impl Default for RetryPolicy {
fn default() -> Self {
Self {
max_retries: DEFAULT_MAX_RETRIES,
base_delay: DEFAULT_RETRY_BASE_DELAY,
max_delay: DEFAULT_RETRY_MAX_DELAY,
}
}
}
impl RetryPolicy {
pub fn disabled() -> Self {
Self {
max_retries: 0,
..Self::default()
}
}
}
pub const API_CONTENT_TYPE: &str = "application/vnd.protonmail.api+json";
#[derive(Debug, Clone)]
pub struct ProtonClientConfiguration {
pub base_url: String,
pub app_version: String,
pub user_agent: String,
pub refresh_redirect_uri: String,
pub request_timeout: Duration,
pub retry_policy: RetryPolicy,
}
impl ProtonClientConfiguration {
pub fn new(app_version: impl Into<String>) -> Self {
Self {
base_url: DEFAULT_BASE_URL.to_owned(),
app_version: app_version.into(),
user_agent: String::new(),
refresh_redirect_uri: DEFAULT_REFRESH_REDIRECT_URI.to_owned(),
request_timeout: DEFAULT_TIMEOUT,
retry_policy: RetryPolicy::default(),
}
}
pub fn with_base_url(mut self, base_url: impl Into<String>) -> Self {
self.base_url = base_url.into();
self
}
pub fn with_user_agent(mut self, user_agent: impl Into<String>) -> Self {
self.user_agent = user_agent.into();
self
}
pub fn with_request_timeout(mut self, timeout: Duration) -> Self {
self.request_timeout = timeout;
self
}
pub fn with_retry_policy(mut self, retry_policy: RetryPolicy) -> Self {
self.retry_policy = retry_policy;
self
}
}