deribit_http/config/
base.rs

1//! Base configuration for HTTP client
2
3use 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/// Configuration for the HTTP client
12#[derive(DebugPretty, DisplaySimple, Clone, Serialize, Deserialize)]
13pub struct HttpConfig {
14    /// Base URL for API requests
15    pub base_url: Url,
16    /// Request timeout
17    pub timeout: Duration,
18    /// Maximum number of retries
19    pub max_retries: u32,
20    /// User agent string
21    pub user_agent: String,
22    /// Whether to use testnet
23    pub testnet: bool,
24    /// API credentials
25    pub credentials: Option<ApiCredentials>,
26}
27
28impl Default for HttpConfig {
29    fn default() -> Self {
30        dotenv::dotenv().ok();
31        // Credentials
32        let credentials = ApiCredentials::new().ok();
33
34        // Testnet flag
35        let testnet = env::var("DERIBIT_TESTNET")
36            .map(|val| val.to_lowercase() == "true")
37            .unwrap_or(true); // Default to testnet for safety
38
39        // Base URL
40        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        // Maximum number of retries
47        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        // Timeout in seconds
52        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    /// Set the timeout for requests
73    pub fn with_timeout(mut self, timeout: Duration) -> Self {
74        self.timeout = timeout;
75        self
76    }
77
78    /// Set the maximum number of retries
79    pub fn with_max_retries(mut self, max_retries: u32) -> Self {
80        self.max_retries = max_retries;
81        self
82    }
83
84    /// Set the user agent string
85    pub fn with_user_agent(mut self, user_agent: String) -> Self {
86        self.user_agent = user_agent;
87        self
88    }
89
90    /// Set OAuth2 credentials
91    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    /// Check if credentials are configured
100    pub fn has_credentials(&self) -> bool {
101        self.credentials.is_some()
102    }
103
104    /// Get the credentials
105    pub fn credentials(&self) -> Option<&ApiCredentials> {
106        self.credentials.as_ref()
107    }
108}