feat: add methods to retrieve current subscription details in PrfItem and refactor profile handling in IProfiles

This commit is contained in:
Tunglies
2025-11-04 12:01:22 +08:00
parent 0306f73841
commit 97769cf93a
6 changed files with 127 additions and 114 deletions

View File

@@ -44,6 +44,43 @@ struct ProfileItems {
profile_name: String,
}
impl Default for ProfileItems {
fn default() -> Self {
Self {
config: Default::default(),
profile_name: Default::default(),
merge_item: ChainItem {
uid: "".into(),
data: ChainType::Merge(Mapping::new()),
},
script_item: ChainItem {
uid: "".into(),
data: ChainType::Script(tmpl::ITEM_SCRIPT.into()),
},
rules_item: ChainItem {
uid: "".into(),
data: ChainType::Rules(SeqMap::default()),
},
proxies_item: ChainItem {
uid: "".into(),
data: ChainType::Proxies(SeqMap::default()),
},
groups_item: ChainItem {
uid: "".into(),
data: ChainType::Groups(SeqMap::default()),
},
global_merge: ChainItem {
uid: "Merge".into(),
data: ChainType::Merge(Mapping::new()),
},
global_script: ChainItem {
uid: "Script".into(),
data: ChainType::Script(tmpl::ITEM_SCRIPT.into()),
},
}
}
}
async fn get_config_values() -> ConfigValues {
let clash_config = { Config::clash().await.latest_arc().0.clone() };
@@ -89,18 +126,10 @@ async fn get_config_values() -> ConfigValues {
}
}
#[allow(clippy::cognitive_complexity)]
async fn collect_profile_items() -> ProfileItems {
// 从profiles里拿东西 - 先收集需要的数据,然后释放锁
let (
current,
merge_uid,
script_uid,
rules_uid,
proxies_uid,
groups_uid,
_current_profile_uid,
name,
) = {
let (current, merge_uid, script_uid, rules_uid, proxies_uid, groups_uid, name) = {
let current = {
let profiles = Config::profiles().await;
let profiles_clone = profiles.latest_arc();
@@ -109,13 +138,31 @@ async fn collect_profile_items() -> ProfileItems {
let profiles = Config::profiles().await;
let profiles_ref = profiles.latest_arc();
let current_profile_uid = match profiles_ref.get_current() {
Some(uid) => uid.clone(),
None => return ProfileItems::default(),
};
let merge_uid = profiles_ref.current_merge().unwrap_or_default();
let script_uid = profiles_ref.current_script().unwrap_or_default();
let rules_uid = profiles_ref.current_rules().unwrap_or_default();
let proxies_uid = profiles_ref.current_proxies().unwrap_or_default();
let groups_uid = profiles_ref.current_groups().unwrap_or_default();
let current_profile_uid = profiles_ref.get_current().unwrap_or_default();
let current_item = match profiles_ref.get_item_arc(&current_profile_uid) {
Some(item) => item,
None => return ProfileItems::default(),
};
let merge_uid = current_item
.current_merge()
.unwrap_or_else(|| "Merge".into());
let script_uid = current_item
.current_script()
.unwrap_or_else(|| "Script".into());
let rules_uid = current_item
.current_rules()
.unwrap_or_else(|| "Rules".into());
let proxies_uid = current_item
.current_proxies()
.unwrap_or_else(|| "Proxies".into());
let groups_uid = current_item
.current_groups()
.unwrap_or_else(|| "Groups".into());
let name = profiles_ref
.get_item(&current_profile_uid)
@@ -130,7 +177,6 @@ async fn collect_profile_items() -> ProfileItems {
rules_uid,
proxies_uid,
groups_uid,
current_profile_uid,
name,
)
};
@@ -140,7 +186,7 @@ async fn collect_profile_items() -> ProfileItems {
let item = {
let profiles = Config::profiles().await;
let profiles = profiles.latest_arc();
profiles.get_item(merge_uid).ok().cloned()
profiles.get_item(&merge_uid).ok().cloned()
};
if let Some(item) = item {
<Option<ChainItem>>::from_async(&item).await
@@ -157,7 +203,7 @@ async fn collect_profile_items() -> ProfileItems {
let item = {
let profiles = Config::profiles().await;
let profiles = profiles.latest_arc();
profiles.get_item(script_uid).ok().cloned()
profiles.get_item(&script_uid).ok().cloned()
};
if let Some(item) = item {
<Option<ChainItem>>::from_async(&item).await
@@ -174,7 +220,7 @@ async fn collect_profile_items() -> ProfileItems {
let item = {
let profiles = Config::profiles().await;
let profiles = profiles.latest_arc();
profiles.get_item(rules_uid).ok().cloned()
profiles.get_item(&rules_uid).ok().cloned()
};
if let Some(item) = item {
<Option<ChainItem>>::from_async(&item).await
@@ -191,7 +237,7 @@ async fn collect_profile_items() -> ProfileItems {
let item = {
let profiles = Config::profiles().await;
let profiles = profiles.latest_arc();
profiles.get_item(proxies_uid).ok().cloned()
profiles.get_item(&proxies_uid).ok().cloned()
};
if let Some(item) = item {
<Option<ChainItem>>::from_async(&item).await
@@ -208,7 +254,7 @@ async fn collect_profile_items() -> ProfileItems {
let item = {
let profiles = Config::profiles().await;
let profiles = profiles.latest_arc();
profiles.get_item(groups_uid).ok().cloned()
profiles.get_item(&groups_uid).ok().cloned()
};
if let Some(item) = item {
<Option<ChainItem>>::from_async(&item).await