Skip to content

Commit 4dd772a

Browse files
authored
Merge pull request #29 from qianmoQ/dev-25.0.1
feat (language): 支持 Rust 语言
2 parents 2a1d111 + 841aa32 commit 4dd772a

7 files changed

Lines changed: 79 additions & 0 deletions

File tree

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ CodeForge 是一款轻量级、高性能的桌面代码执行器,专为开发
2323
- **Node.js**
2424
- **Go**
2525
- **Java**
26+
- **Shell**
27+
- **Rust**
2628
- **...更多语言敬请期待**
2729

2830
## 安装

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"@codemirror/lang-java": "^6.0.2",
1616
"@codemirror/lang-javascript": "^6.2.4",
1717
"@codemirror/lang-python": "^6.2.1",
18+
"@codemirror/lang-rust": "^6.0.2",
1819
"@codemirror/language": "^6.11.2",
1920
"@codemirror/legacy-modes": "^6.5.1",
2021
"@codemirror/state": "^6.5.2",

public/icons/rust.svg

Lines changed: 3 additions & 0 deletions
Loading

src-tauri/src/plugins/manager.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use super::{
33
python3::Python3Plugin,
44
};
55
use crate::plugins::java::JavaPlugin;
6+
use crate::plugins::rust::RustPlugin;
67
use crate::plugins::shell::ShellPlugin;
78
use std::collections::HashMap;
89

@@ -20,6 +21,7 @@ impl PluginManager {
2021
plugins.insert("go".to_string(), Box::new(GoPlugin));
2122
plugins.insert("java".to_string(), Box::new(JavaPlugin));
2223
plugins.insert("shell".to_string(), Box::new(ShellPlugin));
24+
plugins.insert("rust".to_string(), Box::new(RustPlugin));
2325

2426
Self { plugins }
2527
}

src-tauri/src/plugins/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,7 @@ pub mod manager;
335335
pub mod nodejs;
336336
pub mod python2;
337337
pub mod python3;
338+
pub mod rust;
338339
pub mod shell;
339340

340341
pub use manager::PluginManager;

src-tauri/src/plugins/rust.rs

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
use super::{LanguagePlugin, PluginConfig};
2+
use std::vec;
3+
4+
pub struct RustPlugin;
5+
6+
impl LanguagePlugin for RustPlugin {
7+
fn get_order(&self) -> i32 {
8+
7
9+
}
10+
11+
fn get_language_name(&self) -> &'static str {
12+
"Rust"
13+
}
14+
15+
fn get_language_key(&self) -> &'static str {
16+
"rust"
17+
}
18+
19+
fn get_file_extension(&self) -> String {
20+
self.get_config()
21+
.map(|config| config.extension.clone())
22+
.unwrap_or_else(|| "rs".to_string())
23+
}
24+
25+
fn get_version_args(&self) -> Vec<&'static str> {
26+
vec!["--version"]
27+
}
28+
29+
fn get_path_command(&self) -> String {
30+
"rustc --print sysroot".to_string()
31+
}
32+
33+
fn get_execute_args(&self, file_path: &str) -> Vec<String> {
34+
let cmd = if self.get_execute_home().is_some() {
35+
format!("./rustc {} -o ./main && ./main", file_path)
36+
} else {
37+
format!(
38+
"export PATH=$PATH:$HOME/.cargo/bin && rustc {} -o /tmp/main && /tmp/main",
39+
file_path
40+
)
41+
};
42+
43+
vec!["-c".to_string(), cmd]
44+
}
45+
46+
fn get_default_config(&self) -> PluginConfig {
47+
PluginConfig {
48+
enabled: true,
49+
language: String::from("rust"),
50+
before_compile: None,
51+
extension: String::from("rs"),
52+
execute_home: None,
53+
run_command: Some(String::from("bash")),
54+
after_compile: Some(String::from("rm -f /tmp/main")),
55+
template: Some(String::from(
56+
"// 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<i32> = 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}",
57+
)),
58+
timeout: Some(30),
59+
}
60+
}
61+
62+
fn get_default_command(&self) -> String {
63+
self.get_config()
64+
.and_then(|config| config.run_command.clone())
65+
.unwrap_or_else(|| "/tmp/main".to_string())
66+
}
67+
}

src/composables/useCodeMirrorEditor.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { python } from '@codemirror/lang-python'
33
import { javascript } from '@codemirror/lang-javascript'
44
import { go } from '@codemirror/lang-go'
55
import { java } from '@codemirror/lang-java'
6+
import { rust } from '@codemirror/lang-rust'
67
import { shell } from '@codemirror/legacy-modes/mode/shell'
78
import {
89
abcdef,
@@ -155,6 +156,8 @@ export function useCodeMirrorEditor(props: Props)
155156
return go()
156157
case 'java':
157158
return java()
159+
case 'rust':
160+
return rust()
158161
case 'shell':
159162
return StreamLanguage.define(shell)
160163
default:

0 commit comments

Comments
 (0)