snm_brightdata_client/
config.rs

1// src/config.rs - Enhanced version with complete BrightData configuration
2use anyhow::Result;
3use std::time::Duration;
4
5#[derive(Clone, Debug)]
6pub struct BrightDataConfig {
7    pub endpoint: String,
8    pub token: String,
9    pub base_url: String,
10    pub web_unlocker_zone: String,
11    pub browser_zone: String,
12    pub serp_zone: String,
13    pub timeout: Duration,
14    pub max_retries: u32,
15}
16
17impl BrightDataConfig {
18    pub fn new(endpoint: String, token: String) -> Result<Self> {
19        Ok(Self {
20            endpoint,
21            token,
22            base_url: "https://api.brightdata.com".to_string(),
23            web_unlocker_zone: "default".to_string(),
24            browser_zone: "default_browser".to_string(),
25            serp_zone: "serp_api2".to_string(),
26            timeout: Duration::from_secs(300),
27            max_retries: 3,
28        })
29    }
30
31    pub fn from_env() -> Result<Self> {
32        let endpoint = std::env::var("BRIGHTDATA_ENDPOINT")
33            .unwrap_or_else(|_| "https://brd.superproxy.io".to_string());
34        let token = std::env::var("BRIGHTDATA_TOKEN")?;
35        let base_url = std::env::var("BRIGHTDATA_BASE_URL")
36            .unwrap_or_else(|_| "https://api.brightdata.com".to_string());
37        let web_unlocker_zone = std::env::var("WEB_UNLOCKER_ZONE")
38            .unwrap_or_else(|_| "default".to_string());
39        let browser_zone = std::env::var("BROWSER_ZONE")
40            .unwrap_or_else(|_| "default_browser".to_string());
41        let serp_zone = std::env::var("BRIGHTDATA_SERP_ZONE")
42            .unwrap_or_else(|_| "serp_api2".to_string());
43        let timeout = Duration::from_secs(
44            std::env::var("REQUEST_TIMEOUT")
45                .unwrap_or_else(|_| "300".to_string())
46                .parse()
47                .unwrap_or(300)
48        );
49        let max_retries = std::env::var("MAX_RETRIES")
50            .unwrap_or_else(|_| "3".to_string())
51            .parse()
52            .unwrap_or(3);
53
54        Ok(Self {
55            endpoint,
56            token,
57            base_url,
58            web_unlocker_zone,
59            browser_zone,
60            serp_zone,
61            timeout,
62            max_retries,
63        })
64    }
65
66    pub fn validate(&self) -> Result<()> {
67        if self.token.is_empty() {
68            return Err(anyhow::anyhow!("BrightData token is required"));
69        }
70        if self.web_unlocker_zone.is_empty() {
71            return Err(anyhow::anyhow!("Web Unlocker zone is required"));
72        }
73        if self.browser_zone.is_empty() {
74            return Err(anyhow::anyhow!("Browser zone is required"));
75        }
76        if self.serp_zone.is_empty() {
77            return Err(anyhow::anyhow!("SERP zone is required"));
78        }
79        Ok(())
80    }
81}