关于 solid-rust
solid-rust 是面向 Rust 2024 项目的模块化架构与 SOLID 原则 Skill。它规定模块位置、文件长度和文档要求,并要求实现前检查可复用代码。
主要功能
- 01功能模块置于 src/modules/
- 02共享代码置于 src/core/
- 03Trait 位置与泛型约束规则
- 04thiserror 与 rustdoc 要求
- 05实现前检查 DRY 与代码复用
适用场景
- 01规划新的 Rust 功能模块
- 02按 SOLID 架构规则审查代码
- 03搭建服务、Trait、处理器与测试
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ fusengine/ agents --skill solid-rust安装后在 Claude Code 中输入/solid-rust确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/architecture-patterns.mddependency-inversion.mdinterface-segregation.mdliskov-substitution.mdopen-closed.mdsingle-responsibility.mdsolid-principles.mdreferences/templates/error.mdhandler.mdmodule.mdservice.mdtest.mdtrait-def.md详细介绍
SOLID Rust 为 Rust 2024 版强制执行模块化架构:每项功能都位于 `src/modules/[feature]/` 下(handlers.rs、services.rs、repository.rs、traits.rs、models.rs),共享代码放在 `src/core/` 中;trait 只能放在 `traits.rs` 或 `src/core/traits/` 中;泛型使用 trait bound,而不是具体类型;自定义错误由 `thiserror` 处理;每个公开项都必须带有 rustdoc `///` 注释。
编写任何新代码之前,必须先对照 src/core/services 和 src/core/traits 检查是否符合 DRY 原则。概览请参阅 solid-principles.md;SRP/OCP/LSP/ISP/DIP 的详细信息请参阅各原则的参考文档;模块、服务、trait、处理器、错误和测试脚手架请参阅模板。
SOLID Rust - 模块化架构
Agent 工作流(必须遵循)
在进行任何实现之前,必须并行启动 3 个 Agent,每个 Agent 调用一次,并指定 name:
- fuse-ai-pilot:explore-codebase - 分析现有架构
- fuse-ai-pilot:research-expert - 通过 Context7 核实 Rust 文档
- fuse-ai-pilot:sniper - 实现后的验证
DRY - 先复用,再创建(必须遵循)
编写任何新代码之前:
- 使用 grep 搜索代码库,查找类似的 trait、服务或逻辑
- 检查共享位置:
src/core/services/、src/core/traits/ - 如果存在类似代码 -> 扩展或复用,而不是重复创建
- 如果代码将由 2 个或更多功能使用 -> 在
src/core/中创建
架构(必须采用模块化结构)
| 层 | 位置 | 最大行数 |
|---|---|---|
| 处理器 | src/modules/[feature]/handlers.rs | 50 |
| 服务 | src/modules/[feature]/services.rs | 100 |
| 仓库 | src/modules/[feature]/repository.rs | 100 |
| Trait | src/modules/[feature]/traits.rs | 30 |
| 模型 | src/modules/[feature]/models.rs | 50 |
| 共享代码 | src/core/{services,traits,models}/ | - |
绝不使用扁平的 src/ 结构——始终使用 src/modules/[feature]/
关键规则(必须遵循)
| 规则 | 要求 |
|---|---|
| 文件行数限制 | 100 行(达到 90 行时拆分) |
| 处理器 | 少于 50 行,将工作委托给服务 |
| Trait | 只能放在 traits.rs 或 src/core/traits/ 中 |
| Rustdoc | 每个公开项都必须有 /// 注释 |
| 错误处理 | 使用 thiserror 处理自定义错误 |
| 泛型 | 使用 trait bound,而不是具体类型 |
参考指南
概念
| 主题 | 参考文档 | 查阅时机 |
|---|---|---|
| SOLID 概览 | solid-principles.md | 快速参考 |
| SRP | single-responsibility.md | 结构体臃肿时 |
| OCP | open-closed.md | 添加实现时 |
| LSP | liskov-substitution.md | trait 契约 |
| ISP | interface-segregation.md | trait 臃肿时 |
| DIP | dependency-inversion.md | 泛型/依赖注入 |
| 架构 | architecture-patterns.md | 模块化 crate |
模板
| 模板 | 使用时机 |
|---|---|
| module.md | 功能模块结构 |
| service.md | 业务逻辑服务 |
| trait-def.md | Trait 定义 |
| handler.md | HTTP 处理器(Axum) |
| error.md | 自定义错误(thiserror) |
| test.md | 单元测试和集成测试 |
禁止事项
| 反模式 | 修正方法 |
|---|---|
| 文件超过 100 行 | 达到 90 行时拆分 |
| 在 impl 文件中定义 trait | 移至 traits.rs |
Box<dyn Any> | 使用适当的 trait bound |
扁平的 src/ 结构 | 使用 src/modules/[feature]/ |
| 在库代码中使用 Unwrap | 使用 Result<T, E> |
评论
支持 Markdown