perf: utilize smartstring for string handling (#5149)

* perf: utilize smartstring for string handling

- Updated various modules to replace standard String with smartstring::alias::String for improved performance and memory efficiency.
- Adjusted string manipulations and conversions throughout the codebase to ensure compatibility with the new smartstring type.
- Enhanced readability and maintainability by using `.into()` for conversions where applicable.
- Ensured that all instances of string handling in configuration, logging, and network management leverage the benefits of smartstring.

* fix: replace wrap_err with stringify_err for better error handling in UWP tool invocation

* refactor: update import path for StringifyErr and adjust string handling in sysopt

* fix: correct import path for CmdResult in UWP module

* fix: update argument type for execute_sysproxy_command to use std::string::String

* fix: add missing CmdResult import in UWP platform module

* fix: improve string handling and error messaging across multiple files

* style: format code for improved readability and consistency across multiple files

* fix: remove unused file
This commit is contained in:
Tunglies
2025-10-22 16:25:44 +08:00
committed by GitHub
parent fe96a7030a
commit a05ea64bcd
50 changed files with 361 additions and 272 deletions

View File

@@ -541,7 +541,7 @@ pub async fn startup_script() -> Result<()> {
));
};
let script_dir = PathBuf::from(&script_path);
let script_dir = PathBuf::from(script_path.as_str());
if !script_dir.exists() {
return Err(anyhow::anyhow!("script not found: {}", script_path));
}
@@ -553,7 +553,7 @@ pub async fn startup_script() -> Result<()> {
.shell()
.command(shell_type)
.current_dir(working_dir)
.args(&[script_path])
.args([script_path.as_str()])
.output()
.await?;

View File

@@ -98,21 +98,10 @@ macro_rules! wrap_err {
// Case 1: Future<Result<T, E>>
($stat:expr, async) => {{
match $stat.await {
Ok(a) => Ok(a),
Ok(a) => Ok::<_, ::anyhow::Error>(a),
Err(err) => {
log::error!(target: "app", "{}", err);
Err(err.to_string())
}
}
}};
// Case 2: Result<T, E>
($stat:expr) => {{
match $stat {
Ok(a) => Ok(a),
Err(err) => {
log::error!(target: "app", "{}", err);
Err(err.to_string())
Err(::anyhow::Error::msg(err.to_string()))
}
}
}};

View File

@@ -1,3 +1,4 @@
use crate::config::Config;
use anyhow::Result;
use base64::{Engine as _, engine::general_purpose};
use isahc::prelude::*;
@@ -9,14 +10,13 @@ use isahc::{
header::{HeaderMap, HeaderValue, USER_AGENT},
},
};
use smartstring::alias::String;
use std::time::{Duration, Instant};
use sysproxy::Sysproxy;
use tauri::Url;
use tokio::sync::Mutex;
use tokio::time::timeout;
use crate::config::Config;
#[derive(Debug)]
pub struct HttpResponse {
status: StatusCode,
@@ -80,7 +80,7 @@ impl NetworkManager {
async fn record_connection_error(&self, error: &str) {
let mut last_error = self.last_connection_error.lock().await;
*last_error = Some((Instant::now(), error.to_string()));
*last_error = Some((Instant::now(), error.into()));
let mut count = self.connection_error_count.lock().await;
*count += 1;
@@ -181,8 +181,9 @@ impl NetworkManager {
headers.insert(
USER_AGENT,
HeaderValue::from_str(
&user_agent
.unwrap_or_else(|| format!("clash-verge/v{}", env!("CARGO_PKG_VERSION"))),
&user_agent.unwrap_or_else(|| {
format!("clash-verge/v{}", env!("CARGO_PKG_VERSION")).into()
}),
)?,
);
@@ -240,7 +241,7 @@ impl NetworkManager {
let status = response.status();
let headers = response.headers().clone();
let body = response.text().await?;
Ok::<_, anyhow::Error>(HttpResponse::new(status, headers, body))
Ok::<_, anyhow::Error>(HttpResponse::new(status, headers, body.into()))
})
.await
{

View File

@@ -1,4 +1,5 @@
use anyhow::Result;
use smartstring::alias::String;
use crate::{
config::Config,

View File

@@ -1,8 +1,9 @@
use anyhow::{Result, bail};
use percent_encoding::percent_decode_str;
use smartstring::alias::String;
use tauri::Url;
use crate::{config::PrfItem, core::handle, logging, utils::logging::Type, wrap_err};
use crate::{config::PrfItem, core::handle, logging, logging_error, utils::logging::Type};
pub(super) async fn resolve_scheme(param: String) -> Result<()> {
log::info!(target:"app", "received deep link: {param}");
@@ -27,7 +28,7 @@ pub(super) async fn resolve_scheme(param: String) -> Result<()> {
let name = link_parsed
.query_pairs()
.find(|(key, _)| key == "name")
.map(|(_, value)| value.into_owned());
.map(|(_, value)| value.into());
let url_param = if let Some(query) = link_parsed.query() {
let prefix = "url=";
@@ -58,7 +59,11 @@ pub(super) async fn resolve_scheme(param: String) -> Result<()> {
}
};
let result = crate::config::profiles::profiles_append_item_safe(item).await;
let _ = wrap_err!(result);
logging_error!(
Type::Config,
"failed to import subscription url: {:?}",
result
);
handle::Handle::notice_message("import_sub_url::ok", uid);
}
Err(e) => {

View File

@@ -26,11 +26,11 @@ pub async fn build_new_window() -> Result<WebviewWindow, String> {
.latest_ref()
.start_page
.clone()
.unwrap_or("/".to_string());
.unwrap_or("/".into());
match tauri::WebviewWindowBuilder::new(
app_handle,
"main", /* the unique window label */
tauri::WebviewUrl::App(start_page.into()),
tauri::WebviewUrl::App(start_page.as_str().into()),
)
.title("Clash Verge")
.center()

View File

@@ -1,5 +1,3 @@
use std::time::Duration;
use super::resolve;
use crate::{
config::{Config, DEFAULT_PAC, IVerge},
@@ -13,6 +11,8 @@ use once_cell::sync::OnceCell;
use parking_lot::Mutex;
use port_scanner::local_port_available;
use reqwest::ClientBuilder;
use smartstring::alias::String;
use std::time::Duration;
use tokio::sync::oneshot;
use warp::Filter;
@@ -31,7 +31,7 @@ pub async fn check_singleton() -> Result<()> {
let client = ClientBuilder::new()
.timeout(Duration::from_millis(500))
.build()?;
let argvs: Vec<String> = std::env::args().collect();
let argvs: Vec<std::string::String> = std::env::args().collect();
if argvs.len() > 1 {
#[cfg(not(target_os = "macos"))]
{
@@ -75,8 +75,8 @@ pub fn embed_server() {
} else {
logging!(error, Type::Window, "轻量模式退出失败,无法恢复应用窗口");
};
Ok::<_, warp::Rejection>(warp::reply::with_status::<String>(
"ok".into(),
Ok::<_, warp::Rejection>(warp::reply::with_status::<std::string::String>(
"ok".to_string(),
warp::http::StatusCode::OK,
))
});
@@ -111,7 +111,10 @@ pub fn embed_server() {
tokio::task::spawn_local(async move {
logging_error!(Type::Setup, resolve::resolve_scheme(param).await);
});
warp::reply::with_status::<String>("ok".into(), warp::http::StatusCode::OK)
warp::reply::with_status::<std::string::String>(
"ok".to_string(),
warp::http::StatusCode::OK,
)
});
let commands = visible.or(scheme).or(pac);