agy-superpowers 5.1.4 → 5.1.6

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 (185) hide show
  1. package/package.json +1 -1
  2. package/template/agent/rules/debug-confirmation-policy.md +34 -0
  3. package/template/agent/rules/language-matching.md +32 -0
  4. package/template/agent/skills/rust-developer/SKILL.md +281 -0
  5. package/template/agent/skills/rust-developer/references/rust-rules/_sections.md +231 -0
  6. package/template/agent/skills/rust-developer/references/rust-rules/anti-clone-excessive.md +124 -0
  7. package/template/agent/skills/rust-developer/references/rust-rules/anti-collect-intermediate.md +131 -0
  8. package/template/agent/skills/rust-developer/references/rust-rules/anti-empty-catch.md +132 -0
  9. package/template/agent/skills/rust-developer/references/rust-rules/anti-expect-lazy.md +95 -0
  10. package/template/agent/skills/rust-developer/references/rust-rules/anti-format-hot-path.md +141 -0
  11. package/template/agent/skills/rust-developer/references/rust-rules/anti-index-over-iter.md +125 -0
  12. package/template/agent/skills/rust-developer/references/rust-rules/anti-lock-across-await.md +127 -0
  13. package/template/agent/skills/rust-developer/references/rust-rules/anti-over-abstraction.md +120 -0
  14. package/template/agent/skills/rust-developer/references/rust-rules/anti-panic-expected.md +131 -0
  15. package/template/agent/skills/rust-developer/references/rust-rules/anti-premature-optimize.md +156 -0
  16. package/template/agent/skills/rust-developer/references/rust-rules/anti-string-for-str.md +122 -0
  17. package/template/agent/skills/rust-developer/references/rust-rules/anti-stringly-typed.md +167 -0
  18. package/template/agent/skills/rust-developer/references/rust-rules/anti-type-erasure.md +134 -0
  19. package/template/agent/skills/rust-developer/references/rust-rules/anti-unwrap-abuse.md +143 -0
  20. package/template/agent/skills/rust-developer/references/rust-rules/anti-vec-for-slice.md +121 -0
  21. package/template/agent/skills/rust-developer/references/rust-rules/api-builder-must-use.md +143 -0
  22. package/template/agent/skills/rust-developer/references/rust-rules/api-builder-pattern.md +187 -0
  23. package/template/agent/skills/rust-developer/references/rust-rules/api-common-traits.md +165 -0
  24. package/template/agent/skills/rust-developer/references/rust-rules/api-default-impl.md +177 -0
  25. package/template/agent/skills/rust-developer/references/rust-rules/api-extension-trait.md +163 -0
  26. package/template/agent/skills/rust-developer/references/rust-rules/api-from-not-into.md +146 -0
  27. package/template/agent/skills/rust-developer/references/rust-rules/api-impl-asref.md +142 -0
  28. package/template/agent/skills/rust-developer/references/rust-rules/api-impl-into.md +160 -0
  29. package/template/agent/skills/rust-developer/references/rust-rules/api-must-use.md +125 -0
  30. package/template/agent/skills/rust-developer/references/rust-rules/api-newtype-safety.md +162 -0
  31. package/template/agent/skills/rust-developer/references/rust-rules/api-non-exhaustive.md +177 -0
  32. package/template/agent/skills/rust-developer/references/rust-rules/api-parse-dont-validate.md +184 -0
  33. package/template/agent/skills/rust-developer/references/rust-rules/api-sealed-trait.md +168 -0
  34. package/template/agent/skills/rust-developer/references/rust-rules/api-serde-optional.md +182 -0
  35. package/template/agent/skills/rust-developer/references/rust-rules/api-typestate.md +199 -0
  36. package/template/agent/skills/rust-developer/references/rust-rules/async-bounded-channel.md +175 -0
  37. package/template/agent/skills/rust-developer/references/rust-rules/async-broadcast-pubsub.md +185 -0
  38. package/template/agent/skills/rust-developer/references/rust-rules/async-cancellation-token.md +203 -0
  39. package/template/agent/skills/rust-developer/references/rust-rules/async-clone-before-await.md +171 -0
  40. package/template/agent/skills/rust-developer/references/rust-rules/async-join-parallel.md +158 -0
  41. package/template/agent/skills/rust-developer/references/rust-rules/async-joinset-structured.md +195 -0
  42. package/template/agent/skills/rust-developer/references/rust-rules/async-mpsc-queue.md +171 -0
  43. package/template/agent/skills/rust-developer/references/rust-rules/async-no-lock-await.md +156 -0
  44. package/template/agent/skills/rust-developer/references/rust-rules/async-oneshot-response.md +191 -0
  45. package/template/agent/skills/rust-developer/references/rust-rules/async-select-racing.md +198 -0
  46. package/template/agent/skills/rust-developer/references/rust-rules/async-spawn-blocking.md +154 -0
  47. package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-fs.md +167 -0
  48. package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-runtime.md +169 -0
  49. package/template/agent/skills/rust-developer/references/rust-rules/async-try-join.md +172 -0
  50. package/template/agent/skills/rust-developer/references/rust-rules/async-watch-latest.md +189 -0
  51. package/template/agent/skills/rust-developer/references/rust-rules/doc-all-public.md +113 -0
  52. package/template/agent/skills/rust-developer/references/rust-rules/doc-cargo-metadata.md +147 -0
  53. package/template/agent/skills/rust-developer/references/rust-rules/doc-errors-section.md +122 -0
  54. package/template/agent/skills/rust-developer/references/rust-rules/doc-examples-section.md +161 -0
  55. package/template/agent/skills/rust-developer/references/rust-rules/doc-hidden-setup.md +149 -0
  56. package/template/agent/skills/rust-developer/references/rust-rules/doc-intra-links.md +138 -0
  57. package/template/agent/skills/rust-developer/references/rust-rules/doc-link-types.md +169 -0
  58. package/template/agent/skills/rust-developer/references/rust-rules/doc-module-inner.md +116 -0
  59. package/template/agent/skills/rust-developer/references/rust-rules/doc-panics-section.md +128 -0
  60. package/template/agent/skills/rust-developer/references/rust-rules/doc-question-mark.md +136 -0
  61. package/template/agent/skills/rust-developer/references/rust-rules/doc-safety-section.md +131 -0
  62. package/template/agent/skills/rust-developer/references/rust-rules/err-anyhow-app.md +179 -0
  63. package/template/agent/skills/rust-developer/references/rust-rules/err-context-chain.md +144 -0
  64. package/template/agent/skills/rust-developer/references/rust-rules/err-custom-type.md +152 -0
  65. package/template/agent/skills/rust-developer/references/rust-rules/err-doc-errors.md +145 -0
  66. package/template/agent/skills/rust-developer/references/rust-rules/err-expect-bugs-only.md +133 -0
  67. package/template/agent/skills/rust-developer/references/rust-rules/err-from-impl.md +152 -0
  68. package/template/agent/skills/rust-developer/references/rust-rules/err-lowercase-msg.md +124 -0
  69. package/template/agent/skills/rust-developer/references/rust-rules/err-no-unwrap-prod.md +115 -0
  70. package/template/agent/skills/rust-developer/references/rust-rules/err-question-mark.md +151 -0
  71. package/template/agent/skills/rust-developer/references/rust-rules/err-result-over-panic.md +130 -0
  72. package/template/agent/skills/rust-developer/references/rust-rules/err-source-chain.md +155 -0
  73. package/template/agent/skills/rust-developer/references/rust-rules/err-thiserror-lib.md +171 -0
  74. package/template/agent/skills/rust-developer/references/rust-rules/lint-cargo-metadata.md +138 -0
  75. package/template/agent/skills/rust-developer/references/rust-rules/lint-deny-correctness.md +107 -0
  76. package/template/agent/skills/rust-developer/references/rust-rules/lint-missing-docs.md +154 -0
  77. package/template/agent/skills/rust-developer/references/rust-rules/lint-pedantic-selective.md +118 -0
  78. package/template/agent/skills/rust-developer/references/rust-rules/lint-rustfmt-check.md +157 -0
  79. package/template/agent/skills/rust-developer/references/rust-rules/lint-unsafe-doc.md +133 -0
  80. package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-complexity.md +131 -0
  81. package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-perf.md +136 -0
  82. package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-style.md +135 -0
  83. package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-suspicious.md +122 -0
  84. package/template/agent/skills/rust-developer/references/rust-rules/lint-workspace-lints.md +172 -0
  85. package/template/agent/skills/rust-developer/references/rust-rules/mem-arena-allocator.md +168 -0
  86. package/template/agent/skills/rust-developer/references/rust-rules/mem-arrayvec.md +142 -0
  87. package/template/agent/skills/rust-developer/references/rust-rules/mem-assert-type-size.md +168 -0
  88. package/template/agent/skills/rust-developer/references/rust-rules/mem-avoid-format.md +147 -0
  89. package/template/agent/skills/rust-developer/references/rust-rules/mem-box-large-variant.md +158 -0
  90. package/template/agent/skills/rust-developer/references/rust-rules/mem-boxed-slice.md +139 -0
  91. package/template/agent/skills/rust-developer/references/rust-rules/mem-clone-from.md +147 -0
  92. package/template/agent/skills/rust-developer/references/rust-rules/mem-compact-string.md +149 -0
  93. package/template/agent/skills/rust-developer/references/rust-rules/mem-reuse-collections.md +174 -0
  94. package/template/agent/skills/rust-developer/references/rust-rules/mem-smaller-integers.md +159 -0
  95. package/template/agent/skills/rust-developer/references/rust-rules/mem-smallvec.md +138 -0
  96. package/template/agent/skills/rust-developer/references/rust-rules/mem-thinvec.md +142 -0
  97. package/template/agent/skills/rust-developer/references/rust-rules/mem-with-capacity.md +156 -0
  98. package/template/agent/skills/rust-developer/references/rust-rules/mem-write-over-format.md +172 -0
  99. package/template/agent/skills/rust-developer/references/rust-rules/mem-zero-copy.md +164 -0
  100. package/template/agent/skills/rust-developer/references/rust-rules/name-acronym-word.md +99 -0
  101. package/template/agent/skills/rust-developer/references/rust-rules/name-as-free.md +104 -0
  102. package/template/agent/skills/rust-developer/references/rust-rules/name-consts-screaming.md +94 -0
  103. package/template/agent/skills/rust-developer/references/rust-rules/name-crate-no-rs.md +78 -0
  104. package/template/agent/skills/rust-developer/references/rust-rules/name-funcs-snake.md +76 -0
  105. package/template/agent/skills/rust-developer/references/rust-rules/name-into-ownership.md +123 -0
  106. package/template/agent/skills/rust-developer/references/rust-rules/name-is-has-bool.md +127 -0
  107. package/template/agent/skills/rust-developer/references/rust-rules/name-iter-convention.md +129 -0
  108. package/template/agent/skills/rust-developer/references/rust-rules/name-iter-method.md +131 -0
  109. package/template/agent/skills/rust-developer/references/rust-rules/name-iter-type-match.md +142 -0
  110. package/template/agent/skills/rust-developer/references/rust-rules/name-lifetime-short.md +86 -0
  111. package/template/agent/skills/rust-developer/references/rust-rules/name-no-get-prefix.md +154 -0
  112. package/template/agent/skills/rust-developer/references/rust-rules/name-to-expensive.md +118 -0
  113. package/template/agent/skills/rust-developer/references/rust-rules/name-type-param-single.md +92 -0
  114. package/template/agent/skills/rust-developer/references/rust-rules/name-types-camel.md +65 -0
  115. package/template/agent/skills/rust-developer/references/rust-rules/name-variants-camel.md +101 -0
  116. package/template/agent/skills/rust-developer/references/rust-rules/opt-bounds-check.md +161 -0
  117. package/template/agent/skills/rust-developer/references/rust-rules/opt-cache-friendly.md +187 -0
  118. package/template/agent/skills/rust-developer/references/rust-rules/opt-codegen-units.md +142 -0
  119. package/template/agent/skills/rust-developer/references/rust-rules/opt-cold-unlikely.md +152 -0
  120. package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-always-rare.md +141 -0
  121. package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-never-cold.md +181 -0
  122. package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-small.md +160 -0
  123. package/template/agent/skills/rust-developer/references/rust-rules/opt-likely-hint.md +171 -0
  124. package/template/agent/skills/rust-developer/references/rust-rules/opt-lto-release.md +130 -0
  125. package/template/agent/skills/rust-developer/references/rust-rules/opt-pgo-profile.md +167 -0
  126. package/template/agent/skills/rust-developer/references/rust-rules/opt-simd-portable.md +144 -0
  127. package/template/agent/skills/rust-developer/references/rust-rules/opt-target-cpu.md +154 -0
  128. package/template/agent/skills/rust-developer/references/rust-rules/own-arc-shared.md +141 -0
  129. package/template/agent/skills/rust-developer/references/rust-rules/own-borrow-over-clone.md +95 -0
  130. package/template/agent/skills/rust-developer/references/rust-rules/own-clone-explicit.md +135 -0
  131. package/template/agent/skills/rust-developer/references/rust-rules/own-copy-small.md +124 -0
  132. package/template/agent/skills/rust-developer/references/rust-rules/own-cow-conditional.md +135 -0
  133. package/template/agent/skills/rust-developer/references/rust-rules/own-lifetime-elision.md +134 -0
  134. package/template/agent/skills/rust-developer/references/rust-rules/own-move-large.md +134 -0
  135. package/template/agent/skills/rust-developer/references/rust-rules/own-mutex-interior.md +105 -0
  136. package/template/agent/skills/rust-developer/references/rust-rules/own-rc-single-thread.md +65 -0
  137. package/template/agent/skills/rust-developer/references/rust-rules/own-refcell-interior.md +97 -0
  138. package/template/agent/skills/rust-developer/references/rust-rules/own-rwlock-readers.md +122 -0
  139. package/template/agent/skills/rust-developer/references/rust-rules/own-slice-over-vec.md +119 -0
  140. package/template/agent/skills/rust-developer/references/rust-rules/perf-black-box-bench.md +153 -0
  141. package/template/agent/skills/rust-developer/references/rust-rules/perf-chain-avoid.md +136 -0
  142. package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-into.md +133 -0
  143. package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-once.md +120 -0
  144. package/template/agent/skills/rust-developer/references/rust-rules/perf-drain-reuse.md +137 -0
  145. package/template/agent/skills/rust-developer/references/rust-rules/perf-entry-api.md +134 -0
  146. package/template/agent/skills/rust-developer/references/rust-rules/perf-extend-batch.md +150 -0
  147. package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-lazy.md +123 -0
  148. package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-over-index.md +113 -0
  149. package/template/agent/skills/rust-developer/references/rust-rules/perf-profile-first.md +175 -0
  150. package/template/agent/skills/rust-developer/references/rust-rules/perf-release-profile.md +149 -0
  151. package/template/agent/skills/rust-developer/references/rust-rules/proj-bin-dir.md +142 -0
  152. package/template/agent/skills/rust-developer/references/rust-rules/proj-flat-small.md +133 -0
  153. package/template/agent/skills/rust-developer/references/rust-rules/proj-lib-main-split.md +148 -0
  154. package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-by-feature.md +130 -0
  155. package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-rs-dir.md +120 -0
  156. package/template/agent/skills/rust-developer/references/rust-rules/proj-prelude-module.md +155 -0
  157. package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-crate-internal.md +139 -0
  158. package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-super-parent.md +135 -0
  159. package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-use-reexport.md +162 -0
  160. package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-deps.md +186 -0
  161. package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-large.md +162 -0
  162. package/template/agent/skills/rust-developer/references/rust-rules/test-arrange-act-assert.md +160 -0
  163. package/template/agent/skills/rust-developer/references/rust-rules/test-cfg-test-module.md +151 -0
  164. package/template/agent/skills/rust-developer/references/rust-rules/test-criterion-bench.md +171 -0
  165. package/template/agent/skills/rust-developer/references/rust-rules/test-descriptive-names.md +142 -0
  166. package/template/agent/skills/rust-developer/references/rust-rules/test-doctest-examples.md +168 -0
  167. package/template/agent/skills/rust-developer/references/rust-rules/test-fixture-raii.md +151 -0
  168. package/template/agent/skills/rust-developer/references/rust-rules/test-integration-dir.md +144 -0
  169. package/template/agent/skills/rust-developer/references/rust-rules/test-mock-traits.md +189 -0
  170. package/template/agent/skills/rust-developer/references/rust-rules/test-mockall-mocking.md +226 -0
  171. package/template/agent/skills/rust-developer/references/rust-rules/test-proptest-properties.md +161 -0
  172. package/template/agent/skills/rust-developer/references/rust-rules/test-should-panic.md +130 -0
  173. package/template/agent/skills/rust-developer/references/rust-rules/test-tokio-async.md +154 -0
  174. package/template/agent/skills/rust-developer/references/rust-rules/test-use-super.md +127 -0
  175. package/template/agent/skills/rust-developer/references/rust-rules/type-enum-states.md +154 -0
  176. package/template/agent/skills/rust-developer/references/rust-rules/type-generic-bounds.md +142 -0
  177. package/template/agent/skills/rust-developer/references/rust-rules/type-never-diverge.md +146 -0
  178. package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-ids.md +160 -0
  179. package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-validated.md +159 -0
  180. package/template/agent/skills/rust-developer/references/rust-rules/type-no-stringly.md +144 -0
  181. package/template/agent/skills/rust-developer/references/rust-rules/type-option-nullable.md +137 -0
  182. package/template/agent/skills/rust-developer/references/rust-rules/type-phantom-marker.md +188 -0
  183. package/template/agent/skills/rust-developer/references/rust-rules/type-repr-transparent.md +143 -0
  184. package/template/agent/skills/rust-developer/references/rust-rules/type-result-fallible.md +131 -0
  185. package/template/agent/skills/systematic-debugging/SKILL.md +17 -0
