11use async_trait:: async_trait;
2- use log:: { error, info} ;
2+ use log:: { error, info, warn } ;
33use serde:: { Deserialize , Serialize } ;
44use std:: collections:: HashMap ;
55use std:: path:: PathBuf ;
@@ -24,6 +24,7 @@ pub struct EnvironmentInfo {
2424 pub current_version : Option < String > ,
2525 pub installed_versions : Vec < EnvironmentVersion > ,
2626 pub available_versions : Vec < EnvironmentVersion > ,
27+ pub error : Option < String > , // 错误信息(如获取可用版本失败)
2728}
2829
2930// 下载进度事件
@@ -67,7 +68,7 @@ pub trait EnvironmentProvider: Send + Sync {
6768 ) -> Result < String , String > ;
6869
6970 // 切换到指定版本
70- async fn switch_version ( & self , version : & str ) -> Result < ( ) , String > ;
71+ async fn switch_version ( & self , version : & str , app_handle : AppHandle ) -> Result < ( ) , String > ;
7172
7273 // 获取当前激活的版本
7374 async fn get_current_version ( & self ) -> Result < Option < String > , String > ;
@@ -105,16 +106,22 @@ impl EnvironmentManager {
105106
106107 let current_version = provider. get_current_version ( ) . await . ok ( ) . flatten ( ) ;
107108 let installed_versions = provider. get_installed_versions ( ) . await . unwrap_or_default ( ) ;
108- let available_versions = provider
109- . fetch_available_versions ( )
110- . await
111- . unwrap_or_default ( ) ;
109+
110+ // 获取可用版本,如果失败也要返回已安装版本,并在错误信息中说明
111+ let ( available_versions, error) = match provider. fetch_available_versions ( ) . await {
112+ Ok ( versions) => ( versions, None ) ,
113+ Err ( e) => {
114+ warn ! ( "获取可用版本失败: {}" , e) ;
115+ ( vec ! [ ] , Some ( format ! ( "获取可用版本失败: {}" , e) ) )
116+ }
117+ } ;
112118
113119 Ok ( EnvironmentInfo {
114120 language : language. to_string ( ) ,
115121 current_version,
116122 installed_versions,
117123 available_versions,
124+ error,
118125 } )
119126 }
120127
@@ -133,14 +140,19 @@ impl EnvironmentManager {
133140 provider. download_and_install ( version, app_handle) . await
134141 }
135142
136- pub async fn switch_version ( & self , language : & str , version : & str ) -> Result < ( ) , String > {
143+ pub async fn switch_version (
144+ & self ,
145+ language : & str ,
146+ version : & str ,
147+ app_handle : AppHandle ,
148+ ) -> Result < ( ) , String > {
137149 let provider = self
138150 . providers
139151 . get ( language)
140152 . ok_or_else ( || format ! ( "暂未支持 {} 语言,请前往 github 提供 issues" , language) ) ?;
141153
142154 info ! ( "切换 {} 到版本 {}" , language, version) ;
143- provider. switch_version ( version) . await
155+ provider. switch_version ( version, app_handle ) . await
144156 }
145157
146158 pub fn get_supported_languages ( & self ) -> Vec < String > {
0 commit comments