agy-superpowers 5.1.4 → 5.1.5

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