rust
This skill should be used every time you work on Rust projects or Rust code changes in this repository.
SKILL.mdskills/software-engineering/rust/SKILL.md
GitHubRust Project Structure Rules
This file defines the preferred Rust project organization for this repo.
Core Principles
- Organize by domain and feature, not by type.
- Keep orchestration glue in
app/. - Split always-on logic into
core/and optional capabilities intofeatures/. - Each subdomain under
core/and each feature underfeatures/must be its own folder with clear boundaries. - Only add feature files that the feature actually needs (
state.rs,render.rs,ui.rs,helpers.rs). - Avoid type-based folders like
constructors/,methods/,traits/, orenums/.
Top-Level Layout (Typical)
src/
├── lib.rs
├── main.rs
├── app/ # orchestration, wiring, lifecycle
├── core/ # always-on domain + engine
├── features/ # optional capabilities
├── adapters/ # external boundaries (db, http, fs, cli)
├── services/ # infra helpers (watchers, git, timers)
├── config/ # config structs + loaders
└── utils/ # tiny pure helpers only
Top-Level Layout (TUI)
src/
├── main.rs
├── app/ # orchestration, event loop, wiring
├── widgets/ # widget modules (primary organization)
├── screens/ # view composition
├── adapters/ # external boundaries (fs, git, clipboard)
├── services/ # infra helpers (file watching, timers)
├── config/ # config structs + loaders
└── utils/ # tiny pure helpers only
Folder Semantics
app/: glue layer. Composition, wiring, lifecycle, and startup/teardown.- Web:
router.rs,lifecycle.rs - TUI:
event_loop.rs,layout_wiring.rs
- Web:
core/: required engine logic that defines the domain (non-TUI).- Web:
core/model/,core/engine/
- Web:
features/: optional or additive capabilities (non-TUI). Each feature is a folder.- Web:
features/auth/,features/settings/ - TUI:
features/toc/,features/scrollbar
- Web:
widgets/: primary TUI organization unit. Each widget is a bounded folder.- TUI:
widgets/markdown_widget/,widgets/command_palette/
- TUI:
screens/: TUI view composition and layout wiring.- TUI:
screens/dashboard.rs,screens/settings.rs
- TUI:
adapters/: outbound/inbound boundaries to external systems (storage is a kind of adapter).- Web:
adapters/http.rs,adapters/storage.rs - TUI:
adapters/fs.rs,adapters/git.rs
- Web:
services/: internal infrastructure helpers (file watching, git status, timers).- Web:
services/timer.rs,services/clock.rs - TUI:
services/file_watcher.rs,services/git_status.rs
- Web:
config/: config structs + loaders.- Web:
config/app_config.rs - TUI:
config/tui_config.rs
- Web:
utils/: tiny pure helpers only. No IO, no shared state.- Web:
utils/format.rs - TUI:
utils/geometry.rs
- Web:
Core Structure (Subdomain Boundaries)
Each core subdomain is its own folder. Keep code flat inside unless it grows.
src/core/
├── mod.rs
├── model/
├── engine/
├── parser/
├── render/
├── source/
├── events/
└── types/
Feature Structure (Feature Boundaries)
Each feature is a folder. Add state.rs, render.rs, ui.rs, or helpers.rs only when the feature needs them.
src/features/
├── mod.rs
├── toc/
│ ├── mod.rs
│ ├── state.rs
│ ├── render.rs
│ └── helpers.rs
├── selection/
│ ├── mod.rs
│ ├── state.rs
│ └── helpers.rs
└── theme/
├── mod.rs
├── palette.rs
├── style.rs
└── load.rs
File Naming
- Use snake_case filenames.
- Filename matches the primary type or concern.
- One logical concern per file.
Example Structures
Example: CLI App
src/
├── main.rs
├── app/
│ ├── mod.rs
│ ├── bootstrap.rs
│ └── wiring.rs
├── core/
│ ├── mod.rs
│ ├── model/
│ ├── parser/
│ └── engine/
├── features/
│ ├── mod.rs
│ ├── search/
│ │ ├── mod.rs
│ │ └── state.rs
│ └── export/
│ ├── mod.rs
│ └── helpers.rs
├── adapters/
│ ├── mod.rs
│ ├── cli.rs
│ └── fs.rs
├── services/
│ ├── mod.rs
│ └── file_watcher.rs
└── config/
├── mod.rs
└── settings.rs
Example: Web App (Dioxus)
src/
├── main.rs
├── app/
│ ├── mod.rs
│ ├── router.rs
│ └── wiring.rs
├── core/
│ ├── mod.rs
│ ├── model/
│ ├── engine/
│ └── events/
├── features/
│ ├── mod.rs
│ ├── auth/
│ │ ├── mod.rs
│ │ ├── state.rs
│ │ └── ui.rs
│ ├── dashboard/
│ │ ├── mod.rs
│ │ └── ui.rs
│ └── settings/
│ ├── mod.rs
│ └── ui.rs
├── adapters/
│ ├── mod.rs
│ └── http.rs
└── services/
├── mod.rs
└── storage.rs
Example: TUI App (ratatui)
src/
├── main.rs
├── app/
│ ├── mod.rs
│ ├── lifecycle.rs
│ └── wiring.rs
├── screens/
│ ├── mod.rs
│ ├── dashboard.rs
│ └── settings.rs
├── widgets/
│ ├── mod.rs
│ ├── markdown_widget/
│ │ ├── mod.rs
│ │ ├── widget/
│ │ ├── state/
│ │ ├── foundation/
│ │ └── extensions/
│ └── command_palette/
│ ├── mod.rs
│ ├── state.rs
│ └── render.rs
├── adapters/
│ ├── mod.rs
│ └── fs.rs
└── services/
├── mod.rs
└── file_watcher.rs