From c82cefe80e105ce0c3554413de2dfb1189a16ea1 Mon Sep 17 00:00:00 2001 From: Tunglies <77394545+Tunglies@users.noreply.github.com> Date: Sat, 22 Nov 2025 15:33:24 +0800 Subject: [PATCH] feat: add clash-verge-types crate and integrate IRuntime struct --- Cargo.lock | 10 +++ Cargo.toml | 16 +++-- crates/clash-verge-types/Cargo.toml | 13 ++++ crates/clash-verge-types/src/lib.rs | 1 + .../clash-verge-types/src}/runtime.rs | 63 +++++-------------- src-tauri/Cargo.toml | 9 +-- src-tauri/src/config/config.rs | 3 +- src-tauri/src/config/mod.rs | 3 +- src-tauri/src/core/manager/config.rs | 3 +- 9 files changed, 62 insertions(+), 59 deletions(-) create mode 100644 crates/clash-verge-types/Cargo.toml create mode 100644 crates/clash-verge-types/src/lib.rs rename {src-tauri/src/config => crates/clash-verge-types/src}/runtime.rs (67%) diff --git a/Cargo.lock b/Cargo.lock index e192e0e33..f1320f97d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1118,6 +1118,7 @@ dependencies = [ "clash-verge-draft", "clash-verge-logging", "clash-verge-signal", + "clash-verge-types", "clash_verge_logger", "clash_verge_service_ipc", "compact_str", @@ -1206,6 +1207,15 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "clash-verge-types" +version = "0.1.0" +dependencies = [ + "serde", + "serde_yaml_ng", + "smartstring", +] + [[package]] name = "clash_verge_logger" version = "0.2.1" diff --git a/Cargo.toml b/Cargo.toml index 56319eedb..b46aaa0da 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,7 @@ members = [ "crates/clash-verge-logging", "crates/clash-verge-signal", "crates/tauri-plugin-clash-verge-sysinfo", + "crates/clash-verge-types", ] resolver = "2" @@ -45,12 +46,11 @@ strip = false clash-verge-draft = { path = "crates/clash-verge-draft" } clash-verge-logging = { path = "crates/clash-verge-logging" } clash-verge-signal = { path = "crates/clash-verge-signal" } +clash-verge-types = { path = "crates/clash-verge-types" } tauri-plugin-clash-verge-sysinfo = { path = "crates/tauri-plugin-clash-verge-sysinfo" } + tauri = { version = "2.9.3" } -parking_lot = { version = "0.12.5", features = [ - "hardware-lock-elision", - "send_guard", -] } +parking_lot = { version = "0.12.5", features = ["hardware-lock-elision"] } anyhow = "1.0.100" criterion = { version = "0.7.0", features = ["async_tokio"] } tokio = { version = "1.48.0", features = [ @@ -59,10 +59,16 @@ tokio = { version = "1.48.0", features = [ "time", "sync", ] } -compact_str = { version = "0.9.0", features = ["serde"] } flexi_logger = "0.31.7" log = "0.4.28" +smartstring = { version = "1.0.1" } +compact_str = { version = "0.9.0", features = ["serde"] } + +serde = { version = "1.0.228" } +serde_json = { version = "1.0.145" } +serde_yaml_ng = { version = "0.10.0" } + # *** For Windows platform only *** deelevate = "0.2.0" # ********************************* diff --git a/crates/clash-verge-types/Cargo.toml b/crates/clash-verge-types/Cargo.toml new file mode 100644 index 000000000..256a2e786 --- /dev/null +++ b/crates/clash-verge-types/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "clash-verge-types" +version = "0.1.0" +edition.workspace = true +rust-version.workspace = true + +[dependencies] +serde = { workspace = true } +serde_yaml_ng = { workspace = true } +smartstring = { workspace = true } + +[lints] +workspace = true diff --git a/crates/clash-verge-types/src/lib.rs b/crates/clash-verge-types/src/lib.rs new file mode 100644 index 000000000..ea62c4145 --- /dev/null +++ b/crates/clash-verge-types/src/lib.rs @@ -0,0 +1 @@ +pub mod runtime; diff --git a/src-tauri/src/config/runtime.rs b/crates/clash-verge-types/src/runtime.rs similarity index 67% rename from src-tauri/src/config/runtime.rs rename to crates/clash-verge-types/src/runtime.rs index e394d5d68..91603f2ed 100644 --- a/src-tauri/src/config/runtime.rs +++ b/crates/clash-verge-types/src/runtime.rs @@ -1,15 +1,15 @@ -use crate::enhance::field::use_keys; -use serde::{Deserialize, Serialize}; use serde_yaml_ng::{Mapping, Value}; use smartstring::alias::String; use std::collections::HashMap; -#[derive(Default, Debug, Clone, Deserialize, Serialize)] +#[derive(Default, Clone)] pub struct IRuntime { pub config: Option, // 记录在订阅中(包括merge和script生成的)出现过的keys // 这些keys不一定都生效 + // TODO 或许我们可以用 hashset 来存储以提升查询效率 pub exists_keys: Vec, + // TODO 或许可以用 FixMap 来存储以提升效率 pub chain_logs: HashMap>, } @@ -49,49 +49,7 @@ impl IRuntime { } } - //跟新链式代理配置文件 - /// { - /// "proxies":[ - /// { - /// name : 入口节点, - /// type: xxx - /// server: xxx - /// port: xxx - /// ports: xxx - /// password: xxx - /// skip-cert-verify: xxx, - /// }, - /// { - /// name : hop_node_1_xxxx, - /// type: xxx - /// server: xxx - /// port: xxx - /// ports: xxx - /// password: xxx - /// skip-cert-verify: xxx, - /// dialer-proxy : "入口节点" - /// }, - /// { - /// name : 出口节点, - /// type: xxx - /// server: xxx - /// port: xxx - /// ports: xxx - /// password: xxx - /// skip-cert-verify: xxx, - /// dialer-proxy : "hop_node_1_xxxx" - /// } - /// ], - /// "proxy-groups" : [ - /// { - /// name : "proxy_chain", - /// type: "select", - /// proxies ["出口节点"] - /// } - /// ] - /// } - /// - /// 传入none 为删除 + // 传入none 为删除 pub fn update_proxy_chain_config(&mut self, proxy_chain_config: Option) { if let Some(config) = self.config.as_mut() { if let Some(Value::Sequence(proxies)) = config.get_mut("proxies") { @@ -121,3 +79,16 @@ impl IRuntime { } } } + +// TODO 完整迁移 enhance 行为后移除 +fn use_keys(config: &Mapping) -> Vec { + config + .iter() + .filter_map(|(key, _)| key.as_str()) + .map(|s: &str| { + let mut s: String = s.into(); + s.make_ascii_lowercase(); + s + }) + .collect() +} diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 246b32c9f..5e5fbaa61 100755 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -33,6 +33,7 @@ tauri-build = { version = "2.5.2", features = [] } clash-verge-draft = { workspace = true } clash-verge-logging = { workspace = true } clash-verge-signal = { workspace = true } +clash-verge-types = { workspace = true } tauri-plugin-clash-verge-sysinfo = { workspace = true } tauri = { workspace = true, features = [ "protocol-asset", @@ -47,19 +48,20 @@ tokio = { workspace = true } compact_str = { workspace = true } flexi_logger = { workspace = true } log = { workspace = true } +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } +serde_yaml_ng = { workspace = true } +smartstring = { workspace = true, features = ["serde"] } warp = { version = "0.4.2", features = ["server"] } open = "5.3.3" dunce = "1.0.5" nanoid = "0.4" chrono = "0.4.42" boa_engine = "0.21.0" -serde_json = "1.0.145" -serde_yaml_ng = "0.10.0" once_cell = { version = "1.21.3", features = ["parking_lot"] } port_scanner = "0.1.5" delay_timer = "0.11.6" percent-encoding = "2.3.2" -serde = { version = "1.0.228", features = ["derive"] } reqwest = { version = "0.12.24", features = ["json", "cookies"] } regex = "1.12.2" sysproxy = { git = "https://github.com/clash-verge-rev/sysproxy-rs", features = [ @@ -91,7 +93,6 @@ tauri-plugin-devtools = { version = "2.0.1" } tauri-plugin-mihomo = { git = "https://github.com/clash-verge-rev/tauri-plugin-mihomo" } clash_verge_logger = { git = "https://github.com/clash-verge-rev/clash-verge-logger" } async-trait = "0.1.89" -smartstring = { version = "1.0.1", features = ["serde"] } clash_verge_service_ipc = { version = "2.0.21", features = [ "client", ], git = "https://github.com/clash-verge-rev/clash-verge-service-ipc" } diff --git a/src-tauri/src/config/config.rs b/src-tauri/src/config/config.rs index 671ec586e..d3152616e 100644 --- a/src-tauri/src/config/config.rs +++ b/src-tauri/src/config/config.rs @@ -1,4 +1,4 @@ -use super::{IClashTemp, IProfiles, IRuntime, IVerge}; +use super::{IClashTemp, IProfiles, IVerge}; use crate::{ cmd, config::{PrfItem, profiles_append_item_safe}, @@ -11,6 +11,7 @@ use anyhow::{Result, anyhow}; use backoff::{Error as BackoffError, ExponentialBackoff}; use clash_verge_draft::Draft; use clash_verge_logging::{Type, logging, logging_error}; +use clash_verge_types::runtime::IRuntime; use smartstring::alias::String; use std::path::PathBuf; use tokio::sync::OnceCell; diff --git a/src-tauri/src/config/mod.rs b/src-tauri/src/config/mod.rs index 342c11f47..cf935f2ae 100644 --- a/src-tauri/src/config/mod.rs +++ b/src-tauri/src/config/mod.rs @@ -4,10 +4,9 @@ mod config; mod encrypt; mod prfitem; pub mod profiles; -mod runtime; mod verge; -pub use self::{clash::*, config::*, encrypt::*, prfitem::*, profiles::*, runtime::*, verge::*}; +pub use self::{clash::*, config::*, encrypt::*, prfitem::*, profiles::*, verge::*}; pub const DEFAULT_PAC: &str = r#"function FindProxyForURL(url, host) { return "PROXY 127.0.0.1:%mixed-port%; SOCKS5 127.0.0.1:%mixed-port%; DIRECT;"; diff --git a/src-tauri/src/core/manager/config.rs b/src-tauri/src/core/manager/config.rs index ee5fad673..9e81bdd08 100644 --- a/src-tauri/src/core/manager/config.rs +++ b/src-tauri/src/core/manager/config.rs @@ -1,12 +1,13 @@ use super::CoreManager; use crate::{ - config::{Config, ConfigType, IRuntime}, + config::{Config, ConfigType}, constants::timing, core::{handle, validate::CoreConfigValidator}, utils::{dirs, help}, }; use anyhow::{Result, anyhow}; use clash_verge_logging::{Type, logging}; +use clash_verge_types::runtime::IRuntime; use smartstring::alias::String; use std::{path::PathBuf, time::Instant}; use tauri_plugin_mihomo::Error as MihomoError;