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.
Files changed (220) hide show
  1. package/README.md +47 -150
  2. package/package.json +1 -1
  3. package/template/agent/rules/scratch-scripts.md +37 -0
  4. package/template/agent/rules/superpowers.md +4 -51
  5. package/template/agent/skills/ai-integrated-product/SKILL.md +0 -57
  6. package/template/agent/skills/analytics-setup/SKILL.md +0 -51
  7. package/template/agent/skills/api-design/SKILL.md +0 -193
  8. package/template/agent/skills/app-store-optimizer/SKILL.md +0 -127
  9. package/template/agent/skills/auth-and-identity/SKILL.md +0 -167
  10. package/template/agent/skills/backend-developer/SKILL.md +0 -148
  11. package/template/agent/skills/bootstrapper-finance/SKILL.md +0 -55
  12. package/template/agent/skills/chrome-extension-developer/SKILL.md +0 -53
  13. package/template/agent/skills/community-manager/SKILL.md +0 -115
  14. package/template/agent/skills/content-marketer/SKILL.md +0 -111
  15. package/template/agent/skills/conversion-optimizer/SKILL.md +0 -142
  16. package/template/agent/skills/cto-architect/SKILL.md +0 -133
  17. package/template/agent/skills/customer-success-manager/SKILL.md +0 -126
  18. package/template/agent/skills/data-analyst/SKILL.md +0 -147
  19. package/template/agent/skills/devops-engineer/SKILL.md +0 -117
  20. package/template/agent/skills/email-infrastructure/SKILL.md +0 -164
  21. package/template/agent/skills/game-design/SKILL.md +0 -194
  22. package/template/agent/skills/game-developer/SKILL.md +0 -175
  23. package/template/agent/skills/growth-hacker/SKILL.md +0 -122
  24. package/template/agent/skills/idea-validator/SKILL.md +0 -55
  25. package/template/agent/skills/indie-legal/SKILL.md +0 -53
  26. package/template/agent/skills/influencer-marketer/SKILL.md +0 -141
  27. package/template/agent/skills/landing-page-builder/SKILL.md +0 -59
  28. package/template/agent/skills/launch-strategist/SKILL.md +0 -62
  29. package/template/agent/skills/market-researcher/SKILL.md +0 -53
  30. package/template/agent/skills/micro-saas-builder/SKILL.md +0 -56
  31. package/template/agent/skills/monetization-strategist/SKILL.md +0 -119
  32. package/template/agent/skills/paid-acquisition-specialist/SKILL.md +0 -119
  33. package/template/agent/skills/pricing-psychologist/SKILL.md +0 -58
  34. package/template/agent/skills/real-time-features/SKILL.md +0 -194
  35. package/template/agent/skills/retention-specialist/SKILL.md +0 -123
  36. package/template/agent/skills/rust-developer/SKILL.md +0 -281
  37. package/template/agent/skills/rust-developer/references/rust-rules/_sections.md +0 -231
  38. package/template/agent/skills/rust-developer/references/rust-rules/anti-clone-excessive.md +0 -124
  39. package/template/agent/skills/rust-developer/references/rust-rules/anti-collect-intermediate.md +0 -131
  40. package/template/agent/skills/rust-developer/references/rust-rules/anti-empty-catch.md +0 -132
  41. package/template/agent/skills/rust-developer/references/rust-rules/anti-expect-lazy.md +0 -95
  42. package/template/agent/skills/rust-developer/references/rust-rules/anti-format-hot-path.md +0 -141
  43. package/template/agent/skills/rust-developer/references/rust-rules/anti-index-over-iter.md +0 -125
  44. package/template/agent/skills/rust-developer/references/rust-rules/anti-lock-across-await.md +0 -127
  45. package/template/agent/skills/rust-developer/references/rust-rules/anti-over-abstraction.md +0 -120
  46. package/template/agent/skills/rust-developer/references/rust-rules/anti-panic-expected.md +0 -131
  47. package/template/agent/skills/rust-developer/references/rust-rules/anti-premature-optimize.md +0 -156
  48. package/template/agent/skills/rust-developer/references/rust-rules/anti-string-for-str.md +0 -122
  49. package/template/agent/skills/rust-developer/references/rust-rules/anti-stringly-typed.md +0 -167
  50. package/template/agent/skills/rust-developer/references/rust-rules/anti-type-erasure.md +0 -134
  51. package/template/agent/skills/rust-developer/references/rust-rules/anti-unwrap-abuse.md +0 -143
  52. package/template/agent/skills/rust-developer/references/rust-rules/anti-vec-for-slice.md +0 -121
  53. package/template/agent/skills/rust-developer/references/rust-rules/api-builder-must-use.md +0 -143
  54. package/template/agent/skills/rust-developer/references/rust-rules/api-builder-pattern.md +0 -187
  55. package/template/agent/skills/rust-developer/references/rust-rules/api-common-traits.md +0 -165
  56. package/template/agent/skills/rust-developer/references/rust-rules/api-default-impl.md +0 -177
  57. package/template/agent/skills/rust-developer/references/rust-rules/api-extension-trait.md +0 -163
  58. package/template/agent/skills/rust-developer/references/rust-rules/api-from-not-into.md +0 -146
  59. package/template/agent/skills/rust-developer/references/rust-rules/api-impl-asref.md +0 -142
  60. package/template/agent/skills/rust-developer/references/rust-rules/api-impl-into.md +0 -160
  61. package/template/agent/skills/rust-developer/references/rust-rules/api-must-use.md +0 -125
  62. package/template/agent/skills/rust-developer/references/rust-rules/api-newtype-safety.md +0 -162
  63. package/template/agent/skills/rust-developer/references/rust-rules/api-non-exhaustive.md +0 -177
  64. package/template/agent/skills/rust-developer/references/rust-rules/api-parse-dont-validate.md +0 -184
  65. package/template/agent/skills/rust-developer/references/rust-rules/api-sealed-trait.md +0 -168
  66. package/template/agent/skills/rust-developer/references/rust-rules/api-serde-optional.md +0 -182
  67. package/template/agent/skills/rust-developer/references/rust-rules/api-typestate.md +0 -199
  68. package/template/agent/skills/rust-developer/references/rust-rules/async-bounded-channel.md +0 -175
  69. package/template/agent/skills/rust-developer/references/rust-rules/async-broadcast-pubsub.md +0 -185
  70. package/template/agent/skills/rust-developer/references/rust-rules/async-cancellation-token.md +0 -203
  71. package/template/agent/skills/rust-developer/references/rust-rules/async-clone-before-await.md +0 -171
  72. package/template/agent/skills/rust-developer/references/rust-rules/async-join-parallel.md +0 -158
  73. package/template/agent/skills/rust-developer/references/rust-rules/async-joinset-structured.md +0 -195
  74. package/template/agent/skills/rust-developer/references/rust-rules/async-mpsc-queue.md +0 -171
  75. package/template/agent/skills/rust-developer/references/rust-rules/async-no-lock-await.md +0 -156
  76. package/template/agent/skills/rust-developer/references/rust-rules/async-oneshot-response.md +0 -191
  77. package/template/agent/skills/rust-developer/references/rust-rules/async-select-racing.md +0 -198
  78. package/template/agent/skills/rust-developer/references/rust-rules/async-spawn-blocking.md +0 -154
  79. package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-fs.md +0 -167
  80. package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-runtime.md +0 -169
  81. package/template/agent/skills/rust-developer/references/rust-rules/async-try-join.md +0 -172
  82. package/template/agent/skills/rust-developer/references/rust-rules/async-watch-latest.md +0 -189
  83. package/template/agent/skills/rust-developer/references/rust-rules/doc-all-public.md +0 -113
  84. package/template/agent/skills/rust-developer/references/rust-rules/doc-cargo-metadata.md +0 -147
  85. package/template/agent/skills/rust-developer/references/rust-rules/doc-errors-section.md +0 -122
  86. package/template/agent/skills/rust-developer/references/rust-rules/doc-examples-section.md +0 -161
  87. package/template/agent/skills/rust-developer/references/rust-rules/doc-hidden-setup.md +0 -149
  88. package/template/agent/skills/rust-developer/references/rust-rules/doc-intra-links.md +0 -138
  89. package/template/agent/skills/rust-developer/references/rust-rules/doc-link-types.md +0 -169
  90. package/template/agent/skills/rust-developer/references/rust-rules/doc-module-inner.md +0 -116
  91. package/template/agent/skills/rust-developer/references/rust-rules/doc-panics-section.md +0 -128
  92. package/template/agent/skills/rust-developer/references/rust-rules/doc-question-mark.md +0 -136
  93. package/template/agent/skills/rust-developer/references/rust-rules/doc-safety-section.md +0 -131
  94. package/template/agent/skills/rust-developer/references/rust-rules/err-anyhow-app.md +0 -179
  95. package/template/agent/skills/rust-developer/references/rust-rules/err-context-chain.md +0 -144
  96. package/template/agent/skills/rust-developer/references/rust-rules/err-custom-type.md +0 -152
  97. package/template/agent/skills/rust-developer/references/rust-rules/err-doc-errors.md +0 -145
  98. package/template/agent/skills/rust-developer/references/rust-rules/err-expect-bugs-only.md +0 -133
  99. package/template/agent/skills/rust-developer/references/rust-rules/err-from-impl.md +0 -152
  100. package/template/agent/skills/rust-developer/references/rust-rules/err-lowercase-msg.md +0 -124
  101. package/template/agent/skills/rust-developer/references/rust-rules/err-no-unwrap-prod.md +0 -115
  102. package/template/agent/skills/rust-developer/references/rust-rules/err-question-mark.md +0 -151
  103. package/template/agent/skills/rust-developer/references/rust-rules/err-result-over-panic.md +0 -130
  104. package/template/agent/skills/rust-developer/references/rust-rules/err-source-chain.md +0 -155
  105. package/template/agent/skills/rust-developer/references/rust-rules/err-thiserror-lib.md +0 -171
  106. package/template/agent/skills/rust-developer/references/rust-rules/lint-cargo-metadata.md +0 -138
  107. package/template/agent/skills/rust-developer/references/rust-rules/lint-deny-correctness.md +0 -107
  108. package/template/agent/skills/rust-developer/references/rust-rules/lint-missing-docs.md +0 -154
  109. package/template/agent/skills/rust-developer/references/rust-rules/lint-pedantic-selective.md +0 -118
  110. package/template/agent/skills/rust-developer/references/rust-rules/lint-rustfmt-check.md +0 -157
  111. package/template/agent/skills/rust-developer/references/rust-rules/lint-unsafe-doc.md +0 -133
  112. package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-complexity.md +0 -131
  113. package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-perf.md +0 -136
  114. package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-style.md +0 -135
  115. package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-suspicious.md +0 -122
  116. package/template/agent/skills/rust-developer/references/rust-rules/lint-workspace-lints.md +0 -172
  117. package/template/agent/skills/rust-developer/references/rust-rules/mem-arena-allocator.md +0 -168
  118. package/template/agent/skills/rust-developer/references/rust-rules/mem-arrayvec.md +0 -142
  119. package/template/agent/skills/rust-developer/references/rust-rules/mem-assert-type-size.md +0 -168
  120. package/template/agent/skills/rust-developer/references/rust-rules/mem-avoid-format.md +0 -147
  121. package/template/agent/skills/rust-developer/references/rust-rules/mem-box-large-variant.md +0 -158
  122. package/template/agent/skills/rust-developer/references/rust-rules/mem-boxed-slice.md +0 -139
  123. package/template/agent/skills/rust-developer/references/rust-rules/mem-clone-from.md +0 -147
  124. package/template/agent/skills/rust-developer/references/rust-rules/mem-compact-string.md +0 -149
  125. package/template/agent/skills/rust-developer/references/rust-rules/mem-reuse-collections.md +0 -174
  126. package/template/agent/skills/rust-developer/references/rust-rules/mem-smaller-integers.md +0 -159
  127. package/template/agent/skills/rust-developer/references/rust-rules/mem-smallvec.md +0 -138
  128. package/template/agent/skills/rust-developer/references/rust-rules/mem-thinvec.md +0 -142
  129. package/template/agent/skills/rust-developer/references/rust-rules/mem-with-capacity.md +0 -156
  130. package/template/agent/skills/rust-developer/references/rust-rules/mem-write-over-format.md +0 -172
  131. package/template/agent/skills/rust-developer/references/rust-rules/mem-zero-copy.md +0 -164
  132. package/template/agent/skills/rust-developer/references/rust-rules/name-acronym-word.md +0 -99
  133. package/template/agent/skills/rust-developer/references/rust-rules/name-as-free.md +0 -104
  134. package/template/agent/skills/rust-developer/references/rust-rules/name-consts-screaming.md +0 -94
  135. package/template/agent/skills/rust-developer/references/rust-rules/name-crate-no-rs.md +0 -78
  136. package/template/agent/skills/rust-developer/references/rust-rules/name-funcs-snake.md +0 -76
  137. package/template/agent/skills/rust-developer/references/rust-rules/name-into-ownership.md +0 -123
  138. package/template/agent/skills/rust-developer/references/rust-rules/name-is-has-bool.md +0 -127
  139. package/template/agent/skills/rust-developer/references/rust-rules/name-iter-convention.md +0 -129
  140. package/template/agent/skills/rust-developer/references/rust-rules/name-iter-method.md +0 -131
  141. package/template/agent/skills/rust-developer/references/rust-rules/name-iter-type-match.md +0 -142
  142. package/template/agent/skills/rust-developer/references/rust-rules/name-lifetime-short.md +0 -86
  143. package/template/agent/skills/rust-developer/references/rust-rules/name-no-get-prefix.md +0 -154
  144. package/template/agent/skills/rust-developer/references/rust-rules/name-to-expensive.md +0 -118
  145. package/template/agent/skills/rust-developer/references/rust-rules/name-type-param-single.md +0 -92
  146. package/template/agent/skills/rust-developer/references/rust-rules/name-types-camel.md +0 -65
  147. package/template/agent/skills/rust-developer/references/rust-rules/name-variants-camel.md +0 -101
  148. package/template/agent/skills/rust-developer/references/rust-rules/opt-bounds-check.md +0 -161
  149. package/template/agent/skills/rust-developer/references/rust-rules/opt-cache-friendly.md +0 -187
  150. package/template/agent/skills/rust-developer/references/rust-rules/opt-codegen-units.md +0 -142
  151. package/template/agent/skills/rust-developer/references/rust-rules/opt-cold-unlikely.md +0 -152
  152. package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-always-rare.md +0 -141
  153. package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-never-cold.md +0 -181
  154. package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-small.md +0 -160
  155. package/template/agent/skills/rust-developer/references/rust-rules/opt-likely-hint.md +0 -171
  156. package/template/agent/skills/rust-developer/references/rust-rules/opt-lto-release.md +0 -130
  157. package/template/agent/skills/rust-developer/references/rust-rules/opt-pgo-profile.md +0 -167
  158. package/template/agent/skills/rust-developer/references/rust-rules/opt-simd-portable.md +0 -144
  159. package/template/agent/skills/rust-developer/references/rust-rules/opt-target-cpu.md +0 -154
  160. package/template/agent/skills/rust-developer/references/rust-rules/own-arc-shared.md +0 -141
  161. package/template/agent/skills/rust-developer/references/rust-rules/own-borrow-over-clone.md +0 -95
  162. package/template/agent/skills/rust-developer/references/rust-rules/own-clone-explicit.md +0 -135
  163. package/template/agent/skills/rust-developer/references/rust-rules/own-copy-small.md +0 -124
  164. package/template/agent/skills/rust-developer/references/rust-rules/own-cow-conditional.md +0 -135
  165. package/template/agent/skills/rust-developer/references/rust-rules/own-lifetime-elision.md +0 -134
  166. package/template/agent/skills/rust-developer/references/rust-rules/own-move-large.md +0 -134
  167. package/template/agent/skills/rust-developer/references/rust-rules/own-mutex-interior.md +0 -105
  168. package/template/agent/skills/rust-developer/references/rust-rules/own-rc-single-thread.md +0 -65
  169. package/template/agent/skills/rust-developer/references/rust-rules/own-refcell-interior.md +0 -97
  170. package/template/agent/skills/rust-developer/references/rust-rules/own-rwlock-readers.md +0 -122
  171. package/template/agent/skills/rust-developer/references/rust-rules/own-slice-over-vec.md +0 -119
  172. package/template/agent/skills/rust-developer/references/rust-rules/perf-black-box-bench.md +0 -153
  173. package/template/agent/skills/rust-developer/references/rust-rules/perf-chain-avoid.md +0 -136
  174. package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-into.md +0 -133
  175. package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-once.md +0 -120
  176. package/template/agent/skills/rust-developer/references/rust-rules/perf-drain-reuse.md +0 -137
  177. package/template/agent/skills/rust-developer/references/rust-rules/perf-entry-api.md +0 -134
  178. package/template/agent/skills/rust-developer/references/rust-rules/perf-extend-batch.md +0 -150
  179. package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-lazy.md +0 -123
  180. package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-over-index.md +0 -113
  181. package/template/agent/skills/rust-developer/references/rust-rules/perf-profile-first.md +0 -175
  182. package/template/agent/skills/rust-developer/references/rust-rules/perf-release-profile.md +0 -149
  183. package/template/agent/skills/rust-developer/references/rust-rules/proj-bin-dir.md +0 -142
  184. package/template/agent/skills/rust-developer/references/rust-rules/proj-flat-small.md +0 -133
  185. package/template/agent/skills/rust-developer/references/rust-rules/proj-lib-main-split.md +0 -148
  186. package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-by-feature.md +0 -130
  187. package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-rs-dir.md +0 -120
  188. package/template/agent/skills/rust-developer/references/rust-rules/proj-prelude-module.md +0 -155
  189. package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-crate-internal.md +0 -139
  190. package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-super-parent.md +0 -135
  191. package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-use-reexport.md +0 -162
  192. package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-deps.md +0 -186
  193. package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-large.md +0 -162
  194. package/template/agent/skills/rust-developer/references/rust-rules/test-arrange-act-assert.md +0 -160
  195. package/template/agent/skills/rust-developer/references/rust-rules/test-cfg-test-module.md +0 -151
  196. package/template/agent/skills/rust-developer/references/rust-rules/test-criterion-bench.md +0 -171
  197. package/template/agent/skills/rust-developer/references/rust-rules/test-descriptive-names.md +0 -142
  198. package/template/agent/skills/rust-developer/references/rust-rules/test-doctest-examples.md +0 -168
  199. package/template/agent/skills/rust-developer/references/rust-rules/test-fixture-raii.md +0 -151
  200. package/template/agent/skills/rust-developer/references/rust-rules/test-integration-dir.md +0 -144
  201. package/template/agent/skills/rust-developer/references/rust-rules/test-mock-traits.md +0 -189
  202. package/template/agent/skills/rust-developer/references/rust-rules/test-mockall-mocking.md +0 -226
  203. package/template/agent/skills/rust-developer/references/rust-rules/test-proptest-properties.md +0 -161
  204. package/template/agent/skills/rust-developer/references/rust-rules/test-should-panic.md +0 -130
  205. package/template/agent/skills/rust-developer/references/rust-rules/test-tokio-async.md +0 -154
  206. package/template/agent/skills/rust-developer/references/rust-rules/test-use-super.md +0 -127
  207. package/template/agent/skills/rust-developer/references/rust-rules/type-enum-states.md +0 -154
  208. package/template/agent/skills/rust-developer/references/rust-rules/type-generic-bounds.md +0 -142
  209. package/template/agent/skills/rust-developer/references/rust-rules/type-never-diverge.md +0 -146
  210. package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-ids.md +0 -160
  211. package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-validated.md +0 -159
  212. package/template/agent/skills/rust-developer/references/rust-rules/type-no-stringly.md +0 -144
  213. package/template/agent/skills/rust-developer/references/rust-rules/type-option-nullable.md +0 -137
  214. package/template/agent/skills/rust-developer/references/rust-rules/type-phantom-marker.md +0 -188
  215. package/template/agent/skills/rust-developer/references/rust-rules/type-repr-transparent.md +0 -143
  216. package/template/agent/skills/rust-developer/references/rust-rules/type-result-fallible.md +0 -131
  217. package/template/agent/skills/saas-architect/SKILL.md +0 -139
  218. package/template/agent/skills/security-engineer/SKILL.md +0 -133
  219. package/template/agent/skills/seo-specialist/SKILL.md +0 -130
  220. 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
@@ -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