agy-superpowers 5.2.2 → 5.2.4
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/CLAUDE.md +80 -0
- package/template/agent/rules/code-styles.md +31 -32
- package/template/agent/rules/debug-confirmation-policy.md +2 -0
- package/template/agent/rules/file-length-policy.md +2 -0
- package/template/agent/rules/git-policy.md +7 -0
- package/template/agent/rules/language-matching.md +2 -0
- package/template/agent/rules/scratch-scripts.md +39 -0
- package/template/agent/rules/superpowers.md +8 -51
- package/template/agent/skills/executing-plans/SKILL.md +17 -0
- package/template/agent/skills/systematic-debugging/SKILL.md +16 -0
- package/template/agent/skills/test-driven-development/SKILL.md +16 -0
- package/template/agent/skills/verification-before-completion/SKILL.md +22 -0
- package/template/agent/skills/writing-plans/SKILL.md +16 -0
- 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,154 +0,0 @@
|
|
|
1
|
-
# lint-missing-docs
|
|
2
|
-
|
|
3
|
-
> Warn on missing documentation for public items
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
The `missing_docs` lint ensures all public API items are documented. For libraries, documentation IS the user interface. Missing docs mean users can't understand your API without reading source code.
|
|
8
|
-
|
|
9
|
-
## Configuration
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
// In lib.rs
|
|
13
|
-
#![warn(missing_docs)]
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
Or in `Cargo.toml`:
|
|
17
|
-
|
|
18
|
-
```toml
|
|
19
|
-
[lints.rust]
|
|
20
|
-
missing_docs = "warn"
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
For strict enforcement:
|
|
24
|
-
|
|
25
|
-
```rust
|
|
26
|
-
#![deny(missing_docs)]
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
## What It Catches
|
|
30
|
-
|
|
31
|
-
```rust
|
|
32
|
-
#![warn(missing_docs)]
|
|
33
|
-
|
|
34
|
-
pub struct User { // WARN: missing documentation for a struct
|
|
35
|
-
pub name: String, // WARN: missing documentation for a field
|
|
36
|
-
pub age: u32, // WARN: missing documentation for a field
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
pub fn process() { } // WARN: missing documentation for a function
|
|
40
|
-
|
|
41
|
-
pub trait Handler { // WARN: missing documentation for a trait
|
|
42
|
-
fn handle(&self); // WARN: missing documentation for a method
|
|
43
|
-
}
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
## Good
|
|
47
|
-
|
|
48
|
-
```rust
|
|
49
|
-
#![warn(missing_docs)]
|
|
50
|
-
|
|
51
|
-
//! User management module.
|
|
52
|
-
|
|
53
|
-
/// Represents a registered user in the system.
|
|
54
|
-
pub struct User {
|
|
55
|
-
/// The user's display name.
|
|
56
|
-
pub name: String,
|
|
57
|
-
/// The user's age in years.
|
|
58
|
-
pub age: u32,
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/// Processes pending user requests.
|
|
62
|
-
///
|
|
63
|
-
/// # Examples
|
|
64
|
-
///
|
|
65
|
-
/// ```
|
|
66
|
-
/// process();
|
|
67
|
-
/// ```
|
|
68
|
-
pub fn process() { }
|
|
69
|
-
|
|
70
|
-
/// Handler trait for request processing.
|
|
71
|
-
pub trait Handler {
|
|
72
|
-
/// Handle an incoming request.
|
|
73
|
-
fn handle(&self);
|
|
74
|
-
}
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
## Private Items
|
|
78
|
-
|
|
79
|
-
`missing_docs` only applies to `pub` items. Private items don't trigger warnings:
|
|
80
|
-
|
|
81
|
-
```rust
|
|
82
|
-
#![warn(missing_docs)]
|
|
83
|
-
|
|
84
|
-
struct Internal { } // No warning - private
|
|
85
|
-
|
|
86
|
-
pub struct Public { } // WARN - public, needs docs
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
## Allow for Specific Items
|
|
90
|
-
|
|
91
|
-
```rust
|
|
92
|
-
#![warn(missing_docs)]
|
|
93
|
-
|
|
94
|
-
/// Documented module.
|
|
95
|
-
pub mod api {
|
|
96
|
-
/// Documented struct.
|
|
97
|
-
pub struct Config { }
|
|
98
|
-
|
|
99
|
-
#[allow(missing_docs)]
|
|
100
|
-
pub mod internal {
|
|
101
|
-
// Internal API, docs not required
|
|
102
|
-
pub struct Helper { }
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
## Gradual Adoption
|
|
108
|
-
|
|
109
|
-
For existing codebases, start with `warn` and fix incrementally:
|
|
110
|
-
|
|
111
|
-
```rust
|
|
112
|
-
// Phase 1: Warn, fix critical items
|
|
113
|
-
#![warn(missing_docs)]
|
|
114
|
-
|
|
115
|
-
// Phase 2: After cleanup, deny
|
|
116
|
-
#![deny(missing_docs)]
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
## Combining with doc Attributes
|
|
120
|
-
|
|
121
|
-
```rust
|
|
122
|
-
#![warn(missing_docs)]
|
|
123
|
-
#![warn(rustdoc::broken_intra_doc_links)]
|
|
124
|
-
#![warn(rustdoc::private_intra_doc_links)]
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
## Workspace Configuration
|
|
128
|
-
|
|
129
|
-
```toml
|
|
130
|
-
# In workspace Cargo.toml
|
|
131
|
-
[workspace.lints.rust]
|
|
132
|
-
missing_docs = "warn"
|
|
133
|
-
|
|
134
|
-
# Member crates inherit
|
|
135
|
-
[lints]
|
|
136
|
-
workspace = true
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
## What to Document
|
|
140
|
-
|
|
141
|
-
| Item | Doc Focus |
|
|
142
|
-
|------|-----------|
|
|
143
|
-
| Structs | Purpose, usage example |
|
|
144
|
-
| Struct fields | What it represents |
|
|
145
|
-
| Enums | When to use each variant |
|
|
146
|
-
| Functions | What it does, params, return |
|
|
147
|
-
| Traits | Contract and expectations |
|
|
148
|
-
| Modules | What the module provides |
|
|
149
|
-
|
|
150
|
-
## See Also
|
|
151
|
-
|
|
152
|
-
- [doc-all-public](./doc-all-public.md) - Documentation patterns
|
|
153
|
-
- [lint-unsafe-doc](./lint-unsafe-doc.md) - Unsafe documentation
|
|
154
|
-
- [doc-examples-section](./doc-examples-section.md) - Adding examples
|
package/template/agent/skills/rust-developer/references/rust-rules/lint-pedantic-selective.md
DELETED
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
# lint-pedantic-selective
|
|
2
|
-
|
|
3
|
-
> Enable clippy::pedantic selectively
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
The `clippy::pedantic` group contains opinionated lints that aren't universally applicable. Enabling it wholesale produces noise; selectively enabling useful pedantic lints improves code quality without false positives.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
// Too noisy - will fight you constantly
|
|
13
|
-
#![warn(clippy::pedantic)]
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
## Good
|
|
17
|
-
|
|
18
|
-
```toml
|
|
19
|
-
# Cargo.toml - cherry-pick useful pedantic lints
|
|
20
|
-
[lints.clippy]
|
|
21
|
-
# Enable pedantic as baseline
|
|
22
|
-
pedantic = "warn"
|
|
23
|
-
|
|
24
|
-
# Disable noisy ones
|
|
25
|
-
missing_errors_doc = "allow" # Document errors separately
|
|
26
|
-
missing_panics_doc = "allow" # Document panics separately
|
|
27
|
-
module_name_repetitions = "allow" # Allow Foo::FooError pattern
|
|
28
|
-
too_many_lines = "allow" # Function length varies
|
|
29
|
-
must_use_candidate = "allow" # Too many suggestions
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
## Recommended Pedantic Lints
|
|
33
|
-
|
|
34
|
-
| Lint | Why Enable |
|
|
35
|
-
|------|-----------|
|
|
36
|
-
| `doc_markdown` | Catch unmarked code in docs |
|
|
37
|
-
| `match_wildcard_for_single_variants` | Explicit variant matching |
|
|
38
|
-
| `semicolon_if_nothing_returned` | Consistent semicolons |
|
|
39
|
-
| `string_add_assign` | Use `+=` for string concatenation |
|
|
40
|
-
| `unnested_or_patterns` | Simplify match patterns |
|
|
41
|
-
| `unused_self` | Catch methods that should be functions |
|
|
42
|
-
| `used_underscore_binding` | Warn on using `_var` |
|
|
43
|
-
| `wildcard_imports` | Avoid glob imports |
|
|
44
|
-
|
|
45
|
-
## Often Disabled
|
|
46
|
-
|
|
47
|
-
| Lint | Why Disable |
|
|
48
|
-
|------|-------------|
|
|
49
|
-
| `missing_errors_doc` | Handle with `#[doc]` policy |
|
|
50
|
-
| `missing_panics_doc` | Handle with `#[doc]` policy |
|
|
51
|
-
| `module_name_repetitions` | Sometimes intentional |
|
|
52
|
-
| `must_use_candidate` | Too aggressive |
|
|
53
|
-
| `too_many_lines` | Arbitrary threshold |
|
|
54
|
-
| `struct_excessive_bools` | Valid for config structs |
|
|
55
|
-
|
|
56
|
-
## Full Configuration
|
|
57
|
-
|
|
58
|
-
```toml
|
|
59
|
-
# Cargo.toml
|
|
60
|
-
[lints.clippy]
|
|
61
|
-
# Start with pedantic
|
|
62
|
-
pedantic = "warn"
|
|
63
|
-
|
|
64
|
-
# Keep these
|
|
65
|
-
doc_markdown = "warn"
|
|
66
|
-
match_wildcard_for_single_variants = "warn"
|
|
67
|
-
semicolon_if_nothing_returned = "warn"
|
|
68
|
-
unused_self = "warn"
|
|
69
|
-
wildcard_imports = "warn"
|
|
70
|
-
|
|
71
|
-
# Disable these
|
|
72
|
-
missing_errors_doc = "allow"
|
|
73
|
-
missing_panics_doc = "allow"
|
|
74
|
-
module_name_repetitions = "allow"
|
|
75
|
-
must_use_candidate = "allow"
|
|
76
|
-
too_many_lines = "allow"
|
|
77
|
-
similar_names = "allow"
|
|
78
|
-
struct_excessive_bools = "allow"
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
## Alternative: Explicit Opt-in
|
|
82
|
-
|
|
83
|
-
```toml
|
|
84
|
-
# Only enable specific lints, not the group
|
|
85
|
-
[lints.clippy]
|
|
86
|
-
# From pedantic, only these:
|
|
87
|
-
doc_markdown = "warn"
|
|
88
|
-
semicolon_if_nothing_returned = "warn"
|
|
89
|
-
unused_self = "warn"
|
|
90
|
-
wildcard_imports = "warn"
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
## Module-Level Overrides
|
|
94
|
-
|
|
95
|
-
```rust
|
|
96
|
-
// Allow specific lint for a module
|
|
97
|
-
#![allow(clippy::module_name_repetitions)]
|
|
98
|
-
|
|
99
|
-
// Or for specific items
|
|
100
|
-
#[allow(clippy::too_many_arguments)]
|
|
101
|
-
fn complex_function(/* many args */) { }
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
## Team Consensus
|
|
105
|
-
|
|
106
|
-
Pedantic lints are style choices. Agree as a team:
|
|
107
|
-
|
|
108
|
-
1. Enable `pedantic` as baseline
|
|
109
|
-
2. Run `cargo clippy` on codebase
|
|
110
|
-
3. Discuss each warning category
|
|
111
|
-
4. Disable ones that don't fit your style
|
|
112
|
-
5. Document decisions in `clippy.toml`
|
|
113
|
-
|
|
114
|
-
## See Also
|
|
115
|
-
|
|
116
|
-
- [lint-warn-style](./lint-warn-style.md) - Style warnings
|
|
117
|
-
- [lint-warn-complexity](./lint-warn-complexity.md) - Complexity warnings
|
|
118
|
-
- [lint-deny-correctness](./lint-deny-correctness.md) - Correctness lints
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
# lint-rustfmt-check
|
|
2
|
-
|
|
3
|
-
> Run cargo fmt --check in CI
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Consistent formatting eliminates style debates and makes diffs cleaner. Running `cargo fmt --check` in CI ensures all code follows the same format. This catches formatting issues before merge, not after.
|
|
8
|
-
|
|
9
|
-
## CI Configuration
|
|
10
|
-
|
|
11
|
-
### GitHub Actions
|
|
12
|
-
|
|
13
|
-
```yaml
|
|
14
|
-
name: CI
|
|
15
|
-
|
|
16
|
-
on: [push, pull_request]
|
|
17
|
-
|
|
18
|
-
jobs:
|
|
19
|
-
fmt:
|
|
20
|
-
runs-on: ubuntu-latest
|
|
21
|
-
steps:
|
|
22
|
-
- uses: actions/checkout@v4
|
|
23
|
-
- uses: dtolnay/rust-toolchain@stable
|
|
24
|
-
with:
|
|
25
|
-
components: rustfmt
|
|
26
|
-
- run: cargo fmt --all --check
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
### GitLab CI
|
|
30
|
-
|
|
31
|
-
```yaml
|
|
32
|
-
fmt:
|
|
33
|
-
image: rust:latest
|
|
34
|
-
script:
|
|
35
|
-
- rustup component add rustfmt
|
|
36
|
-
- cargo fmt --all --check
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
### Pre-commit Hook
|
|
40
|
-
|
|
41
|
-
```bash
|
|
42
|
-
#!/bin/sh
|
|
43
|
-
# .git/hooks/pre-commit
|
|
44
|
-
cargo fmt --all --check
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
## Configuration
|
|
48
|
-
|
|
49
|
-
Create `rustfmt.toml` for custom settings:
|
|
50
|
-
|
|
51
|
-
```toml
|
|
52
|
-
# rustfmt.toml
|
|
53
|
-
edition = "2021"
|
|
54
|
-
max_width = 100
|
|
55
|
-
use_small_heuristics = "Max"
|
|
56
|
-
imports_granularity = "Module"
|
|
57
|
-
group_imports = "StdExternalCrate"
|
|
58
|
-
reorder_imports = true
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
## Common Options
|
|
62
|
-
|
|
63
|
-
| Option | Default | Description |
|
|
64
|
-
|--------|---------|-------------|
|
|
65
|
-
| `max_width` | 100 | Maximum line width |
|
|
66
|
-
| `tab_spaces` | 4 | Spaces per indent |
|
|
67
|
-
| `edition` | "2015" | Rust edition |
|
|
68
|
-
| `use_small_heuristics` | "Default" | Layout heuristics |
|
|
69
|
-
| `imports_granularity` | "Preserve" | Import grouping |
|
|
70
|
-
| `group_imports` | "Preserve" | Import ordering |
|
|
71
|
-
|
|
72
|
-
## Running Locally
|
|
73
|
-
|
|
74
|
-
```bash
|
|
75
|
-
# Check formatting (doesn't modify files)
|
|
76
|
-
cargo fmt --all --check
|
|
77
|
-
|
|
78
|
-
# Apply formatting
|
|
79
|
-
cargo fmt --all
|
|
80
|
-
|
|
81
|
-
# Format specific file
|
|
82
|
-
cargo fmt -- src/main.rs
|
|
83
|
-
|
|
84
|
-
# Check with verbose output
|
|
85
|
-
cargo fmt --all --check -- --verbose
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
## Workspace Formatting
|
|
89
|
-
|
|
90
|
-
```bash
|
|
91
|
-
# Format all workspace members
|
|
92
|
-
cargo fmt --all
|
|
93
|
-
|
|
94
|
-
# Format specific package
|
|
95
|
-
cargo fmt -p my-package
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
## Ignoring Files
|
|
99
|
-
|
|
100
|
-
In `rustfmt.toml`:
|
|
101
|
-
|
|
102
|
-
```toml
|
|
103
|
-
# Skip generated files
|
|
104
|
-
ignore = [
|
|
105
|
-
"src/generated/*",
|
|
106
|
-
"build.rs",
|
|
107
|
-
]
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
Or in code:
|
|
111
|
-
|
|
112
|
-
```rust
|
|
113
|
-
#[rustfmt::skip]
|
|
114
|
-
mod generated_code;
|
|
115
|
-
|
|
116
|
-
#[rustfmt::skip]
|
|
117
|
-
const MATRIX: [[i32; 4]; 4] = [
|
|
118
|
-
[1, 0, 0, 0],
|
|
119
|
-
[0, 1, 0, 0],
|
|
120
|
-
[0, 0, 1, 0],
|
|
121
|
-
[0, 0, 0, 1],
|
|
122
|
-
];
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
## Nightly Features
|
|
126
|
-
|
|
127
|
-
Some options require nightly:
|
|
128
|
-
|
|
129
|
-
```toml
|
|
130
|
-
# rustfmt.toml (nightly only)
|
|
131
|
-
unstable_features = true
|
|
132
|
-
imports_granularity = "Crate"
|
|
133
|
-
wrap_comments = true
|
|
134
|
-
format_code_in_doc_comments = true
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
```bash
|
|
138
|
-
# Use nightly rustfmt
|
|
139
|
-
cargo +nightly fmt
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
## IDE Integration
|
|
143
|
-
|
|
144
|
-
Most IDEs format on save. Configure to use project `rustfmt.toml`:
|
|
145
|
-
|
|
146
|
-
```json
|
|
147
|
-
// VS Code settings.json
|
|
148
|
-
{
|
|
149
|
-
"rust-analyzer.rustfmt.extraArgs": ["--config-path", "./rustfmt.toml"]
|
|
150
|
-
}
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
## See Also
|
|
154
|
-
|
|
155
|
-
- [lint-warn-style](./lint-warn-style.md) - Style lints
|
|
156
|
-
- [lint-pedantic-selective](./lint-pedantic-selective.md) - Pedantic lints
|
|
157
|
-
- [name-funcs-snake](./name-funcs-snake.md) - Naming conventions
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
# lint-unsafe-doc
|
|
2
|
-
|
|
3
|
-
> Require documentation for unsafe blocks
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
The `undocumented_unsafe_blocks` lint ensures every unsafe block has a `// SAFETY:` comment explaining why the operation is sound. Unsafe code is the source of most memory safety bugs—documenting invariants catches mistakes and helps reviewers.
|
|
8
|
-
|
|
9
|
-
## Configuration
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
#![warn(clippy::undocumented_unsafe_blocks)]
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
Or in `Cargo.toml`:
|
|
16
|
-
|
|
17
|
-
```toml
|
|
18
|
-
[lints.clippy]
|
|
19
|
-
undocumented_unsafe_blocks = "warn"
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
For strict enforcement:
|
|
23
|
-
|
|
24
|
-
```toml
|
|
25
|
-
[lints.clippy]
|
|
26
|
-
undocumented_unsafe_blocks = "deny"
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
## Bad
|
|
30
|
-
|
|
31
|
-
```rust
|
|
32
|
-
pub fn read_data(ptr: *const u8, len: usize) -> &[u8] {
|
|
33
|
-
unsafe {
|
|
34
|
-
std::slice::from_raw_parts(ptr, len) // WARN: undocumented
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
impl Buffer {
|
|
39
|
-
pub fn get_unchecked(&self, index: usize) -> &u8 {
|
|
40
|
-
unsafe { self.data.get_unchecked(index) } // WARN
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
## Good
|
|
46
|
-
|
|
47
|
-
```rust
|
|
48
|
-
pub fn read_data(ptr: *const u8, len: usize) -> &[u8] {
|
|
49
|
-
// SAFETY: Caller guarantees:
|
|
50
|
-
// - ptr is valid for reads of len bytes
|
|
51
|
-
// - ptr is properly aligned for u8
|
|
52
|
-
// - the memory is initialized
|
|
53
|
-
// - no mutable references exist to this memory
|
|
54
|
-
unsafe {
|
|
55
|
-
std::slice::from_raw_parts(ptr, len)
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
impl Buffer {
|
|
60
|
-
pub fn get_unchecked(&self, index: usize) -> &u8 {
|
|
61
|
-
debug_assert!(index < self.len(), "index out of bounds");
|
|
62
|
-
// SAFETY: We verified index < len in debug builds.
|
|
63
|
-
// Callers must ensure index is within bounds.
|
|
64
|
-
unsafe { self.data.get_unchecked(index) }
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
## SAFETY Comment Format
|
|
70
|
-
|
|
71
|
-
```rust
|
|
72
|
-
// SAFETY: <explanation of why this is sound>
|
|
73
|
-
unsafe {
|
|
74
|
-
// ...
|
|
75
|
-
}
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
The comment should explain:
|
|
79
|
-
1. **What invariants are upheld** - preconditions that make this safe
|
|
80
|
-
2. **Why the invariants hold** - how you know they're satisfied
|
|
81
|
-
3. **What could go wrong** - if invariants are violated
|
|
82
|
-
|
|
83
|
-
## Examples by Category
|
|
84
|
-
|
|
85
|
-
### Pointer Operations
|
|
86
|
-
|
|
87
|
-
```rust
|
|
88
|
-
// SAFETY: ptr was obtained from Box::into_raw, so it's valid
|
|
89
|
-
// and properly aligned. We're taking back ownership.
|
|
90
|
-
let boxed = unsafe { Box::from_raw(ptr) };
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
### Unchecked Operations
|
|
94
|
-
|
|
95
|
-
```rust
|
|
96
|
-
// SAFETY: We just checked that i < self.len() above.
|
|
97
|
-
// The bounds check cannot be elided by the optimizer
|
|
98
|
-
// because len() is not inlined.
|
|
99
|
-
unsafe { self.data.get_unchecked(i) }
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
### FFI Calls
|
|
103
|
-
|
|
104
|
-
```rust
|
|
105
|
-
// SAFETY: libc::getenv is safe to call with a null-terminated
|
|
106
|
-
// string. We ensure null termination with CString::new.
|
|
107
|
-
// The returned pointer is valid for the lifetime of the environment.
|
|
108
|
-
let value = unsafe { libc::getenv(key.as_ptr()) };
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
### Trait Implementations
|
|
112
|
-
|
|
113
|
-
```rust
|
|
114
|
-
// SAFETY: MyType contains no pointers or interior mutability,
|
|
115
|
-
// and all bit patterns are valid MyType values.
|
|
116
|
-
unsafe impl Send for MyType {}
|
|
117
|
-
unsafe impl Sync for MyType {}
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
## Related Lints
|
|
121
|
-
|
|
122
|
-
```toml
|
|
123
|
-
[lints.clippy]
|
|
124
|
-
undocumented_unsafe_blocks = "warn"
|
|
125
|
-
# Also consider:
|
|
126
|
-
multiple_unsafe_ops_per_block = "warn" # One operation per block
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
## See Also
|
|
130
|
-
|
|
131
|
-
- [doc-safety-section](./doc-safety-section.md) - `# Safety` in docs
|
|
132
|
-
- [lint-deny-correctness](./lint-deny-correctness.md) - Correctness lints
|
|
133
|
-
- [type-repr-transparent](./type-repr-transparent.md) - FFI safety
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
# lint-warn-complexity
|
|
2
|
-
|
|
3
|
-
> Enable clippy::complexity for simpler code
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
The `clippy::complexity` lint group identifies unnecessarily complex code that can be simplified. Complex code is harder to read, maintain, and often hides bugs. Clippy suggests cleaner alternatives.
|
|
8
|
-
|
|
9
|
-
## Configuration
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
// In lib.rs or main.rs
|
|
13
|
-
#![warn(clippy::complexity)]
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
Or in `Cargo.toml`:
|
|
17
|
-
|
|
18
|
-
```toml
|
|
19
|
-
[lints.clippy]
|
|
20
|
-
complexity = "warn"
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## What It Catches
|
|
24
|
-
|
|
25
|
-
### Unnecessary Complexity
|
|
26
|
-
|
|
27
|
-
```rust
|
|
28
|
-
// WARN: Overly complex boolean expression
|
|
29
|
-
if !(x == 0) { } // Use: if x != 0 { }
|
|
30
|
-
|
|
31
|
-
// WARN: Manual implementation of Option::map
|
|
32
|
-
match option {
|
|
33
|
-
Some(x) => Some(x + 1),
|
|
34
|
-
None => None,
|
|
35
|
-
} // Use: option.map(|x| x + 1)
|
|
36
|
-
|
|
37
|
-
// WARN: Unnecessary filter before count
|
|
38
|
-
iter.filter(|x| predicate(x)).count() // Could simplify if only counting
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
### Redundant Operations
|
|
42
|
-
|
|
43
|
-
```rust
|
|
44
|
-
// WARN: Redundant allocation
|
|
45
|
-
let s = format!("literal"); // Use: "literal".to_string() or just "literal"
|
|
46
|
-
|
|
47
|
-
// WARN: Unnecessarily complicated match
|
|
48
|
-
match result {
|
|
49
|
-
Ok(ok) => Ok(ok),
|
|
50
|
-
Err(err) => Err(err),
|
|
51
|
-
} // Just use: result
|
|
52
|
-
|
|
53
|
-
// WARN: Box::new in return position
|
|
54
|
-
fn make_error() -> Box<dyn Error> {
|
|
55
|
-
Box::new(MyError) // Could use: MyError.into()
|
|
56
|
-
}
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
### Overly Verbose Code
|
|
60
|
-
|
|
61
|
-
```rust
|
|
62
|
-
// WARN: bind_instead_of_map
|
|
63
|
-
option.and_then(|x| Some(x + 1)) // Use: option.map(|x| x + 1)
|
|
64
|
-
|
|
65
|
-
// WARN: clone_on_copy
|
|
66
|
-
let y = x.clone(); // Where x is Copy type, just use: let y = x;
|
|
67
|
-
|
|
68
|
-
// WARN: useless_let_if_seq
|
|
69
|
-
let result;
|
|
70
|
-
if condition {
|
|
71
|
-
result = 1;
|
|
72
|
-
} else {
|
|
73
|
-
result = 2;
|
|
74
|
-
}
|
|
75
|
-
// Use: let result = if condition { 1 } else { 2 };
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
## Notable Lints in This Group
|
|
79
|
-
|
|
80
|
-
| Lint | Simplification |
|
|
81
|
-
|------|---------------|
|
|
82
|
-
| `bind_instead_of_map` | Use `map` instead of `and_then(Some(...))` |
|
|
83
|
-
| `bool_comparison` | `if x == true` → `if x` |
|
|
84
|
-
| `clone_on_copy` | Remove `.clone()` for Copy types |
|
|
85
|
-
| `filter_next` | Use `.find()` instead |
|
|
86
|
-
| `option_map_unit_fn` | Use `if let` instead |
|
|
87
|
-
| `search_is_some` | Use `.any()` or `.contains()` |
|
|
88
|
-
| `unnecessary_cast` | Remove redundant casts |
|
|
89
|
-
| `useless_conversion` | Remove `.into()` when types match |
|
|
90
|
-
|
|
91
|
-
## Examples
|
|
92
|
-
|
|
93
|
-
```rust
|
|
94
|
-
// Before (complexity warnings)
|
|
95
|
-
fn find_positive(nums: &[i32]) -> Option<i32> {
|
|
96
|
-
let filtered: Vec<_> = nums.iter()
|
|
97
|
-
.cloned()
|
|
98
|
-
.filter(|x| *x > 0)
|
|
99
|
-
.collect();
|
|
100
|
-
if filtered.len() == 0 {
|
|
101
|
-
None
|
|
102
|
-
} else {
|
|
103
|
-
Some(filtered[0])
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// After (simplified)
|
|
108
|
-
fn find_positive(nums: &[i32]) -> Option<i32> {
|
|
109
|
-
nums.iter()
|
|
110
|
-
.copied()
|
|
111
|
-
.find(|&x| x > 0)
|
|
112
|
-
}
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
## Cognitive Load
|
|
116
|
-
|
|
117
|
-
Complex code isn't just longer—it's harder to understand:
|
|
118
|
-
|
|
119
|
-
```rust
|
|
120
|
-
// High cognitive load
|
|
121
|
-
let value = if x.is_some() { x.unwrap() } else { y.unwrap_or(z) };
|
|
122
|
-
|
|
123
|
-
// Lower cognitive load
|
|
124
|
-
let value = x.unwrap_or_else(|| y.unwrap_or(z));
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
## See Also
|
|
128
|
-
|
|
129
|
-
- [lint-warn-style](./lint-warn-style.md) - Style warnings
|
|
130
|
-
- [lint-warn-perf](./lint-warn-perf.md) - Performance warnings
|
|
131
|
-
- [lint-pedantic-selective](./lint-pedantic-selective.md) - Pedantic lints
|