diff --git a/README.md b/README.md index ce043ea..04b5abf 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,8 @@ CodeForge 是一款轻量级、高性能的桌面代码执行器,专为开发 - **Node.js** - **Go** - **Java** +- **Shell** +- **Rust** - **...更多语言敬请期待** ## 安装 diff --git a/package.json b/package.json index 68681ab..a8d36e1 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "@codemirror/lang-java": "^6.0.2", "@codemirror/lang-javascript": "^6.2.4", "@codemirror/lang-python": "^6.2.1", + "@codemirror/lang-rust": "^6.0.2", "@codemirror/language": "^6.11.2", "@codemirror/legacy-modes": "^6.5.1", "@codemirror/state": "^6.5.2", diff --git a/public/icons/rust.svg b/public/icons/rust.svg new file mode 100644 index 0000000..89e1955 --- /dev/null +++ b/public/icons/rust.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src-tauri/src/plugins/manager.rs b/src-tauri/src/plugins/manager.rs index bca946b..34a0a86 100644 --- a/src-tauri/src/plugins/manager.rs +++ b/src-tauri/src/plugins/manager.rs @@ -3,6 +3,7 @@ use super::{ python3::Python3Plugin, }; use crate::plugins::java::JavaPlugin; +use crate::plugins::rust::RustPlugin; use crate::plugins::shell::ShellPlugin; use std::collections::HashMap; @@ -20,6 +21,7 @@ impl PluginManager { plugins.insert("go".to_string(), Box::new(GoPlugin)); plugins.insert("java".to_string(), Box::new(JavaPlugin)); plugins.insert("shell".to_string(), Box::new(ShellPlugin)); + plugins.insert("rust".to_string(), Box::new(RustPlugin)); Self { plugins } } diff --git a/src-tauri/src/plugins/mod.rs b/src-tauri/src/plugins/mod.rs index 0be83e7..9e3b851 100644 --- a/src-tauri/src/plugins/mod.rs +++ b/src-tauri/src/plugins/mod.rs @@ -335,6 +335,7 @@ pub mod manager; pub mod nodejs; pub mod python2; pub mod python3; +pub mod rust; pub mod shell; pub use manager::PluginManager; diff --git a/src-tauri/src/plugins/rust.rs b/src-tauri/src/plugins/rust.rs new file mode 100644 index 0000000..79173b2 --- /dev/null +++ b/src-tauri/src/plugins/rust.rs @@ -0,0 +1,67 @@ +use super::{LanguagePlugin, PluginConfig}; +use std::vec; + +pub struct RustPlugin; + +impl LanguagePlugin for RustPlugin { + fn get_order(&self) -> i32 { + 7 + } + + fn get_language_name(&self) -> &'static str { + "Rust" + } + + fn get_language_key(&self) -> &'static str { + "rust" + } + + fn get_file_extension(&self) -> String { + self.get_config() + .map(|config| config.extension.clone()) + .unwrap_or_else(|| "rs".to_string()) + } + + fn get_version_args(&self) -> Vec<&'static str> { + vec!["--version"] + } + + fn get_path_command(&self) -> String { + "rustc --print sysroot".to_string() + } + + fn get_execute_args(&self, file_path: &str) -> Vec { + let cmd = if self.get_execute_home().is_some() { + format!("./rustc {} -o ./main && ./main", file_path) + } else { + format!( + "export PATH=$PATH:$HOME/.cargo/bin && rustc {} -o /tmp/main && /tmp/main", + file_path + ) + }; + + vec!["-c".to_string(), cmd] + } + + fn get_default_config(&self) -> PluginConfig { + PluginConfig { + enabled: true, + language: String::from("rust"), + before_compile: None, + extension: String::from("rs"), + execute_home: None, + run_command: Some(String::from("bash")), + after_compile: Some(String::from("rm -f /tmp/main")), + template: Some(String::from( + "// Rust 示例代码 - CodeForge 代码执行环境\n\nfn main() {\n println!(\"🎉 欢迎使用 CodeForge!\");\n println!(\"Welcome to CodeForge!\");\n println!(\"\");\n \n println!(\"=========================================\");\n println!(\" CodeForge Rust \");\n println!(\"=========================================\");\n println!(\"\");\n \n // 基本输出示例\n println!(\"✅ Rust 运行成功! (Rust is working!)\");\n println!(\"🦀 这是 Rust 版本 (This is Rust)\");\n println!(\"\");\n \n // 简单计算\n let number1 = 10;\n let number2 = 20;\n let result = number1 + number2;\n \n println!(\"🔢 简单计算 (Simple calculation):\");\n println!(\"{} + {} = {}\", number1, number2, result);\n println!(\"\");\n \n // 字符串操作\n let name = \"CodeForge\";\n let version = \"Rust\";\n \n println!(\"📝 字符串操作 (String operations):\");\n println!(\"平台名称 (Platform): {}\", name);\n println!(\"语言版本 (Language): {}\", version);\n println!(\"完整信息 (Full info): {} - {}\", name, version);\n println!(\"\");\n \n // 循环示例\n println!(\"🔄 循环输出 (Loop output):\");\n for i in 1..=5 {\n println!(\"第 {} 次输出 (Output #{}): Hello from CodeForge!\", i, i);\n }\n println!(\"\");\n \n // 向量操作\n let fruits = vec![\"苹果\", \"香蕉\", \"橙子\", \"葡萄\"];\n println!(\"🍎 水果列表 (Fruit list):\");\n for (index, fruit) in fruits.iter().enumerate() {\n println!(\"{}. {}\", index + 1, fruit);\n }\n println!(\"\");\n \n // 条件判断\n let score = 85;\n println!(\"📊 成绩评估 (Score evaluation):\");\n if score >= 90 {\n println!(\"优秀! (Excellent!)\");\n } else if score >= 80 {\n println!(\"良好! (Good!)\");\n } else if score >= 60 {\n println!(\"及格 (Pass)\");\n } else {\n println!(\"需要努力 (Need improvement)\");\n }\n \n // Rust 特有的所有权演示\n println!(\"\");\n println!(\"🔒 Rust 所有权演示 (Ownership demonstration):\");\n let mut message = String::from(\"Hello\");\n message.push_str(\", CodeForge!\");\n println!(\"可变字符串 (Mutable string): {}\", message);\n \n // Option 类型演示\n let maybe_number: Option = Some(42);\n match maybe_number {\n Some(n) => println!(\"找到数字 (Found number): {}\", n),\n None => println!(\"没有数字 (No number)\"),\n }\n \n println!(\"\");\n println!(\"🎯 CodeForge Rust 代码执行完成!\");\n println!(\"🎯 CodeForge Rust execution completed!\");\n println!(\"\");\n println!(\"感谢使用 CodeForge 代码执行环境! 🚀\");\n println!(\"Thank you for using CodeForge! 🚀\");\n}", + )), + timeout: Some(30), + } + } + + fn get_default_command(&self) -> String { + self.get_config() + .and_then(|config| config.run_command.clone()) + .unwrap_or_else(|| "/tmp/main".to_string()) + } +} diff --git a/src/composables/useCodeMirrorEditor.ts b/src/composables/useCodeMirrorEditor.ts index f66c3d7..5d7f845 100644 --- a/src/composables/useCodeMirrorEditor.ts +++ b/src/composables/useCodeMirrorEditor.ts @@ -3,6 +3,7 @@ import { python } from '@codemirror/lang-python' import { javascript } from '@codemirror/lang-javascript' import { go } from '@codemirror/lang-go' import { java } from '@codemirror/lang-java' +import { rust } from '@codemirror/lang-rust' import { shell } from '@codemirror/legacy-modes/mode/shell' import { abcdef, @@ -155,6 +156,8 @@ export function useCodeMirrorEditor(props: Props) return go() case 'java': return java() + case 'rust': + return rust() case 'shell': return StreamLanguage.define(shell) default: