mirror of
https://github.com/clash-verge-rev/clash-verge-rev.git
synced 2026-10-29 18:12:10 +08:00
perf(proxy): reuse group order names
This commit is contained in:
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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<_>>(),
|
||||
|
||||
Reference in New Issue
Block a user