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.
Files changed (231) hide show
  1. package/README.md +47 -150
  2. package/package.json +1 -1
  3. package/template/agent/rules/CLAUDE.md +80 -0
  4. package/template/agent/rules/code-styles.md +31 -32
  5. package/template/agent/rules/debug-confirmation-policy.md +2 -0
  6. package/template/agent/rules/file-length-policy.md +2 -0
  7. package/template/agent/rules/git-policy.md +7 -0
  8. package/template/agent/rules/language-matching.md +2 -0
  9. package/template/agent/rules/scratch-scripts.md +39 -0
  10. package/template/agent/rules/superpowers.md +8 -51
  11. package/template/agent/skills/executing-plans/SKILL.md +17 -0
  12. package/template/agent/skills/systematic-debugging/SKILL.md +16 -0
  13. package/template/agent/skills/test-driven-development/SKILL.md +16 -0
  14. package/template/agent/skills/verification-before-completion/SKILL.md +22 -0
  15. package/template/agent/skills/writing-plans/SKILL.md +16 -0
  16. package/template/agent/skills/ai-integrated-product/SKILL.md +0 -57
  17. package/template/agent/skills/analytics-setup/SKILL.md +0 -51
  18. package/template/agent/skills/api-design/SKILL.md +0 -193
  19. package/template/agent/skills/app-store-optimizer/SKILL.md +0 -127
  20. package/template/agent/skills/auth-and-identity/SKILL.md +0 -167
  21. package/template/agent/skills/backend-developer/SKILL.md +0 -148
  22. package/template/agent/skills/bootstrapper-finance/SKILL.md +0 -55
  23. package/template/agent/skills/chrome-extension-developer/SKILL.md +0 -53
  24. package/template/agent/skills/community-manager/SKILL.md +0 -115
  25. package/template/agent/skills/content-marketer/SKILL.md +0 -111
  26. package/template/agent/skills/conversion-optimizer/SKILL.md +0 -142
  27. package/template/agent/skills/cto-architect/SKILL.md +0 -133
  28. package/template/agent/skills/customer-success-manager/SKILL.md +0 -126
  29. package/template/agent/skills/data-analyst/SKILL.md +0 -147
  30. package/template/agent/skills/devops-engineer/SKILL.md +0 -117
  31. package/template/agent/skills/email-infrastructure/SKILL.md +0 -164
  32. package/template/agent/skills/game-design/SKILL.md +0 -194
  33. package/template/agent/skills/game-developer/SKILL.md +0 -175
  34. package/template/agent/skills/growth-hacker/SKILL.md +0 -122
  35. package/template/agent/skills/idea-validator/SKILL.md +0 -55
  36. package/template/agent/skills/indie-legal/SKILL.md +0 -53
  37. package/template/agent/skills/influencer-marketer/SKILL.md +0 -141
  38. package/template/agent/skills/landing-page-builder/SKILL.md +0 -59
  39. package/template/agent/skills/launch-strategist/SKILL.md +0 -62
  40. package/template/agent/skills/market-researcher/SKILL.md +0 -53
  41. package/template/agent/skills/micro-saas-builder/SKILL.md +0 -56
  42. package/template/agent/skills/monetization-strategist/SKILL.md +0 -119
  43. package/template/agent/skills/paid-acquisition-specialist/SKILL.md +0 -119
  44. package/template/agent/skills/pricing-psychologist/SKILL.md +0 -58
  45. package/template/agent/skills/real-time-features/SKILL.md +0 -194
  46. package/template/agent/skills/retention-specialist/SKILL.md +0 -123
  47. package/template/agent/skills/rust-developer/SKILL.md +0 -281
  48. package/template/agent/skills/rust-developer/references/rust-rules/_sections.md +0 -231
  49. package/template/agent/skills/rust-developer/references/rust-rules/anti-clone-excessive.md +0 -124
  50. package/template/agent/skills/rust-developer/references/rust-rules/anti-collect-intermediate.md +0 -131
  51. package/template/agent/skills/rust-developer/references/rust-rules/anti-empty-catch.md +0 -132
  52. package/template/agent/skills/rust-developer/references/rust-rules/anti-expect-lazy.md +0 -95
  53. package/template/agent/skills/rust-developer/references/rust-rules/anti-format-hot-path.md +0 -141
  54. package/template/agent/skills/rust-developer/references/rust-rules/anti-index-over-iter.md +0 -125
  55. package/template/agent/skills/rust-developer/references/rust-rules/anti-lock-across-await.md +0 -127
  56. package/template/agent/skills/rust-developer/references/rust-rules/anti-over-abstraction.md +0 -120
  57. package/template/agent/skills/rust-developer/references/rust-rules/anti-panic-expected.md +0 -131
  58. package/template/agent/skills/rust-developer/references/rust-rules/anti-premature-optimize.md +0 -156
  59. package/template/agent/skills/rust-developer/references/rust-rules/anti-string-for-str.md +0 -122
  60. package/template/agent/skills/rust-developer/references/rust-rules/anti-stringly-typed.md +0 -167
  61. package/template/agent/skills/rust-developer/references/rust-rules/anti-type-erasure.md +0 -134
  62. package/template/agent/skills/rust-developer/references/rust-rules/anti-unwrap-abuse.md +0 -143
  63. package/template/agent/skills/rust-developer/references/rust-rules/anti-vec-for-slice.md +0 -121
  64. package/template/agent/skills/rust-developer/references/rust-rules/api-builder-must-use.md +0 -143
  65. package/template/agent/skills/rust-developer/references/rust-rules/api-builder-pattern.md +0 -187
  66. package/template/agent/skills/rust-developer/references/rust-rules/api-common-traits.md +0 -165
  67. package/template/agent/skills/rust-developer/references/rust-rules/api-default-impl.md +0 -177
  68. package/template/agent/skills/rust-developer/references/rust-rules/api-extension-trait.md +0 -163
  69. package/template/agent/skills/rust-developer/references/rust-rules/api-from-not-into.md +0 -146
  70. package/template/agent/skills/rust-developer/references/rust-rules/api-impl-asref.md +0 -142
  71. package/template/agent/skills/rust-developer/references/rust-rules/api-impl-into.md +0 -160
  72. package/template/agent/skills/rust-developer/references/rust-rules/api-must-use.md +0 -125
  73. package/template/agent/skills/rust-developer/references/rust-rules/api-newtype-safety.md +0 -162
  74. package/template/agent/skills/rust-developer/references/rust-rules/api-non-exhaustive.md +0 -177
  75. package/template/agent/skills/rust-developer/references/rust-rules/api-parse-dont-validate.md +0 -184
  76. package/template/agent/skills/rust-developer/references/rust-rules/api-sealed-trait.md +0 -168
  77. package/template/agent/skills/rust-developer/references/rust-rules/api-serde-optional.md +0 -182
  78. package/template/agent/skills/rust-developer/references/rust-rules/api-typestate.md +0 -199
  79. package/template/agent/skills/rust-developer/references/rust-rules/async-bounded-channel.md +0 -175
  80. package/template/agent/skills/rust-developer/references/rust-rules/async-broadcast-pubsub.md +0 -185
  81. package/template/agent/skills/rust-developer/references/rust-rules/async-cancellation-token.md +0 -203
  82. package/template/agent/skills/rust-developer/references/rust-rules/async-clone-before-await.md +0 -171
  83. package/template/agent/skills/rust-developer/references/rust-rules/async-join-parallel.md +0 -158
  84. package/template/agent/skills/rust-developer/references/rust-rules/async-joinset-structured.md +0 -195
  85. package/template/agent/skills/rust-developer/references/rust-rules/async-mpsc-queue.md +0 -171
  86. package/template/agent/skills/rust-developer/references/rust-rules/async-no-lock-await.md +0 -156
  87. package/template/agent/skills/rust-developer/references/rust-rules/async-oneshot-response.md +0 -191
  88. package/template/agent/skills/rust-developer/references/rust-rules/async-select-racing.md +0 -198
  89. package/template/agent/skills/rust-developer/references/rust-rules/async-spawn-blocking.md +0 -154
  90. package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-fs.md +0 -167
  91. package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-runtime.md +0 -169
  92. package/template/agent/skills/rust-developer/references/rust-rules/async-try-join.md +0 -172
  93. package/template/agent/skills/rust-developer/references/rust-rules/async-watch-latest.md +0 -189
  94. package/template/agent/skills/rust-developer/references/rust-rules/doc-all-public.md +0 -113
  95. package/template/agent/skills/rust-developer/references/rust-rules/doc-cargo-metadata.md +0 -147
  96. package/template/agent/skills/rust-developer/references/rust-rules/doc-errors-section.md +0 -122
  97. package/template/agent/skills/rust-developer/references/rust-rules/doc-examples-section.md +0 -161
  98. package/template/agent/skills/rust-developer/references/rust-rules/doc-hidden-setup.md +0 -149
  99. package/template/agent/skills/rust-developer/references/rust-rules/doc-intra-links.md +0 -138
  100. package/template/agent/skills/rust-developer/references/rust-rules/doc-link-types.md +0 -169
  101. package/template/agent/skills/rust-developer/references/rust-rules/doc-module-inner.md +0 -116
  102. package/template/agent/skills/rust-developer/references/rust-rules/doc-panics-section.md +0 -128
  103. package/template/agent/skills/rust-developer/references/rust-rules/doc-question-mark.md +0 -136
  104. package/template/agent/skills/rust-developer/references/rust-rules/doc-safety-section.md +0 -131
  105. package/template/agent/skills/rust-developer/references/rust-rules/err-anyhow-app.md +0 -179
  106. package/template/agent/skills/rust-developer/references/rust-rules/err-context-chain.md +0 -144
  107. package/template/agent/skills/rust-developer/references/rust-rules/err-custom-type.md +0 -152
  108. package/template/agent/skills/rust-developer/references/rust-rules/err-doc-errors.md +0 -145
  109. package/template/agent/skills/rust-developer/references/rust-rules/err-expect-bugs-only.md +0 -133
  110. package/template/agent/skills/rust-developer/references/rust-rules/err-from-impl.md +0 -152
  111. package/template/agent/skills/rust-developer/references/rust-rules/err-lowercase-msg.md +0 -124
  112. package/template/agent/skills/rust-developer/references/rust-rules/err-no-unwrap-prod.md +0 -115
  113. package/template/agent/skills/rust-developer/references/rust-rules/err-question-mark.md +0 -151
  114. package/template/agent/skills/rust-developer/references/rust-rules/err-result-over-panic.md +0 -130
  115. package/template/agent/skills/rust-developer/references/rust-rules/err-source-chain.md +0 -155
  116. package/template/agent/skills/rust-developer/references/rust-rules/err-thiserror-lib.md +0 -171
  117. package/template/agent/skills/rust-developer/references/rust-rules/lint-cargo-metadata.md +0 -138
  118. package/template/agent/skills/rust-developer/references/rust-rules/lint-deny-correctness.md +0 -107
  119. package/template/agent/skills/rust-developer/references/rust-rules/lint-missing-docs.md +0 -154
  120. package/template/agent/skills/rust-developer/references/rust-rules/lint-pedantic-selective.md +0 -118
  121. package/template/agent/skills/rust-developer/references/rust-rules/lint-rustfmt-check.md +0 -157
  122. package/template/agent/skills/rust-developer/references/rust-rules/lint-unsafe-doc.md +0 -133
  123. package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-complexity.md +0 -131
  124. package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-perf.md +0 -136
  125. package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-style.md +0 -135
  126. package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-suspicious.md +0 -122
  127. package/template/agent/skills/rust-developer/references/rust-rules/lint-workspace-lints.md +0 -172
  128. package/template/agent/skills/rust-developer/references/rust-rules/mem-arena-allocator.md +0 -168
  129. package/template/agent/skills/rust-developer/references/rust-rules/mem-arrayvec.md +0 -142
  130. package/template/agent/skills/rust-developer/references/rust-rules/mem-assert-type-size.md +0 -168
  131. package/template/agent/skills/rust-developer/references/rust-rules/mem-avoid-format.md +0 -147
  132. package/template/agent/skills/rust-developer/references/rust-rules/mem-box-large-variant.md +0 -158
  133. package/template/agent/skills/rust-developer/references/rust-rules/mem-boxed-slice.md +0 -139
  134. package/template/agent/skills/rust-developer/references/rust-rules/mem-clone-from.md +0 -147
  135. package/template/agent/skills/rust-developer/references/rust-rules/mem-compact-string.md +0 -149
  136. package/template/agent/skills/rust-developer/references/rust-rules/mem-reuse-collections.md +0 -174
  137. package/template/agent/skills/rust-developer/references/rust-rules/mem-smaller-integers.md +0 -159
  138. package/template/agent/skills/rust-developer/references/rust-rules/mem-smallvec.md +0 -138
  139. package/template/agent/skills/rust-developer/references/rust-rules/mem-thinvec.md +0 -142
  140. package/template/agent/skills/rust-developer/references/rust-rules/mem-with-capacity.md +0 -156
  141. package/template/agent/skills/rust-developer/references/rust-rules/mem-write-over-format.md +0 -172
  142. package/template/agent/skills/rust-developer/references/rust-rules/mem-zero-copy.md +0 -164
  143. package/template/agent/skills/rust-developer/references/rust-rules/name-acronym-word.md +0 -99
  144. package/template/agent/skills/rust-developer/references/rust-rules/name-as-free.md +0 -104
  145. package/template/agent/skills/rust-developer/references/rust-rules/name-consts-screaming.md +0 -94
  146. package/template/agent/skills/rust-developer/references/rust-rules/name-crate-no-rs.md +0 -78
  147. package/template/agent/skills/rust-developer/references/rust-rules/name-funcs-snake.md +0 -76
  148. package/template/agent/skills/rust-developer/references/rust-rules/name-into-ownership.md +0 -123
  149. package/template/agent/skills/rust-developer/references/rust-rules/name-is-has-bool.md +0 -127
  150. package/template/agent/skills/rust-developer/references/rust-rules/name-iter-convention.md +0 -129
  151. package/template/agent/skills/rust-developer/references/rust-rules/name-iter-method.md +0 -131
  152. package/template/agent/skills/rust-developer/references/rust-rules/name-iter-type-match.md +0 -142
  153. package/template/agent/skills/rust-developer/references/rust-rules/name-lifetime-short.md +0 -86
  154. package/template/agent/skills/rust-developer/references/rust-rules/name-no-get-prefix.md +0 -154
  155. package/template/agent/skills/rust-developer/references/rust-rules/name-to-expensive.md +0 -118
  156. package/template/agent/skills/rust-developer/references/rust-rules/name-type-param-single.md +0 -92
  157. package/template/agent/skills/rust-developer/references/rust-rules/name-types-camel.md +0 -65
  158. package/template/agent/skills/rust-developer/references/rust-rules/name-variants-camel.md +0 -101
  159. package/template/agent/skills/rust-developer/references/rust-rules/opt-bounds-check.md +0 -161
  160. package/template/agent/skills/rust-developer/references/rust-rules/opt-cache-friendly.md +0 -187
  161. package/template/agent/skills/rust-developer/references/rust-rules/opt-codegen-units.md +0 -142
  162. package/template/agent/skills/rust-developer/references/rust-rules/opt-cold-unlikely.md +0 -152
  163. package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-always-rare.md +0 -141
  164. package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-never-cold.md +0 -181
  165. package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-small.md +0 -160
  166. package/template/agent/skills/rust-developer/references/rust-rules/opt-likely-hint.md +0 -171
  167. package/template/agent/skills/rust-developer/references/rust-rules/opt-lto-release.md +0 -130
  168. package/template/agent/skills/rust-developer/references/rust-rules/opt-pgo-profile.md +0 -167
  169. package/template/agent/skills/rust-developer/references/rust-rules/opt-simd-portable.md +0 -144
  170. package/template/agent/skills/rust-developer/references/rust-rules/opt-target-cpu.md +0 -154
  171. package/template/agent/skills/rust-developer/references/rust-rules/own-arc-shared.md +0 -141
  172. package/template/agent/skills/rust-developer/references/rust-rules/own-borrow-over-clone.md +0 -95
  173. package/template/agent/skills/rust-developer/references/rust-rules/own-clone-explicit.md +0 -135
  174. package/template/agent/skills/rust-developer/references/rust-rules/own-copy-small.md +0 -124
  175. package/template/agent/skills/rust-developer/references/rust-rules/own-cow-conditional.md +0 -135
  176. package/template/agent/skills/rust-developer/references/rust-rules/own-lifetime-elision.md +0 -134
  177. package/template/agent/skills/rust-developer/references/rust-rules/own-move-large.md +0 -134
  178. package/template/agent/skills/rust-developer/references/rust-rules/own-mutex-interior.md +0 -105
  179. package/template/agent/skills/rust-developer/references/rust-rules/own-rc-single-thread.md +0 -65
  180. package/template/agent/skills/rust-developer/references/rust-rules/own-refcell-interior.md +0 -97
  181. package/template/agent/skills/rust-developer/references/rust-rules/own-rwlock-readers.md +0 -122
  182. package/template/agent/skills/rust-developer/references/rust-rules/own-slice-over-vec.md +0 -119
  183. package/template/agent/skills/rust-developer/references/rust-rules/perf-black-box-bench.md +0 -153
  184. package/template/agent/skills/rust-developer/references/rust-rules/perf-chain-avoid.md +0 -136
  185. package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-into.md +0 -133
  186. package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-once.md +0 -120
  187. package/template/agent/skills/rust-developer/references/rust-rules/perf-drain-reuse.md +0 -137
  188. package/template/agent/skills/rust-developer/references/rust-rules/perf-entry-api.md +0 -134
  189. package/template/agent/skills/rust-developer/references/rust-rules/perf-extend-batch.md +0 -150
  190. package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-lazy.md +0 -123
  191. package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-over-index.md +0 -113
  192. package/template/agent/skills/rust-developer/references/rust-rules/perf-profile-first.md +0 -175
  193. package/template/agent/skills/rust-developer/references/rust-rules/perf-release-profile.md +0 -149
  194. package/template/agent/skills/rust-developer/references/rust-rules/proj-bin-dir.md +0 -142
  195. package/template/agent/skills/rust-developer/references/rust-rules/proj-flat-small.md +0 -133
  196. package/template/agent/skills/rust-developer/references/rust-rules/proj-lib-main-split.md +0 -148
  197. package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-by-feature.md +0 -130
  198. package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-rs-dir.md +0 -120
  199. package/template/agent/skills/rust-developer/references/rust-rules/proj-prelude-module.md +0 -155
  200. package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-crate-internal.md +0 -139
  201. package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-super-parent.md +0 -135
  202. package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-use-reexport.md +0 -162
  203. package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-deps.md +0 -186
  204. package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-large.md +0 -162
  205. package/template/agent/skills/rust-developer/references/rust-rules/test-arrange-act-assert.md +0 -160
  206. package/template/agent/skills/rust-developer/references/rust-rules/test-cfg-test-module.md +0 -151
  207. package/template/agent/skills/rust-developer/references/rust-rules/test-criterion-bench.md +0 -171
  208. package/template/agent/skills/rust-developer/references/rust-rules/test-descriptive-names.md +0 -142
  209. package/template/agent/skills/rust-developer/references/rust-rules/test-doctest-examples.md +0 -168
  210. package/template/agent/skills/rust-developer/references/rust-rules/test-fixture-raii.md +0 -151
  211. package/template/agent/skills/rust-developer/references/rust-rules/test-integration-dir.md +0 -144
  212. package/template/agent/skills/rust-developer/references/rust-rules/test-mock-traits.md +0 -189
  213. package/template/agent/skills/rust-developer/references/rust-rules/test-mockall-mocking.md +0 -226
  214. package/template/agent/skills/rust-developer/references/rust-rules/test-proptest-properties.md +0 -161
  215. package/template/agent/skills/rust-developer/references/rust-rules/test-should-panic.md +0 -130
  216. package/template/agent/skills/rust-developer/references/rust-rules/test-tokio-async.md +0 -154
  217. package/template/agent/skills/rust-developer/references/rust-rules/test-use-super.md +0 -127
  218. package/template/agent/skills/rust-developer/references/rust-rules/type-enum-states.md +0 -154
  219. package/template/agent/skills/rust-developer/references/rust-rules/type-generic-bounds.md +0 -142
  220. package/template/agent/skills/rust-developer/references/rust-rules/type-never-diverge.md +0 -146
  221. package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-ids.md +0 -160
  222. package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-validated.md +0 -159
  223. package/template/agent/skills/rust-developer/references/rust-rules/type-no-stringly.md +0 -144
  224. package/template/agent/skills/rust-developer/references/rust-rules/type-option-nullable.md +0 -137
  225. package/template/agent/skills/rust-developer/references/rust-rules/type-phantom-marker.md +0 -188
  226. package/template/agent/skills/rust-developer/references/rust-rules/type-repr-transparent.md +0 -143
  227. package/template/agent/skills/rust-developer/references/rust-rules/type-result-fallible.md +0 -131
  228. package/template/agent/skills/saas-architect/SKILL.md +0 -139
  229. package/template/agent/skills/security-engineer/SKILL.md +0 -133
  230. package/template/agent/skills/seo-specialist/SKILL.md +0 -130
  231. package/template/agent/skills/solo-founder-ops/SKILL.md +0 -56
