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,118 +0,0 @@
|
|
|
1
|
-
# name-to-expensive
|
|
2
|
-
|
|
3
|
-
> Use `to_` prefix for expensive conversions that allocate or compute
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
The `to_` prefix signals "this conversion has a cost"—typically allocation, cloning, or computation. Callers know to consider caching the result or avoiding repeated calls. This contrasts with `as_` (free reference conversion) and `into_` (ownership transfer).
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
impl Name {
|
|
13
|
-
// Misleading: suggests expensive operation
|
|
14
|
-
fn as_uppercase(&self) -> String {
|
|
15
|
-
self.0.to_uppercase() // Allocates!
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
// Misleading: suggests cheap reference
|
|
19
|
-
fn get_string(&self) -> String {
|
|
20
|
-
self.0.clone() // Allocates!
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## Good
|
|
26
|
-
|
|
27
|
-
```rust
|
|
28
|
-
impl Name {
|
|
29
|
-
// to_ = allocates/computes
|
|
30
|
-
fn to_uppercase(&self) -> String {
|
|
31
|
-
self.0.to_uppercase()
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// to_ = creates new value
|
|
35
|
-
fn to_string(&self) -> String {
|
|
36
|
-
self.0.clone()
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// as_ = free reference (cheap)
|
|
40
|
-
fn as_str(&self) -> &str {
|
|
41
|
-
&self.0
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
## Standard Library Examples
|
|
47
|
-
|
|
48
|
-
```rust
|
|
49
|
-
// to_ methods - all allocate or compute
|
|
50
|
-
let s: String = slice.to_vec(); // Allocates Vec
|
|
51
|
-
let s: String = "hello".to_string(); // Allocates String
|
|
52
|
-
let s: String = "HELLO".to_lowercase(); // Allocates new String
|
|
53
|
-
let s: String = path.to_string_lossy().into_owned(); // May allocate
|
|
54
|
-
|
|
55
|
-
// Contrast with as_ methods - all are free
|
|
56
|
-
let slice: &[u8] = s.as_bytes(); // Just reinterpret
|
|
57
|
-
let str_ref: &str = string.as_str(); // Just reference
|
|
58
|
-
let path: &Path = Path::new("foo"); // Just reference
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
## Conversion Method Prefixes
|
|
62
|
-
|
|
63
|
-
| Prefix | Cost | Ownership | Example |
|
|
64
|
-
|--------|------|-----------|---------|
|
|
65
|
-
| `as_` | Free (O(1)) | Borrows `&T` | `as_str()`, `as_bytes()` |
|
|
66
|
-
| `to_` | Allocates/Computes | Creates new | `to_string()`, `to_vec()` |
|
|
67
|
-
| `into_` | Usually free | Takes ownership | `into_inner()`, `into_vec()` |
|
|
68
|
-
|
|
69
|
-
## Custom Types
|
|
70
|
-
|
|
71
|
-
```rust
|
|
72
|
-
struct Email(String);
|
|
73
|
-
|
|
74
|
-
impl Email {
|
|
75
|
-
// Cheap: just returns reference
|
|
76
|
-
fn as_str(&self) -> &str {
|
|
77
|
-
&self.0
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// Expensive: allocates
|
|
81
|
-
fn to_lowercase(&self) -> Email {
|
|
82
|
-
Email(self.0.to_lowercase())
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// Expensive: allocates
|
|
86
|
-
fn to_display_format(&self) -> String {
|
|
87
|
-
format!("<{}>", self.0)
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// Ownership transfer: usually cheap
|
|
91
|
-
fn into_string(self) -> String {
|
|
92
|
-
self.0
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
## to_owned() Pattern
|
|
98
|
-
|
|
99
|
-
```rust
|
|
100
|
-
// to_owned() for getting owned version of borrowed data
|
|
101
|
-
let borrowed: &str = "hello";
|
|
102
|
-
let owned: String = borrowed.to_owned(); // Allocates
|
|
103
|
-
|
|
104
|
-
let borrowed: &[i32] = &[1, 2, 3];
|
|
105
|
-
let owned: Vec<i32> = borrowed.to_owned(); // Allocates
|
|
106
|
-
|
|
107
|
-
// ToOwned trait
|
|
108
|
-
trait ToOwned {
|
|
109
|
-
type Owned;
|
|
110
|
-
fn to_owned(&self) -> Self::Owned;
|
|
111
|
-
}
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
## See Also
|
|
115
|
-
|
|
116
|
-
- [name-as-free](./name-as-free.md) - Free reference conversions
|
|
117
|
-
- [name-into-ownership](./name-into-ownership.md) - Ownership transfer
|
|
118
|
-
- [own-cow-conditional](./own-cow-conditional.md) - Avoiding unnecessary allocations
|
package/template/agent/skills/rust-developer/references/rust-rules/name-type-param-single.md
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
# name-type-param-single
|
|
2
|
-
|
|
3
|
-
> Use single uppercase letters for type parameters: `T`, `E`, `K`, `V`
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Generic type parameters conventionally use single uppercase letters. This keeps signatures concise and follows established conventions that readers instantly recognize. `T` for "type", `E` for "error", `K` for "key", `V` for "value" are universal in Rust.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
// Verbose type parameters
|
|
13
|
-
struct Container<ElementType> {
|
|
14
|
-
items: Vec<ElementType>,
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
fn process<InputType, OutputType>(input: InputType) -> OutputType { ... }
|
|
18
|
-
|
|
19
|
-
// Lowercase - looks like lifetime
|
|
20
|
-
struct Wrapper<t> { ... } // Confusing
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## Good
|
|
24
|
-
|
|
25
|
-
```rust
|
|
26
|
-
// Single uppercase letters
|
|
27
|
-
struct Container<T> {
|
|
28
|
-
items: Vec<T>,
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
fn process<I, O>(input: I) -> O { ... }
|
|
32
|
-
|
|
33
|
-
// Standard conventions
|
|
34
|
-
struct HashMap<K, V> { ... } // K=Key, V=Value
|
|
35
|
-
enum Result<T, E> { ... } // T=Type, E=Error
|
|
36
|
-
enum Option<T> { ... } // T=Type
|
|
37
|
-
struct Ref<'a, T> { ... } // Lifetime + Type
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
## Standard Type Parameter Names
|
|
41
|
-
|
|
42
|
-
| Parameter | Meaning | Example |
|
|
43
|
-
|-----------|---------|---------|
|
|
44
|
-
| `T` | Type (generic) | `Vec<T>` |
|
|
45
|
-
| `E` | Error | `Result<T, E>` |
|
|
46
|
-
| `K` | Key | `HashMap<K, V>` |
|
|
47
|
-
| `V` | Value | `HashMap<K, V>` |
|
|
48
|
-
| `I` | Input / Item | `Iterator<Item = I>` |
|
|
49
|
-
| `O` | Output | `Fn(I) -> O` |
|
|
50
|
-
| `R` | Return / Result | `fn() -> R` |
|
|
51
|
-
| `S` | State | `StateMachine<S>` |
|
|
52
|
-
| `A` | Allocator | `Vec<T, A>` |
|
|
53
|
-
| `F` | Function | `map<F>(f: F)` |
|
|
54
|
-
|
|
55
|
-
## Multiple Type Parameters
|
|
56
|
-
|
|
57
|
-
```rust
|
|
58
|
-
// Use related letters
|
|
59
|
-
fn transform<I, O, E>(input: I) -> Result<O, E>
|
|
60
|
-
where
|
|
61
|
-
I: Input,
|
|
62
|
-
O: Output,
|
|
63
|
-
E: Error,
|
|
64
|
-
{ ... }
|
|
65
|
-
|
|
66
|
-
// Or sequential: T, U, V
|
|
67
|
-
fn combine<T, U, V>(a: T, b: U) -> V { ... }
|
|
68
|
-
|
|
69
|
-
// Descriptive only when many parameters need clarity
|
|
70
|
-
struct Query<Db, Row, Err> { ... }
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
## Trait Bounds
|
|
74
|
-
|
|
75
|
-
```rust
|
|
76
|
-
// Keep type params short, move complexity to where clause
|
|
77
|
-
fn process<T, E>(value: T) -> Result<T, E>
|
|
78
|
-
where
|
|
79
|
-
T: Clone + Debug + Send + Sync,
|
|
80
|
-
E: Error + From<IoError>,
|
|
81
|
-
{ ... }
|
|
82
|
-
|
|
83
|
-
// Not inline
|
|
84
|
-
fn process<T: Clone + Debug + Send + Sync, E: Error + From<IoError>>(value: T) -> Result<T, E>
|
|
85
|
-
// Too long!
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
## See Also
|
|
89
|
-
|
|
90
|
-
- [name-lifetime-short](./name-lifetime-short.md) - Lifetime parameter naming
|
|
91
|
-
- [name-types-camel](./name-types-camel.md) - Concrete type naming
|
|
92
|
-
- [type-generic-bounds](./type-generic-bounds.md) - Trait bounds
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
# name-types-camel
|
|
2
|
-
|
|
3
|
-
> Use `UpperCamelCase` for types, traits, and enum names
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Rust's naming conventions are enforced by the compiler and linter. Consistent naming makes code immediately recognizable—you know `HttpClient` is a type, `send_request` is a function. Violating conventions triggers warnings and makes code harder to read.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
// Lowercase types - compiler warns
|
|
13
|
-
struct http_client { ... } // warning: type `http_client` should have an upper camel case name
|
|
14
|
-
trait serializable { ... } // warning
|
|
15
|
-
enum response_type { ... } // warning
|
|
16
|
-
|
|
17
|
-
// Screaming case for types
|
|
18
|
-
struct HTTP_CLIENT { ... } // Not idiomatic
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
## Good
|
|
22
|
-
|
|
23
|
-
```rust
|
|
24
|
-
// UpperCamelCase for all types
|
|
25
|
-
struct HttpClient { ... }
|
|
26
|
-
trait Serializable { ... }
|
|
27
|
-
enum ResponseType { ... }
|
|
28
|
-
|
|
29
|
-
// Compound words
|
|
30
|
-
struct TcpConnection { ... }
|
|
31
|
-
struct IoError { ... }
|
|
32
|
-
struct FileReader { ... }
|
|
33
|
-
|
|
34
|
-
// Generic types
|
|
35
|
-
struct HashMap<K, V> { ... }
|
|
36
|
-
struct Result<T, E> { ... }
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
## Acronyms
|
|
40
|
-
|
|
41
|
-
```rust
|
|
42
|
-
// Treat acronyms as words (capitalize first letter only)
|
|
43
|
-
struct HttpServer { ... } // Not HTTPServer
|
|
44
|
-
struct JsonParser { ... } // Not JSONParser
|
|
45
|
-
struct Uuid { ... } // Not UUID
|
|
46
|
-
struct TcpStream { ... } // Not TCPStream
|
|
47
|
-
|
|
48
|
-
// Exception: Two-letter acronyms can be all caps
|
|
49
|
-
struct IOError { ... } // Acceptable
|
|
50
|
-
struct IoError { ... } // Also acceptable (preferred)
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
## Type Aliases
|
|
54
|
-
|
|
55
|
-
```rust
|
|
56
|
-
// Type aliases also use UpperCamelCase
|
|
57
|
-
type Result<T> = std::result::Result<T, Error>;
|
|
58
|
-
type BoxedFuture<'a, T> = Pin<Box<dyn Future<Output = T> + Send + 'a>>;
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
## See Also
|
|
62
|
-
|
|
63
|
-
- [name-variants-camel](./name-variants-camel.md) - Enum variant naming
|
|
64
|
-
- [name-funcs-snake](./name-funcs-snake.md) - Function naming
|
|
65
|
-
- [name-acronym-word](./name-acronym-word.md) - Acronym handling
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
# name-variants-camel
|
|
2
|
-
|
|
3
|
-
> Use `UpperCamelCase` for enum variants
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Enum variants follow the same naming convention as types—`UpperCamelCase`. This distinguishes them from fields, variables, and functions. The compiler warns on violations, and consistent naming helps readers instantly recognize variant names.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
enum Status {
|
|
13
|
-
pending, // warning: variant `pending` should have an upper camel case name
|
|
14
|
-
in_progress, // warning
|
|
15
|
-
COMPLETED, // Not idiomatic
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
enum Color {
|
|
19
|
-
RED, // Screaming case - not Rust style
|
|
20
|
-
GREEN,
|
|
21
|
-
BLUE,
|
|
22
|
-
}
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## Good
|
|
26
|
-
|
|
27
|
-
```rust
|
|
28
|
-
enum Status {
|
|
29
|
-
Pending,
|
|
30
|
-
InProgress,
|
|
31
|
-
Completed,
|
|
32
|
-
Failed,
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
enum Color {
|
|
36
|
-
Red,
|
|
37
|
-
Green,
|
|
38
|
-
Blue,
|
|
39
|
-
Custom(u8, u8, u8),
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
enum HttpMethod {
|
|
43
|
-
Get,
|
|
44
|
-
Post,
|
|
45
|
-
Put,
|
|
46
|
-
Delete,
|
|
47
|
-
Patch,
|
|
48
|
-
}
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
## Variants with Data
|
|
52
|
-
|
|
53
|
-
```rust
|
|
54
|
-
enum Message {
|
|
55
|
-
// Unit variant
|
|
56
|
-
Quit,
|
|
57
|
-
|
|
58
|
-
// Tuple variant
|
|
59
|
-
Move(i32, i32),
|
|
60
|
-
|
|
61
|
-
// Struct variant
|
|
62
|
-
Write { text: String },
|
|
63
|
-
|
|
64
|
-
// Named fields
|
|
65
|
-
ChangeColor {
|
|
66
|
-
red: u8,
|
|
67
|
-
green: u8,
|
|
68
|
-
blue: u8,
|
|
69
|
-
},
|
|
70
|
-
}
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
## Variant Naming Tips
|
|
74
|
-
|
|
75
|
-
```rust
|
|
76
|
-
// Be specific
|
|
77
|
-
enum Error {
|
|
78
|
-
NotFound, // Good: specific
|
|
79
|
-
PermissionDenied, // Good: specific
|
|
80
|
-
Error, // Bad: vague
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// Avoid redundant type name in variant
|
|
84
|
-
enum ConnectionState {
|
|
85
|
-
Connected, // Good
|
|
86
|
-
Disconnected, // Good
|
|
87
|
-
ConnectionError, // Bad: redundant "Connection"
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// Use None/Some pattern for Option-like enums
|
|
91
|
-
enum MaybeValue<T> {
|
|
92
|
-
Some(T),
|
|
93
|
-
None,
|
|
94
|
-
}
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
## See Also
|
|
98
|
-
|
|
99
|
-
- [name-types-camel](./name-types-camel.md) - Type naming
|
|
100
|
-
- [api-non-exhaustive](./api-non-exhaustive.md) - Forward-compatible enums
|
|
101
|
-
- [type-enum-states](./type-enum-states.md) - State machine enums
|
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
# opt-bounds-check
|
|
2
|
-
|
|
3
|
-
> Use iterators and patterns that eliminate bounds checks in hot paths
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Rust's safety guarantees require bounds checking on array/slice indexing. In tight loops, these checks can cause measurable overhead (branch mispredictions, preventing vectorization). Patterns like iterators, `get_unchecked`, and index splitting can eliminate these checks while maintaining safety.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
fn sum_products(a: &[f64], b: &[f64]) -> f64 {
|
|
13
|
-
let mut sum = 0.0;
|
|
14
|
-
for i in 0..a.len() {
|
|
15
|
-
sum += a[i] * b[i]; // Two bounds checks per iteration
|
|
16
|
-
}
|
|
17
|
-
sum
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
fn apply_filter(data: &mut [u8], kernel: &[u8; 3]) {
|
|
21
|
-
for i in 1..data.len() - 1 {
|
|
22
|
-
// Three bounds checks per iteration
|
|
23
|
-
data[i] = (data[i - 1] + data[i] + data[i + 1]) / 3;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## Good
|
|
29
|
-
|
|
30
|
-
```rust
|
|
31
|
-
fn sum_products(a: &[f64], b: &[f64]) -> f64 {
|
|
32
|
-
// Iterator zips - no bounds checks, vectorizes well
|
|
33
|
-
a.iter().zip(b.iter()).map(|(x, y)| x * y).sum()
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
fn apply_filter(data: &mut [u8]) {
|
|
37
|
-
// Windows pattern - no bounds checks
|
|
38
|
-
for window in data.windows(3) {
|
|
39
|
-
// window[0], window[1], window[2] are all valid
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// Or use chunks
|
|
43
|
-
for chunk in data.chunks_exact(4) {
|
|
44
|
-
process_simd(chunk);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
## Iterator Patterns
|
|
50
|
-
|
|
51
|
-
```rust
|
|
52
|
-
// All of these avoid bounds checks:
|
|
53
|
-
|
|
54
|
-
// zip - parallel iteration
|
|
55
|
-
for (a, b) in xs.iter().zip(ys.iter()) { ... }
|
|
56
|
-
|
|
57
|
-
// enumerate - index + value
|
|
58
|
-
for (i, x) in data.iter().enumerate() { ... }
|
|
59
|
-
|
|
60
|
-
// windows - sliding window
|
|
61
|
-
for window in data.windows(3) { ... }
|
|
62
|
-
|
|
63
|
-
// chunks - fixed-size groups
|
|
64
|
-
for chunk in data.chunks(4) { ... }
|
|
65
|
-
for chunk in data.chunks_exact(4) { ... } // Guarantees exact size
|
|
66
|
-
|
|
67
|
-
// split_at - divide slice
|
|
68
|
-
let (left, right) = data.split_at(mid);
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
## Split for Parallel Access
|
|
72
|
-
|
|
73
|
-
```rust
|
|
74
|
-
fn parallel_sum(data: &[i32]) -> i32 {
|
|
75
|
-
// Split into independent chunks
|
|
76
|
-
let (left, right) = data.split_at(data.len() / 2);
|
|
77
|
-
|
|
78
|
-
// Process chunks without bounds checks
|
|
79
|
-
let sum_left: i32 = left.iter().sum();
|
|
80
|
-
let sum_right: i32 = right.iter().sum();
|
|
81
|
-
|
|
82
|
-
sum_left + sum_right
|
|
83
|
-
}
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
## get_unchecked for Proven Safety
|
|
87
|
-
|
|
88
|
-
```rust
|
|
89
|
-
fn matrix_multiply(a: &[f64], b: &[f64], c: &mut [f64], n: usize) {
|
|
90
|
-
assert!(a.len() >= n * n);
|
|
91
|
-
assert!(b.len() >= n * n);
|
|
92
|
-
assert!(c.len() >= n * n);
|
|
93
|
-
|
|
94
|
-
for i in 0..n {
|
|
95
|
-
for j in 0..n {
|
|
96
|
-
let mut sum = 0.0;
|
|
97
|
-
for k in 0..n {
|
|
98
|
-
// SAFETY: bounds verified by asserts above
|
|
99
|
-
unsafe {
|
|
100
|
-
sum += a.get_unchecked(i * n + k)
|
|
101
|
-
* b.get_unchecked(k * n + j);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
// SAFETY: bounds verified by asserts above
|
|
105
|
-
unsafe {
|
|
106
|
-
*c.get_unchecked_mut(i * n + j) = sum;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
## Slice Patterns
|
|
114
|
-
|
|
115
|
-
```rust
|
|
116
|
-
fn process_header(data: &[u8]) -> Option<Header> {
|
|
117
|
-
// Slice pattern - single length check, no per-field checks
|
|
118
|
-
let [a, b, c, d, rest @ ..] = data else {
|
|
119
|
-
return None;
|
|
120
|
-
};
|
|
121
|
-
|
|
122
|
-
Some(Header {
|
|
123
|
-
magic: *a,
|
|
124
|
-
version: *b,
|
|
125
|
-
flags: u16::from_le_bytes([*c, *d]),
|
|
126
|
-
payload: rest,
|
|
127
|
-
})
|
|
128
|
-
}
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
## Verify Bounds Check Elimination
|
|
132
|
-
|
|
133
|
-
```bash
|
|
134
|
-
# Check generated assembly
|
|
135
|
-
cargo asm --release my_crate::hot_function
|
|
136
|
-
|
|
137
|
-
# Look for 'cmp' and 'ja'/'jbe' instructions near array access
|
|
138
|
-
# If eliminated, you'll see direct memory access
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
## When to Accept Bounds Checks
|
|
142
|
-
|
|
143
|
-
```rust
|
|
144
|
-
// Random access patterns - checks unavoidable
|
|
145
|
-
fn random_lookup(data: &[u8], indices: &[usize]) -> Vec<u8> {
|
|
146
|
-
indices.iter()
|
|
147
|
-
.filter_map(|&i| data.get(i).copied()) // Checked, but necessary
|
|
148
|
-
.collect()
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
// Infrequent access - overhead negligible
|
|
152
|
-
fn get_config(&self, key: &str) -> Option<&Value> {
|
|
153
|
-
self.config.get(key) // Fine, not hot path
|
|
154
|
-
}
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
## See Also
|
|
158
|
-
|
|
159
|
-
- [opt-simd-portable](./opt-simd-portable.md) - SIMD requires unchecked access
|
|
160
|
-
- [opt-cache-friendly](./opt-cache-friendly.md) - Cache-efficient patterns
|
|
161
|
-
- [perf-profile-first](./perf-profile-first.md) - Identify actual hot paths
|