🦀 Rust Expert
1. 依赖管理 (Dependency Governance)
🚨 高危依赖隔离原则 (The "Autogen Isolation" Rule)
对于自动生成且版本不稳定的库(典型代表:windows-rs),严禁在业务逻辑中直接散布其类型。
- •
触发条件:
- •库是 Autogenerated (如 win32metadata 生成)
- •库处于 0.x 版本且 API 频繁变动
- •项目重度依赖该库 (如 GDI 绘图)
- •
执行规范:
- •建立防腐层 (Anti-Corruption Layer):创建一个专门的模块(如
src/platform/win32_wrapper.rs)。 - •物理隔离:所有的
use windows::Win32::...只能出现在这个 Wrapper 文件中。 - •类型重映射:对外暴露自定义的安全类型(如
pub struct SafeHDC(usize)),业务逻辑只认这个 Wrapper 类型。
- •建立防腐层 (Anti-Corruption Layer):创建一个专门的模块(如
- •
收益:当上游库发生 Breaking Change(如
HANDLE类型变更)时,只需修改 Wrapper 文件的一处代码,而非全项目的几百处调用。
2. 代码组织
模块结构
rust
src/ ├── main.rs // 入口,只做初始化 ├── lib.rs // 公共导出 ├── commands/ // Tauri commands ├── services/ // 业务逻辑 ├── models/ // 数据结构 └── utils/ // 工具函数
规则
- •✅ 每个模块职责单一
- •✅ 公共 API 通过
lib.rs导出 - •❌ 禁止在
main.rs写业务逻辑
2. 错误处理
使用 thiserror + anyhow
rust
// 定义错误类型
#[derive(thiserror::Error, Debug)]
pub enum AppError {
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
#[error("Capture failed: {0}")]
Capture(String),
}
// 在函数中使用
fn capture() -> Result<(), AppError> {
// ...
}
规则
- •✅ 永远使用
Result<T, E>,不用unwrap() - •✅ 只在测试或确定安全时用
expect() - •❌ 禁止
panic!在生产代码
3. 异步处理
Tokio 最佳实践
rust
#[tokio::main]
async fn main() {
// 主线程只做调度
}
// CPU 密集任务用 spawn_blocking
tokio::task::spawn_blocking(|| {
heavy_computation();
}).await?;
规则
- •✅ IO 操作用
async - •✅ CPU 密集用
spawn_blocking - •❌ 禁止在 async 函数中阻塞
4. 内存安全
所有权检查清单
- • 避免不必要的
clone() - • 优先使用
&str而非String - • 大结构体传引用
&T,小结构体传值 - • 使用
Arc<Mutex<T>>跨线程共享
5. Tauri 特定
Command 定义
rust
#[tauri::command]
async fn my_command(state: State<'_, AppState>) -> Result<String, String> {
// 业务逻辑不写这里,调用 service
services::do_something(&state).await
.map_err(|e| e.to_string())
}
规则
- •✅ Command 只做参数解析和调用 service
- •✅ 错误转换为
String返回前端 - •❌ 禁止在 command 里写复杂逻辑