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,94 +0,0 @@
|
|
|
1
|
-
# name-consts-screaming
|
|
2
|
-
|
|
3
|
-
> Use `SCREAMING_SNAKE_CASE` for constants and statics
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Constants and statics are special—they're known at compile time and have program-wide lifetime. `SCREAMING_SNAKE_CASE` makes them visually distinct from runtime variables. This convention is enforced by the compiler and universally expected.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
// lowercase/camelCase constants - compiler warns
|
|
13
|
-
const maxConnections: u32 = 100; // warning
|
|
14
|
-
const default_timeout: u64 = 30; // warning
|
|
15
|
-
static globalCounter: AtomicU64 = AtomicU64::new(0); // warning
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## Good
|
|
19
|
-
|
|
20
|
-
```rust
|
|
21
|
-
// SCREAMING_SNAKE_CASE for constants
|
|
22
|
-
const MAX_CONNECTIONS: u32 = 100;
|
|
23
|
-
const DEFAULT_TIMEOUT: Duration = Duration::from_secs(30);
|
|
24
|
-
const BUFFER_SIZE: usize = 4096;
|
|
25
|
-
|
|
26
|
-
// SCREAMING_SNAKE_CASE for statics
|
|
27
|
-
static GLOBAL_COUNTER: AtomicU64 = AtomicU64::new(0);
|
|
28
|
-
static CONFIG: OnceLock<Config> = OnceLock::new();
|
|
29
|
-
|
|
30
|
-
// Type-level constants in impl blocks
|
|
31
|
-
impl Buffer {
|
|
32
|
-
const INITIAL_CAPACITY: usize = 1024;
|
|
33
|
-
const MAX_CAPACITY: usize = 1024 * 1024;
|
|
34
|
-
}
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
## Associated Constants
|
|
38
|
-
|
|
39
|
-
```rust
|
|
40
|
-
trait Limit {
|
|
41
|
-
const MAX: usize;
|
|
42
|
-
const MIN: usize;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
impl Limit for SmallBuffer {
|
|
46
|
-
const MAX: usize = 256;
|
|
47
|
-
const MIN: usize = 16;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// Generic associated constants
|
|
51
|
-
struct Container<T> {
|
|
52
|
-
data: Vec<T>,
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
impl<T> Container<T> {
|
|
56
|
-
const EMPTY: Self = Self { data: Vec::new() };
|
|
57
|
-
}
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
## Environment and Config
|
|
61
|
-
|
|
62
|
-
```rust
|
|
63
|
-
// Environment variable names
|
|
64
|
-
const ENV_DATABASE_URL: &str = "DATABASE_URL";
|
|
65
|
-
const ENV_LOG_LEVEL: &str = "LOG_LEVEL";
|
|
66
|
-
|
|
67
|
-
// Configuration keys
|
|
68
|
-
const CONFIG_TIMEOUT_SECONDS: &str = "timeout_seconds";
|
|
69
|
-
const CONFIG_MAX_RETRIES: &str = "max_retries";
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
## Lazy Static / OnceLock
|
|
73
|
-
|
|
74
|
-
```rust
|
|
75
|
-
use std::sync::OnceLock;
|
|
76
|
-
|
|
77
|
-
// Global configuration
|
|
78
|
-
static CONFIG: OnceLock<AppConfig> = OnceLock::new();
|
|
79
|
-
|
|
80
|
-
// Compiled regex
|
|
81
|
-
static EMAIL_REGEX: OnceLock<Regex> = OnceLock::new();
|
|
82
|
-
|
|
83
|
-
fn get_email_regex() -> &'static Regex {
|
|
84
|
-
EMAIL_REGEX.get_or_init(|| {
|
|
85
|
-
Regex::new(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$").unwrap()
|
|
86
|
-
})
|
|
87
|
-
}
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
## See Also
|
|
91
|
-
|
|
92
|
-
- [name-funcs-snake](./name-funcs-snake.md) - Function/variable naming
|
|
93
|
-
- [name-types-camel](./name-types-camel.md) - Type naming
|
|
94
|
-
- [type-newtype-ids](./type-newtype-ids.md) - Type-safe constants
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
# name-crate-no-rs
|
|
2
|
-
|
|
3
|
-
> Don't suffix crate names with `-rs` or `-rust`
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Adding `-rs` or `-rust` to crate names is redundant—you're already on crates.io, it's obviously Rust. These suffixes waste characters, clutter the namespace, and can make crate names harder to type. The Rust community discourages this pattern.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```toml
|
|
12
|
-
# Cargo.toml
|
|
13
|
-
[package]
|
|
14
|
-
name = "json-parser-rs" # Redundant -rs
|
|
15
|
-
name = "my-lib-rust" # Redundant -rust
|
|
16
|
-
name = "http-client-rs" # We know it's Rust
|
|
17
|
-
name = "rust-sqlite" # rust- prefix equally bad
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
## Good
|
|
21
|
-
|
|
22
|
-
```toml
|
|
23
|
-
# Cargo.toml
|
|
24
|
-
[package]
|
|
25
|
-
name = "json-parser"
|
|
26
|
-
name = "my-lib"
|
|
27
|
-
name = "http-client"
|
|
28
|
-
name = "sqlite-wrapper"
|
|
29
|
-
|
|
30
|
-
# Real crate examples (no -rs):
|
|
31
|
-
# serde (not serde-rs)
|
|
32
|
-
# tokio (not tokio-rs)
|
|
33
|
-
# reqwest (not reqwest-rs)
|
|
34
|
-
# clap (not clap-rs)
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
## When Context Is Needed
|
|
38
|
-
|
|
39
|
-
```toml
|
|
40
|
-
# If you're porting a library from another language:
|
|
41
|
-
name = "python-ast" # Describes what it's for, not what it's written in
|
|
42
|
-
|
|
43
|
-
# If you're providing bindings:
|
|
44
|
-
name = "openssl" # The Rust crate IS the Rust interface
|
|
45
|
-
|
|
46
|
-
# Platform-specific:
|
|
47
|
-
name = "windows-sys" # Platform, not language
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
## Repository Naming
|
|
51
|
-
|
|
52
|
-
```
|
|
53
|
-
# GitHub repos don't need -rs either
|
|
54
|
-
github.com/user/my-library # Good
|
|
55
|
-
github.com/user/my-library-rs # Unnecessary
|
|
56
|
-
|
|
57
|
-
# Though some do for disambiguation from other language versions
|
|
58
|
-
github.com/rust-lang/rust # The rust repo itself uses "rust"
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
## Exceptions
|
|
62
|
-
|
|
63
|
-
```toml
|
|
64
|
-
# Rare cases where disambiguation matters:
|
|
65
|
-
# - If there's a widely-known non-Rust project with the same name
|
|
66
|
-
# - Official Rust project repositories (rust-lang org)
|
|
67
|
-
|
|
68
|
-
# But even then, consider alternatives:
|
|
69
|
-
name = "fancy-lib" # Instead of fancy-rs
|
|
70
|
-
name = "better-json" # Instead of json-rust
|
|
71
|
-
name = "my-serde-impl" # Instead of serde-rs-fork
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
## See Also
|
|
75
|
-
|
|
76
|
-
- [proj-workspace-deps](./proj-workspace-deps.md) - Cargo configuration
|
|
77
|
-
- [doc-cargo-metadata](./doc-cargo-metadata.md) - Package metadata
|
|
78
|
-
- [name-funcs-snake](./name-funcs-snake.md) - Naming conventions
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
# name-funcs-snake
|
|
2
|
-
|
|
3
|
-
> Use `snake_case` for functions, methods, variables, and modules
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Rust uses `snake_case` for "value-level" names—functions, methods, variables, modules. This convention is enforced by the compiler and distinguishes runtime entities from types. Consistent naming makes code scannable and predictable.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
// CamelCase functions - compiler warns
|
|
13
|
-
fn calculateTotal() -> f64 { ... } // warning: function `calculateTotal` should have a snake case name
|
|
14
|
-
fn getUserName() -> String { ... } // warning
|
|
15
|
-
|
|
16
|
-
// Inconsistent naming
|
|
17
|
-
fn get_user() -> User { ... }
|
|
18
|
-
fn fetchOrder() -> Order { ... } // Mixed conventions
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
## Good
|
|
22
|
-
|
|
23
|
-
```rust
|
|
24
|
-
// snake_case for functions
|
|
25
|
-
fn calculate_total() -> f64 { ... }
|
|
26
|
-
fn get_user_name() -> String { ... }
|
|
27
|
-
fn fetch_order() -> Order { ... }
|
|
28
|
-
|
|
29
|
-
// snake_case for methods
|
|
30
|
-
impl User {
|
|
31
|
-
fn full_name(&self) -> String { ... }
|
|
32
|
-
fn is_active(&self) -> bool { ... }
|
|
33
|
-
fn set_email(&mut self, email: &str) { ... }
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// snake_case for variables
|
|
37
|
-
let user_count = 42;
|
|
38
|
-
let max_connections = 100;
|
|
39
|
-
let is_valid = true;
|
|
40
|
-
|
|
41
|
-
// snake_case for modules
|
|
42
|
-
mod user_service;
|
|
43
|
-
mod http_client;
|
|
44
|
-
mod json_parser;
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
## Acronyms in snake_case
|
|
48
|
-
|
|
49
|
-
```rust
|
|
50
|
-
// Lowercase acronyms in snake_case
|
|
51
|
-
fn parse_json() -> Json { ... } // Not parse_JSON
|
|
52
|
-
fn connect_tcp() -> TcpStream { ... } // Not connect_TCP
|
|
53
|
-
fn generate_uuid() -> Uuid { ... } // Not generate_UUID
|
|
54
|
-
|
|
55
|
-
let http_response = fetch();
|
|
56
|
-
let json_data = parse();
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
## Local Variables
|
|
60
|
-
|
|
61
|
-
```rust
|
|
62
|
-
fn process_data(input_data: &[u8]) -> Result<Output, Error> {
|
|
63
|
-
let raw_bytes = input_data;
|
|
64
|
-
let decoded_string = decode(raw_bytes)?;
|
|
65
|
-
let parsed_value = parse(&decoded_string)?;
|
|
66
|
-
let final_result = transform(parsed_value)?;
|
|
67
|
-
|
|
68
|
-
Ok(final_result)
|
|
69
|
-
}
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
## See Also
|
|
73
|
-
|
|
74
|
-
- [name-types-camel](./name-types-camel.md) - Type naming
|
|
75
|
-
- [name-consts-screaming](./name-consts-screaming.md) - Constant naming
|
|
76
|
-
- [name-lifetime-short](./name-lifetime-short.md) - Lifetime naming
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
# name-into-ownership
|
|
2
|
-
|
|
3
|
-
> Use `into_` prefix for ownership-consuming conversions
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
The `into_` prefix signals "this method consumes self and returns something else." The original value is moved and no longer usable. This ownership transfer is usually cheap (no allocation), but the caller loses access to the original. Clear naming prevents "use after move" confusion.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
impl Wrapper {
|
|
13
|
-
// Misleading: doesn't indicate ownership transfer
|
|
14
|
-
fn get_inner(self) -> Inner {
|
|
15
|
-
self.inner
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
// Misleading: suggests borrowing
|
|
19
|
-
fn as_inner(self) -> Inner { // Takes self by value!
|
|
20
|
-
self.inner
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## Good
|
|
26
|
-
|
|
27
|
-
```rust
|
|
28
|
-
impl Wrapper {
|
|
29
|
-
// into_ clearly shows ownership transfer
|
|
30
|
-
fn into_inner(self) -> Inner {
|
|
31
|
-
self.inner
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// Usage is clear
|
|
36
|
-
let wrapper = Wrapper::new(inner);
|
|
37
|
-
let inner = wrapper.into_inner(); // wrapper is consumed
|
|
38
|
-
// wrapper.foo(); // Error: use of moved value
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
## Standard Library Examples
|
|
42
|
-
|
|
43
|
-
```rust
|
|
44
|
-
// All consume self and return owned data
|
|
45
|
-
let string: String = "hello".to_string();
|
|
46
|
-
let bytes: Vec<u8> = string.into_bytes(); // String consumed
|
|
47
|
-
|
|
48
|
-
let path = PathBuf::from("/foo");
|
|
49
|
-
let os_string: OsString = path.into_os_string(); // PathBuf consumed
|
|
50
|
-
|
|
51
|
-
let boxed: Box<[i32]> = vec![1, 2, 3].into_boxed_slice(); // Vec consumed
|
|
52
|
-
|
|
53
|
-
let vec: Vec<u8> = boxed.into_vec(); // Box consumed
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
## into_iter() Pattern
|
|
57
|
-
|
|
58
|
-
```rust
|
|
59
|
-
let vec = vec![1, 2, 3];
|
|
60
|
-
|
|
61
|
-
// into_iter consumes the collection
|
|
62
|
-
for item in vec.into_iter() { // or just: for item in vec
|
|
63
|
-
// item is i32, not &i32
|
|
64
|
-
}
|
|
65
|
-
// vec is consumed, can't use anymore
|
|
66
|
-
|
|
67
|
-
// Contrast with iter() which borrows
|
|
68
|
-
let vec = vec![1, 2, 3];
|
|
69
|
-
for item in vec.iter() {
|
|
70
|
-
// item is &i32
|
|
71
|
-
}
|
|
72
|
-
// vec still usable
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
## IntoIterator Trait
|
|
76
|
-
|
|
77
|
-
```rust
|
|
78
|
-
impl IntoIterator for MyCollection {
|
|
79
|
-
type Item = Element;
|
|
80
|
-
type IntoIter = std::vec::IntoIter<Element>;
|
|
81
|
-
|
|
82
|
-
fn into_iter(self) -> Self::IntoIter {
|
|
83
|
-
self.elements.into_iter() // Consumes self
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
## Conversion Prefix Summary
|
|
89
|
-
|
|
90
|
-
```rust
|
|
91
|
-
struct Buffer {
|
|
92
|
-
data: Vec<u8>,
|
|
93
|
-
name: String,
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
impl Buffer {
|
|
97
|
-
// as_ : free borrow, returns reference
|
|
98
|
-
fn as_slice(&self) -> &[u8] {
|
|
99
|
-
&self.data
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// to_ : allocates, creates new value
|
|
103
|
-
fn to_vec(&self) -> Vec<u8> {
|
|
104
|
-
self.data.clone()
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// into_ : consumes self, usually cheap
|
|
108
|
-
fn into_inner(self) -> Vec<u8> {
|
|
109
|
-
self.data
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// into_ : can destructure into parts
|
|
113
|
-
fn into_parts(self) -> (Vec<u8>, String) {
|
|
114
|
-
(self.data, self.name)
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
## See Also
|
|
120
|
-
|
|
121
|
-
- [name-as-free](./name-as-free.md) - Borrowing conversions
|
|
122
|
-
- [name-to-expensive](./name-to-expensive.md) - Allocating conversions
|
|
123
|
-
- [api-from-not-into](./api-from-not-into.md) - From trait implementation
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
# name-is-has-bool
|
|
2
|
-
|
|
3
|
-
> Use `is_`, `has_`, `can_`, `should_` prefixes for boolean-returning methods
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Boolean methods answer yes/no questions. Prefixes like `is_`, `has_`, `can_` make the question explicit, so code reads naturally: `if user.is_active()`, `if buffer.has_remaining()`. Without prefixes, boolean methods are ambiguous and require reading documentation.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
impl User {
|
|
13
|
-
// Unclear: does this check or set?
|
|
14
|
-
fn active(&self) -> bool { ... }
|
|
15
|
-
|
|
16
|
-
// Unclear: does this delete or check?
|
|
17
|
-
fn deleted(&self) -> bool { ... }
|
|
18
|
-
|
|
19
|
-
// Unclear return type
|
|
20
|
-
fn admin(&self) -> bool { ... }
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
// Reading code is confusing
|
|
24
|
-
if user.active() { ... } // Is this checking or activating?
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
## Good
|
|
28
|
-
|
|
29
|
-
```rust
|
|
30
|
-
impl User {
|
|
31
|
-
// Clear: answers "is the user active?"
|
|
32
|
-
fn is_active(&self) -> bool { ... }
|
|
33
|
-
|
|
34
|
-
// Clear: answers "is the user deleted?"
|
|
35
|
-
fn is_deleted(&self) -> bool { ... }
|
|
36
|
-
|
|
37
|
-
// Clear: answers "is the user an admin?"
|
|
38
|
-
fn is_admin(&self) -> bool { ... }
|
|
39
|
-
|
|
40
|
-
// Clear: answers "does the user have permission X?"
|
|
41
|
-
fn has_permission(&self, perm: Permission) -> bool { ... }
|
|
42
|
-
|
|
43
|
-
// Clear: answers "can the user edit?"
|
|
44
|
-
fn can_edit(&self) -> bool { ... }
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// Reads naturally
|
|
48
|
-
if user.is_active() && user.has_permission(Permission::Write) {
|
|
49
|
-
// ...
|
|
50
|
-
}
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
## Common Prefixes
|
|
54
|
-
|
|
55
|
-
| Prefix | Use For | Example |
|
|
56
|
-
|--------|---------|---------|
|
|
57
|
-
| `is_` | State/property check | `is_empty()`, `is_valid()`, `is_some()` |
|
|
58
|
-
| `has_` | Possession/containment | `has_key()`, `has_children()`, `has_remaining()` |
|
|
59
|
-
| `can_` | Capability/permission | `can_read()`, `can_write()`, `can_execute()` |
|
|
60
|
-
| `should_` | Recommendation/policy | `should_retry()`, `should_cache()` |
|
|
61
|
-
| `needs_` | Requirement | `needs_update()`, `needs_auth()` |
|
|
62
|
-
| `will_` | Future action | `will_block()`, `will_overflow()` |
|
|
63
|
-
|
|
64
|
-
## Standard Library Examples
|
|
65
|
-
|
|
66
|
-
```rust
|
|
67
|
-
// is_ prefix
|
|
68
|
-
vec.is_empty()
|
|
69
|
-
option.is_some()
|
|
70
|
-
option.is_none()
|
|
71
|
-
result.is_ok()
|
|
72
|
-
result.is_err()
|
|
73
|
-
char.is_alphabetic()
|
|
74
|
-
str.is_ascii()
|
|
75
|
-
path.is_file()
|
|
76
|
-
path.is_dir()
|
|
77
|
-
|
|
78
|
-
// has_ prefix (less common in std)
|
|
79
|
-
iterator.has_next() // conceptual
|
|
80
|
-
|
|
81
|
-
// Checking methods
|
|
82
|
-
str.contains("foo") // Not is_ because takes argument
|
|
83
|
-
str.starts_with("bar") // Descriptive verb phrase
|
|
84
|
-
str.ends_with("baz")
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
## Negation
|
|
88
|
-
|
|
89
|
-
```rust
|
|
90
|
-
// Prefer positive form with caller negation
|
|
91
|
-
if !user.is_active() { ... }
|
|
92
|
-
|
|
93
|
-
// Rather than negative method
|
|
94
|
-
if user.is_inactive() { ... } // Avoid double negatives: !is_inactive()
|
|
95
|
-
|
|
96
|
-
// Exception: when negative is the common case
|
|
97
|
-
fn is_empty(&self) -> bool { ... } // Checking for empty is common
|
|
98
|
-
fn is_not_empty(&self) -> bool { ... } // Rarely needed, use !is_empty()
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
## Boolean Fields
|
|
102
|
-
|
|
103
|
-
```rust
|
|
104
|
-
struct Config {
|
|
105
|
-
// Field names can omit prefix
|
|
106
|
-
enabled: bool,
|
|
107
|
-
verbose: bool,
|
|
108
|
-
debug: bool,
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
impl Config {
|
|
112
|
-
// But methods should have prefix
|
|
113
|
-
fn is_enabled(&self) -> bool {
|
|
114
|
-
self.enabled
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
fn is_verbose(&self) -> bool {
|
|
118
|
-
self.verbose
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
## See Also
|
|
124
|
-
|
|
125
|
-
- [name-no-get-prefix](./name-no-get-prefix.md) - Getter naming
|
|
126
|
-
- [name-funcs-snake](./name-funcs-snake.md) - Function naming
|
|
127
|
-
- [api-must-use](./api-must-use.md) - Boolean functions should be checked
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
# name-iter-convention
|
|
2
|
-
|
|
3
|
-
> Use iter/iter_mut/into_iter for iterator methods
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Rust has a standard convention for iterator method names that signals ownership semantics. Following this convention makes APIs predictable and enables the `for item in collection` syntax to work correctly.
|
|
8
|
-
|
|
9
|
-
## The Three Iterator Methods
|
|
10
|
-
|
|
11
|
-
| Method | Returns | Ownership |
|
|
12
|
-
|--------|---------|-----------|
|
|
13
|
-
| `iter()` | `impl Iterator<Item = &T>` | Borrows collection |
|
|
14
|
-
| `iter_mut()` | `impl Iterator<Item = &mut T>` | Mutably borrows |
|
|
15
|
-
| `into_iter()` | `impl Iterator<Item = T>` | Consumes collection |
|
|
16
|
-
|
|
17
|
-
## Implementation
|
|
18
|
-
|
|
19
|
-
```rust
|
|
20
|
-
struct MyCollection<T> {
|
|
21
|
-
items: Vec<T>,
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
impl<T> MyCollection<T> {
|
|
25
|
-
/// Returns an iterator over references.
|
|
26
|
-
fn iter(&self) -> impl Iterator<Item = &T> {
|
|
27
|
-
self.items.iter()
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/// Returns an iterator over mutable references.
|
|
31
|
-
fn iter_mut(&mut self) -> impl Iterator<Item = &mut T> {
|
|
32
|
-
self.items.iter_mut()
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// IntoIterator trait for into_iter()
|
|
37
|
-
impl<T> IntoIterator for MyCollection<T> {
|
|
38
|
-
type Item = T;
|
|
39
|
-
type IntoIter = std::vec::IntoIter<T>;
|
|
40
|
-
|
|
41
|
-
fn into_iter(self) -> Self::IntoIter {
|
|
42
|
-
self.items.into_iter()
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// Also implement for references
|
|
47
|
-
impl<'a, T> IntoIterator for &'a MyCollection<T> {
|
|
48
|
-
type Item = &'a T;
|
|
49
|
-
type IntoIter = std::slice::Iter<'a, T>;
|
|
50
|
-
|
|
51
|
-
fn into_iter(self) -> Self::IntoIter {
|
|
52
|
-
self.items.iter()
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
impl<'a, T> IntoIterator for &'a mut MyCollection<T> {
|
|
57
|
-
type Item = &'a mut T;
|
|
58
|
-
type IntoIter = std::slice::IterMut<'a, T>;
|
|
59
|
-
|
|
60
|
-
fn into_iter(self) -> Self::IntoIter {
|
|
61
|
-
self.items.iter_mut()
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
## Usage
|
|
67
|
-
|
|
68
|
-
```rust
|
|
69
|
-
let collection = MyCollection { items: vec![1, 2, 3] };
|
|
70
|
-
|
|
71
|
-
// Explicit methods
|
|
72
|
-
for x in collection.iter() { } // Borrows
|
|
73
|
-
for x in collection.iter_mut() { } // Mutably borrows
|
|
74
|
-
|
|
75
|
-
// IntoIterator enables for loop syntax
|
|
76
|
-
for x in &collection { } // Calls (&collection).into_iter()
|
|
77
|
-
for x in &mut collection { } // Calls (&mut collection).into_iter()
|
|
78
|
-
for x in collection { } // Consumes, calls collection.into_iter()
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
## Bad
|
|
82
|
-
|
|
83
|
-
```rust
|
|
84
|
-
impl MyCollection<T> {
|
|
85
|
-
// Non-standard names
|
|
86
|
-
fn elements(&self) -> impl Iterator<Item = &T> { } // Should be iter()
|
|
87
|
-
fn get_items(&self) -> impl Iterator<Item = &T> { } // Should be iter()
|
|
88
|
-
fn iterate(&self) -> impl Iterator<Item = &T> { } // Should be iter()
|
|
89
|
-
fn as_iter(&self) -> impl Iterator<Item = &T> { } // Should be iter()
|
|
90
|
-
}
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
## Additional Iterator Methods
|
|
94
|
-
|
|
95
|
-
```rust
|
|
96
|
-
impl MyCollection<T> {
|
|
97
|
-
// Filter by predicate
|
|
98
|
-
fn iter_valid(&self) -> impl Iterator<Item = &T> {
|
|
99
|
-
self.iter().filter(|x| x.is_valid())
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// Specific slice
|
|
103
|
-
fn iter_range(&self, start: usize, end: usize) -> impl Iterator<Item = &T> {
|
|
104
|
-
self.items[start..end].iter()
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
## Standard Library Examples
|
|
110
|
-
|
|
111
|
-
```rust
|
|
112
|
-
// Vec, slice, arrays
|
|
113
|
-
vec.iter() // &T
|
|
114
|
-
vec.iter_mut() // &mut T
|
|
115
|
-
vec.into_iter() // T
|
|
116
|
-
|
|
117
|
-
// HashMap
|
|
118
|
-
map.iter() // (&K, &V)
|
|
119
|
-
map.iter_mut() // (&K, &mut V)
|
|
120
|
-
map.into_iter() // (K, V)
|
|
121
|
-
map.keys() // &K
|
|
122
|
-
map.values() // &V
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
## See Also
|
|
126
|
-
|
|
127
|
-
- [name-iter-type-match](./name-iter-type-match.md) - Iterator type naming
|
|
128
|
-
- [name-iter-method](./name-iter-method.md) - Iterator method names
|
|
129
|
-
- [perf-iter-over-index](./perf-iter-over-index.md) - Prefer iterators
|