diff --git a/src-tauri/src/cmd/profile.rs b/src-tauri/src/cmd/profile.rs index e67fc734..bcdafab2 100644 --- a/src-tauri/src/cmd/profile.rs +++ b/src-tauri/src/cmd/profile.rs @@ -284,10 +284,10 @@ async fn validate_new_profile(new_profile: &String) -> Result<(), ()> { } /// 执行配置更新并处理结果 -async fn restore_previous_profile(prev_profile: String) -> CmdResult<()> { +async fn restore_previous_profile(prev_profile: &String) -> CmdResult<()> { logging!(info, Type::Cmd, "尝试恢复到之前的配置: {}", prev_profile); let restore_profiles = IProfiles { - current: Some(prev_profile), + current: Some(prev_profile.to_owned()), items: None, }; Config::profiles() @@ -304,7 +304,7 @@ async fn restore_previous_profile(prev_profile: String) -> CmdResult<()> { Ok(()) } -async fn handle_success(current_value: Option) -> CmdResult { +async fn handle_success(current_value: Option<&String>) -> CmdResult { Config::profiles().await.apply(); handle::Handle::refresh_clash(); @@ -320,9 +320,9 @@ async fn handle_success(current_value: Option) -> CmdResult { logging!(warn, Type::Cmd, "Warning: 异步保存配置文件失败: {e}"); } - if let Some(current) = ¤t_value { - logging!(info, Type::Cmd, "向前端发送配置变更事件: {}", current,); - handle::Handle::notify_profile_changed(current.clone()); + if let Some(current) = current_value { + logging!(info, Type::Cmd, "向前端发送配置变更事件: {}", current); + handle::Handle::notify_profile_changed(current.to_owned()); } Ok(true) @@ -330,7 +330,7 @@ async fn handle_success(current_value: Option) -> CmdResult { async fn handle_validation_failure( error_msg: String, - current_profile: Option, + current_profile: Option<&String>, ) -> CmdResult { logging!(warn, Type::Cmd, "配置验证失败: {}", error_msg); Config::profiles().await.discard(); @@ -348,7 +348,7 @@ async fn handle_update_error(e: E) -> CmdResult { Ok(false) } -async fn handle_timeout(current_profile: Option) -> CmdResult { +async fn handle_timeout(current_profile: Option<&String>) -> CmdResult { let timeout_msg = "配置更新超时(30秒),可能是配置验证或核心通信阻塞"; logging!(error, Type::Cmd, "{}", timeout_msg); Config::profiles().await.discard(); @@ -360,8 +360,8 @@ async fn handle_timeout(current_profile: Option) -> CmdResult { } async fn perform_config_update( - current_value: Option, - current_profile: Option, + current_value: Option<&String>, + current_profile: Option<&String>, ) -> CmdResult { let update_result = tokio::time::timeout( Duration::from_secs(30), @@ -391,7 +391,8 @@ pub async fn patch_profiles_config(profiles: IProfiles) -> CmdResult { defer! { CURRENT_SWITCHING_PROFILE.store(false, Ordering::Release); } - let target_profile = profiles.current.clone(); + + let target_profile = profiles.current.as_ref(); logging!( info, @@ -401,24 +402,21 @@ pub async fn patch_profiles_config(profiles: IProfiles) -> CmdResult { ); // 保存当前配置,以便在验证失败时恢复 - let current_profile = Config::profiles().await.latest_arc().current.clone(); - logging!(info, Type::Cmd, "当前配置: {:?}", current_profile); + let previous_profile = Config::profiles().await.data_arc().current.clone(); + logging!(info, Type::Cmd, "当前配置: {:?}", previous_profile); // 如果要切换配置,先检查目标配置文件是否有语法错误 - if let Some(new_profile) = profiles.current.as_ref() - && current_profile.as_ref() != Some(new_profile) - && validate_new_profile(new_profile).await.is_err() + if let Some(switch_to_profile) = target_profile + && previous_profile.as_ref() != Some(switch_to_profile) + && validate_new_profile(switch_to_profile).await.is_err() { return Ok(false); } - let _ = Config::profiles() .await .edit_draft(|d| d.patch_config(&profiles)); - let current_value = profiles.current.clone(); - - perform_config_update(current_value, current_profile).await + perform_config_update(target_profile, previous_profile.as_ref()).await } /// 根据profile name修改profiles diff --git a/src-tauri/src/config/profiles.rs b/src-tauri/src/config/profiles.rs index cc7f5c80..c956326f 100644 --- a/src-tauri/src/config/profiles.rs +++ b/src-tauri/src/config/profiles.rs @@ -50,28 +50,26 @@ impl IProfiles { } None } + pub async fn new() -> Self { - match dirs::profiles_path() { - Ok(path) => match help::read_yaml::(&path).await { - Ok(mut profiles) => { - if profiles.items.is_none() { - profiles.items = Some(vec![]); + let path = match dirs::profiles_path() { + Ok(p) => p, + Err(err) => { + logging!(error, Type::Config, "{err}"); + return Self::default(); + } + }; + + match help::read_yaml::(&path).await { + Ok(mut profiles) => { + let items = profiles.items.get_or_insert_with(Vec::new); + for item in items.iter_mut() { + if item.uid.is_none() { + item.uid = Some(help::get_uid("d").into()); } - // compatible with the old old old version - if let Some(items) = profiles.items.as_mut() { - for item in items.iter_mut() { - if item.uid.is_none() { - item.uid = Some(help::get_uid("d").into()); - } - } - } - profiles } - Err(err) => { - logging!(error, Type::Config, "{err}"); - Self::default() - } - }, + profiles + } Err(err) => { logging!(error, Type::Config, "{err}"); Self::default() @@ -433,12 +431,12 @@ impl IProfiles { } /// 获取所有的profiles(uid,名称) - pub fn all_profile_uid_and_name(&self) -> Option> { + pub fn all_profile_uid_and_name(&self) -> Option> { self.items.as_ref().map(|items| { items .iter() .filter_map(|e| { - if let (Some(uid), Some(name)) = (e.uid.clone(), e.name.clone()) { + if let (Some(uid), Some(name)) = (e.uid.as_ref(), e.name.as_ref()) { Some((uid, name)) } else { None diff --git a/src-tauri/src/core/tray/mod.rs b/src-tauri/src/core/tray/mod.rs index e7cc1fda..e8797ece 100644 --- a/src-tauri/src/core/tray/mod.rs +++ b/src-tauri/src/core/tray/mod.rs @@ -318,11 +318,9 @@ impl Tray { .unwrap_or("rule") .to_owned() }; - let profile_uid_and_name = Config::profiles() - .await - .latest_arc() - .all_profile_uid_and_name() - .unwrap_or_default(); + let profiles_config = Config::profiles().await; + let profiles_arc = profiles_config.latest_arc(); + let profile_uid_and_name = profiles_arc.all_profile_uid_and_name().unwrap_or_default(); let is_lightweight_mode = is_in_lightweight_mode(); match app_handle.tray_by_id("main") { @@ -666,7 +664,7 @@ fn create_hotkeys(hotkeys: &Option>) -> HashMap { async fn create_profile_menu_item( app_handle: &AppHandle, - profile_uid_and_name: Vec<(String, String)>, + profile_uid_and_name: Vec<(&String, &String)>, ) -> Result>> { let futures = profile_uid_and_name .iter() @@ -870,7 +868,7 @@ async fn create_tray_menu( system_proxy_enabled: bool, tun_mode_enabled: bool, tun_mode_available: bool, - profile_uid_and_name: Vec<(String, String)>, + profile_uid_and_name: Vec<(&String, &String)>, is_lightweight_mode: bool, ) -> Result> { let current_proxy_mode = mode.unwrap_or("");