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