From fc5fdbfea647f7468174e006b84742136890664f Mon Sep 17 00:00:00 2001 From: Tunglies <77394545+Tunglies@users.noreply.github.com> Date: Tue, 18 Aug 2026 10:47:54 +0800 Subject: [PATCH] perf(proxy): reuse group order names --- src-tauri/src/cmd/proxy.rs | 2 +- src-tauri/src/core/proxy_view.rs | 30 ++++++++++++------------------ 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/src-tauri/src/cmd/proxy.rs b/src-tauri/src/cmd/proxy.rs index 7cf33ffa2..551c3a88e 100644 --- a/src-tauri/src/cmd/proxy.rs +++ b/src-tauri/src/cmd/proxy.rs @@ -45,7 +45,7 @@ fn runtime_group_order(config: Option<&Mapping>) -> Vec { .filter_map(|group| group.get("name")) .filter_map(|name| name.as_str()) .filter(|name| !name.is_empty() && *name != "GLOBAL") - .filter(|name| seen.insert((*name).to_owned())) + .filter(|name| seen.insert(*name)) .map(str::to_owned) .collect() } diff --git a/src-tauri/src/core/proxy_view.rs b/src-tauri/src/core/proxy_view.rs index 588f2b699..4a8d9e30b 100644 --- a/src-tauri/src/core/proxy_view.rs +++ b/src-tauri/src/core/proxy_view.rs @@ -232,7 +232,7 @@ impl ProxyViewBuilder { let global = core_groups .remove("GLOBAL") .map(|proxy| build_group("GLOBAL".to_owned(), proxy, &resolver)); - let (groups, order_source) = build_ordered_groups(core_groups, &runtime_group_order, &resolver); + let (groups, order_source) = build_ordered_groups(core_groups, runtime_group_order, &resolver); let direct = core_node_ids.get("DIRECT").cloned(); let standalone = build_standalone(&core_node_ids); @@ -439,32 +439,26 @@ fn build_node(record_id: String, name: String, proxy: Proxy, source: ProxyNodeSo fn build_ordered_groups( mut core_groups: BTreeMap, - runtime_group_order: &[String], + runtime_group_order: Vec, resolver: &MemberResolver<'_>, ) -> (Vec, ProxyViewOrderSource) { - let mut selected = BTreeSet::new(); - let mut names = Vec::new(); + let mut groups = Vec::with_capacity(core_groups.len()); for name in runtime_group_order { - if core_groups.contains_key(name) && selected.insert(name.clone()) { - names.push(name.clone()); + if let Some(proxy) = core_groups.remove(&name) { + groups.push(build_group(name, proxy, resolver)); } } - let order_source = if names.is_empty() { + let order_source = if groups.is_empty() { ProxyViewOrderSource::Fallback } else { ProxyViewOrderSource::Runtime }; - names.extend(core_groups.keys().filter(|name| !selected.contains(*name)).cloned()); - - let groups = names - .into_iter() - .filter_map(|name| { - core_groups - .remove(&name) - .map(|proxy| build_group(name, proxy, resolver)) - }) - .collect(); + groups.extend( + core_groups + .into_iter() + .map(|(name, proxy)| build_group(name, proxy, resolver)), + ); (groups, order_source) } @@ -658,7 +652,7 @@ mod tests { ); let mut input = ordered_input(false); - input.runtime_group_order = vec!["Zulu".into()]; + input.runtime_group_order = vec!["Zulu".into(), "Zulu".into()]; let view = ProxyViewBuilder::build(input); assert_eq!( view.groups.iter().map(|group| group.name.as_str()).collect::>(),