Skip to content

Commit 3c78d22

Browse files
committed
minor refactoring
1 parent 6e3ff47 commit 3c78d22

File tree

5 files changed

+43
-34
lines changed

5 files changed

+43
-34
lines changed

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/parsers.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@ use std::sync::LazyLock;
33
use color_eyre::eyre::{OptionExt as _, WrapErr as _};
44

55
pub static PROXY_REGEX: LazyLock<fancy_regex::Regex> = LazyLock::new(|| {
6-
fancy_regex::Regex::new(
7-
r"(?:^|[^\dA-Za-z])(?:(?P<protocol>https?|socks[45]):\/\/)?(?:(?P<username>[^\s:@]+):(?P<password>[^\s:@]+)@)?(?P<host>(?:[\-\.\dA-Za-z]+|(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])(?:\.(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])){3})):(?P<port>\d|[1-9]\d{1,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])(?=[^\dA-Za-z]|$)"
8-
).unwrap()
6+
fancy_regex::RegexBuilder::new(
7+
r"(?:^|[^\dA-Za-z])(?:(?P<protocol>https?|socks[45]):\/\/)?(?:(?P<username>[^\s:@]+):(?P<password>[^\s:@]+)@)?(?P<host>(?:[\-\.\dA-Za-z]+|(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])(?:\.(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])){3})):(?P<port>\d|[1-9]\d{1,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])(?=[^\dA-Za-z]|$)",
8+
)
9+
.case_insensitive(true)
10+
.build()
11+
.unwrap()
912
});
1013

1114
static IPV4_REGEX: LazyLock<fancy_regex::Regex> = LazyLock::new(|| {

src/proxy.rs

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::{fmt, sync::Arc};
1+
use std::{fmt, fmt::Write as _, sync::Arc};
22

33
use color_eyre::eyre::{OptionExt as _, WrapErr as _, eyre};
44

@@ -21,7 +21,7 @@ impl TryFrom<&str> for ProxyType {
2121
type Error = color_eyre::Report;
2222

2323
fn try_from(string: &str) -> color_eyre::Result<Self> {
24-
match string {
24+
match string.to_ascii_lowercase().as_str() {
2525
"http" | "https" => Ok(Self::Http),
2626
"socks4" => Ok(Self::Socks4),
2727
"socks5" => Ok(Self::Socks5),
@@ -60,24 +60,34 @@ pub struct Proxy {
6060
pub exit_ip: Option<String>,
6161
}
6262

63-
impl Proxy {
64-
pub async fn check(
65-
&mut self,
66-
config: Arc<Config>,
67-
) -> color_eyre::Result<()> {
68-
let mut proxy = reqwest::Proxy::all(format!(
63+
impl TryFrom<&mut Proxy> for reqwest::Proxy {
64+
type Error = color_eyre::Report;
65+
66+
fn try_from(value: &mut Proxy) -> Result<Self, Self::Error> {
67+
let proxy = Self::all(format!(
6968
"{}://{}:{}",
70-
self.protocol, self.host, self.port
69+
value.protocol, value.host, value.port
7170
))
7271
.wrap_err("failed to create reqwest::Proxy")?;
72+
7373
if let (Some(username), Some(password)) =
74-
(self.username.as_ref(), self.password.as_ref())
74+
(value.username.as_ref(), value.password.as_ref())
7575
{
76-
proxy = proxy.basic_auth(username, password);
76+
Ok(proxy.basic_auth(username, password))
77+
} else {
78+
Ok(proxy)
7779
}
80+
}
81+
}
82+
83+
impl Proxy {
84+
pub async fn check(
85+
&mut self,
86+
config: Arc<Config>,
87+
) -> color_eyre::Result<()> {
7888
let client = reqwest::Client::builder()
7989
.user_agent(USER_AGENT)
80-
.proxy(proxy)
90+
.proxy(self.try_into()?)
8191
.timeout(config.timeout)
8292
.pool_max_idle_per_host(0)
8393
.tcp_keepalive(None)
@@ -134,20 +144,14 @@ impl Proxy {
134144
pub fn as_str(&self, include_protocol: bool) -> String {
135145
let mut s = String::new();
136146
if include_protocol {
137-
s.push_str(&self.protocol.to_string());
138-
s.push_str("://");
147+
write!(&mut s, "{}://", self.protocol).unwrap();
139148
}
140149
if let (Some(username), Some(password)) =
141150
(self.username.as_ref(), self.password.as_ref())
142151
{
143-
s.push_str(username);
144-
s.push(':');
145-
s.push_str(password);
146-
s.push('@');
152+
write!(&mut s, "{username}:{password}@").unwrap();
147153
}
148-
s.push_str(&self.host);
149-
s.push(':');
150-
s.push_str(&self.port.to_string());
154+
write!(&mut s, "{}:{}", self.host, self.port).unwrap();
151155
s
152156
}
153157
}

src/storage.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,15 @@ impl ProxyStorage {
1919
}
2020

2121
pub fn get_grouped(&self) -> HashMap<ProxyType, Vec<&Proxy>> {
22-
let mut groups: HashMap<ProxyType, Vec<&Proxy>> = self
22+
let mut groups: HashMap<_, _> = self
2323
.enabled_protocols
2424
.iter()
2525
.map(|p| (p.clone(), Vec::new()))
2626
.collect();
2727
for proxy in &self.proxies {
28-
groups.entry(proxy.protocol.clone()).or_default().push(proxy);
28+
if let Some(proxies) = groups.get_mut(&proxy.protocol) {
29+
proxies.push(proxy);
30+
}
2931
}
3032
groups
3133
}

src/ui/tui.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ fn draw(f: &mut Frame, state: &AppState, logger_state: &TuiWidgetState) {
214214
let mut proxy_types: Vec<_> = state.sources_total.keys().collect();
215215
proxy_types.sort();
216216

217-
for (i, proxy_type) in proxy_types.iter().enumerate() {
217+
for (i, proxy_type) in proxy_types.into_iter().enumerate() {
218218
let block =
219219
Block::bordered().title(proxy_type.to_string().to_uppercase());
220220
f.render_widget(block.clone(), proxies_layout[i]);
@@ -286,11 +286,11 @@ fn draw(f: &mut Frame, state: &AppState, logger_state: &TuiWidgetState) {
286286
);
287287
}
288288

289-
let mut lines = vec![
290-
Line::from("Up/PageUp/k - scroll logs up"),
291-
Line::from("Down/PageDown/j - scroll logs down"),
292-
];
293-
if matches!(state.mode, AppMode::Done) {
289+
let done = matches!(state.mode, AppMode::Done);
290+
let mut lines = Vec::with_capacity(2 + usize::from(done));
291+
lines.push(Line::from("Up/PageUp/k - scroll logs up"));
292+
lines.push(Line::from("Down/PageDown/j - scroll logs down"));
293+
if done {
294294
lines.push(
295295
Line::from("Enter/ESC/q/Ctrl-C - exit")
296296
.style(Style::default().fg(Color::Red)),

0 commit comments

Comments
 (0)