agy-superpowers 5.2.2 → 5.2.4
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/CLAUDE.md +80 -0
- package/template/agent/rules/code-styles.md +31 -32
- package/template/agent/rules/debug-confirmation-policy.md +2 -0
- package/template/agent/rules/file-length-policy.md +2 -0
- package/template/agent/rules/git-policy.md +7 -0
- package/template/agent/rules/language-matching.md +2 -0
- package/template/agent/rules/scratch-scripts.md +39 -0
- package/template/agent/rules/superpowers.md +8 -51
- package/template/agent/skills/executing-plans/SKILL.md +17 -0
- package/template/agent/skills/systematic-debugging/SKILL.md +16 -0
- package/template/agent/skills/test-driven-development/SKILL.md +16 -0
- package/template/agent/skills/verification-before-completion/SKILL.md +22 -0
- package/template/agent/skills/writing-plans/SKILL.md +16 -0
- 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,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
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
# proj-prelude-module
|
|
2
|
-
|
|
3
|
-
> Create prelude module for common imports
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
A `prelude` module collects the most commonly used types and traits for glob import. Users write `use my_crate::prelude::*` instead of many individual imports. This follows the pattern established by `std::prelude`.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
// Users must import everything individually
|
|
13
|
-
use my_crate::Client;
|
|
14
|
-
use my_crate::Config;
|
|
15
|
-
use my_crate::Error;
|
|
16
|
-
use my_crate::Request;
|
|
17
|
-
use my_crate::Response;
|
|
18
|
-
use my_crate::traits::Handler;
|
|
19
|
-
use my_crate::traits::Middleware;
|
|
20
|
-
use my_crate::types::Method;
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## Good
|
|
24
|
-
|
|
25
|
-
```rust
|
|
26
|
-
// src/lib.rs
|
|
27
|
-
pub mod prelude {
|
|
28
|
-
pub use crate::{
|
|
29
|
-
Client,
|
|
30
|
-
Config,
|
|
31
|
-
Error,
|
|
32
|
-
Request,
|
|
33
|
-
Response,
|
|
34
|
-
};
|
|
35
|
-
pub use crate::traits::{Handler, Middleware};
|
|
36
|
-
pub use crate::types::Method;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// Users write:
|
|
40
|
-
use my_crate::prelude::*;
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
## What to Include
|
|
44
|
-
|
|
45
|
-
| Include | Don't Include |
|
|
46
|
-
|---------|---------------|
|
|
47
|
-
| Core types users always need | Rarely-used types |
|
|
48
|
-
| Common traits | Implementation details |
|
|
49
|
-
| Error types | Internal helpers |
|
|
50
|
-
| Extension traits | Feature-gated items (usually) |
|
|
51
|
-
| Type aliases | Everything |
|
|
52
|
-
|
|
53
|
-
## Example: Web Framework Prelude
|
|
54
|
-
|
|
55
|
-
```rust
|
|
56
|
-
pub mod prelude {
|
|
57
|
-
// Core request/response
|
|
58
|
-
pub use crate::{Request, Response, Body};
|
|
59
|
-
|
|
60
|
-
// Error handling
|
|
61
|
-
pub use crate::Error;
|
|
62
|
-
|
|
63
|
-
// Common traits
|
|
64
|
-
pub use crate::traits::{FromRequest, IntoResponse};
|
|
65
|
-
|
|
66
|
-
// Routing
|
|
67
|
-
pub use crate::Router;
|
|
68
|
-
|
|
69
|
-
// HTTP types
|
|
70
|
-
pub use crate::http::{Method, StatusCode};
|
|
71
|
-
}
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
## Example: Database Library Prelude
|
|
75
|
-
|
|
76
|
-
```rust
|
|
77
|
-
pub mod prelude {
|
|
78
|
-
// Connection and pool
|
|
79
|
-
pub use crate::{Connection, Pool};
|
|
80
|
-
|
|
81
|
-
// Query building
|
|
82
|
-
pub use crate::query::{Query, Select, Insert, Update, Delete};
|
|
83
|
-
|
|
84
|
-
// Traits for custom types
|
|
85
|
-
pub use crate::traits::{FromRow, ToSql};
|
|
86
|
-
|
|
87
|
-
// Error type
|
|
88
|
-
pub use crate::Error;
|
|
89
|
-
}
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
## Pattern: Tiered Preludes
|
|
93
|
-
|
|
94
|
-
```rust
|
|
95
|
-
// Minimal prelude
|
|
96
|
-
pub mod prelude {
|
|
97
|
-
pub use crate::{Client, Config, Error};
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// Full prelude for power users
|
|
101
|
-
pub mod full_prelude {
|
|
102
|
-
pub use crate::prelude::*;
|
|
103
|
-
pub use crate::advanced::*;
|
|
104
|
-
pub use crate::extensions::*;
|
|
105
|
-
}
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
## Pattern: Feature-Gated Prelude Items
|
|
109
|
-
|
|
110
|
-
```rust
|
|
111
|
-
pub mod prelude {
|
|
112
|
-
pub use crate::{Client, Error};
|
|
113
|
-
|
|
114
|
-
#[cfg(feature = "async")]
|
|
115
|
-
pub use crate::async_client::AsyncClient;
|
|
116
|
-
|
|
117
|
-
#[cfg(feature = "serde")]
|
|
118
|
-
pub use crate::serde::{Serialize, Deserialize};
|
|
119
|
-
}
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
## Guidelines
|
|
123
|
-
|
|
124
|
-
1. **Be conservative** - Only include truly common items
|
|
125
|
-
2. **Avoid conflicts** - Don't include names that might clash (e.g., `Error`)
|
|
126
|
-
3. **Document it** - List what's included in module docs
|
|
127
|
-
4. **Stay stable** - Removing items is breaking change
|
|
128
|
-
|
|
129
|
-
## Documenting the Prelude
|
|
130
|
-
|
|
131
|
-
```rust
|
|
132
|
-
//! Common imports for convenient glob importing.
|
|
133
|
-
//!
|
|
134
|
-
//! # Usage
|
|
135
|
-
//!
|
|
136
|
-
//! ```
|
|
137
|
-
//! use my_crate::prelude::*;
|
|
138
|
-
//! ```
|
|
139
|
-
//!
|
|
140
|
-
//! # Contents
|
|
141
|
-
//!
|
|
142
|
-
//! This prelude re-exports:
|
|
143
|
-
//! - [`Client`] - The main API client
|
|
144
|
-
//! - [`Config`] - Client configuration
|
|
145
|
-
//! - [`Error`] - Error type
|
|
146
|
-
pub mod prelude {
|
|
147
|
-
// ...
|
|
148
|
-
}
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
## See Also
|
|
152
|
-
|
|
153
|
-
- [proj-pub-use-reexport](./proj-pub-use-reexport.md) - Re-export patterns
|
|
154
|
-
- [api-extension-trait](./api-extension-trait.md) - Extension traits
|
|
155
|
-
- [doc-module-inner](./doc-module-inner.md) - Module documentation
|