snm_brightdata_client/
config.rs1use 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}