@@ -0,0 +1,129 @@
1
+ # name-iter-convention
2
+
3
+ > Use iter/iter_mut/into_iter for iterator methods
4
+
5
+ ## Why It Matters
6
+
7
+ Rust has a standard convention for iterator method names that signals ownership semantics. Following this convention makes APIs predictable and enables the `for item in collection` syntax to work correctly.
8
+
9
+ ## The Three Iterator Methods
10
+
11
+ | Method | Returns | Ownership |
12
+ |--------|---------|-----------|
13
+ | `iter()` | `impl Iterator<Item = &T>` | Borrows collection |
14
+ | `iter_mut()` | `impl Iterator<Item = &mut T>` | Mutably borrows |
15
+ | `into_iter()` | `impl Iterator<Item = T>` | Consumes collection |
16
+
17
+ ## Implementation
18
+
19
+ ```rust
20
+ struct MyCollection<T> {
21
+ items: Vec<T>,
22
+ }
23
+
24
+ impl<T> MyCollection<T> {
25
+ /// Returns an iterator over references.
26
+ fn iter(&self) -> impl Iterator<Item = &T> {
27
+ self.items.iter()
28
+ }
29
+
30
+ /// Returns an iterator over mutable references.
31
+ fn iter_mut(&mut self) -> impl Iterator<Item = &mut T> {
32
+ self.items.iter_mut()
33
+ }
34
+ }
35
+
36
+ // IntoIterator trait for into_iter()
37
+ impl<T> IntoIterator for MyCollection<T> {
38
+ type Item = T;
39
+ type IntoIter = std::vec::IntoIter<T>;
40
+
41
+ fn into_iter(self) -> Self::IntoIter {
42
+ self.items.into_iter()
43
+ }
44
+ }
45
+
46
+ // Also implement for references
47
+ impl<'a, T> IntoIterator for &'a MyCollection<T> {
48
+ type Item = &'a T;
49
+ type IntoIter = std::slice::Iter<'a, T>;
50
+
51
+ fn into_iter(self) -> Self::IntoIter {
52
+ self.items.iter()
53
+ }
54
+ }
55
+
56
+ impl<'a, T> IntoIterator for &'a mut MyCollection<T> {
57
+ type Item = &'a mut T;
58
+ type IntoIter = std::slice::IterMut<'a, T>;
59
+
60
+ fn into_iter(self) -> Self::IntoIter {
61
+ self.items.iter_mut()
62
+ }
63
+ }
64
+ ```
65
+
66
+ ## Usage
67
+
68
+ ```rust
69
+ let collection = MyCollection { items: vec![1, 2, 3] };
70
+
71
+ // Explicit methods
72
+ for x in collection.iter() { } // Borrows
73
+ for x in collection.iter_mut() { } // Mutably borrows
74
+
75
+ // IntoIterator enables for loop syntax
76
+ for x in &collection { } // Calls (&collection).into_iter()
77
+ for x in &mut collection { } // Calls (&mut collection).into_iter()
78
+ for x in collection { } // Consumes, calls collection.into_iter()
79
+ ```
80
+
81
+ ## Bad
82
+
83
+ ```rust
84
+ impl MyCollection<T> {
85
+ // Non-standard names
86
+ fn elements(&self) -> impl Iterator<Item = &T> { } // Should be iter()
87
+ fn get_items(&self) -> impl Iterator<Item = &T> { } // Should be iter()
88
+ fn iterate(&self) -> impl Iterator<Item = &T> { } // Should be iter()
89
+ fn as_iter(&self) -> impl Iterator<Item = &T> { } // Should be iter()
90
+ }
91
+ ```
92
+
93
+ ## Additional Iterator Methods
94
+
95
+ ```rust
96
+ impl MyCollection<T> {
97
+ // Filter by predicate
98
+ fn iter_valid(&self) -> impl Iterator<Item = &T> {
99
+ self.iter().filter(|x| x.is_valid())
100
+ }
101
+
102
+ // Specific slice
103
+ fn iter_range(&self, start: usize, end: usize) -> impl Iterator<Item = &T> {
104
+ self.items[start..end].iter()
105
+ }
106
+ }
107
+ ```
108
+
109
+ ## Standard Library Examples
110
+
111
+ ```rust
112
+ // Vec, slice, arrays
113
+ vec.iter() // &T
114
+ vec.iter_mut() // &mut T
115
+ vec.into_iter() // T
116
+
117
+ // HashMap
118
+ map.iter() // (&K, &V)
119
+ map.iter_mut() // (&K, &mut V)
120
+ map.into_iter() // (K, V)
121
+ map.keys() // &K
122
+ map.values() // &V
123
+ ```
124
+
125
+ ## See Also
126
+
127
+ - [name-iter-type-match](./name-iter-type-match.md) - Iterator type naming
128
+ - [name-iter-method](./name-iter-method.md) - Iterator method names
129
+ - [perf-iter-over-index](./perf-iter-over-index.md) - Prefer iterators
@@ -0,0 +1,131 @@
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
@@ -0,0 +1,142 @@
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
@@ -0,0 +1,86 @@
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
@@ -0,0 +1,154 @@
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