agy-superpowers 5.2.2 → 5.2.3
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.
- package/README.md +47 -150
- package/package.json +1 -1
- package/template/agent/rules/scratch-scripts.md +37 -0
- package/template/agent/rules/superpowers.md +4 -51
- package/template/agent/skills/ai-integrated-product/SKILL.md +0 -57
- package/template/agent/skills/analytics-setup/SKILL.md +0 -51
- package/template/agent/skills/api-design/SKILL.md +0 -193
- package/template/agent/skills/app-store-optimizer/SKILL.md +0 -127
- package/template/agent/skills/auth-and-identity/SKILL.md +0 -167
- package/template/agent/skills/backend-developer/SKILL.md +0 -148
- package/template/agent/skills/bootstrapper-finance/SKILL.md +0 -55
- package/template/agent/skills/chrome-extension-developer/SKILL.md +0 -53
- package/template/agent/skills/community-manager/SKILL.md +0 -115
- package/template/agent/skills/content-marketer/SKILL.md +0 -111
- package/template/agent/skills/conversion-optimizer/SKILL.md +0 -142
- package/template/agent/skills/cto-architect/SKILL.md +0 -133
- package/template/agent/skills/customer-success-manager/SKILL.md +0 -126
- package/template/agent/skills/data-analyst/SKILL.md +0 -147
- package/template/agent/skills/devops-engineer/SKILL.md +0 -117
- package/template/agent/skills/email-infrastructure/SKILL.md +0 -164
- package/template/agent/skills/game-design/SKILL.md +0 -194
- package/template/agent/skills/game-developer/SKILL.md +0 -175
- package/template/agent/skills/growth-hacker/SKILL.md +0 -122
- package/template/agent/skills/idea-validator/SKILL.md +0 -55
- package/template/agent/skills/indie-legal/SKILL.md +0 -53
- package/template/agent/skills/influencer-marketer/SKILL.md +0 -141
- package/template/agent/skills/landing-page-builder/SKILL.md +0 -59
- package/template/agent/skills/launch-strategist/SKILL.md +0 -62
- package/template/agent/skills/market-researcher/SKILL.md +0 -53
- package/template/agent/skills/micro-saas-builder/SKILL.md +0 -56
- package/template/agent/skills/monetization-strategist/SKILL.md +0 -119
- package/template/agent/skills/paid-acquisition-specialist/SKILL.md +0 -119
- package/template/agent/skills/pricing-psychologist/SKILL.md +0 -58
- package/template/agent/skills/real-time-features/SKILL.md +0 -194
- package/template/agent/skills/retention-specialist/SKILL.md +0 -123
- package/template/agent/skills/rust-developer/SKILL.md +0 -281
- package/template/agent/skills/rust-developer/references/rust-rules/_sections.md +0 -231
- package/template/agent/skills/rust-developer/references/rust-rules/anti-clone-excessive.md +0 -124
- package/template/agent/skills/rust-developer/references/rust-rules/anti-collect-intermediate.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/anti-empty-catch.md +0 -132
- package/template/agent/skills/rust-developer/references/rust-rules/anti-expect-lazy.md +0 -95
- package/template/agent/skills/rust-developer/references/rust-rules/anti-format-hot-path.md +0 -141
- package/template/agent/skills/rust-developer/references/rust-rules/anti-index-over-iter.md +0 -125
- package/template/agent/skills/rust-developer/references/rust-rules/anti-lock-across-await.md +0 -127
- package/template/agent/skills/rust-developer/references/rust-rules/anti-over-abstraction.md +0 -120
- package/template/agent/skills/rust-developer/references/rust-rules/anti-panic-expected.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/anti-premature-optimize.md +0 -156
- package/template/agent/skills/rust-developer/references/rust-rules/anti-string-for-str.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/anti-stringly-typed.md +0 -167
- package/template/agent/skills/rust-developer/references/rust-rules/anti-type-erasure.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/anti-unwrap-abuse.md +0 -143
- package/template/agent/skills/rust-developer/references/rust-rules/anti-vec-for-slice.md +0 -121
- package/template/agent/skills/rust-developer/references/rust-rules/api-builder-must-use.md +0 -143
- package/template/agent/skills/rust-developer/references/rust-rules/api-builder-pattern.md +0 -187
- package/template/agent/skills/rust-developer/references/rust-rules/api-common-traits.md +0 -165
- package/template/agent/skills/rust-developer/references/rust-rules/api-default-impl.md +0 -177
- package/template/agent/skills/rust-developer/references/rust-rules/api-extension-trait.md +0 -163
- package/template/agent/skills/rust-developer/references/rust-rules/api-from-not-into.md +0 -146
- package/template/agent/skills/rust-developer/references/rust-rules/api-impl-asref.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/api-impl-into.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/api-must-use.md +0 -125
- package/template/agent/skills/rust-developer/references/rust-rules/api-newtype-safety.md +0 -162
- package/template/agent/skills/rust-developer/references/rust-rules/api-non-exhaustive.md +0 -177
- package/template/agent/skills/rust-developer/references/rust-rules/api-parse-dont-validate.md +0 -184
- package/template/agent/skills/rust-developer/references/rust-rules/api-sealed-trait.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/api-serde-optional.md +0 -182
- package/template/agent/skills/rust-developer/references/rust-rules/api-typestate.md +0 -199
- package/template/agent/skills/rust-developer/references/rust-rules/async-bounded-channel.md +0 -175
- package/template/agent/skills/rust-developer/references/rust-rules/async-broadcast-pubsub.md +0 -185
- package/template/agent/skills/rust-developer/references/rust-rules/async-cancellation-token.md +0 -203
- package/template/agent/skills/rust-developer/references/rust-rules/async-clone-before-await.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/async-join-parallel.md +0 -158
- package/template/agent/skills/rust-developer/references/rust-rules/async-joinset-structured.md +0 -195
- package/template/agent/skills/rust-developer/references/rust-rules/async-mpsc-queue.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/async-no-lock-await.md +0 -156
- package/template/agent/skills/rust-developer/references/rust-rules/async-oneshot-response.md +0 -191
- package/template/agent/skills/rust-developer/references/rust-rules/async-select-racing.md +0 -198
- package/template/agent/skills/rust-developer/references/rust-rules/async-spawn-blocking.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-fs.md +0 -167
- package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-runtime.md +0 -169
- package/template/agent/skills/rust-developer/references/rust-rules/async-try-join.md +0 -172
- package/template/agent/skills/rust-developer/references/rust-rules/async-watch-latest.md +0 -189
- package/template/agent/skills/rust-developer/references/rust-rules/doc-all-public.md +0 -113
- package/template/agent/skills/rust-developer/references/rust-rules/doc-cargo-metadata.md +0 -147
- package/template/agent/skills/rust-developer/references/rust-rules/doc-errors-section.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/doc-examples-section.md +0 -161
- package/template/agent/skills/rust-developer/references/rust-rules/doc-hidden-setup.md +0 -149
- package/template/agent/skills/rust-developer/references/rust-rules/doc-intra-links.md +0 -138
- package/template/agent/skills/rust-developer/references/rust-rules/doc-link-types.md +0 -169
- package/template/agent/skills/rust-developer/references/rust-rules/doc-module-inner.md +0 -116
- package/template/agent/skills/rust-developer/references/rust-rules/doc-panics-section.md +0 -128
- package/template/agent/skills/rust-developer/references/rust-rules/doc-question-mark.md +0 -136
- package/template/agent/skills/rust-developer/references/rust-rules/doc-safety-section.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/err-anyhow-app.md +0 -179
- package/template/agent/skills/rust-developer/references/rust-rules/err-context-chain.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/err-custom-type.md +0 -152
- package/template/agent/skills/rust-developer/references/rust-rules/err-doc-errors.md +0 -145
- package/template/agent/skills/rust-developer/references/rust-rules/err-expect-bugs-only.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/err-from-impl.md +0 -152
- package/template/agent/skills/rust-developer/references/rust-rules/err-lowercase-msg.md +0 -124
- package/template/agent/skills/rust-developer/references/rust-rules/err-no-unwrap-prod.md +0 -115
- package/template/agent/skills/rust-developer/references/rust-rules/err-question-mark.md +0 -151
- package/template/agent/skills/rust-developer/references/rust-rules/err-result-over-panic.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/err-source-chain.md +0 -155
- package/template/agent/skills/rust-developer/references/rust-rules/err-thiserror-lib.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/lint-cargo-metadata.md +0 -138
- package/template/agent/skills/rust-developer/references/rust-rules/lint-deny-correctness.md +0 -107
- package/template/agent/skills/rust-developer/references/rust-rules/lint-missing-docs.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/lint-pedantic-selective.md +0 -118
- package/template/agent/skills/rust-developer/references/rust-rules/lint-rustfmt-check.md +0 -157
- package/template/agent/skills/rust-developer/references/rust-rules/lint-unsafe-doc.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-complexity.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-perf.md +0 -136
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-style.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-suspicious.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/lint-workspace-lints.md +0 -172
- package/template/agent/skills/rust-developer/references/rust-rules/mem-arena-allocator.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/mem-arrayvec.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/mem-assert-type-size.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/mem-avoid-format.md +0 -147
- package/template/agent/skills/rust-developer/references/rust-rules/mem-box-large-variant.md +0 -158
- package/template/agent/skills/rust-developer/references/rust-rules/mem-boxed-slice.md +0 -139
- package/template/agent/skills/rust-developer/references/rust-rules/mem-clone-from.md +0 -147
- package/template/agent/skills/rust-developer/references/rust-rules/mem-compact-string.md +0 -149
- package/template/agent/skills/rust-developer/references/rust-rules/mem-reuse-collections.md +0 -174
- package/template/agent/skills/rust-developer/references/rust-rules/mem-smaller-integers.md +0 -159
- package/template/agent/skills/rust-developer/references/rust-rules/mem-smallvec.md +0 -138
- package/template/agent/skills/rust-developer/references/rust-rules/mem-thinvec.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/mem-with-capacity.md +0 -156
- package/template/agent/skills/rust-developer/references/rust-rules/mem-write-over-format.md +0 -172
- package/template/agent/skills/rust-developer/references/rust-rules/mem-zero-copy.md +0 -164
- package/template/agent/skills/rust-developer/references/rust-rules/name-acronym-word.md +0 -99
- package/template/agent/skills/rust-developer/references/rust-rules/name-as-free.md +0 -104
- package/template/agent/skills/rust-developer/references/rust-rules/name-consts-screaming.md +0 -94
- package/template/agent/skills/rust-developer/references/rust-rules/name-crate-no-rs.md +0 -78
- package/template/agent/skills/rust-developer/references/rust-rules/name-funcs-snake.md +0 -76
- package/template/agent/skills/rust-developer/references/rust-rules/name-into-ownership.md +0 -123
- package/template/agent/skills/rust-developer/references/rust-rules/name-is-has-bool.md +0 -127
- package/template/agent/skills/rust-developer/references/rust-rules/name-iter-convention.md +0 -129
- package/template/agent/skills/rust-developer/references/rust-rules/name-iter-method.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/name-iter-type-match.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/name-lifetime-short.md +0 -86
- package/template/agent/skills/rust-developer/references/rust-rules/name-no-get-prefix.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/name-to-expensive.md +0 -118
- package/template/agent/skills/rust-developer/references/rust-rules/name-type-param-single.md +0 -92
- package/template/agent/skills/rust-developer/references/rust-rules/name-types-camel.md +0 -65
- package/template/agent/skills/rust-developer/references/rust-rules/name-variants-camel.md +0 -101
- package/template/agent/skills/rust-developer/references/rust-rules/opt-bounds-check.md +0 -161
- package/template/agent/skills/rust-developer/references/rust-rules/opt-cache-friendly.md +0 -187
- package/template/agent/skills/rust-developer/references/rust-rules/opt-codegen-units.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/opt-cold-unlikely.md +0 -152
- package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-always-rare.md +0 -141
- package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-never-cold.md +0 -181
- package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-small.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/opt-likely-hint.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/opt-lto-release.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/opt-pgo-profile.md +0 -167
- package/template/agent/skills/rust-developer/references/rust-rules/opt-simd-portable.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/opt-target-cpu.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/own-arc-shared.md +0 -141
- package/template/agent/skills/rust-developer/references/rust-rules/own-borrow-over-clone.md +0 -95
- package/template/agent/skills/rust-developer/references/rust-rules/own-clone-explicit.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/own-copy-small.md +0 -124
- package/template/agent/skills/rust-developer/references/rust-rules/own-cow-conditional.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/own-lifetime-elision.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/own-move-large.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/own-mutex-interior.md +0 -105
- package/template/agent/skills/rust-developer/references/rust-rules/own-rc-single-thread.md +0 -65
- package/template/agent/skills/rust-developer/references/rust-rules/own-refcell-interior.md +0 -97
- package/template/agent/skills/rust-developer/references/rust-rules/own-rwlock-readers.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/own-slice-over-vec.md +0 -119
- package/template/agent/skills/rust-developer/references/rust-rules/perf-black-box-bench.md +0 -153
- package/template/agent/skills/rust-developer/references/rust-rules/perf-chain-avoid.md +0 -136
- package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-into.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-once.md +0 -120
- package/template/agent/skills/rust-developer/references/rust-rules/perf-drain-reuse.md +0 -137
- package/template/agent/skills/rust-developer/references/rust-rules/perf-entry-api.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/perf-extend-batch.md +0 -150
- package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-lazy.md +0 -123
- package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-over-index.md +0 -113
- package/template/agent/skills/rust-developer/references/rust-rules/perf-profile-first.md +0 -175
- package/template/agent/skills/rust-developer/references/rust-rules/perf-release-profile.md +0 -149
- package/template/agent/skills/rust-developer/references/rust-rules/proj-bin-dir.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/proj-flat-small.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/proj-lib-main-split.md +0 -148
- package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-by-feature.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-rs-dir.md +0 -120
- package/template/agent/skills/rust-developer/references/rust-rules/proj-prelude-module.md +0 -155
- package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-crate-internal.md +0 -139
- package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-super-parent.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-use-reexport.md +0 -162
- package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-deps.md +0 -186
- package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-large.md +0 -162
- package/template/agent/skills/rust-developer/references/rust-rules/test-arrange-act-assert.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/test-cfg-test-module.md +0 -151
- package/template/agent/skills/rust-developer/references/rust-rules/test-criterion-bench.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/test-descriptive-names.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/test-doctest-examples.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/test-fixture-raii.md +0 -151
- package/template/agent/skills/rust-developer/references/rust-rules/test-integration-dir.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/test-mock-traits.md +0 -189
- package/template/agent/skills/rust-developer/references/rust-rules/test-mockall-mocking.md +0 -226
- package/template/agent/skills/rust-developer/references/rust-rules/test-proptest-properties.md +0 -161
- package/template/agent/skills/rust-developer/references/rust-rules/test-should-panic.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/test-tokio-async.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/test-use-super.md +0 -127
- package/template/agent/skills/rust-developer/references/rust-rules/type-enum-states.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/type-generic-bounds.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/type-never-diverge.md +0 -146
- package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-ids.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-validated.md +0 -159
- package/template/agent/skills/rust-developer/references/rust-rules/type-no-stringly.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/type-option-nullable.md +0 -137
- package/template/agent/skills/rust-developer/references/rust-rules/type-phantom-marker.md +0 -188
- package/template/agent/skills/rust-developer/references/rust-rules/type-repr-transparent.md +0 -143
- package/template/agent/skills/rust-developer/references/rust-rules/type-result-fallible.md +0 -131
- package/template/agent/skills/saas-architect/SKILL.md +0 -139
- package/template/agent/skills/security-engineer/SKILL.md +0 -133
- package/template/agent/skills/seo-specialist/SKILL.md +0 -130
- package/template/agent/skills/solo-founder-ops/SKILL.md +0 -56
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
# name-acronym-word
|
|
2
|
-
|
|
3
|
-
> Treat acronyms as words in identifiers: `HttpServer`, not `HTTPServer`
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
When acronyms are written in ALL CAPS within identifiers, word boundaries become unclear: is `HTTPSHandler` "HTTPS Handler" or "HTTP SHandler"? Treating acronyms as words (`HttpsHandler`) maintains clear word boundaries and follows Rust convention. The standard library uses this consistently.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
// ALL CAPS acronyms - unclear word boundaries
|
|
13
|
-
struct HTTPServer { ... } // HTTP + Server or H + TTP + Server?
|
|
14
|
-
struct TCPIPConnection { ... } // TCP + IP? Or other splits?
|
|
15
|
-
struct JSONParser { ... }
|
|
16
|
-
struct XMLHTTPRequest { ... } // Very confusing
|
|
17
|
-
|
|
18
|
-
fn parseJSON(input: &str) { ... }
|
|
19
|
-
fn connectTCP(addr: &str) { ... }
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
## Good
|
|
23
|
-
|
|
24
|
-
```rust
|
|
25
|
-
// Acronyms as words - clear boundaries
|
|
26
|
-
struct HttpServer { ... } // Http + Server
|
|
27
|
-
struct TcpIpConnection { ... } // Tcp + Ip + Connection
|
|
28
|
-
struct JsonParser { ... }
|
|
29
|
-
struct XmlHttpRequest { ... }
|
|
30
|
-
|
|
31
|
-
fn parse_json(input: &str) { ... }
|
|
32
|
-
fn connect_tcp(addr: &str) { ... }
|
|
33
|
-
|
|
34
|
-
// More examples
|
|
35
|
-
struct Uuid { ... } // Not UUID
|
|
36
|
-
struct Uri { ... } // Not URI
|
|
37
|
-
struct Url { ... } // Not URL
|
|
38
|
-
struct Html { ... } // Not HTML
|
|
39
|
-
struct Css { ... } // Not CSS
|
|
40
|
-
struct Api { ... } // Not API
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
## Standard Library Examples
|
|
44
|
-
|
|
45
|
-
```rust
|
|
46
|
-
// std uses acronyms as words
|
|
47
|
-
std::net::TcpStream // Not TCPStream
|
|
48
|
-
std::net::TcpListener // Not TCPListener
|
|
49
|
-
std::net::UdpSocket // Not UDPSocket
|
|
50
|
-
std::net::IpAddr // Not IPAddr
|
|
51
|
-
std::io::IoError // Not IOError (though Io is acceptable too)
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
## Two-Letter Acronyms
|
|
55
|
-
|
|
56
|
-
```rust
|
|
57
|
-
// Two-letter acronyms can go either way
|
|
58
|
-
struct Io { ... } // or IO - both acceptable
|
|
59
|
-
struct Id { ... } // or ID - both acceptable
|
|
60
|
-
|
|
61
|
-
// Preference: treat as word for consistency
|
|
62
|
-
struct IoHandler { ... } // Preferred
|
|
63
|
-
struct IdGenerator { ... } // Preferred
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
## In snake_case
|
|
67
|
-
|
|
68
|
-
```rust
|
|
69
|
-
// Acronyms become lowercase in snake_case
|
|
70
|
-
fn parse_json() { ... }
|
|
71
|
-
fn connect_tcp() { ... }
|
|
72
|
-
fn generate_uuid() { ... }
|
|
73
|
-
fn fetch_http() { ... }
|
|
74
|
-
fn encode_url() { ... }
|
|
75
|
-
|
|
76
|
-
// Variables
|
|
77
|
-
let json_response = fetch_json();
|
|
78
|
-
let tcp_connection = connect_tcp();
|
|
79
|
-
let user_id = generate_uuid();
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
## Mixed Cases
|
|
83
|
-
|
|
84
|
-
```rust
|
|
85
|
-
// When acronym is part of compound
|
|
86
|
-
struct HttpsConnection { ... } // Https (not HTTPS)
|
|
87
|
-
struct Utf8String { ... } // Utf8 (not UTF8)
|
|
88
|
-
struct Base64Encoder { ... } // Base64 as word
|
|
89
|
-
|
|
90
|
-
// Multiple acronyms
|
|
91
|
-
struct JsonApiClient { ... } // Json + Api + Client
|
|
92
|
-
struct RestApiHandler { ... } // Rest + Api + Handler
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
## See Also
|
|
96
|
-
|
|
97
|
-
- [name-types-camel](./name-types-camel.md) - Type naming conventions
|
|
98
|
-
- [name-funcs-snake](./name-funcs-snake.md) - Function naming conventions
|
|
99
|
-
- [name-consts-screaming](./name-consts-screaming.md) - Constant naming
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
# name-as-free
|
|
2
|
-
|
|
3
|
-
> `as_` prefix: free reference conversion
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Consistent naming helps users understand API cost. `as_` prefix signals a free (O(1), no allocation) conversion that returns a reference. This convention is used throughout the standard library.
|
|
8
|
-
|
|
9
|
-
## The Convention
|
|
10
|
-
|
|
11
|
-
| Prefix | Cost | Ownership | Example |
|
|
12
|
-
|--------|------|-----------|---------|
|
|
13
|
-
| `as_` | Free | `&T -> &U` | `str::as_bytes()` |
|
|
14
|
-
| `to_` | Expensive | `&T -> U` | `str::to_lowercase()` |
|
|
15
|
-
| `into_` | Variable | `T -> U` | `String::into_bytes()` |
|
|
16
|
-
|
|
17
|
-
## Examples
|
|
18
|
-
|
|
19
|
-
```rust
|
|
20
|
-
impl MyString {
|
|
21
|
-
// as_ - free reference conversion
|
|
22
|
-
pub fn as_str(&self) -> &str {
|
|
23
|
-
&self.inner
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
pub fn as_bytes(&self) -> &[u8] {
|
|
27
|
-
self.inner.as_bytes()
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
impl Wrapper<T> {
|
|
32
|
-
// as_ - returns reference to inner
|
|
33
|
-
pub fn as_inner(&self) -> &T {
|
|
34
|
-
&self.inner
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
pub fn as_inner_mut(&mut self) -> &mut T {
|
|
38
|
-
&mut self.inner
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
## Standard Library Examples
|
|
44
|
-
|
|
45
|
-
```rust
|
|
46
|
-
// String
|
|
47
|
-
let s = String::from("hello");
|
|
48
|
-
let bytes: &[u8] = s.as_bytes(); // Free, returns &[u8]
|
|
49
|
-
let str_ref: &str = s.as_str(); // Free, returns &str
|
|
50
|
-
|
|
51
|
-
// Vec
|
|
52
|
-
let v = vec![1, 2, 3];
|
|
53
|
-
let slice: &[i32] = v.as_slice(); // Free, returns &[i32]
|
|
54
|
-
|
|
55
|
-
// Path
|
|
56
|
-
let p = PathBuf::from("/home");
|
|
57
|
-
let path: &Path = p.as_path(); // Free, returns &Path
|
|
58
|
-
|
|
59
|
-
// OsString
|
|
60
|
-
let os = OsString::from("hello");
|
|
61
|
-
let os_str: &OsStr = os.as_os_str(); // Free, returns &OsStr
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
## Bad
|
|
65
|
-
|
|
66
|
-
```rust
|
|
67
|
-
impl MyType {
|
|
68
|
-
// BAD: as_ but allocates
|
|
69
|
-
pub fn as_string(&self) -> String {
|
|
70
|
-
format!("{}", self.value) // Allocates! Should be to_string()
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// BAD: as_ but expensive
|
|
74
|
-
pub fn as_processed(&self) -> &ProcessedData {
|
|
75
|
-
// Actually does expensive computation
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
## Good
|
|
81
|
-
|
|
82
|
-
```rust
|
|
83
|
-
impl MyType {
|
|
84
|
-
// GOOD: Free reference
|
|
85
|
-
pub fn as_str(&self) -> &str {
|
|
86
|
-
&self.inner
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// GOOD: to_ signals allocation
|
|
90
|
-
pub fn to_string(&self) -> String {
|
|
91
|
-
format!("{}", self.value)
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// GOOD: into_ signals ownership transfer
|
|
95
|
-
pub fn into_inner(self) -> Inner {
|
|
96
|
-
self.inner
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
## See Also
|
|
102
|
-
|
|
103
|
-
- [name-to-expensive](name-to-expensive.md) - `to_` prefix for expensive conversions
|
|
104
|
-
- [name-into-ownership](name-into-ownership.md) - `into_` prefix for ownership transfer
|
|
@@ -1,94 +0,0 @@
|
|
|
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
|
|
@@ -1,78 +0,0 @@
|
|
|
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
|
|
@@ -1,76 +0,0 @@
|
|
|
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
|
|
@@ -1,123 +0,0 @@
|
|
|
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
|
|
@@ -1,127 +0,0 @@
|
|
|
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
|