perf(proxy): reuse group order names

This commit is contained in:
Tunglies
2026-08-19 15:49:03 +08:00
parent e15ddab542
commit fc5fdbfea6
2 changed files with 13 additions and 19 deletions
+1 -1
View File
@@ -45,7 +45,7 @@ fn runtime_group_order(config: Option<&Mapping>) -> Vec<String> {
.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()
}
+12 -18
View File
@@ -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<String, Proxy>,
runtime_group_order: &[String],
runtime_group_order: Vec<String>,
resolver: &MemberResolver<'_>,
) -> (Vec<ProxyGroupView>, 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::<Vec<_>>(),