deribit_http/config/
base.rs1use crate::config::credentials::ApiCredentials;
4use crate::constants::{DEFAULT_TIMEOUT, MAX_RETRIES, PRODUCTION_BASE_URL, TESTNET_BASE_URL};
5use pretty_simple_display::{DebugPretty, DisplaySimple};
6use serde::{Deserialize, Serialize};
7use std::env;
8use std::time::Duration;
9use url::Url;
10
11#[derive(DebugPretty, DisplaySimple, Clone, Serialize, Deserialize)]
13pub struct HttpConfig {
14 pub base_url: Url,
16 pub timeout: Duration,
18 pub max_retries: u32,
20 pub user_agent: String,
22 pub testnet: bool,
24 pub credentials: Option<ApiCredentials>,
26}
27
28impl Default for HttpConfig {
29 fn default() -> Self {
30 dotenv::dotenv().ok();
31 let credentials = ApiCredentials::new().ok();
33
34 let testnet = env::var("DERIBIT_TESTNET")
36 .map(|val| val.to_lowercase() == "true")
37 .unwrap_or(true); let base_url = if testnet {
41 Url::parse(TESTNET_BASE_URL).expect("Invalid testnet URL")
42 } else {
43 Url::parse(PRODUCTION_BASE_URL).expect("Invalid base URL")
44 };
45
46 let max_retries = env::var("DERIBIT_HTTP_MAX_RETRIES")
48 .map(|val| val.parse::<u32>().unwrap_or(MAX_RETRIES))
49 .unwrap_or(MAX_RETRIES);
50
51 let timeout_u64 = env::var("DERIBIT_HTTP_TIMEOUT")
53 .map(|val| val.parse::<u64>().unwrap_or(DEFAULT_TIMEOUT))
54 .unwrap_or(DEFAULT_TIMEOUT);
55 let timeout = Duration::from_secs(timeout_u64);
56
57 let user_agent = env::var("DERIBIT_HTTP_USER_AGENT")
58 .unwrap_or_else(|_| format!("deribit-http/{}", env!("CARGO_PKG_VERSION")));
59
60 Self {
61 base_url,
62 timeout,
63 max_retries,
64 user_agent,
65 testnet,
66 credentials,
67 }
68 }
69}
70
71impl HttpConfig {
72 pub fn with_timeout(mut self, timeout: Duration) -> Self {
74 self.timeout = timeout;
75 self
76 }
77
78 pub fn with_max_retries(mut self, max_retries: u32) -> Self {
80 self.max_retries = max_retries;
81 self
82 }
83
84 pub fn with_user_agent(mut self, user_agent: String) -> Self {
86 self.user_agent = user_agent;
87 self
88 }
89
90 pub fn with_oauth2(mut self, client_id: String, client_secret: String) -> Self {
92 self.credentials = Some(ApiCredentials {
93 client_id: Some(client_id),
94 client_secret: Some(client_secret),
95 });
96 self
97 }
98
99 pub fn has_credentials(&self) -> bool {
101 self.credentials.is_some()
102 }
103
104 pub fn credentials(&self) -> Option<&ApiCredentials> {
106 self.credentials.as_ref()
107 }
108}