@@ -1,131 +0,0 @@
1
- # name-iter-method
2
-
3
- > Name iterator methods `iter()`, `iter_mut()`, and `into_iter()` consistently
4
-
5
- ## Why It Matters
6
-
7
- Rust has a strong convention for iterator method names. Following these conventions makes your types work predictably with `for` loops and iterator adapters. Users expect `iter()` for shared references, `iter_mut()` for mutable references, and `into_iter()` for owned iteration.
8
-
9
- ## Bad
10
-
11
- ```rust
12
- struct Collection<T> {
13
- items: Vec<T>,
14
- }
15
-
16
- impl<T> Collection<T> {
17
- // Non-standard names - confusing
18
- fn elements(&self) -> impl Iterator<Item = &T> {
19
- self.items.iter()
20
- }
21
-
22
- fn get_iterator(&self) -> impl Iterator<Item = &T> {
23
- self.items.iter()
24
- }
25
-
26
- fn to_iter(self) -> impl Iterator<Item = T> {
27
- self.items.into_iter()
28
- }
29
- }
30
- ```
31
-
32
- ## Good
33
-
34
- ```rust
35
- struct Collection<T> {
36
- items: Vec<T>,
37
- }
38
-
39
- impl<T> Collection<T> {
40
- /// Returns an iterator over references.
41
- fn iter(&self) -> impl Iterator<Item = &T> {
42
- self.items.iter()
43
- }
44
-
45
- /// Returns an iterator over mutable references.
46
- fn iter_mut(&mut self) -> impl Iterator<Item = &mut T> {
47
- self.items.iter_mut()
48
- }
49
- }
50
-
51
- // Implement IntoIterator for for-loop support
52
- impl<T> IntoIterator for Collection<T> {
53
- type Item = T;
54
- type IntoIter = std::vec::IntoIter<T>;
55
-
56
- fn into_iter(self) -> Self::IntoIter {
57
- self.items.into_iter()
58
- }
59
- }
60
-
61
- impl<'a, T> IntoIterator for &'a Collection<T> {
62
- type Item = &'a T;
63
- type IntoIter = std::slice::Iter<'a, T>;
64
-
65
- fn into_iter(self) -> Self::IntoIter {
66
- self.items.iter()
67
- }
68
- }
69
-
70
- impl<'a, T> IntoIterator for &'a mut Collection<T> {
71
- type Item = &'a mut T;
72
- type IntoIter = std::slice::IterMut<'a, T>;
73
-
74
- fn into_iter(self) -> Self::IntoIter {
75
- self.items.iter_mut()
76
- }
77
- }
78
- ```
79
-
80
- ## Iterator Convention Summary
81
-
82
- | Method | Receiver | Yields | Use Case |
83
- |--------|----------|--------|----------|
84
- | `iter()` | `&self` | `&T` | Read-only iteration |
85
- | `iter_mut()` | `&mut self` | `&mut T` | In-place modification |
86
- | `into_iter()` | `self` | `T` | Consuming iteration |
87
-
88
- ## For Loop Integration
89
-
90
- ```rust
91
- let col = Collection { items: vec![1, 2, 3] };
92
-
93
- // These all work with proper IntoIterator impls
94
- for item in &col { // Calls (&col).into_iter() -> iter()
95
- println!("{}", item); // &i32
96
- }
97
-
98
- for item in &mut col { // Calls (&mut col).into_iter() -> iter_mut()
99
- *item += 1; // &mut i32
100
- }
101
-
102
- for item in col { // Calls col.into_iter()
103
- process(item); // i32, consumes col
104
- }
105
- ```
106
-
107
- ## Additional Iterator Methods
108
-
109
- ```rust
110
- impl<T> Collection<T> {
111
- // Domain-specific iterators follow similar patterns
112
-
113
- /// Iterates over keys (for map-like structures).
114
- fn keys(&self) -> impl Iterator<Item = &K> { ... }
115
-
116
- /// Iterates over values.
117
- fn values(&self) -> impl Iterator<Item = &V> { ... }
118
-
119
- /// Iterates over mutable values.
120
- fn values_mut(&mut self) -> impl Iterator<Item = &mut V> { ... }
121
-
122
- /// Drains elements, leaving container empty.
123
- fn drain(&mut self) -> impl Iterator<Item = T> { ... }
124
- }
125
- ```
126
-
127
- ## See Also
128
-
129
- - [name-as-free](./name-as-free.md) - Conversion naming conventions
130
- - [api-extension-trait](./api-extension-trait.md) - Iterator extensions
131
- - [api-common-traits](./api-common-traits.md) - Standard trait implementations
@@ -1,142 +0,0 @@
1
- # name-iter-type-match
2
-
3
- > Name iterator types after their source method
4
-
5
- ## Why It Matters
6
-
7
- Iterator types should match the method that creates them. `iter()` returns `Iter`, `into_iter()` returns `IntoIter`, `keys()` returns `Keys`. This naming pattern is established by the standard library and makes types predictable.
8
-
9
- ## Standard Library Pattern
10
-
11
- ```rust
12
- // Vec
13
- impl<T> Vec<T> {
14
- fn iter(&self) -> Iter<'_, T> { } // Returns Iter
15
- fn iter_mut(&mut self) -> IterMut<'_, T> { } // Returns IterMut
16
- }
17
-
18
- impl<T> IntoIterator for Vec<T> {
19
- type IntoIter = IntoIter<T>; // Returns IntoIter
20
- }
21
-
22
- // HashMap
23
- impl<K, V> HashMap<K, V> {
24
- fn iter(&self) -> Iter<'_, K, V> { }
25
- fn keys(&self) -> Keys<'_, K, V> { } // Returns Keys
26
- fn values(&self) -> Values<'_, K, V> { } // Returns Values
27
- fn drain(&mut self) -> Drain<'_, K, V> { } // Returns Drain
28
- }
29
- ```
30
-
31
- ## Implementation
32
-
33
- ```rust
34
- mod my_collection {
35
- pub struct MyCollection<T> {
36
- items: Vec<T>,
37
- }
38
-
39
- // Iterator types in same module
40
- pub struct Iter<'a, T> {
41
- inner: std::slice::Iter<'a, T>,
42
- }
43
-
44
- pub struct IterMut<'a, T> {
45
- inner: std::slice::IterMut<'a, T>,
46
- }
47
-
48
- pub struct IntoIter<T> {
49
- inner: std::vec::IntoIter<T>,
50
- }
51
-
52
- impl<T> MyCollection<T> {
53
- pub fn iter(&self) -> Iter<'_, T> {
54
- Iter { inner: self.items.iter() }
55
- }
56
-
57
- pub fn iter_mut(&mut self) -> IterMut<'_, T> {
58
- IterMut { inner: self.items.iter_mut() }
59
- }
60
- }
61
-
62
- impl<T> IntoIterator for MyCollection<T> {
63
- type Item = T;
64
- type IntoIter = IntoIter<T>;
65
-
66
- fn into_iter(self) -> IntoIter<T> {
67
- IntoIter { inner: self.items.into_iter() }
68
- }
69
- }
70
-
71
- // Implement Iterator for each type
72
- impl<'a, T> Iterator for Iter<'a, T> {
73
- type Item = &'a T;
74
- fn next(&mut self) -> Option<Self::Item> {
75
- self.inner.next()
76
- }
77
- }
78
-
79
- impl<'a, T> Iterator for IterMut<'a, T> {
80
- type Item = &'a mut T;
81
- fn next(&mut self) -> Option<Self::Item> {
82
- self.inner.next()
83
- }
84
- }
85
-
86
- impl<T> Iterator for IntoIter<T> {
87
- type Item = T;
88
- fn next(&mut self) -> Option<Self::Item> {
89
- self.inner.next()
90
- }
91
- }
92
- }
93
- ```
94
-
95
- ## Naming Convention
96
-
97
- | Method | Iterator Type |
98
- |--------|---------------|
99
- | `iter()` | `Iter` |
100
- | `iter_mut()` | `IterMut` |
101
- | `into_iter()` | `IntoIter` |
102
- | `keys()` | `Keys` |
103
- | `values()` | `Values` |
104
- | `values_mut()` | `ValuesMut` |
105
- | `drain()` | `Drain` |
106
- | `chunks()` | `Chunks` |
107
- | `windows()` | `Windows` |
108
-
109
- ## Custom Iterator Methods
110
-
111
- ```rust
112
- impl Graph {
113
- // Method name -> Type name
114
- fn nodes(&self) -> Nodes<'_> { } // Custom: Nodes
115
- fn edges(&self) -> Edges<'_> { } // Custom: Edges
116
- fn neighbors(&self, node: NodeId) -> Neighbors<'_> { } // Custom: Neighbors
117
- }
118
-
119
- pub struct Nodes<'a> { /* ... */ }
120
- pub struct Edges<'a> { /* ... */ }
121
- pub struct Neighbors<'a> { /* ... */ }
122
- ```
123
-
124
- ## Bad
125
-
126
- ```rust
127
- // Mismatched names
128
- impl MyCollection<T> {
129
- fn iter(&self) -> MyCollectionIterator<'_, T> { } // Should be Iter
130
- fn keys(&self) -> KeyIterator<'_, K> { } // Should be Keys
131
- }
132
-
133
- // Generic names that don't match method
134
- pub struct Iterator<T>; // Conflicts with std::iter::Iterator
135
- pub struct I<T>; // Too cryptic
136
- ```
137
-
138
- ## See Also
139
-
140
- - [name-iter-convention](./name-iter-convention.md) - iter/iter_mut/into_iter
141
- - [name-iter-method](./name-iter-method.md) - Iterator method names
142
- - [api-common-traits](./api-common-traits.md) - Implementing common traits
@@ -1,86 +0,0 @@
1
- # name-lifetime-short
2
-
3
- > Use short, conventional lifetime names: `'a`, `'b`, `'de`, `'src`
4
-
5
- ## Why It Matters
6
-
7
- Lifetime parameters are ubiquitous in Rust signatures. Short names like `'a` keep signatures readable. For domain-specific lifetimes, descriptive but short names like `'src` or `'de` communicate intent without clutter. The Rust community has established conventions that aid recognition.
8
-
9
- ## Bad
10
-
11
- ```rust
12
- // Overly verbose lifetimes
13
- fn parse<'input_lifetime, 'output_lifetime>(
14
- input: &'input_lifetime str
15
- ) -> Result<&'output_lifetime str, Error> { ... }
16
-
17
- // Meaningless long names
18
- struct Parser<'parser_instance_lifetime> {
19
- source: &'parser_instance_lifetime str,
20
- }
21
- ```
22
-
23
- ## Good
24
-
25
- ```rust
26
- // Standard short lifetimes
27
- fn parse<'a>(input: &'a str) -> Result<&'a str, Error> { ... }
28
-
29
- struct Parser<'a> {
30
- source: &'a str,
31
- }
32
-
33
- // Multiple lifetimes: 'a, 'b, 'c
34
- fn merge<'a, 'b>(first: &'a str, second: &'b str) -> String { ... }
35
-
36
- // Descriptive when clarity helps
37
- fn deserialize<'de>(input: &'de [u8]) -> Result<Value<'de>, Error> { ... }
38
- ```
39
-
40
- ## Common Lifetime Conventions
41
-
42
- | Lifetime | Convention | Example |
43
- |----------|------------|---------|
44
- | `'a` | Generic, first lifetime | `fn foo<'a>(x: &'a str)` |
45
- | `'b` | Generic, second lifetime | `fn bar<'a, 'b>(x: &'a T, y: &'b U)` |
46
- | `'de` | Deserialization | serde's `Deserialize<'de>` |
47
- | `'src` | Source code/input | `struct Lexer<'src>` |
48
- | `'ctx` | Context | `struct Query<'ctx>` |
49
- | `'input` | Input data | `struct Parser<'input>` |
50
- | `'static` | Static lifetime | `&'static str` |
51
-
52
- ## Elision Preferred
53
-
54
- ```rust
55
- // Let elision work when possible
56
- fn first_word(s: &str) -> &str { // Not fn first_word<'a>(s: &'a str) -> &'a str
57
- s.split_whitespace().next().unwrap_or("")
58
- }
59
-
60
- impl User {
61
- fn name(&self) -> &str { // Elision handles this
62
- &self.name
63
- }
64
- }
65
- ```
66
-
67
- ## Serde Convention
68
-
69
- ```rust
70
- use serde::{Deserialize, Serialize};
71
-
72
- // 'de is the standard serde lifetime for borrowed data
73
- #[derive(Deserialize)]
74
- struct Request<'de> {
75
- #[serde(borrow)]
76
- name: &'de str,
77
- #[serde(borrow)]
78
- tags: Vec<&'de str>,
79
- }
80
- ```
81
-
82
- ## See Also
83
-
84
- - [own-lifetime-elision](./own-lifetime-elision.md) - When to omit lifetimes
85
- - [name-type-param-single](./name-type-param-single.md) - Type parameter naming
86
- - [own-borrow-over-clone](./own-borrow-over-clone.md) - Borrowing patterns
@@ -1,154 +0,0 @@
1
- # name-no-get-prefix
2
-
3
- > Omit get_ prefix for simple getters
4
-
5
- ## Why It Matters
6
-
7
- Rust convention omits the `get_` prefix for simple field access. Methods like `len()`, `name()`, `value()` are cleaner than `get_len()`, `get_name()`, `get_value()`. This follows the principle of making the common case concise.
8
-
9
- The `get` prefix is reserved for methods that DO something beyond simple field access.
10
-
11
- ## Bad
12
-
13
- ```rust
14
- struct User {
15
- name: String,
16
- age: u32,
17
- }
18
-
19
- impl User {
20
- fn get_name(&self) -> &str { // Verbose
21
- &self.name
22
- }
23
-
24
- fn get_age(&self) -> u32 { // Verbose
25
- self.age
26
- }
27
-
28
- fn get_is_adult(&self) -> bool { // Doubly verbose
29
- self.age >= 18
30
- }
31
- }
32
-
33
- let name = user.get_name();
34
- let age = user.get_age();
35
- ```
36
-
37
- ## Good
38
-
39
- ```rust
40
- struct User {
41
- name: String,
42
- age: u32,
43
- }
44
-
45
- impl User {
46
- fn name(&self) -> &str { // Clean
47
- &self.name
48
- }
49
-
50
- fn age(&self) -> u32 { // Clean
51
- self.age
52
- }
53
-
54
- fn is_adult(&self) -> bool { // Boolean uses is_ prefix
55
- self.age >= 18
56
- }
57
- }
58
-
59
- let name = user.name();
60
- let age = user.age();
61
- ```
62
-
63
- ## When get_ IS Appropriate
64
-
65
- Use `get` when the method does more than simple access:
66
-
67
- ```rust
68
- impl HashMap<K, V> {
69
- // Returns Option - not just field access
70
- fn get(&self, key: &K) -> Option<&V> { }
71
-
72
- // Mutable variant
73
- fn get_mut(&mut self, key: &K) -> Option<&mut V> { }
74
- }
75
-
76
- impl Vec<T> {
77
- // Returns Option - bounds checked
78
- fn get(&self, index: usize) -> Option<&T> { }
79
- }
80
-
81
- impl Context {
82
- // Does computation/lookup, not just field access
83
- fn get_config(&self) -> Config {
84
- self.configs.get(&self.current_env).cloned().unwrap_or_default()
85
- }
86
- }
87
- ```
88
-
89
- ## Standard Library Examples
90
-
91
- ```rust
92
- // No get_ prefix
93
- String::len()
94
- Vec::len()
95
- Vec::capacity()
96
- Vec::is_empty()
97
- Path::file_name()
98
- Option::is_some()
99
- Result::is_ok()
100
-
101
- // With get - returns Option or does lookup
102
- Vec::get(index)
103
- HashMap::get(key)
104
- BTreeMap::get(key)
105
- ```
106
-
107
- ## Pattern: Getter/Setter Pairs
108
-
109
- ```rust
110
- impl Config {
111
- // Getter: no prefix
112
- fn timeout(&self) -> Duration {
113
- self.timeout
114
- }
115
-
116
- // Setter: use set_ prefix
117
- fn set_timeout(&mut self, timeout: Duration) {
118
- self.timeout = timeout;
119
- }
120
- }
121
- ```
122
-
123
- ## Pattern: Builder Methods
124
-
125
- ```rust
126
- impl ConfigBuilder {
127
- // Builder methods: no get_, no set_
128
- fn timeout(mut self, timeout: Duration) -> Self {
129
- self.timeout = timeout;
130
- self
131
- }
132
-
133
- fn retries(mut self, retries: u32) -> Self {
134
- self.retries = retries;
135
- self
136
- }
137
- }
138
- ```
139
-
140
- ## Decision Guide
141
-
142
- | Pattern | Naming |
143
- |---------|--------|
144
- | Simple field access | `name()`, `value()`, `len()` |
145
- | Boolean property | `is_valid()`, `has_items()` |
146
- | Fallible access | `get()`, `get_mut()` |
147
- | Setter | `set_name()`, `set_value()` |
148
- | Builder | `name()`, `value()` (consuming self) |
149
-
150
- ## See Also
151
-
152
- - [name-is-has-bool](./name-is-has-bool.md) - Boolean naming
153
- - [name-is-has-bool](./name-is-has-bool.md) - Boolean naming
154
- - [api-builder-pattern](./api-builder-pattern.md) - Builder pattern
@@ -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