1use std::time::Duration;
4
5pub const DEFAULT_BASE_URL: &str = "https://drive-api.proton.me/";
7
8pub const DEFAULT_REFRESH_REDIRECT_URI: &str = "https://proton.me";
10
11pub const DEFAULT_TIMEOUT: Duration = Duration::from_secs(30);
13
14pub const DEFAULT_MAX_RETRIES: u32 = 3;
18
19pub const DEFAULT_RETRY_BASE_DELAY: Duration = Duration::from_millis(500);
21
22pub const DEFAULT_RETRY_MAX_DELAY: Duration = Duration::from_secs(30);
25
26#[derive(Debug, Clone)]
33pub struct RetryPolicy {
34 pub max_retries: u32,
36 pub base_delay: Duration,
38 pub max_delay: Duration,
40}
41
42impl Default for RetryPolicy {
43 fn default() -> Self {
44 Self {
45 max_retries: DEFAULT_MAX_RETRIES,
46 base_delay: DEFAULT_RETRY_BASE_DELAY,
47 max_delay: DEFAULT_RETRY_MAX_DELAY,
48 }
49 }
50}
51
52impl RetryPolicy {
53 pub fn disabled() -> Self {
55 Self {
56 max_retries: 0,
57 ..Self::default()
58 }
59 }
60}
61
62pub const API_CONTENT_TYPE: &str = "application/vnd.protonmail.api+json";
64
65#[derive(Debug, Clone)]
71pub struct ProtonClientConfiguration {
72 pub base_url: String,
73 pub app_version: String,
74 pub user_agent: String,
75 pub refresh_redirect_uri: String,
76 pub request_timeout: Duration,
77 pub retry_policy: RetryPolicy,
78}
79
80impl ProtonClientConfiguration {
81 pub fn new(app_version: impl Into<String>) -> Self {
83 Self {
84 base_url: DEFAULT_BASE_URL.to_owned(),
85 app_version: app_version.into(),
86 user_agent: String::new(),
87 refresh_redirect_uri: DEFAULT_REFRESH_REDIRECT_URI.to_owned(),
88 request_timeout: DEFAULT_TIMEOUT,
89 retry_policy: RetryPolicy::default(),
90 }
91 }
92
93 pub fn with_base_url(mut self, base_url: impl Into<String>) -> Self {
94 self.base_url = base_url.into();
95 self
96 }
97
98 pub fn with_user_agent(mut self, user_agent: impl Into<String>) -> Self {
99 self.user_agent = user_agent.into();
100 self
101 }
102
103 pub fn with_request_timeout(mut self, timeout: Duration) -> Self {
104 self.request_timeout = timeout;
105 self
106 }
107
108 pub fn with_retry_policy(mut self, retry_policy: RetryPolicy) -> Self {
109 self.retry_policy = retry_policy;
110 self
111 }
112}