agy-superpowers 5.2.2 → 5.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -150
- package/package.json +1 -1
- package/template/agent/rules/scratch-scripts.md +37 -0
- package/template/agent/rules/superpowers.md +4 -51
- package/template/agent/skills/ai-integrated-product/SKILL.md +0 -57
- package/template/agent/skills/analytics-setup/SKILL.md +0 -51
- package/template/agent/skills/api-design/SKILL.md +0 -193
- package/template/agent/skills/app-store-optimizer/SKILL.md +0 -127
- package/template/agent/skills/auth-and-identity/SKILL.md +0 -167
- package/template/agent/skills/backend-developer/SKILL.md +0 -148
- package/template/agent/skills/bootstrapper-finance/SKILL.md +0 -55
- package/template/agent/skills/chrome-extension-developer/SKILL.md +0 -53
- package/template/agent/skills/community-manager/SKILL.md +0 -115
- package/template/agent/skills/content-marketer/SKILL.md +0 -111
- package/template/agent/skills/conversion-optimizer/SKILL.md +0 -142
- package/template/agent/skills/cto-architect/SKILL.md +0 -133
- package/template/agent/skills/customer-success-manager/SKILL.md +0 -126
- package/template/agent/skills/data-analyst/SKILL.md +0 -147
- package/template/agent/skills/devops-engineer/SKILL.md +0 -117
- package/template/agent/skills/email-infrastructure/SKILL.md +0 -164
- package/template/agent/skills/game-design/SKILL.md +0 -194
- package/template/agent/skills/game-developer/SKILL.md +0 -175
- package/template/agent/skills/growth-hacker/SKILL.md +0 -122
- package/template/agent/skills/idea-validator/SKILL.md +0 -55
- package/template/agent/skills/indie-legal/SKILL.md +0 -53
- package/template/agent/skills/influencer-marketer/SKILL.md +0 -141
- package/template/agent/skills/landing-page-builder/SKILL.md +0 -59
- package/template/agent/skills/launch-strategist/SKILL.md +0 -62
- package/template/agent/skills/market-researcher/SKILL.md +0 -53
- package/template/agent/skills/micro-saas-builder/SKILL.md +0 -56
- package/template/agent/skills/monetization-strategist/SKILL.md +0 -119
- package/template/agent/skills/paid-acquisition-specialist/SKILL.md +0 -119
- package/template/agent/skills/pricing-psychologist/SKILL.md +0 -58
- package/template/agent/skills/real-time-features/SKILL.md +0 -194
- package/template/agent/skills/retention-specialist/SKILL.md +0 -123
- package/template/agent/skills/rust-developer/SKILL.md +0 -281
- package/template/agent/skills/rust-developer/references/rust-rules/_sections.md +0 -231
- package/template/agent/skills/rust-developer/references/rust-rules/anti-clone-excessive.md +0 -124
- package/template/agent/skills/rust-developer/references/rust-rules/anti-collect-intermediate.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/anti-empty-catch.md +0 -132
- package/template/agent/skills/rust-developer/references/rust-rules/anti-expect-lazy.md +0 -95
- package/template/agent/skills/rust-developer/references/rust-rules/anti-format-hot-path.md +0 -141
- package/template/agent/skills/rust-developer/references/rust-rules/anti-index-over-iter.md +0 -125
- package/template/agent/skills/rust-developer/references/rust-rules/anti-lock-across-await.md +0 -127
- package/template/agent/skills/rust-developer/references/rust-rules/anti-over-abstraction.md +0 -120
- package/template/agent/skills/rust-developer/references/rust-rules/anti-panic-expected.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/anti-premature-optimize.md +0 -156
- package/template/agent/skills/rust-developer/references/rust-rules/anti-string-for-str.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/anti-stringly-typed.md +0 -167
- package/template/agent/skills/rust-developer/references/rust-rules/anti-type-erasure.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/anti-unwrap-abuse.md +0 -143
- package/template/agent/skills/rust-developer/references/rust-rules/anti-vec-for-slice.md +0 -121
- package/template/agent/skills/rust-developer/references/rust-rules/api-builder-must-use.md +0 -143
- package/template/agent/skills/rust-developer/references/rust-rules/api-builder-pattern.md +0 -187
- package/template/agent/skills/rust-developer/references/rust-rules/api-common-traits.md +0 -165
- package/template/agent/skills/rust-developer/references/rust-rules/api-default-impl.md +0 -177
- package/template/agent/skills/rust-developer/references/rust-rules/api-extension-trait.md +0 -163
- package/template/agent/skills/rust-developer/references/rust-rules/api-from-not-into.md +0 -146
- package/template/agent/skills/rust-developer/references/rust-rules/api-impl-asref.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/api-impl-into.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/api-must-use.md +0 -125
- package/template/agent/skills/rust-developer/references/rust-rules/api-newtype-safety.md +0 -162
- package/template/agent/skills/rust-developer/references/rust-rules/api-non-exhaustive.md +0 -177
- package/template/agent/skills/rust-developer/references/rust-rules/api-parse-dont-validate.md +0 -184
- package/template/agent/skills/rust-developer/references/rust-rules/api-sealed-trait.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/api-serde-optional.md +0 -182
- package/template/agent/skills/rust-developer/references/rust-rules/api-typestate.md +0 -199
- package/template/agent/skills/rust-developer/references/rust-rules/async-bounded-channel.md +0 -175
- package/template/agent/skills/rust-developer/references/rust-rules/async-broadcast-pubsub.md +0 -185
- package/template/agent/skills/rust-developer/references/rust-rules/async-cancellation-token.md +0 -203
- package/template/agent/skills/rust-developer/references/rust-rules/async-clone-before-await.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/async-join-parallel.md +0 -158
- package/template/agent/skills/rust-developer/references/rust-rules/async-joinset-structured.md +0 -195
- package/template/agent/skills/rust-developer/references/rust-rules/async-mpsc-queue.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/async-no-lock-await.md +0 -156
- package/template/agent/skills/rust-developer/references/rust-rules/async-oneshot-response.md +0 -191
- package/template/agent/skills/rust-developer/references/rust-rules/async-select-racing.md +0 -198
- package/template/agent/skills/rust-developer/references/rust-rules/async-spawn-blocking.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-fs.md +0 -167
- package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-runtime.md +0 -169
- package/template/agent/skills/rust-developer/references/rust-rules/async-try-join.md +0 -172
- package/template/agent/skills/rust-developer/references/rust-rules/async-watch-latest.md +0 -189
- package/template/agent/skills/rust-developer/references/rust-rules/doc-all-public.md +0 -113
- package/template/agent/skills/rust-developer/references/rust-rules/doc-cargo-metadata.md +0 -147
- package/template/agent/skills/rust-developer/references/rust-rules/doc-errors-section.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/doc-examples-section.md +0 -161
- package/template/agent/skills/rust-developer/references/rust-rules/doc-hidden-setup.md +0 -149
- package/template/agent/skills/rust-developer/references/rust-rules/doc-intra-links.md +0 -138
- package/template/agent/skills/rust-developer/references/rust-rules/doc-link-types.md +0 -169
- package/template/agent/skills/rust-developer/references/rust-rules/doc-module-inner.md +0 -116
- package/template/agent/skills/rust-developer/references/rust-rules/doc-panics-section.md +0 -128
- package/template/agent/skills/rust-developer/references/rust-rules/doc-question-mark.md +0 -136
- package/template/agent/skills/rust-developer/references/rust-rules/doc-safety-section.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/err-anyhow-app.md +0 -179
- package/template/agent/skills/rust-developer/references/rust-rules/err-context-chain.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/err-custom-type.md +0 -152
- package/template/agent/skills/rust-developer/references/rust-rules/err-doc-errors.md +0 -145
- package/template/agent/skills/rust-developer/references/rust-rules/err-expect-bugs-only.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/err-from-impl.md +0 -152
- package/template/agent/skills/rust-developer/references/rust-rules/err-lowercase-msg.md +0 -124
- package/template/agent/skills/rust-developer/references/rust-rules/err-no-unwrap-prod.md +0 -115
- package/template/agent/skills/rust-developer/references/rust-rules/err-question-mark.md +0 -151
- package/template/agent/skills/rust-developer/references/rust-rules/err-result-over-panic.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/err-source-chain.md +0 -155
- package/template/agent/skills/rust-developer/references/rust-rules/err-thiserror-lib.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/lint-cargo-metadata.md +0 -138
- package/template/agent/skills/rust-developer/references/rust-rules/lint-deny-correctness.md +0 -107
- package/template/agent/skills/rust-developer/references/rust-rules/lint-missing-docs.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/lint-pedantic-selective.md +0 -118
- package/template/agent/skills/rust-developer/references/rust-rules/lint-rustfmt-check.md +0 -157
- package/template/agent/skills/rust-developer/references/rust-rules/lint-unsafe-doc.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-complexity.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-perf.md +0 -136
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-style.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-suspicious.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/lint-workspace-lints.md +0 -172
- package/template/agent/skills/rust-developer/references/rust-rules/mem-arena-allocator.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/mem-arrayvec.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/mem-assert-type-size.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/mem-avoid-format.md +0 -147
- package/template/agent/skills/rust-developer/references/rust-rules/mem-box-large-variant.md +0 -158
- package/template/agent/skills/rust-developer/references/rust-rules/mem-boxed-slice.md +0 -139
- package/template/agent/skills/rust-developer/references/rust-rules/mem-clone-from.md +0 -147
- package/template/agent/skills/rust-developer/references/rust-rules/mem-compact-string.md +0 -149
- package/template/agent/skills/rust-developer/references/rust-rules/mem-reuse-collections.md +0 -174
- package/template/agent/skills/rust-developer/references/rust-rules/mem-smaller-integers.md +0 -159
- package/template/agent/skills/rust-developer/references/rust-rules/mem-smallvec.md +0 -138
- package/template/agent/skills/rust-developer/references/rust-rules/mem-thinvec.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/mem-with-capacity.md +0 -156
- package/template/agent/skills/rust-developer/references/rust-rules/mem-write-over-format.md +0 -172
- package/template/agent/skills/rust-developer/references/rust-rules/mem-zero-copy.md +0 -164
- package/template/agent/skills/rust-developer/references/rust-rules/name-acronym-word.md +0 -99
- package/template/agent/skills/rust-developer/references/rust-rules/name-as-free.md +0 -104
- package/template/agent/skills/rust-developer/references/rust-rules/name-consts-screaming.md +0 -94
- package/template/agent/skills/rust-developer/references/rust-rules/name-crate-no-rs.md +0 -78
- package/template/agent/skills/rust-developer/references/rust-rules/name-funcs-snake.md +0 -76
- package/template/agent/skills/rust-developer/references/rust-rules/name-into-ownership.md +0 -123
- package/template/agent/skills/rust-developer/references/rust-rules/name-is-has-bool.md +0 -127
- package/template/agent/skills/rust-developer/references/rust-rules/name-iter-convention.md +0 -129
- package/template/agent/skills/rust-developer/references/rust-rules/name-iter-method.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/name-iter-type-match.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/name-lifetime-short.md +0 -86
- package/template/agent/skills/rust-developer/references/rust-rules/name-no-get-prefix.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/name-to-expensive.md +0 -118
- package/template/agent/skills/rust-developer/references/rust-rules/name-type-param-single.md +0 -92
- package/template/agent/skills/rust-developer/references/rust-rules/name-types-camel.md +0 -65
- package/template/agent/skills/rust-developer/references/rust-rules/name-variants-camel.md +0 -101
- package/template/agent/skills/rust-developer/references/rust-rules/opt-bounds-check.md +0 -161
- package/template/agent/skills/rust-developer/references/rust-rules/opt-cache-friendly.md +0 -187
- package/template/agent/skills/rust-developer/references/rust-rules/opt-codegen-units.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/opt-cold-unlikely.md +0 -152
- package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-always-rare.md +0 -141
- package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-never-cold.md +0 -181
- package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-small.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/opt-likely-hint.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/opt-lto-release.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/opt-pgo-profile.md +0 -167
- package/template/agent/skills/rust-developer/references/rust-rules/opt-simd-portable.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/opt-target-cpu.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/own-arc-shared.md +0 -141
- package/template/agent/skills/rust-developer/references/rust-rules/own-borrow-over-clone.md +0 -95
- package/template/agent/skills/rust-developer/references/rust-rules/own-clone-explicit.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/own-copy-small.md +0 -124
- package/template/agent/skills/rust-developer/references/rust-rules/own-cow-conditional.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/own-lifetime-elision.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/own-move-large.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/own-mutex-interior.md +0 -105
- package/template/agent/skills/rust-developer/references/rust-rules/own-rc-single-thread.md +0 -65
- package/template/agent/skills/rust-developer/references/rust-rules/own-refcell-interior.md +0 -97
- package/template/agent/skills/rust-developer/references/rust-rules/own-rwlock-readers.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/own-slice-over-vec.md +0 -119
- package/template/agent/skills/rust-developer/references/rust-rules/perf-black-box-bench.md +0 -153
- package/template/agent/skills/rust-developer/references/rust-rules/perf-chain-avoid.md +0 -136
- package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-into.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-once.md +0 -120
- package/template/agent/skills/rust-developer/references/rust-rules/perf-drain-reuse.md +0 -137
- package/template/agent/skills/rust-developer/references/rust-rules/perf-entry-api.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/perf-extend-batch.md +0 -150
- package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-lazy.md +0 -123
- package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-over-index.md +0 -113
- package/template/agent/skills/rust-developer/references/rust-rules/perf-profile-first.md +0 -175
- package/template/agent/skills/rust-developer/references/rust-rules/perf-release-profile.md +0 -149
- package/template/agent/skills/rust-developer/references/rust-rules/proj-bin-dir.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/proj-flat-small.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/proj-lib-main-split.md +0 -148
- package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-by-feature.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-rs-dir.md +0 -120
- package/template/agent/skills/rust-developer/references/rust-rules/proj-prelude-module.md +0 -155
- package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-crate-internal.md +0 -139
- package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-super-parent.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-use-reexport.md +0 -162
- package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-deps.md +0 -186
- package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-large.md +0 -162
- package/template/agent/skills/rust-developer/references/rust-rules/test-arrange-act-assert.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/test-cfg-test-module.md +0 -151
- package/template/agent/skills/rust-developer/references/rust-rules/test-criterion-bench.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/test-descriptive-names.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/test-doctest-examples.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/test-fixture-raii.md +0 -151
- package/template/agent/skills/rust-developer/references/rust-rules/test-integration-dir.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/test-mock-traits.md +0 -189
- package/template/agent/skills/rust-developer/references/rust-rules/test-mockall-mocking.md +0 -226
- package/template/agent/skills/rust-developer/references/rust-rules/test-proptest-properties.md +0 -161
- package/template/agent/skills/rust-developer/references/rust-rules/test-should-panic.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/test-tokio-async.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/test-use-super.md +0 -127
- package/template/agent/skills/rust-developer/references/rust-rules/type-enum-states.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/type-generic-bounds.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/type-never-diverge.md +0 -146
- package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-ids.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-validated.md +0 -159
- package/template/agent/skills/rust-developer/references/rust-rules/type-no-stringly.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/type-option-nullable.md +0 -137
- package/template/agent/skills/rust-developer/references/rust-rules/type-phantom-marker.md +0 -188
- package/template/agent/skills/rust-developer/references/rust-rules/type-repr-transparent.md +0 -143
- package/template/agent/skills/rust-developer/references/rust-rules/type-result-fallible.md +0 -131
- package/template/agent/skills/saas-architect/SKILL.md +0 -139
- package/template/agent/skills/security-engineer/SKILL.md +0 -133
- package/template/agent/skills/seo-specialist/SKILL.md +0 -130
- package/template/agent/skills/solo-founder-ops/SKILL.md +0 -56
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
# proj-bin-dir
|
|
2
|
-
|
|
3
|
-
> Put multiple binaries in src/bin/
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
When a crate produces multiple binaries, placing them in `src/bin/` keeps the project organized. Each file becomes a separate binary target automatically, without manual `Cargo.toml` configuration.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```
|
|
12
|
-
my-project/
|
|
13
|
-
├── Cargo.toml # Complex [[bin]] sections for each binary
|
|
14
|
-
├── src/
|
|
15
|
-
│ ├── main.rs # Which binary is this?
|
|
16
|
-
│ ├── server.rs # Is this a module or binary?
|
|
17
|
-
│ ├── cli.rs # Unclear
|
|
18
|
-
│ └── lib.rs
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
```toml
|
|
22
|
-
# Cargo.toml - verbose and error-prone
|
|
23
|
-
[[bin]]
|
|
24
|
-
name = "server"
|
|
25
|
-
path = "src/server.rs"
|
|
26
|
-
|
|
27
|
-
[[bin]]
|
|
28
|
-
name = "cli"
|
|
29
|
-
path = "src/cli.rs"
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
## Good
|
|
33
|
-
|
|
34
|
-
```
|
|
35
|
-
my-project/
|
|
36
|
-
├── Cargo.toml # Clean, no [[bin]] needed
|
|
37
|
-
├── src/
|
|
38
|
-
│ ├── lib.rs # Shared library code
|
|
39
|
-
│ └── bin/
|
|
40
|
-
│ ├── server.rs # Binary: my-project-server (or just server)
|
|
41
|
-
│ └── cli.rs # Binary: my-project-cli (or just cli)
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
Each file in `src/bin/` automatically becomes a binary named after the file.
|
|
45
|
-
|
|
46
|
-
## Running Binaries
|
|
47
|
-
|
|
48
|
-
```bash
|
|
49
|
-
# Run specific binary
|
|
50
|
-
cargo run --bin server
|
|
51
|
-
cargo run --bin cli
|
|
52
|
-
|
|
53
|
-
# Build specific binary
|
|
54
|
-
cargo build --bin server
|
|
55
|
-
|
|
56
|
-
# Build all binaries
|
|
57
|
-
cargo build --bins
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
## Pattern: Binary with Multiple Files
|
|
61
|
-
|
|
62
|
-
For complex binaries, use directories:
|
|
63
|
-
|
|
64
|
-
```
|
|
65
|
-
src/
|
|
66
|
-
├── lib.rs
|
|
67
|
-
└── bin/
|
|
68
|
-
├── server/
|
|
69
|
-
│ ├── main.rs # Entry point
|
|
70
|
-
│ ├── config.rs # Server-specific module
|
|
71
|
-
│ └── handlers.rs
|
|
72
|
-
└── cli/
|
|
73
|
-
├── main.rs
|
|
74
|
-
└── commands.rs
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
## Pattern: Shared Library Code
|
|
78
|
-
|
|
79
|
-
```rust
|
|
80
|
-
// src/lib.rs - Shared code
|
|
81
|
-
pub mod config;
|
|
82
|
-
pub mod database;
|
|
83
|
-
pub mod models;
|
|
84
|
-
|
|
85
|
-
// src/bin/server.rs - Server binary
|
|
86
|
-
use my_project::{config, database, models};
|
|
87
|
-
|
|
88
|
-
fn main() {
|
|
89
|
-
let config = config::load();
|
|
90
|
-
let db = database::connect(&config);
|
|
91
|
-
// ...
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// src/bin/cli.rs - CLI binary
|
|
95
|
-
use my_project::{config, models};
|
|
96
|
-
|
|
97
|
-
fn main() {
|
|
98
|
-
let config = config::load();
|
|
99
|
-
// CLI logic using shared code
|
|
100
|
-
}
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
## Binary Naming
|
|
104
|
-
|
|
105
|
-
| File Path | Binary Name |
|
|
106
|
-
|-----------|-------------|
|
|
107
|
-
| `src/main.rs` | `my-project` (crate name) |
|
|
108
|
-
| `src/bin/server.rs` | `server` |
|
|
109
|
-
| `src/bin/my-cli.rs` | `my-cli` |
|
|
110
|
-
| `src/bin/server/main.rs` | `server` |
|
|
111
|
-
|
|
112
|
-
## Explicit Configuration
|
|
113
|
-
|
|
114
|
-
When you need custom settings:
|
|
115
|
-
|
|
116
|
-
```toml
|
|
117
|
-
[[bin]]
|
|
118
|
-
name = "my-server"
|
|
119
|
-
path = "src/bin/server.rs"
|
|
120
|
-
required-features = ["server"]
|
|
121
|
-
|
|
122
|
-
[[bin]]
|
|
123
|
-
name = "my-cli"
|
|
124
|
-
path = "src/bin/cli.rs"
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
## Pattern: Default Binary
|
|
128
|
-
|
|
129
|
-
```toml
|
|
130
|
-
# src/main.rs is the default binary
|
|
131
|
-
# Additional binaries in src/bin/
|
|
132
|
-
|
|
133
|
-
[package]
|
|
134
|
-
name = "my-tool"
|
|
135
|
-
default-run = "my-tool" # Or specify another
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
## See Also
|
|
139
|
-
|
|
140
|
-
- [proj-lib-main-split](./proj-lib-main-split.md) - Keep main.rs minimal
|
|
141
|
-
- [proj-workspace-large](./proj-workspace-large.md) - Workspace for larger projects
|
|
142
|
-
- [proj-flat-small](./proj-flat-small.md) - Simple project structure
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
# proj-flat-small
|
|
2
|
-
|
|
3
|
-
> Keep small projects flat
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Over-organizing small projects adds navigation overhead without benefit. A project with 5-10 files doesn't need nested directories. Start flat, add structure only when complexity demands it.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```
|
|
12
|
-
src/
|
|
13
|
-
├── core/
|
|
14
|
-
│ └── mod.rs # Just re-exports
|
|
15
|
-
├── domain/
|
|
16
|
-
│ ├── mod.rs
|
|
17
|
-
│ └── models/
|
|
18
|
-
│ ├── mod.rs
|
|
19
|
-
│ └── user.rs # 50 lines
|
|
20
|
-
├── infrastructure/
|
|
21
|
-
│ ├── mod.rs
|
|
22
|
-
│ └── database/
|
|
23
|
-
│ ├── mod.rs
|
|
24
|
-
│ └── connection.rs # 30 lines
|
|
25
|
-
├── application/
|
|
26
|
-
│ ├── mod.rs
|
|
27
|
-
│ └── services/
|
|
28
|
-
│ └── mod.rs # Empty
|
|
29
|
-
└── main.rs
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
## Good
|
|
33
|
-
|
|
34
|
-
```
|
|
35
|
-
src/
|
|
36
|
-
├── main.rs
|
|
37
|
-
├── lib.rs
|
|
38
|
-
├── config.rs
|
|
39
|
-
├── database.rs
|
|
40
|
-
├── user.rs
|
|
41
|
-
└── error.rs
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
## When to Add Structure
|
|
45
|
-
|
|
46
|
-
| File Count | Structure |
|
|
47
|
-
|------------|-----------|
|
|
48
|
-
| < 10 files | Flat in `src/` |
|
|
49
|
-
| 10-20 files | Group by feature |
|
|
50
|
-
| 20+ files | Feature folders with submodules |
|
|
51
|
-
|
|
52
|
-
## Progressive Structuring
|
|
53
|
-
|
|
54
|
-
### Stage 1: Flat
|
|
55
|
-
|
|
56
|
-
```
|
|
57
|
-
src/
|
|
58
|
-
├── main.rs
|
|
59
|
-
├── config.rs
|
|
60
|
-
├── user.rs
|
|
61
|
-
└── database.rs
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
### Stage 2: Logical Groups
|
|
65
|
-
|
|
66
|
-
```
|
|
67
|
-
src/
|
|
68
|
-
├── main.rs
|
|
69
|
-
├── config.rs
|
|
70
|
-
├── user.rs
|
|
71
|
-
├── order.rs # Getting bigger
|
|
72
|
-
├── order_item.rs # Related to order
|
|
73
|
-
└── database.rs
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
### Stage 3: Feature Folders
|
|
77
|
-
|
|
78
|
-
```
|
|
79
|
-
src/
|
|
80
|
-
├── main.rs
|
|
81
|
-
├── config.rs
|
|
82
|
-
├── user.rs
|
|
83
|
-
├── order/ # Now complex enough
|
|
84
|
-
│ ├── mod.rs
|
|
85
|
-
│ ├── model.rs
|
|
86
|
-
│ └── item.rs
|
|
87
|
-
└── database.rs
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
## Signs You Need More Structure
|
|
91
|
-
|
|
92
|
-
- Files exceed 300-500 lines
|
|
93
|
-
- Related files are hard to identify
|
|
94
|
-
- You're adding `_` prefixes for grouping (`user_model.rs`, `user_service.rs`)
|
|
95
|
-
- New team members get lost
|
|
96
|
-
- Same concepts repeated in file names
|
|
97
|
-
|
|
98
|
-
## Signs of Over-Structure
|
|
99
|
-
|
|
100
|
-
- Folders with 1-2 files
|
|
101
|
-
- `mod.rs` files that only re-export
|
|
102
|
-
- Deep nesting for simple concepts
|
|
103
|
-
- More lines in module declarations than code
|
|
104
|
-
|
|
105
|
-
## Example: CLI Tool
|
|
106
|
-
|
|
107
|
-
```
|
|
108
|
-
src/
|
|
109
|
-
├── main.rs # Argument parsing, entry point
|
|
110
|
-
├── commands.rs # CLI subcommands
|
|
111
|
-
├── config.rs # Configuration loading
|
|
112
|
-
└── output.rs # Formatting, printing
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
Not:
|
|
116
|
-
|
|
117
|
-
```
|
|
118
|
-
src/
|
|
119
|
-
├── cli/
|
|
120
|
-
│ └── commands/
|
|
121
|
-
│ └── mod.rs
|
|
122
|
-
├── config/
|
|
123
|
-
│ └── mod.rs
|
|
124
|
-
└── presentation/
|
|
125
|
-
└── output/
|
|
126
|
-
└── mod.rs
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
## See Also
|
|
130
|
-
|
|
131
|
-
- [proj-mod-by-feature](./proj-mod-by-feature.md) - Feature organization
|
|
132
|
-
- [proj-lib-main-split](./proj-lib-main-split.md) - Lib/main separation
|
|
133
|
-
- [proj-mod-rs-dir](./proj-mod-rs-dir.md) - Multi-file modules
|
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
# proj-lib-main-split
|
|
2
|
-
|
|
3
|
-
> Keep `main.rs` minimal, logic in `lib.rs`
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Putting your logic in `lib.rs` makes it testable, reusable, and keeps `main.rs` as a thin entry point. Integration tests can only access your library crate, not binary code in `main.rs`.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
// src/main.rs - everything here
|
|
13
|
-
fn main() {
|
|
14
|
-
let args = parse_args();
|
|
15
|
-
let config = load_config(&args.config_path).unwrap();
|
|
16
|
-
let db = connect_database(&config.db_url).unwrap();
|
|
17
|
-
|
|
18
|
-
// Hundreds of lines of application logic...
|
|
19
|
-
// All untestable from integration tests!
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
fn parse_args() -> Args { /* ... */ }
|
|
23
|
-
fn load_config(path: &str) -> Result<Config, Error> { /* ... */ }
|
|
24
|
-
fn connect_database(url: &str) -> Result<Db, Error> { /* ... */ }
|
|
25
|
-
// ... more functions that can't be tested
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## Good
|
|
29
|
-
|
|
30
|
-
```rust
|
|
31
|
-
// src/main.rs - thin entry point
|
|
32
|
-
use my_app::{run, Config};
|
|
33
|
-
|
|
34
|
-
fn main() -> anyhow::Result<()> {
|
|
35
|
-
let config = Config::from_env()?;
|
|
36
|
-
run(config)
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// src/lib.rs - all the logic
|
|
40
|
-
pub mod config;
|
|
41
|
-
pub mod database;
|
|
42
|
-
pub mod handlers;
|
|
43
|
-
|
|
44
|
-
pub use config::Config;
|
|
45
|
-
|
|
46
|
-
pub fn run(config: Config) -> anyhow::Result<()> {
|
|
47
|
-
let db = database::connect(&config.db_url)?;
|
|
48
|
-
let app = handlers::build_app(db);
|
|
49
|
-
app.run()
|
|
50
|
-
}
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
## With CLI Arguments
|
|
54
|
-
|
|
55
|
-
```rust
|
|
56
|
-
// src/main.rs
|
|
57
|
-
use clap::Parser;
|
|
58
|
-
use my_app::{run, Args};
|
|
59
|
-
|
|
60
|
-
fn main() -> anyhow::Result<()> {
|
|
61
|
-
let args = Args::parse();
|
|
62
|
-
run(args)
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// src/lib.rs
|
|
66
|
-
use clap::Parser;
|
|
67
|
-
|
|
68
|
-
#[derive(Parser, Debug)]
|
|
69
|
-
#[command(name = "myapp", version, about)]
|
|
70
|
-
pub struct Args {
|
|
71
|
-
#[arg(short, long)]
|
|
72
|
-
pub config: PathBuf,
|
|
73
|
-
|
|
74
|
-
#[arg(short, long, default_value = "info")]
|
|
75
|
-
pub log_level: String,
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
pub fn run(args: Args) -> anyhow::Result<()> {
|
|
79
|
-
// All application logic here - testable!
|
|
80
|
-
}
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
## Project Structure
|
|
84
|
-
|
|
85
|
-
```
|
|
86
|
-
my_app/
|
|
87
|
-
├── Cargo.toml
|
|
88
|
-
├── src/
|
|
89
|
-
│ ├── main.rs # Entry point only
|
|
90
|
-
│ ├── lib.rs # Library root, re-exports
|
|
91
|
-
│ ├── config.rs # Configuration
|
|
92
|
-
│ ├── database.rs # Database connection
|
|
93
|
-
│ └── handlers/ # Request handlers
|
|
94
|
-
│ ├── mod.rs
|
|
95
|
-
│ └── users.rs
|
|
96
|
-
└── tests/
|
|
97
|
-
└── integration.rs # Can access lib.rs!
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
## Testing Benefits
|
|
101
|
-
|
|
102
|
-
```rust
|
|
103
|
-
// tests/integration.rs - can test everything!
|
|
104
|
-
use my_app::{Config, run, database};
|
|
105
|
-
|
|
106
|
-
#[test]
|
|
107
|
-
fn test_database_connection() {
|
|
108
|
-
let config = Config::test_config();
|
|
109
|
-
let db = database::connect(&config.db_url).unwrap();
|
|
110
|
-
assert!(db.is_connected());
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
#[test]
|
|
114
|
-
fn test_full_workflow() {
|
|
115
|
-
let config = Config::test_config();
|
|
116
|
-
// Test the actual run function
|
|
117
|
-
assert!(my_app::run(config).is_ok());
|
|
118
|
-
}
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
## Multiple Binaries
|
|
122
|
-
|
|
123
|
-
```rust
|
|
124
|
-
// src/lib.rs - shared code
|
|
125
|
-
pub mod core;
|
|
126
|
-
pub mod utils;
|
|
127
|
-
|
|
128
|
-
// src/bin/server.rs
|
|
129
|
-
use my_app::core::Server;
|
|
130
|
-
|
|
131
|
-
fn main() -> anyhow::Result<()> {
|
|
132
|
-
Server::new()?.run()
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
// src/bin/cli.rs
|
|
136
|
-
use my_app::core::Client;
|
|
137
|
-
|
|
138
|
-
fn main() -> anyhow::Result<()> {
|
|
139
|
-
let client = Client::new()?;
|
|
140
|
-
client.execute_command()
|
|
141
|
-
}
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
## See Also
|
|
145
|
-
|
|
146
|
-
- [proj-bin-dir](proj-bin-dir.md) - Put multiple binaries in src/bin/
|
|
147
|
-
- [proj-mod-by-feature](proj-mod-by-feature.md) - Organize modules by feature
|
|
148
|
-
- [test-integration-dir](test-integration-dir.md) - Integration tests in tests/
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
# proj-mod-by-feature
|
|
2
|
-
|
|
3
|
-
> Organize modules by feature, not type
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Feature-based organization keeps related code together, making navigation intuitive and changes localized. Type-based organization (all handlers in one folder, all models in another) scatters related code across the codebase, making features harder to understand and modify.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```
|
|
12
|
-
src/
|
|
13
|
-
├── controllers/
|
|
14
|
-
│ ├── user_controller.rs
|
|
15
|
-
│ ├── order_controller.rs
|
|
16
|
-
│ └── product_controller.rs
|
|
17
|
-
├── models/
|
|
18
|
-
│ ├── user.rs
|
|
19
|
-
│ ├── order.rs
|
|
20
|
-
│ └── product.rs
|
|
21
|
-
├── services/
|
|
22
|
-
│ ├── user_service.rs
|
|
23
|
-
│ ├── order_service.rs
|
|
24
|
-
│ └── product_service.rs
|
|
25
|
-
└── repositories/
|
|
26
|
-
├── user_repository.rs
|
|
27
|
-
├── order_repository.rs
|
|
28
|
-
└── product_repository.rs
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
## Good
|
|
32
|
-
|
|
33
|
-
```
|
|
34
|
-
src/
|
|
35
|
-
├── user/
|
|
36
|
-
│ ├── mod.rs # Re-exports public items
|
|
37
|
-
│ ├── model.rs # User struct, types
|
|
38
|
-
│ ├── repository.rs # Database operations
|
|
39
|
-
│ ├── service.rs # Business logic
|
|
40
|
-
│ └── handler.rs # HTTP handlers
|
|
41
|
-
├── order/
|
|
42
|
-
│ ├── mod.rs
|
|
43
|
-
│ ├── model.rs
|
|
44
|
-
│ ├── repository.rs
|
|
45
|
-
│ ├── service.rs
|
|
46
|
-
│ └── handler.rs
|
|
47
|
-
├── product/
|
|
48
|
-
│ ├── mod.rs
|
|
49
|
-
│ ├── model.rs
|
|
50
|
-
│ ├── repository.rs
|
|
51
|
-
│ └── handler.rs
|
|
52
|
-
└── lib.rs
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
## Benefits
|
|
56
|
-
|
|
57
|
-
| Aspect | Type-Based | Feature-Based |
|
|
58
|
-
|--------|------------|---------------|
|
|
59
|
-
| Finding code | Search across folders | One folder per feature |
|
|
60
|
-
| Adding feature | Touch 4+ folders | Create one folder |
|
|
61
|
-
| Understanding feature | Jump between folders | Everything in one place |
|
|
62
|
-
| Deleting feature | Hunt through codebase | Delete one folder |
|
|
63
|
-
| Code ownership | Unclear | Clear feature owners |
|
|
64
|
-
|
|
65
|
-
## Module Structure
|
|
66
|
-
|
|
67
|
-
```rust
|
|
68
|
-
// src/user/mod.rs
|
|
69
|
-
mod model;
|
|
70
|
-
mod repository;
|
|
71
|
-
mod service;
|
|
72
|
-
mod handler;
|
|
73
|
-
|
|
74
|
-
// Re-export public API
|
|
75
|
-
pub use model::{User, UserId, CreateUserRequest};
|
|
76
|
-
pub use handler::router;
|
|
77
|
-
pub(crate) use service::UserService;
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
## Shared Code
|
|
81
|
-
|
|
82
|
-
```
|
|
83
|
-
src/
|
|
84
|
-
├── user/
|
|
85
|
-
├── order/
|
|
86
|
-
├── shared/ # Cross-cutting concerns
|
|
87
|
-
│ ├── mod.rs
|
|
88
|
-
│ ├── database.rs # Connection pool
|
|
89
|
-
│ ├── error.rs # Common error types
|
|
90
|
-
│ └── middleware.rs # Auth, logging
|
|
91
|
-
└── lib.rs
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
## When to Flatten
|
|
95
|
-
|
|
96
|
-
Small modules don't need deep nesting:
|
|
97
|
-
|
|
98
|
-
```
|
|
99
|
-
src/
|
|
100
|
-
├── user/
|
|
101
|
-
│ ├── mod.rs # Contains User struct + simple functions
|
|
102
|
-
│ └── repository.rs # Only if complex enough
|
|
103
|
-
├── config.rs # Simple enough for single file
|
|
104
|
-
└── lib.rs
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
## Hybrid Approach
|
|
108
|
-
|
|
109
|
-
For larger features, nest further by concern:
|
|
110
|
-
|
|
111
|
-
```
|
|
112
|
-
src/
|
|
113
|
-
├── billing/
|
|
114
|
-
│ ├── mod.rs
|
|
115
|
-
│ ├── invoice/
|
|
116
|
-
│ │ ├── mod.rs
|
|
117
|
-
│ │ ├── model.rs
|
|
118
|
-
│ │ └── service.rs
|
|
119
|
-
│ ├── payment/
|
|
120
|
-
│ │ ├── mod.rs
|
|
121
|
-
│ │ ├── model.rs
|
|
122
|
-
│ │ └── processor.rs
|
|
123
|
-
│ └── shared.rs
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
## See Also
|
|
127
|
-
|
|
128
|
-
- [proj-flat-small](./proj-flat-small.md) - Keep small projects flat
|
|
129
|
-
- [proj-pub-use-reexport](./proj-pub-use-reexport.md) - Clean public API
|
|
130
|
-
- [proj-lib-main-split](./proj-lib-main-split.md) - Lib/main separation
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
# proj-mod-rs-dir
|
|
2
|
-
|
|
3
|
-
> Use mod.rs for multi-file modules
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Rust offers two styles for multi-file modules. The `mod.rs` style is clearer for larger modules and aligns with how most Rust projects are structured. Choose one style consistently.
|
|
8
|
-
|
|
9
|
-
## Two Styles
|
|
10
|
-
|
|
11
|
-
### Style 1: mod.rs (Recommended for larger modules)
|
|
12
|
-
|
|
13
|
-
```
|
|
14
|
-
src/
|
|
15
|
-
├── user/
|
|
16
|
-
│ ├── mod.rs # Module root
|
|
17
|
-
│ ├── model.rs
|
|
18
|
-
│ └── repository.rs
|
|
19
|
-
└── lib.rs
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
```rust
|
|
23
|
-
// src/lib.rs
|
|
24
|
-
mod user; // Looks for user/mod.rs or user.rs
|
|
25
|
-
|
|
26
|
-
// src/user/mod.rs
|
|
27
|
-
mod model;
|
|
28
|
-
mod repository;
|
|
29
|
-
pub use model::User;
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
### Style 2: Adjacent file (Recommended for smaller modules)
|
|
33
|
-
|
|
34
|
-
```
|
|
35
|
-
src/
|
|
36
|
-
├── user.rs # Module root
|
|
37
|
-
├── user/
|
|
38
|
-
│ ├── model.rs
|
|
39
|
-
│ └── repository.rs
|
|
40
|
-
└── lib.rs
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
```rust
|
|
44
|
-
// src/lib.rs
|
|
45
|
-
mod user; // Looks for user.rs, then user/ for submodules
|
|
46
|
-
|
|
47
|
-
// src/user.rs
|
|
48
|
-
mod model;
|
|
49
|
-
mod repository;
|
|
50
|
-
pub use model::User;
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
## When to Use Each
|
|
54
|
-
|
|
55
|
-
| Scenario | Recommendation |
|
|
56
|
-
|----------|----------------|
|
|
57
|
-
| Simple module (1-3 submodules) | Adjacent file (`user.rs` + `user/`) |
|
|
58
|
-
| Complex module (4+ submodules) | `mod.rs` style (`user/mod.rs`) |
|
|
59
|
-
| Deep nesting | `mod.rs` at each level |
|
|
60
|
-
| Library with public modules | Consistent style throughout |
|
|
61
|
-
|
|
62
|
-
## mod.rs Benefits
|
|
63
|
-
|
|
64
|
-
- Clear that `user/` is a module directory
|
|
65
|
-
- All module code inside the folder
|
|
66
|
-
- Easier to move/rename entire modules
|
|
67
|
-
- Common in large codebases (tokio, serde)
|
|
68
|
-
|
|
69
|
-
## Adjacent File Benefits
|
|
70
|
-
|
|
71
|
-
- Module declaration outside directory
|
|
72
|
-
- Can see module's interface without entering folder
|
|
73
|
-
- Matches Rust 2018+ default lint preference
|
|
74
|
-
- Good for small modules with few submodules
|
|
75
|
-
|
|
76
|
-
## Example: Complex Module
|
|
77
|
-
|
|
78
|
-
```
|
|
79
|
-
src/
|
|
80
|
-
├── database/
|
|
81
|
-
│ ├── mod.rs # Main module, re-exports
|
|
82
|
-
│ ├── connection.rs # Connection pool
|
|
83
|
-
│ ├── migrations.rs # Schema migrations
|
|
84
|
-
│ ├── queries/ # Sub-module for queries
|
|
85
|
-
│ │ ├── mod.rs
|
|
86
|
-
│ │ ├── user.rs
|
|
87
|
-
│ │ └── order.rs
|
|
88
|
-
│ └── error.rs
|
|
89
|
-
└── lib.rs
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
```rust
|
|
93
|
-
// src/database/mod.rs
|
|
94
|
-
mod connection;
|
|
95
|
-
mod migrations;
|
|
96
|
-
mod queries;
|
|
97
|
-
mod error;
|
|
98
|
-
|
|
99
|
-
pub use connection::Pool;
|
|
100
|
-
pub use error::DatabaseError;
|
|
101
|
-
pub use queries::{UserQueries, OrderQueries};
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
## Consistency Rule
|
|
105
|
-
|
|
106
|
-
Pick one style for your project and stick with it:
|
|
107
|
-
|
|
108
|
-
```rust
|
|
109
|
-
// Cargo.toml or clippy.toml
|
|
110
|
-
[lints.clippy]
|
|
111
|
-
mod_module_files = "warn" # Enforces mod.rs style
|
|
112
|
-
# OR
|
|
113
|
-
self_named_module_files = "warn" # Enforces adjacent style
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
## See Also
|
|
117
|
-
|
|
118
|
-
- [proj-flat-small](./proj-flat-small.md) - Keep small projects flat
|
|
119
|
-
- [proj-mod-by-feature](./proj-mod-by-feature.md) - Feature organization
|
|
120
|
-
- [proj-pub-use-reexport](./proj-pub-use-reexport.md) - Re-export patterns
|