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,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
@@ -0,0 +1,187 @@
1
+ # opt-cache-friendly
2
+
3
+ > Organize data for cache-efficient access patterns
4
+
5
+ ## Why It Matters
6
+
7
+ Cache misses are expensive—a L3 cache miss costs ~100+ cycles vs ~4 cycles for L1 hit. Data layout and access patterns determine cache efficiency. Arrays of structs (AoS) vs structs of arrays (SoA), memory locality, and access patterns can make order-of-magnitude performance differences.
8
+
9
+ ## Bad
10
+
11
+ ```rust
12
+ // Array of Structs (AoS) - poor cache use when accessing one field
13
+ struct Particle {
14
+ position: [f32; 3], // 12 bytes
15
+ velocity: [f32; 3], // 12 bytes
16
+ mass: f32, // 4 bytes
17
+ id: u64, // 8 bytes
18
+ flags: u8, // 1 byte + padding
19
+ // Total: 40 bytes per particle
20
+ }
21
+
22
+ fn update_positions(particles: &mut [Particle], dt: f32) {
23
+ for p in particles {
24
+ // Access position and velocity - 24 bytes
25
+ // But loads 40-byte struct per particle
26
+ // 16 bytes wasted per cache line load
27
+ p.position[0] += p.velocity[0] * dt;
28
+ p.position[1] += p.velocity[1] * dt;
29
+ p.position[2] += p.velocity[2] * dt;
30
+ }
31
+ }
32
+ ```
33
+
34
+ ## Good
35
+
36
+ ```rust
37
+ // Struct of Arrays (SoA) - cache-efficient for field access
38
+ struct Particles {
39
+ positions_x: Vec<f32>,
40
+ positions_y: Vec<f32>,
41
+ positions_z: Vec<f32>,
42
+ velocities_x: Vec<f32>,
43
+ velocities_y: Vec<f32>,
44
+ velocities_z: Vec<f32>,
45
+ masses: Vec<f32>,
46
+ ids: Vec<u64>,
47
+ flags: Vec<u8>,
48
+ }
49
+
50
+ fn update_positions(p: &mut Particles, dt: f32) {
51
+ // Access contiguous memory - perfect cache utilization
52
+ for (px, vx) in p.positions_x.iter_mut().zip(&p.velocities_x) {
53
+ *px += vx * dt;
54
+ }
55
+ for (py, vy) in p.positions_y.iter_mut().zip(&p.velocities_y) {
56
+ *py += vy * dt;
57
+ }
58
+ for (pz, vz) in p.positions_z.iter_mut().zip(&p.velocities_z) {
59
+ *pz += vz * dt;
60
+ }
61
+ }
62
+ ```
63
+
64
+ ## Hot/Cold Splitting
65
+
66
+ ```rust
67
+ // Separate frequently and rarely accessed fields
68
+ struct EntityHot {
69
+ position: [f32; 3],
70
+ velocity: [f32; 3],
71
+ // Hot data - accessed every frame
72
+ }
73
+
74
+ struct EntityCold {
75
+ name: String,
76
+ creation_time: Instant,
77
+ metadata: HashMap<String, Value>,
78
+ // Cold data - rarely accessed
79
+ }
80
+
81
+ struct Entities {
82
+ hot: Vec<EntityHot>,
83
+ cold: Vec<EntityCold>,
84
+ }
85
+
86
+ // Hot loop touches only hot data
87
+ fn update(entities: &mut Entities, dt: f32) {
88
+ for e in &mut entities.hot {
89
+ e.position[0] += e.velocity[0] * dt;
90
+ // Cold data stays out of cache
91
+ }
92
+ }
93
+ ```
94
+
95
+ ## Prefetching
96
+
97
+ ```rust
98
+ // Process in cache-line-sized chunks
99
+ const CACHE_LINE: usize = 64;
100
+
101
+ fn process_with_prefetch(data: &mut [u8]) {
102
+ for chunk in data.chunks_mut(CACHE_LINE) {
103
+ // Prefetch next chunk while processing current
104
+ // (automatic in many cases, manual for complex patterns)
105
+ process_chunk(chunk);
106
+ }
107
+ }
108
+
109
+ // Matrix multiplication - block for cache
110
+ fn matmul_blocked(a: &[f64], b: &[f64], c: &mut [f64], n: usize) {
111
+ const BLOCK: usize = 32; // Fits in L1 cache
112
+
113
+ for i0 in (0..n).step_by(BLOCK) {
114
+ for j0 in (0..n).step_by(BLOCK) {
115
+ for k0 in (0..n).step_by(BLOCK) {
116
+ // Process BLOCK x BLOCK tile
117
+ for i in i0..min(i0 + BLOCK, n) {
118
+ for j in j0..min(j0 + BLOCK, n) {
119
+ // Inner loop operates on cached data
120
+ }
121
+ }
122
+ }
123
+ }
124
+ }
125
+ }
126
+ ```
127
+
128
+ ## Avoid Pointer Chasing
129
+
130
+ ```rust
131
+ // Bad: linked list - random memory access
132
+ struct Node {
133
+ value: i32,
134
+ next: Option<Box<Node>>,
135
+ }
136
+
137
+ fn sum_linked(head: &Node) -> i32 {
138
+ // Each node is a cache miss
139
+ }
140
+
141
+ // Good: contiguous vector
142
+ fn sum_vector(data: &[i32]) -> i32 {
143
+ data.iter().sum() // Sequential access, prefetcher happy
144
+ }
145
+
146
+ // Good: if graph needed, use indices
147
+ struct Graph {
148
+ values: Vec<i32>,
149
+ edges: Vec<usize>, // Indices into values
150
+ }
151
+ ```
152
+
153
+ ## Memory Layout Attributes
154
+
155
+ ```rust
156
+ // Ensure cache-line alignment
157
+ #[repr(C, align(64))]
158
+ struct CacheAligned {
159
+ data: [u8; 64],
160
+ }
161
+
162
+ // Prevent false sharing in concurrent code
163
+ #[repr(C, align(64))]
164
+ struct PaddedCounter {
165
+ value: AtomicU64,
166
+ _pad: [u8; 56],
167
+ }
168
+ ```
169
+
170
+ ## Measuring Cache Performance
171
+
172
+ ```bash
173
+ # Linux perf
174
+ perf stat -e cache-references,cache-misses ./my_program
175
+
176
+ # Detailed cache analysis
177
+ perf stat -e L1-dcache-loads,L1-dcache-load-misses,LLC-loads,LLC-load-misses ./my_program
178
+
179
+ # Cachegrind
180
+ valgrind --tool=cachegrind ./my_program
181
+ ```
182
+
183
+ ## See Also
184
+
185
+ - [mem-smaller-integers](./mem-smaller-integers.md) - Smaller data fits more in cache
186
+ - [mem-box-large-variant](./mem-box-large-variant.md) - Keep enum sizes small
187
+ - [opt-bounds-check](./opt-bounds-check.md) - Sequential access patterns