@@ -3,6 +3,7 @@ use log::{error, info, warn};
33use std:: collections:: HashMap ;
44use std:: fs;
55use std:: io:: { BufRead , BufReader } ;
6+ use std:: path:: PathBuf ;
67use std:: process:: { Command , Stdio } ;
78use std:: sync:: { Arc , OnceLock , mpsc} ;
89use std:: thread;
@@ -34,6 +35,39 @@ fn init_task_manager() -> TaskManager {
3435 . clone ( )
3536}
3637
38+ // 获取 .codeforge 缓存目录
39+ fn get_codeforge_cache_dir ( language : & str ) -> Result < PathBuf , String > {
40+ let home_dir = dirs:: home_dir ( ) . ok_or ( "无法获取用户主目录" ) ?;
41+ let cache_dir = home_dir
42+ . join ( ".codeforge" )
43+ . join ( "cache" )
44+ . join ( "plugins" )
45+ . join ( language) ;
46+
47+ // 确保目录存在
48+ fs:: create_dir_all ( & cache_dir) . map_err ( |e| format ! ( "创建缓存目录失败: {}" , e) ) ?;
49+
50+ Ok ( cache_dir)
51+ }
52+
53+ // 检查是否应该过滤 stderr 行
54+ fn should_filter_stderr_line ( language : & str , line : & str ) -> bool {
55+ match language {
56+ "clojure" => {
57+ // 过滤 Clojure 的常见警告信息
58+ line. contains ( "WARNING: Implicit use of clojure.main" )
59+ || line. contains ( "WARNING: name already refers to:" )
60+ }
61+ "scala" => {
62+ // 过滤 Scala 的编译信息
63+ line. contains ( "[0m[0m[33mCompiling project" )
64+ || line. contains ( "[0m[0m" )
65+ || line. starts_with ( "\u{001b} " )
66+ }
67+ _ => false ,
68+ }
69+ }
70+
3771// 停止执行命令
3872#[ tauri:: command]
3973pub async fn stop_execution ( language : String ) -> Result < bool , String > {
@@ -80,13 +114,17 @@ pub async fn execute_code(
80114 . get_plugin ( & request. language )
81115 . ok_or_else ( || format ! ( "Unsupported language: {}" , request. language) ) ?;
82116
83- let temp_dir = std:: env:: temp_dir ( ) ;
84- let file_name = format ! (
85- "Codeforge_{}.{}" ,
86- request. language,
87- plugin. get_file_extension( )
88- ) ;
89- let file_path = temp_dir. join ( file_name. clone ( ) ) ;
117+ // 使用 .codeforge/cache/plugin/<language> 目录
118+ let temp_dir = get_codeforge_cache_dir ( & request. language ) ?;
119+ let timestamp = SystemTime :: now ( )
120+ . duration_since ( UNIX_EPOCH )
121+ . unwrap ( )
122+ . as_secs ( ) ;
123+ let file_work = format ! ( "Codeforge_{}_{}" , request. language, timestamp) ;
124+ let work_dir = temp_dir. join ( & file_work) ;
125+ fs:: create_dir_all ( & work_dir) . map_err ( |e| format ! ( "创建工作目录失败: {}" , e) ) ?;
126+ let file_name = format ! ( "{}.{}" , file_work, plugin. get_file_extension( ) ) ;
127+ let file_path = work_dir. join ( & file_name) ;
90128
91129 // 写入代码到临时文件
92130 fs:: write ( & file_path, & request. code )
@@ -274,14 +312,17 @@ pub async fn execute_code(
274312 // 读取并发送 stderr
275313 while let Ok ( line) = stderr_rx. try_recv ( ) {
276314 stderr_lines. push ( line. clone ( ) ) ;
277- let _ = app. emit (
278- "code-output" ,
279- serde_json:: json!( {
280- "type" : "stderr" ,
281- "content" : line,
282- "language" : request. language
283- } ) ,
284- ) ;
315+ // 过滤掉特定语言的警告信息
316+ if !should_filter_stderr_line ( & request. language , & line) {
317+ let _ = app. emit (
318+ "code-output" ,
319+ serde_json:: json!( {
320+ "type" : "stderr" ,
321+ "content" : line,
322+ "language" : request. language
323+ } ) ,
324+ ) ;
325+ }
285326 }
286327
287328 // 检查进程是否结束
@@ -301,14 +342,17 @@ pub async fn execute_code(
301342 }
302343 while let Ok ( line) = stderr_rx. try_recv ( ) {
303344 stderr_lines. push ( line. clone ( ) ) ;
304- let _ = app. emit (
305- "code-output" ,
306- serde_json:: json!( {
307- "type" : "stderr" ,
308- "content" : line,
309- "language" : request. language
310- } ) ,
311- ) ;
345+ // 过滤掉特定语言的警告信息
346+ if !should_filter_stderr_line ( & request. language , & line) {
347+ let _ = app. emit (
348+ "code-output" ,
349+ serde_json:: json!( {
350+ "type" : "stderr" ,
351+ "content" : line,
352+ "language" : request. language
353+ } ) ,
354+ ) ;
355+ }
312356 }
313357
314358 let execution_time = start_time. elapsed ( ) . as_millis ( ) ;
0 commit comments