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,94 @@
1
+ # name-consts-screaming
2
+
3
+ > Use `SCREAMING_SNAKE_CASE` for constants and statics
4
+
5
+ ## Why It Matters
6
+
7
+ Constants and statics are special—they're known at compile time and have program-wide lifetime. `SCREAMING_SNAKE_CASE` makes them visually distinct from runtime variables. This convention is enforced by the compiler and universally expected.
8
+
9
+ ## Bad
10
+
11
+ ```rust
12
+ // lowercase/camelCase constants - compiler warns
13
+ const maxConnections: u32 = 100; // warning
14
+ const default_timeout: u64 = 30; // warning
15
+ static globalCounter: AtomicU64 = AtomicU64::new(0); // warning
16
+ ```
17
+
18
+ ## Good
19
+
20
+ ```rust
21
+ // SCREAMING_SNAKE_CASE for constants
22
+ const MAX_CONNECTIONS: u32 = 100;
23
+ const DEFAULT_TIMEOUT: Duration = Duration::from_secs(30);
24
+ const BUFFER_SIZE: usize = 4096;
25
+
26
+ // SCREAMING_SNAKE_CASE for statics
27
+ static GLOBAL_COUNTER: AtomicU64 = AtomicU64::new(0);
28
+ static CONFIG: OnceLock<Config> = OnceLock::new();
29
+
30
+ // Type-level constants in impl blocks
31
+ impl Buffer {
32
+ const INITIAL_CAPACITY: usize = 1024;
33
+ const MAX_CAPACITY: usize = 1024 * 1024;
34
+ }
35
+ ```
36
+
37
+ ## Associated Constants
38
+
39
+ ```rust
40
+ trait Limit {
41
+ const MAX: usize;
42
+ const MIN: usize;
43
+ }
44
+
45
+ impl Limit for SmallBuffer {
46
+ const MAX: usize = 256;
47
+ const MIN: usize = 16;
48
+ }
49
+
50
+ // Generic associated constants
51
+ struct Container<T> {
52
+ data: Vec<T>,
53
+ }
54
+
55
+ impl<T> Container<T> {
56
+ const EMPTY: Self = Self { data: Vec::new() };
57
+ }
58
+ ```
59
+
60
+ ## Environment and Config
61
+
62
+ ```rust
63
+ // Environment variable names
64
+ const ENV_DATABASE_URL: &str = "DATABASE_URL";
65
+ const ENV_LOG_LEVEL: &str = "LOG_LEVEL";
66
+
67
+ // Configuration keys
68
+ const CONFIG_TIMEOUT_SECONDS: &str = "timeout_seconds";
69
+ const CONFIG_MAX_RETRIES: &str = "max_retries";
70
+ ```
71
+
72
+ ## Lazy Static / OnceLock
73
+
74
+ ```rust
75
+ use std::sync::OnceLock;
76
+
77
+ // Global configuration
78
+ static CONFIG: OnceLock<AppConfig> = OnceLock::new();
79
+
80
+ // Compiled regex
81
+ static EMAIL_REGEX: OnceLock<Regex> = OnceLock::new();
82
+
83
+ fn get_email_regex() -> &'static Regex {
84
+ EMAIL_REGEX.get_or_init(|| {
85
+ Regex::new(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$").unwrap()
86
+ })
87
+ }
88
+ ```
89
+
90
+ ## See Also
91
+
92
+ - [name-funcs-snake](./name-funcs-snake.md) - Function/variable naming
93
+ - [name-types-camel](./name-types-camel.md) - Type naming
94
+ - [type-newtype-ids](./type-newtype-ids.md) - Type-safe constants
@@ -0,0 +1,78 @@
1
+ # name-crate-no-rs
2
+
3
+ > Don't suffix crate names with `-rs` or `-rust`
4
+
5
+ ## Why It Matters
6
+
7
+ Adding `-rs` or `-rust` to crate names is redundant—you're already on crates.io, it's obviously Rust. These suffixes waste characters, clutter the namespace, and can make crate names harder to type. The Rust community discourages this pattern.
8
+
9
+ ## Bad
10
+
11
+ ```toml
12
+ # Cargo.toml
13
+ [package]
14
+ name = "json-parser-rs" # Redundant -rs
15
+ name = "my-lib-rust" # Redundant -rust
16
+ name = "http-client-rs" # We know it's Rust
17
+ name = "rust-sqlite" # rust- prefix equally bad
18
+ ```
19
+
20
+ ## Good
21
+
22
+ ```toml
23
+ # Cargo.toml
24
+ [package]
25
+ name = "json-parser"
26
+ name = "my-lib"
27
+ name = "http-client"
28
+ name = "sqlite-wrapper"
29
+
30
+ # Real crate examples (no -rs):
31
+ # serde (not serde-rs)
32
+ # tokio (not tokio-rs)
33
+ # reqwest (not reqwest-rs)
34
+ # clap (not clap-rs)
35
+ ```
36
+
37
+ ## When Context Is Needed
38
+
39
+ ```toml
40
+ # If you're porting a library from another language:
41
+ name = "python-ast" # Describes what it's for, not what it's written in
42
+
43
+ # If you're providing bindings:
44
+ name = "openssl" # The Rust crate IS the Rust interface
45
+
46
+ # Platform-specific:
47
+ name = "windows-sys" # Platform, not language
48
+ ```
49
+
50
+ ## Repository Naming
51
+
52
+ ```
53
+ # GitHub repos don't need -rs either
54
+ github.com/user/my-library # Good
55
+ github.com/user/my-library-rs # Unnecessary
56
+
57
+ # Though some do for disambiguation from other language versions
58
+ github.com/rust-lang/rust # The rust repo itself uses "rust"
59
+ ```
60
+
61
+ ## Exceptions
62
+
63
+ ```toml
64
+ # Rare cases where disambiguation matters:
65
+ # - If there's a widely-known non-Rust project with the same name
66
+ # - Official Rust project repositories (rust-lang org)
67
+
68
+ # But even then, consider alternatives:
69
+ name = "fancy-lib" # Instead of fancy-rs
70
+ name = "better-json" # Instead of json-rust
71
+ name = "my-serde-impl" # Instead of serde-rs-fork
72
+ ```
73
+
74
+ ## See Also
75
+
76
+ - [proj-workspace-deps](./proj-workspace-deps.md) - Cargo configuration
77
+ - [doc-cargo-metadata](./doc-cargo-metadata.md) - Package metadata
78
+ - [name-funcs-snake](./name-funcs-snake.md) - Naming conventions
@@ -0,0 +1,76 @@
1
+ # name-funcs-snake
2
+
3
+ > Use `snake_case` for functions, methods, variables, and modules
4
+
5
+ ## Why It Matters
6
+
7
+ Rust uses `snake_case` for "value-level" names—functions, methods, variables, modules. This convention is enforced by the compiler and distinguishes runtime entities from types. Consistent naming makes code scannable and predictable.
8
+
9
+ ## Bad
10
+
11
+ ```rust
12
+ // CamelCase functions - compiler warns
13
+ fn calculateTotal() -> f64 { ... } // warning: function `calculateTotal` should have a snake case name
14
+ fn getUserName() -> String { ... } // warning
15
+
16
+ // Inconsistent naming
17
+ fn get_user() -> User { ... }
18
+ fn fetchOrder() -> Order { ... } // Mixed conventions
19
+ ```
20
+
21
+ ## Good
22
+
23
+ ```rust
24
+ // snake_case for functions
25
+ fn calculate_total() -> f64 { ... }
26
+ fn get_user_name() -> String { ... }
27
+ fn fetch_order() -> Order { ... }
28
+
29
+ // snake_case for methods
30
+ impl User {
31
+ fn full_name(&self) -> String { ... }
32
+ fn is_active(&self) -> bool { ... }
33
+ fn set_email(&mut self, email: &str) { ... }
34
+ }
35
+
36
+ // snake_case for variables
37
+ let user_count = 42;
38
+ let max_connections = 100;
39
+ let is_valid = true;
40
+
41
+ // snake_case for modules
42
+ mod user_service;
43
+ mod http_client;
44
+ mod json_parser;
45
+ ```
46
+
47
+ ## Acronyms in snake_case
48
+
49
+ ```rust
50
+ // Lowercase acronyms in snake_case
51
+ fn parse_json() -> Json { ... } // Not parse_JSON
52
+ fn connect_tcp() -> TcpStream { ... } // Not connect_TCP
53
+ fn generate_uuid() -> Uuid { ... } // Not generate_UUID
54
+
55
+ let http_response = fetch();
56
+ let json_data = parse();
57
+ ```
58
+
59
+ ## Local Variables
60
+
61
+ ```rust
62
+ fn process_data(input_data: &[u8]) -> Result<Output, Error> {
63
+ let raw_bytes = input_data;
64
+ let decoded_string = decode(raw_bytes)?;
65
+ let parsed_value = parse(&decoded_string)?;
66
+ let final_result = transform(parsed_value)?;
67
+
68
+ Ok(final_result)
69
+ }
70
+ ```
71
+
72
+ ## See Also
73
+
74
+ - [name-types-camel](./name-types-camel.md) - Type naming
75
+ - [name-consts-screaming](./name-consts-screaming.md) - Constant naming
76
+ - [name-lifetime-short](./name-lifetime-short.md) - Lifetime naming
@@ -0,0 +1,123 @@
1
+ # name-into-ownership
2
+
3
+ > Use `into_` prefix for ownership-consuming conversions
4
+
5
+ ## Why It Matters
6
+
7
+ The `into_` prefix signals "this method consumes self and returns something else." The original value is moved and no longer usable. This ownership transfer is usually cheap (no allocation), but the caller loses access to the original. Clear naming prevents "use after move" confusion.
8
+
9
+ ## Bad
10
+
11
+ ```rust
12
+ impl Wrapper {
13
+ // Misleading: doesn't indicate ownership transfer
14
+ fn get_inner(self) -> Inner {
15
+ self.inner
16
+ }
17
+
18
+ // Misleading: suggests borrowing
19
+ fn as_inner(self) -> Inner { // Takes self by value!
20
+ self.inner
21
+ }
22
+ }
23
+ ```
24
+
25
+ ## Good
26
+
27
+ ```rust
28
+ impl Wrapper {
29
+ // into_ clearly shows ownership transfer
30
+ fn into_inner(self) -> Inner {
31
+ self.inner
32
+ }
33
+ }
34
+
35
+ // Usage is clear
36
+ let wrapper = Wrapper::new(inner);
37
+ let inner = wrapper.into_inner(); // wrapper is consumed
38
+ // wrapper.foo(); // Error: use of moved value
39
+ ```
40
+
41
+ ## Standard Library Examples
42
+
43
+ ```rust
44
+ // All consume self and return owned data
45
+ let string: String = "hello".to_string();
46
+ let bytes: Vec<u8> = string.into_bytes(); // String consumed
47
+
48
+ let path = PathBuf::from("/foo");
49
+ let os_string: OsString = path.into_os_string(); // PathBuf consumed
50
+
51
+ let boxed: Box<[i32]> = vec![1, 2, 3].into_boxed_slice(); // Vec consumed
52
+
53
+ let vec: Vec<u8> = boxed.into_vec(); // Box consumed
54
+ ```
55
+
56
+ ## into_iter() Pattern
57
+
58
+ ```rust
59
+ let vec = vec![1, 2, 3];
60
+
61
+ // into_iter consumes the collection
62
+ for item in vec.into_iter() { // or just: for item in vec
63
+ // item is i32, not &i32
64
+ }
65
+ // vec is consumed, can't use anymore
66
+
67
+ // Contrast with iter() which borrows
68
+ let vec = vec![1, 2, 3];
69
+ for item in vec.iter() {
70
+ // item is &i32
71
+ }
72
+ // vec still usable
73
+ ```
74
+
75
+ ## IntoIterator Trait
76
+
77
+ ```rust
78
+ impl IntoIterator for MyCollection {
79
+ type Item = Element;
80
+ type IntoIter = std::vec::IntoIter<Element>;
81
+
82
+ fn into_iter(self) -> Self::IntoIter {
83
+ self.elements.into_iter() // Consumes self
84
+ }
85
+ }
86
+ ```
87
+
88
+ ## Conversion Prefix Summary
89
+
90
+ ```rust
91
+ struct Buffer {
92
+ data: Vec<u8>,
93
+ name: String,
94
+ }
95
+
96
+ impl Buffer {
97
+ // as_ : free borrow, returns reference
98
+ fn as_slice(&self) -> &[u8] {
99
+ &self.data
100
+ }
101
+
102
+ // to_ : allocates, creates new value
103
+ fn to_vec(&self) -> Vec<u8> {
104
+ self.data.clone()
105
+ }
106
+
107
+ // into_ : consumes self, usually cheap
108
+ fn into_inner(self) -> Vec<u8> {
109
+ self.data
110
+ }
111
+
112
+ // into_ : can destructure into parts
113
+ fn into_parts(self) -> (Vec<u8>, String) {
114
+ (self.data, self.name)
115
+ }
116
+ }
117
+ ```
118
+
119
+ ## See Also
120
+
121
+ - [name-as-free](./name-as-free.md) - Borrowing conversions
122
+ - [name-to-expensive](./name-to-expensive.md) - Allocating conversions
123
+ - [api-from-not-into](./api-from-not-into.md) - From trait implementation
@@ -0,0 +1,127 @@
1
+ # name-is-has-bool
2
+
3
+ > Use `is_`, `has_`, `can_`, `should_` prefixes for boolean-returning methods
4
+
5
+ ## Why It Matters
6
+
7
+ Boolean methods answer yes/no questions. Prefixes like `is_`, `has_`, `can_` make the question explicit, so code reads naturally: `if user.is_active()`, `if buffer.has_remaining()`. Without prefixes, boolean methods are ambiguous and require reading documentation.
8
+
9
+ ## Bad
10
+
11
+ ```rust
12
+ impl User {
13
+ // Unclear: does this check or set?
14
+ fn active(&self) -> bool { ... }
15
+
16
+ // Unclear: does this delete or check?
17
+ fn deleted(&self) -> bool { ... }
18
+
19
+ // Unclear return type
20
+ fn admin(&self) -> bool { ... }
21
+ }
22
+
23
+ // Reading code is confusing
24
+ if user.active() { ... } // Is this checking or activating?
25
+ ```
26
+
27
+ ## Good
28
+
29
+ ```rust
30
+ impl User {
31
+ // Clear: answers "is the user active?"
32
+ fn is_active(&self) -> bool { ... }
33
+
34
+ // Clear: answers "is the user deleted?"
35
+ fn is_deleted(&self) -> bool { ... }
36
+
37
+ // Clear: answers "is the user an admin?"
38
+ fn is_admin(&self) -> bool { ... }
39
+
40
+ // Clear: answers "does the user have permission X?"
41
+ fn has_permission(&self, perm: Permission) -> bool { ... }
42
+
43
+ // Clear: answers "can the user edit?"
44
+ fn can_edit(&self) -> bool { ... }
45
+ }
46
+
47
+ // Reads naturally
48
+ if user.is_active() && user.has_permission(Permission::Write) {
49
+ // ...
50
+ }
51
+ ```
52
+
53
+ ## Common Prefixes
54
+
55
+ | Prefix | Use For | Example |
56
+ |--------|---------|---------|
57
+ | `is_` | State/property check | `is_empty()`, `is_valid()`, `is_some()` |
58
+ | `has_` | Possession/containment | `has_key()`, `has_children()`, `has_remaining()` |
59
+ | `can_` | Capability/permission | `can_read()`, `can_write()`, `can_execute()` |
60
+ | `should_` | Recommendation/policy | `should_retry()`, `should_cache()` |
61
+ | `needs_` | Requirement | `needs_update()`, `needs_auth()` |
62
+ | `will_` | Future action | `will_block()`, `will_overflow()` |
63
+
64
+ ## Standard Library Examples
65
+
66
+ ```rust
67
+ // is_ prefix
68
+ vec.is_empty()
69
+ option.is_some()
70
+ option.is_none()
71
+ result.is_ok()
72
+ result.is_err()
73
+ char.is_alphabetic()
74
+ str.is_ascii()
75
+ path.is_file()
76
+ path.is_dir()
77
+
78
+ // has_ prefix (less common in std)
79
+ iterator.has_next() // conceptual
80
+
81
+ // Checking methods
82
+ str.contains("foo") // Not is_ because takes argument
83
+ str.starts_with("bar") // Descriptive verb phrase
84
+ str.ends_with("baz")
85
+ ```
86
+
87
+ ## Negation
88
+
89
+ ```rust
90
+ // Prefer positive form with caller negation
91
+ if !user.is_active() { ... }
92
+
93
+ // Rather than negative method
94
+ if user.is_inactive() { ... } // Avoid double negatives: !is_inactive()
95
+
96
+ // Exception: when negative is the common case
97
+ fn is_empty(&self) -> bool { ... } // Checking for empty is common
98
+ fn is_not_empty(&self) -> bool { ... } // Rarely needed, use !is_empty()
99
+ ```
100
+
101
+ ## Boolean Fields
102
+
103
+ ```rust
104
+ struct Config {
105
+ // Field names can omit prefix
106
+ enabled: bool,
107
+ verbose: bool,
108
+ debug: bool,
109
+ }
110
+
111
+ impl Config {
112
+ // But methods should have prefix
113
+ fn is_enabled(&self) -> bool {
114
+ self.enabled
115
+ }
116
+
117
+ fn is_verbose(&self) -> bool {
118
+ self.verbose
119
+ }
120
+ }
121
+ ```
122
+
123
+ ## See Also
124
+
125
+ - [name-no-get-prefix](./name-no-get-prefix.md) - Getter naming
126
+ - [name-funcs-snake](./name-funcs-snake.md) - Function naming
127
+ - [api-must-use](./api-must-use.md) - Boolean functions should be checked
@@ -0,0 +1,129 @@
1
+ # name-iter-convention
2
+
3
+ > Use iter/iter_mut/into_iter for iterator methods
4
+
5
+ ## Why It Matters
6
+
7
+ Rust has a standard convention for iterator method names that signals ownership semantics. Following this convention makes APIs predictable and enables the `for item in collection` syntax to work correctly.
8
+
9
+ ## The Three Iterator Methods
10
+
11
+ | Method | Returns | Ownership |
12
+ |--------|---------|-----------|
13
+ | `iter()` | `impl Iterator<Item = &T>` | Borrows collection |
14
+ | `iter_mut()` | `impl Iterator<Item = &mut T>` | Mutably borrows |
15
+ | `into_iter()` | `impl Iterator<Item = T>` | Consumes collection |
16
+
17
+ ## Implementation
18
+
19
+ ```rust
20
+ struct MyCollection<T> {
21
+ items: Vec<T>,
22
+ }
23
+
24
+ impl<T> MyCollection<T> {
25
+ /// Returns an iterator over references.
26
+ fn iter(&self) -> impl Iterator<Item = &T> {
27
+ self.items.iter()
28
+ }
29
+
30
+ /// Returns an iterator over mutable references.
31
+ fn iter_mut(&mut self) -> impl Iterator<Item = &mut T> {
32
+ self.items.iter_mut()
33
+ }
34
+ }
35
+
36
+ // IntoIterator trait for into_iter()
37
+ impl<T> IntoIterator for MyCollection<T> {
38
+ type Item = T;
39
+ type IntoIter = std::vec::IntoIter<T>;
40
+
41
+ fn into_iter(self) -> Self::IntoIter {
42
+ self.items.into_iter()
43
+ }
44
+ }
45
+
46
+ // Also implement for references
47
+ impl<'a, T> IntoIterator for &'a MyCollection<T> {
48
+ type Item = &'a T;
49
+ type IntoIter = std::slice::Iter<'a, T>;
50
+
51
+ fn into_iter(self) -> Self::IntoIter {
52
+ self.items.iter()
53
+ }
54
+ }
55
+
56
+ impl<'a, T> IntoIterator for &'a mut MyCollection<T> {
57
+ type Item = &'a mut T;
58
+ type IntoIter = std::slice::IterMut<'a, T>;
59
+
60
+ fn into_iter(self) -> Self::IntoIter {
61
+ self.items.iter_mut()
62
+ }
63
+ }
64
+ ```
65
+
66
+ ## Usage
67
+
68
+ ```rust
69
+ let collection = MyCollection { items: vec![1, 2, 3] };
70
+
71
+ // Explicit methods
72
+ for x in collection.iter() { } // Borrows
73
+ for x in collection.iter_mut() { } // Mutably borrows
74
+
75
+ // IntoIterator enables for loop syntax
76
+ for x in &collection { } // Calls (&collection).into_iter()
77
+ for x in &mut collection { } // Calls (&mut collection).into_iter()
78
+ for x in collection { } // Consumes, calls collection.into_iter()
79
+ ```
80
+
81
+ ## Bad
82
+
83
+ ```rust
84
+ impl MyCollection<T> {
85
+ // Non-standard names
86
+ fn elements(&self) -> impl Iterator<Item = &T> { } // Should be iter()
87
+ fn get_items(&self) -> impl Iterator<Item = &T> { } // Should be iter()
88
+ fn iterate(&self) -> impl Iterator<Item = &T> { } // Should be iter()
89
+ fn as_iter(&self) -> impl Iterator<Item = &T> { } // Should be iter()
90
+ }
91
+ ```
92
+
93
+ ## Additional Iterator Methods
94
+
95
+ ```rust
96
+ impl MyCollection<T> {
97
+ // Filter by predicate
98
+ fn iter_valid(&self) -> impl Iterator<Item = &T> {
99
+ self.iter().filter(|x| x.is_valid())
100
+ }
101
+
102
+ // Specific slice
103
+ fn iter_range(&self, start: usize, end: usize) -> impl Iterator<Item = &T> {
104
+ self.items[start..end].iter()
105
+ }
106
+ }
107
+ ```
108
+
109
+ ## Standard Library Examples
110
+
111
+ ```rust
112
+ // Vec, slice, arrays
113
+ vec.iter() // &T
114
+ vec.iter_mut() // &mut T
115
+ vec.into_iter() // T
116
+
117
+ // HashMap
118
+ map.iter() // (&K, &V)
119
+ map.iter_mut() // (&K, &mut V)
120
+ map.into_iter() // (K, V)
121
+ map.keys() // &K
122
+ map.values() // &V
123
+ ```
124
+
125
+ ## See Also
126
+
127
+ - [name-iter-type-match](./name-iter-type-match.md) - Iterator type naming
128
+ - [name-iter-method](./name-iter-method.md) - Iterator method names
129
+ - [perf-iter-over-index](./perf-iter-over-index.md) - Prefer iterators