| use reqwest::{Client, Proxy}; |
| use serde::{Serialize, Serializer}; |
| use serde::{Deserialize, Deserializer}; |
| |
|
|
| use crate::app::constant::COMMA_STRING; |
|
|
| #[derive(Clone, Default, PartialEq)] |
| pub enum Proxies { |
| No, |
| #[default] |
| System, |
| List(Vec<String>), |
| } |
|
|
| impl Serialize for Proxies { |
| fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> |
| where |
| S: Serializer, |
| { |
| match self { |
| Proxies::No => serializer.serialize_str(""), |
| Proxies::System => serializer.serialize_str("system"), |
| Proxies::List(urls) => serializer.serialize_str(&urls.join(COMMA_STRING)), |
| } |
| } |
| } |
|
|
| impl<'de> Deserialize<'de> for Proxies { |
| fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> |
| where |
| D: Deserializer<'de>, |
| { |
| let s = <String as serde::Deserialize>::deserialize(deserializer)?; |
| Ok(Proxies::from_str(&s)) |
| } |
| } |
|
|
| impl Proxies { |
| |
| |
| |
| |
| |
| |
| |
| pub fn from_str(s: &str) -> Self { |
| match s.trim() { |
| "" | "no" => Self::No, |
| "system" => Self::System, |
| urls => { |
| let valid_proxies: Vec<String> = urls |
| .split(',') |
| .filter_map(|url| { |
| let trimmed = url.trim(); |
| (!trimmed.is_empty() && Proxy::all(trimmed).is_ok()) |
| .then(|| trimmed.to_string()) |
| }) |
| .collect(); |
|
|
| if valid_proxies.is_empty() { |
| Self::default() |
| } else { |
| Self::List(valid_proxies) |
| } |
| } |
| } |
| } |
|
|
| pub fn get_client(&self) -> Client { |
| match self { |
| Proxies::No => Client::builder().no_proxy().build().unwrap(), |
| Proxies::System => Client::new(), |
| Proxies::List(list) => { |
| |
| let proxy = Proxy::all(list[0].clone()).unwrap(); |
| Client::builder().proxy(proxy).build().unwrap() |
| } |
| } |
| } |
| } |
|
|