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,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
@@ -0,0 +1,92 @@
1
+ # name-type-param-single
2
+
3
+ > Use single uppercase letters for type parameters: `T`, `E`, `K`, `V`
4
+
5
+ ## Why It Matters
6
+
7
+ Generic type parameters conventionally use single uppercase letters. This keeps signatures concise and follows established conventions that readers instantly recognize. `T` for "type", `E` for "error", `K` for "key", `V` for "value" are universal in Rust.
8
+
9
+ ## Bad
10
+
11
+ ```rust
12
+ // Verbose type parameters
13
+ struct Container<ElementType> {
14
+ items: Vec<ElementType>,
15
+ }
16
+
17
+ fn process<InputType, OutputType>(input: InputType) -> OutputType { ... }
18
+
19
+ // Lowercase - looks like lifetime
20
+ struct Wrapper<t> { ... } // Confusing
21
+ ```
22
+
23
+ ## Good
24
+
25
+ ```rust
26
+ // Single uppercase letters
27
+ struct Container<T> {
28
+ items: Vec<T>,
29
+ }
30
+
31
+ fn process<I, O>(input: I) -> O { ... }
32
+
33
+ // Standard conventions
34
+ struct HashMap<K, V> { ... } // K=Key, V=Value
35
+ enum Result<T, E> { ... } // T=Type, E=Error
36
+ enum Option<T> { ... } // T=Type
37
+ struct Ref<'a, T> { ... } // Lifetime + Type
38
+ ```
39
+
40
+ ## Standard Type Parameter Names
41
+
42
+ | Parameter | Meaning | Example |
43
+ |-----------|---------|---------|
44
+ | `T` | Type (generic) | `Vec<T>` |
45
+ | `E` | Error | `Result<T, E>` |
46
+ | `K` | Key | `HashMap<K, V>` |
47
+ | `V` | Value | `HashMap<K, V>` |
48
+ | `I` | Input / Item | `Iterator<Item = I>` |
49
+ | `O` | Output | `Fn(I) -> O` |
50
+ | `R` | Return / Result | `fn() -> R` |
51
+ | `S` | State | `StateMachine<S>` |
52
+ | `A` | Allocator | `Vec<T, A>` |
53
+ | `F` | Function | `map<F>(f: F)` |
54
+
55
+ ## Multiple Type Parameters
56
+
57
+ ```rust
58
+ // Use related letters
59
+ fn transform<I, O, E>(input: I) -> Result<O, E>
60
+ where
61
+ I: Input,
62
+ O: Output,
63
+ E: Error,
64
+ { ... }
65
+
66
+ // Or sequential: T, U, V
67
+ fn combine<T, U, V>(a: T, b: U) -> V { ... }
68
+
69
+ // Descriptive only when many parameters need clarity
70
+ struct Query<Db, Row, Err> { ... }
71
+ ```
72
+
73
+ ## Trait Bounds
74
+
75
+ ```rust
76
+ // Keep type params short, move complexity to where clause
77
+ fn process<T, E>(value: T) -> Result<T, E>
78
+ where
79
+ T: Clone + Debug + Send + Sync,
80
+ E: Error + From<IoError>,
81
+ { ... }
82
+
83
+ // Not inline
84
+ fn process<T: Clone + Debug + Send + Sync, E: Error + From<IoError>>(value: T) -> Result<T, E>
85
+ // Too long!
86
+ ```
87
+
88
+ ## See Also
89
+
90
+ - [name-lifetime-short](./name-lifetime-short.md) - Lifetime parameter naming
91
+ - [name-types-camel](./name-types-camel.md) - Concrete type naming
92
+ - [type-generic-bounds](./type-generic-bounds.md) - Trait bounds
@@ -0,0 +1,65 @@
1
+ # name-types-camel
2
+
3
+ > Use `UpperCamelCase` for types, traits, and enum names
4
+
5
+ ## Why It Matters
6
+
7
+ Rust's naming conventions are enforced by the compiler and linter. Consistent naming makes code immediately recognizable—you know `HttpClient` is a type, `send_request` is a function. Violating conventions triggers warnings and makes code harder to read.
8
+
9
+ ## Bad
10
+
11
+ ```rust
12
+ // Lowercase types - compiler warns
13
+ struct http_client { ... } // warning: type `http_client` should have an upper camel case name
14
+ trait serializable { ... } // warning
15
+ enum response_type { ... } // warning
16
+
17
+ // Screaming case for types
18
+ struct HTTP_CLIENT { ... } // Not idiomatic
19
+ ```
20
+
21
+ ## Good
22
+
23
+ ```rust
24
+ // UpperCamelCase for all types
25
+ struct HttpClient { ... }
26
+ trait Serializable { ... }
27
+ enum ResponseType { ... }
28
+
29
+ // Compound words
30
+ struct TcpConnection { ... }
31
+ struct IoError { ... }
32
+ struct FileReader { ... }
33
+
34
+ // Generic types
35
+ struct HashMap<K, V> { ... }
36
+ struct Result<T, E> { ... }
37
+ ```
38
+
39
+ ## Acronyms
40
+
41
+ ```rust
42
+ // Treat acronyms as words (capitalize first letter only)
43
+ struct HttpServer { ... } // Not HTTPServer
44
+ struct JsonParser { ... } // Not JSONParser
45
+ struct Uuid { ... } // Not UUID
46
+ struct TcpStream { ... } // Not TCPStream
47
+
48
+ // Exception: Two-letter acronyms can be all caps
49
+ struct IOError { ... } // Acceptable
50
+ struct IoError { ... } // Also acceptable (preferred)
51
+ ```
52
+
53
+ ## Type Aliases
54
+
55
+ ```rust
56
+ // Type aliases also use UpperCamelCase
57
+ type Result<T> = std::result::Result<T, Error>;
58
+ type BoxedFuture<'a, T> = Pin<Box<dyn Future<Output = T> + Send + 'a>>;
59
+ ```
60
+
61
+ ## See Also
62
+
63
+ - [name-variants-camel](./name-variants-camel.md) - Enum variant naming
64
+ - [name-funcs-snake](./name-funcs-snake.md) - Function naming
65
+ - [name-acronym-word](./name-acronym-word.md) - Acronym handling
@@ -0,0 +1,101 @@
1
+ # name-variants-camel
2
+
3
+ > Use `UpperCamelCase` for enum variants
4
+
5
+ ## Why It Matters
6
+
7
+ Enum variants follow the same naming convention as types—`UpperCamelCase`. This distinguishes them from fields, variables, and functions. The compiler warns on violations, and consistent naming helps readers instantly recognize variant names.
8
+
9
+ ## Bad
10
+
11
+ ```rust
12
+ enum Status {
13
+ pending, // warning: variant `pending` should have an upper camel case name
14
+ in_progress, // warning
15
+ COMPLETED, // Not idiomatic
16
+ }
17
+
18
+ enum Color {
19
+ RED, // Screaming case - not Rust style
20
+ GREEN,
21
+ BLUE,
22
+ }
23
+ ```
24
+
25
+ ## Good
26
+
27
+ ```rust
28
+ enum Status {
29
+ Pending,
30
+ InProgress,
31
+ Completed,
32
+ Failed,
33
+ }
34
+
35
+ enum Color {
36
+ Red,
37
+ Green,
38
+ Blue,
39
+ Custom(u8, u8, u8),
40
+ }
41
+
42
+ enum HttpMethod {
43
+ Get,
44
+ Post,
45
+ Put,
46
+ Delete,
47
+ Patch,
48
+ }
49
+ ```
50
+
51
+ ## Variants with Data
52
+
53
+ ```rust
54
+ enum Message {
55
+ // Unit variant
56
+ Quit,
57
+
58
+ // Tuple variant
59
+ Move(i32, i32),
60
+
61
+ // Struct variant
62
+ Write { text: String },
63
+
64
+ // Named fields
65
+ ChangeColor {
66
+ red: u8,
67
+ green: u8,
68
+ blue: u8,
69
+ },
70
+ }
71
+ ```
72
+
73
+ ## Variant Naming Tips
74
+
75
+ ```rust
76
+ // Be specific
77
+ enum Error {
78
+ NotFound, // Good: specific
79
+ PermissionDenied, // Good: specific
80
+ Error, // Bad: vague
81
+ }
82
+
83
+ // Avoid redundant type name in variant
84
+ enum ConnectionState {
85
+ Connected, // Good
86
+ Disconnected, // Good
87
+ ConnectionError, // Bad: redundant "Connection"
88
+ }
89
+
90
+ // Use None/Some pattern for Option-like enums
91
+ enum MaybeValue<T> {
92
+ Some(T),
93
+ None,
94
+ }
95
+ ```
96
+
97
+ ## See Also
98
+
99
+ - [name-types-camel](./name-types-camel.md) - Type naming
100
+ - [api-non-exhaustive](./api-non-exhaustive.md) - Forward-compatible enums
101
+ - [type-enum-states](./type-enum-states.md) - State machine enums
@@ -0,0 +1,161 @@
1
+ # opt-bounds-check
2
+
3
+ > Use iterators and patterns that eliminate bounds checks in hot paths
4
+
5
+ ## Why It Matters
6
+
7
+ Rust's safety guarantees require bounds checking on array/slice indexing. In tight loops, these checks can cause measurable overhead (branch mispredictions, preventing vectorization). Patterns like iterators, `get_unchecked`, and index splitting can eliminate these checks while maintaining safety.
8
+
9
+ ## Bad
10
+
11
+ ```rust
12
+ fn sum_products(a: &[f64], b: &[f64]) -> f64 {
13
+ let mut sum = 0.0;
14
+ for i in 0..a.len() {
15
+ sum += a[i] * b[i]; // Two bounds checks per iteration
16
+ }
17
+ sum
18
+ }
19
+
20
+ fn apply_filter(data: &mut [u8], kernel: &[u8; 3]) {
21
+ for i in 1..data.len() - 1 {
22
+ // Three bounds checks per iteration
23
+ data[i] = (data[i - 1] + data[i] + data[i + 1]) / 3;
24
+ }
25
+ }
26
+ ```
27
+
28
+ ## Good
29
+
30
+ ```rust
31
+ fn sum_products(a: &[f64], b: &[f64]) -> f64 {
32
+ // Iterator zips - no bounds checks, vectorizes well
33
+ a.iter().zip(b.iter()).map(|(x, y)| x * y).sum()
34
+ }
35
+
36
+ fn apply_filter(data: &mut [u8]) {
37
+ // Windows pattern - no bounds checks
38
+ for window in data.windows(3) {
39
+ // window[0], window[1], window[2] are all valid
40
+ }
41
+
42
+ // Or use chunks
43
+ for chunk in data.chunks_exact(4) {
44
+ process_simd(chunk);
45
+ }
46
+ }
47
+ ```
48
+
49
+ ## Iterator Patterns
50
+
51
+ ```rust
52
+ // All of these avoid bounds checks:
53
+
54
+ // zip - parallel iteration
55
+ for (a, b) in xs.iter().zip(ys.iter()) { ... }
56
+
57
+ // enumerate - index + value
58
+ for (i, x) in data.iter().enumerate() { ... }
59
+
60
+ // windows - sliding window
61
+ for window in data.windows(3) { ... }
62
+
63
+ // chunks - fixed-size groups
64
+ for chunk in data.chunks(4) { ... }
65
+ for chunk in data.chunks_exact(4) { ... } // Guarantees exact size
66
+
67
+ // split_at - divide slice
68
+ let (left, right) = data.split_at(mid);
69
+ ```
70
+
71
+ ## Split for Parallel Access
72
+
73
+ ```rust
74
+ fn parallel_sum(data: &[i32]) -> i32 {
75
+ // Split into independent chunks
76
+ let (left, right) = data.split_at(data.len() / 2);
77
+
78
+ // Process chunks without bounds checks
79
+ let sum_left: i32 = left.iter().sum();
80
+ let sum_right: i32 = right.iter().sum();
81
+
82
+ sum_left + sum_right
83
+ }
84
+ ```
85
+
86
+ ## get_unchecked for Proven Safety
87
+
88
+ ```rust
89
+ fn matrix_multiply(a: &[f64], b: &[f64], c: &mut [f64], n: usize) {
90
+ assert!(a.len() >= n * n);
91
+ assert!(b.len() >= n * n);
92
+ assert!(c.len() >= n * n);
93
+
94
+ for i in 0..n {
95
+ for j in 0..n {
96
+ let mut sum = 0.0;
97
+ for k in 0..n {
98
+ // SAFETY: bounds verified by asserts above
99
+ unsafe {
100
+ sum += a.get_unchecked(i * n + k)
101
+ * b.get_unchecked(k * n + j);
102
+ }
103
+ }
104
+ // SAFETY: bounds verified by asserts above
105
+ unsafe {
106
+ *c.get_unchecked_mut(i * n + j) = sum;
107
+ }
108
+ }
109
+ }
110
+ }
111
+ ```
112
+
113
+ ## Slice Patterns
114
+
115
+ ```rust
116
+ fn process_header(data: &[u8]) -> Option<Header> {
117
+ // Slice pattern - single length check, no per-field checks
118
+ let [a, b, c, d, rest @ ..] = data else {
119
+ return None;
120
+ };
121
+
122
+ Some(Header {
123
+ magic: *a,
124
+ version: *b,
125
+ flags: u16::from_le_bytes([*c, *d]),
126
+ payload: rest,
127
+ })
128
+ }
129
+ ```
130
+
131
+ ## Verify Bounds Check Elimination
132
+
133
+ ```bash
134
+ # Check generated assembly
135
+ cargo asm --release my_crate::hot_function
136
+
137
+ # Look for 'cmp' and 'ja'/'jbe' instructions near array access
138
+ # If eliminated, you'll see direct memory access
139
+ ```
140
+
141
+ ## When to Accept Bounds Checks
142
+
143
+ ```rust
144
+ // Random access patterns - checks unavoidable
145
+ fn random_lookup(data: &[u8], indices: &[usize]) -> Vec<u8> {
146
+ indices.iter()
147
+ .filter_map(|&i| data.get(i).copied()) // Checked, but necessary
148
+ .collect()
149
+ }
150
+
151
+ // Infrequent access - overhead negligible
152
+ fn get_config(&self, key: &str) -> Option<&Value> {
153
+ self.config.get(key) // Fine, not hot path
154
+ }
155
+ ```
156
+
157
+ ## See Also
158
+
159
+ - [opt-simd-portable](./opt-simd-portable.md) - SIMD requires unchecked access
160
+ - [opt-cache-friendly](./opt-cache-friendly.md) - Cache-efficient patterns
161
+ - [perf-profile-first](./perf-profile-first.md) - Identify actual hot paths