11use crate :: plugins:: { LanguageInfo , PluginManager } ;
22use log:: { debug, error, info} ;
3+ use regex:: Regex ;
34use std:: process:: Command ;
45use tauri:: State ;
56use tokio:: sync:: Mutex ;
67
78pub type PluginManagerState = Mutex < PluginManager > ;
89
9- // 通用的环境信息获取函数
10+ fn extract_version ( output : & str ) -> String {
11+ let output = output. trim ( ) ;
12+
13+ let version_patterns = vec ! [
14+ r"(?i)version\s+([0-9]+\.[0-9]+\.[0-9]+(?:-[a-zA-Z0-9]+)?)" ,
15+ r"(?i)version\s+([0-9]+\.[0-9]+(?:\.[0-9]+)?)" ,
16+ r"\bv?([0-9]+\.[0-9]+\.[0-9]+(?:-[a-zA-Z0-9]+)?)\b" ,
17+ r"\bv?([0-9]+\.[0-9]+(?:\.[0-9]+)?)\b" ,
18+ r#""([0-9]+\.[0-9]+\.[0-9]+)""# ,
19+ ] ;
20+
21+ for pattern in version_patterns {
22+ if let Ok ( re) = Regex :: new ( pattern) {
23+ if let Some ( cap) = re. captures ( output) {
24+ if let Some ( version) = cap. get ( 1 ) {
25+ return version. as_str ( ) . to_string ( ) ;
26+ }
27+ }
28+ }
29+ }
30+
31+ if let Some ( first_line) = output. lines ( ) . next ( ) {
32+ if !first_line. is_empty ( ) {
33+ return first_line. to_string ( ) ;
34+ }
35+ }
36+
37+ output. to_string ( )
38+ }
39+
1040#[ tauri:: command]
1141pub async fn get_info (
1242 language : String ,
@@ -44,20 +74,27 @@ pub async fn get_info(
4474 . arg ( plugin. get_path_command ( ) )
4575 . output ( ) ;
4676
47- let mut version = String :: from_utf8_lossy ( & version_out. stdout )
77+ let mut raw_version = String :: from_utf8_lossy ( & version_out. stdout )
4878 . trim ( )
4979 . to_string ( ) ;
5080
51- if version . is_empty ( ) {
81+ if raw_version . is_empty ( ) {
5282 info ! (
5383 "获取环境 -> 调用插件 [ {} ] 版本为空,通过 stderr 获取" ,
5484 language
5585 ) ;
56- version = String :: from_utf8_lossy ( & version_out. stderr )
86+ raw_version = String :: from_utf8_lossy ( & version_out. stderr )
5787 . trim ( )
5888 . to_string ( ) ;
5989 }
6090
91+ let version = extract_version ( & raw_version) ;
92+ let final_version = if version. is_empty ( ) {
93+ raw_version
94+ } else {
95+ version
96+ } ;
97+
6198 let path = if let Ok ( path_out) = path_result {
6299 if path_out. status . success ( ) {
63100 String :: from_utf8_lossy ( & path_out. stdout ) . trim ( ) . to_string ( )
@@ -71,7 +108,7 @@ pub async fn get_info(
71108 info ! ( "获取环境 -> 调用插件 [ {} ] 完成" , language) ;
72109 return Ok ( LanguageInfo {
73110 installed : true ,
74- version,
111+ version : final_version ,
75112 path,
76113 language : plugin. get_language_name ( ) . to_string ( ) ,
77114 } ) ;
@@ -90,7 +127,6 @@ pub async fn get_info(
90127 } )
91128}
92129
93- // 获取支持的语言列表
94130#[ tauri:: command]
95131pub async fn get_supported_languages (
96132 plugin_manager : State < ' _ , PluginManagerState > ,
0 commit comments