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,172 +0,0 @@
|
|
|
1
|
-
# async-try-join
|
|
2
|
-
|
|
3
|
-
> Use `try_join!` for concurrent fallible operations with early return on error
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
When running multiple fallible operations concurrently, `try_join!` returns `Err` as soon as any future fails, without waiting for the others. This provides fail-fast behavior while still running operations in parallel. For many operations, use `futures::future::try_join_all`.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
// Sequential - slow and no early return benefit
|
|
13
|
-
async fn fetch_all() -> Result<(A, B, C)> {
|
|
14
|
-
let a = fetch_a().await?; // If this fails, we wait for nothing
|
|
15
|
-
let b = fetch_b().await?; // But if this fails, we waited for A
|
|
16
|
-
let c = fetch_c().await?;
|
|
17
|
-
Ok((a, b, c))
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
// join! ignores errors
|
|
21
|
-
async fn fetch_all() -> (Result<A>, Result<B>, Result<C>) {
|
|
22
|
-
let (a, b, c) = join!(fetch_a(), fetch_b(), fetch_c());
|
|
23
|
-
// All complete even if first one failed
|
|
24
|
-
(a, b, c) // Now we have to handle three Results
|
|
25
|
-
}
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## Good
|
|
29
|
-
|
|
30
|
-
```rust
|
|
31
|
-
use tokio::try_join;
|
|
32
|
-
|
|
33
|
-
async fn fetch_all() -> Result<(A, B, C)> {
|
|
34
|
-
// Concurrent AND fail-fast
|
|
35
|
-
let (a, b, c) = try_join!(
|
|
36
|
-
fetch_a(),
|
|
37
|
-
fetch_b(),
|
|
38
|
-
fetch_c(),
|
|
39
|
-
)?;
|
|
40
|
-
|
|
41
|
-
Ok((a, b, c))
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// For dynamic collections
|
|
45
|
-
use futures::future::try_join_all;
|
|
46
|
-
|
|
47
|
-
async fn fetch_users(ids: &[u64]) -> Result<Vec<User>> {
|
|
48
|
-
let futures: Vec<_> = ids.iter()
|
|
49
|
-
.map(|id| fetch_user(*id))
|
|
50
|
-
.collect();
|
|
51
|
-
|
|
52
|
-
try_join_all(futures).await
|
|
53
|
-
}
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
## Error Handling Patterns
|
|
57
|
-
|
|
58
|
-
```rust
|
|
59
|
-
// Different error types - need common error type
|
|
60
|
-
async fn mixed_operations() -> Result<(A, B), Error> {
|
|
61
|
-
let (a, b) = try_join!(
|
|
62
|
-
fetch_a().map_err(Error::from), // Convert errors
|
|
63
|
-
fetch_b().map_err(Error::from),
|
|
64
|
-
)?;
|
|
65
|
-
Ok((a, b))
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// Collect all results, then handle errors
|
|
69
|
-
async fn all_or_nothing(ids: &[u64]) -> Result<Vec<User>> {
|
|
70
|
-
try_join_all(ids.iter().map(|id| fetch_user(*id))).await
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// Collect successes, log failures
|
|
74
|
-
async fn best_effort(ids: &[u64]) -> Vec<User> {
|
|
75
|
-
let results = futures::future::join_all(
|
|
76
|
-
ids.iter().map(|id| fetch_user(*id))
|
|
77
|
-
).await;
|
|
78
|
-
|
|
79
|
-
results.into_iter()
|
|
80
|
-
.filter_map(|r| match r {
|
|
81
|
-
Ok(user) => Some(user),
|
|
82
|
-
Err(e) => {
|
|
83
|
-
log::warn!("Failed to fetch user: {}", e);
|
|
84
|
-
None
|
|
85
|
-
}
|
|
86
|
-
})
|
|
87
|
-
.collect()
|
|
88
|
-
}
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
## Cancellation Behavior
|
|
92
|
-
|
|
93
|
-
```rust
|
|
94
|
-
// try_join! cancels remaining futures on error
|
|
95
|
-
async fn with_cancellation() -> Result<()> {
|
|
96
|
-
// If fetch_a() fails, fetch_b() and fetch_c() are dropped
|
|
97
|
-
// But "dropped" != "immediately stopped"
|
|
98
|
-
// They stop at their next .await point
|
|
99
|
-
|
|
100
|
-
try_join!(
|
|
101
|
-
async {
|
|
102
|
-
fetch_a().await?;
|
|
103
|
-
cleanup_a().await; // May not run if other future fails
|
|
104
|
-
Ok::<_, Error>(())
|
|
105
|
-
},
|
|
106
|
-
async {
|
|
107
|
-
fetch_b().await?;
|
|
108
|
-
cleanup_b().await; // May not run if other future fails
|
|
109
|
-
Ok::<_, Error>(())
|
|
110
|
-
},
|
|
111
|
-
)?;
|
|
112
|
-
|
|
113
|
-
Ok(())
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// For guaranteed cleanup, use Drop guards or explicit handling
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
## With Timeout
|
|
120
|
-
|
|
121
|
-
```rust
|
|
122
|
-
use tokio::time::{timeout, Duration};
|
|
123
|
-
|
|
124
|
-
async fn fetch_with_timeout() -> Result<(A, B)> {
|
|
125
|
-
timeout(
|
|
126
|
-
Duration::from_secs(10),
|
|
127
|
-
try_join!(fetch_a(), fetch_b())
|
|
128
|
-
)
|
|
129
|
-
.await
|
|
130
|
-
.map_err(|_| Error::Timeout)?
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
// Per-operation timeout
|
|
134
|
-
async fn individual_timeouts() -> Result<(A, B)> {
|
|
135
|
-
try_join!(
|
|
136
|
-
timeout(Duration::from_secs(5), fetch_a())
|
|
137
|
-
.map_err(|_| Error::Timeout)
|
|
138
|
-
.and_then(|r| async { r }),
|
|
139
|
-
timeout(Duration::from_secs(5), fetch_b())
|
|
140
|
-
.map_err(|_| Error::Timeout)
|
|
141
|
-
.and_then(|r| async { r }),
|
|
142
|
-
)
|
|
143
|
-
}
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
## try_join! vs FuturesUnordered
|
|
147
|
-
|
|
148
|
-
```rust
|
|
149
|
-
use futures::stream::{FuturesUnordered, StreamExt};
|
|
150
|
-
|
|
151
|
-
// try_join!: wait for all, fail fast
|
|
152
|
-
let (a, b, c) = try_join!(fa, fb, fc)?;
|
|
153
|
-
|
|
154
|
-
// FuturesUnordered: process as they complete
|
|
155
|
-
let mut futures = FuturesUnordered::new();
|
|
156
|
-
futures.push(fetch_a());
|
|
157
|
-
futures.push(fetch_b());
|
|
158
|
-
futures.push(fetch_c());
|
|
159
|
-
|
|
160
|
-
while let Some(result) = futures.next().await {
|
|
161
|
-
match result {
|
|
162
|
-
Ok(data) => process(data),
|
|
163
|
-
Err(e) => return Err(e), // Can fail fast manually
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
## See Also
|
|
169
|
-
|
|
170
|
-
- [async-join-parallel](./async-join-parallel.md) - Non-fallible concurrent futures
|
|
171
|
-
- [async-select-racing](./async-select-racing.md) - First-to-complete semantics
|
|
172
|
-
- [err-question-mark](./err-question-mark.md) - Error propagation
|
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
# async-watch-latest
|
|
2
|
-
|
|
3
|
-
> Use `watch` channel for sharing the latest value with multiple observers
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
`watch` is optimized for scenarios where receivers only care about the most recent value, not the history of changes. Unlike `broadcast`, slow receivers don't lag—they simply skip intermediate values. This is perfect for configuration, state, or status that should always reflect the current situation.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
// Using broadcast when only latest value matters
|
|
13
|
-
let (tx, _) = broadcast::channel::<Config>(100);
|
|
14
|
-
|
|
15
|
-
// Receivers might process stale configs if they're slow
|
|
16
|
-
// And they waste time processing intermediate values
|
|
17
|
-
|
|
18
|
-
// Using mpsc with buffered stale values
|
|
19
|
-
let (tx, mut rx) = mpsc::channel::<Status>(100);
|
|
20
|
-
// Receiver might process outdated statuses
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## Good
|
|
24
|
-
|
|
25
|
-
```rust
|
|
26
|
-
use tokio::sync::watch;
|
|
27
|
-
|
|
28
|
-
let (tx, rx) = watch::channel(Config::default());
|
|
29
|
-
|
|
30
|
-
// Multiple observers
|
|
31
|
-
let rx1 = rx.clone();
|
|
32
|
-
let rx2 = rx.clone();
|
|
33
|
-
|
|
34
|
-
// Observer 1: waits for changes
|
|
35
|
-
tokio::spawn(async move {
|
|
36
|
-
let mut rx = rx1;
|
|
37
|
-
while rx.changed().await.is_ok() {
|
|
38
|
-
let config = rx.borrow();
|
|
39
|
-
apply_config(&*config);
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
// Observer 2: also sees all changes
|
|
44
|
-
tokio::spawn(async move {
|
|
45
|
-
let mut rx = rx2;
|
|
46
|
-
while rx.changed().await.is_ok() {
|
|
47
|
-
let config = rx.borrow();
|
|
48
|
-
log_config_change(&*config);
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
// Update the value
|
|
53
|
-
tx.send(Config::new())?;
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
## watch Semantics
|
|
57
|
-
|
|
58
|
-
```rust
|
|
59
|
-
use tokio::sync::watch;
|
|
60
|
-
|
|
61
|
-
let (tx, mut rx) = watch::channel("initial");
|
|
62
|
-
|
|
63
|
-
// Immediate read - no waiting
|
|
64
|
-
assert_eq!(*rx.borrow(), "initial");
|
|
65
|
-
|
|
66
|
-
// Wait for change
|
|
67
|
-
tx.send("updated")?;
|
|
68
|
-
rx.changed().await?;
|
|
69
|
-
assert_eq!(*rx.borrow(), "updated");
|
|
70
|
-
|
|
71
|
-
// Multiple rapid updates - receiver sees latest
|
|
72
|
-
tx.send("v1")?;
|
|
73
|
-
tx.send("v2")?;
|
|
74
|
-
tx.send("v3")?;
|
|
75
|
-
rx.changed().await?;
|
|
76
|
-
assert_eq!(*rx.borrow(), "v3"); // Skipped v1, v2
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
## Configuration Reload Pattern
|
|
80
|
-
|
|
81
|
-
```rust
|
|
82
|
-
use tokio::sync::watch;
|
|
83
|
-
use std::sync::Arc;
|
|
84
|
-
|
|
85
|
-
struct AppConfig {
|
|
86
|
-
log_level: Level,
|
|
87
|
-
max_connections: usize,
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
async fn config_watcher(tx: watch::Sender<Arc<AppConfig>>) {
|
|
91
|
-
loop {
|
|
92
|
-
tokio::time::sleep(Duration::from_secs(60)).await;
|
|
93
|
-
|
|
94
|
-
if let Ok(new_config) = reload_config_from_disk() {
|
|
95
|
-
// Only notifies if value actually changed
|
|
96
|
-
tx.send_if_modified(|current| {
|
|
97
|
-
if *current != new_config {
|
|
98
|
-
*current = Arc::new(new_config);
|
|
99
|
-
true
|
|
100
|
-
} else {
|
|
101
|
-
false
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
async fn worker(mut config_rx: watch::Receiver<Arc<AppConfig>>) {
|
|
109
|
-
loop {
|
|
110
|
-
tokio::select! {
|
|
111
|
-
_ = config_rx.changed() => {
|
|
112
|
-
let config = config_rx.borrow().clone();
|
|
113
|
-
reconfigure(&config);
|
|
114
|
-
}
|
|
115
|
-
_ = do_work() => {}
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
## State Machine Updates
|
|
122
|
-
|
|
123
|
-
```rust
|
|
124
|
-
#[derive(Clone, PartialEq)]
|
|
125
|
-
enum ConnectionState {
|
|
126
|
-
Disconnected,
|
|
127
|
-
Connecting,
|
|
128
|
-
Connected,
|
|
129
|
-
Error(String),
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
struct Connection {
|
|
133
|
-
state_tx: watch::Sender<ConnectionState>,
|
|
134
|
-
state_rx: watch::Receiver<ConnectionState>,
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
impl Connection {
|
|
138
|
-
async fn wait_connected(&mut self) -> Result<(), Error> {
|
|
139
|
-
loop {
|
|
140
|
-
let state = self.state_rx.borrow().clone();
|
|
141
|
-
match state {
|
|
142
|
-
ConnectionState::Connected => return Ok(()),
|
|
143
|
-
ConnectionState::Error(e) => return Err(Error::Connection(e)),
|
|
144
|
-
_ => {
|
|
145
|
-
self.state_rx.changed().await?;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
## Borrow vs Clone
|
|
154
|
-
|
|
155
|
-
```rust
|
|
156
|
-
use tokio::sync::watch;
|
|
157
|
-
|
|
158
|
-
let (tx, rx) = watch::channel(vec![1, 2, 3]);
|
|
159
|
-
|
|
160
|
-
// borrow() returns Ref - must not hold across await
|
|
161
|
-
{
|
|
162
|
-
let data = rx.borrow();
|
|
163
|
-
println!("{:?}", *data);
|
|
164
|
-
} // Ref dropped here
|
|
165
|
-
|
|
166
|
-
// For use across await, clone the data
|
|
167
|
-
let data = rx.borrow().clone();
|
|
168
|
-
some_async_operation().await;
|
|
169
|
-
use_data(&data); // Safe
|
|
170
|
-
|
|
171
|
-
// Or use borrow_and_update() to mark as seen
|
|
172
|
-
let data = rx.borrow_and_update().clone();
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
## watch vs broadcast vs mpsc
|
|
176
|
-
|
|
177
|
-
| Feature | watch | broadcast | mpsc |
|
|
178
|
-
|---------|-------|-----------|------|
|
|
179
|
-
| Receivers | Multiple | Multiple | Single |
|
|
180
|
-
| Message delivery | Latest only | All messages | All messages |
|
|
181
|
-
| Slow receiver | Skips to latest | Lags/misses | Backpressure |
|
|
182
|
-
| Clone required | No | Yes | No |
|
|
183
|
-
| Best for | Config, status | Events | Work queues |
|
|
184
|
-
|
|
185
|
-
## See Also
|
|
186
|
-
|
|
187
|
-
- [async-broadcast-pubsub](./async-broadcast-pubsub.md) - When history matters
|
|
188
|
-
- [async-mpsc-queue](./async-mpsc-queue.md) - Work queue patterns
|
|
189
|
-
- [async-cancellation-token](./async-cancellation-token.md) - Related pattern
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
# doc-all-public
|
|
2
|
-
|
|
3
|
-
> Document all public items with `///` doc comments
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Public items define your crate's API contract. Without documentation, users must read source code to understand how to use your library. Well-documented APIs reduce support burden, improve adoption, and serve as the primary reference for users.
|
|
8
|
-
|
|
9
|
-
Rust's `cargo doc` generates beautiful HTML documentation from doc comments, but only if you write them.
|
|
10
|
-
|
|
11
|
-
## Bad
|
|
12
|
-
|
|
13
|
-
```rust
|
|
14
|
-
pub struct Config {
|
|
15
|
-
pub timeout: Duration,
|
|
16
|
-
pub retries: u32,
|
|
17
|
-
pub base_url: String,
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
pub fn connect(config: Config) -> Result<Connection, Error> {
|
|
21
|
-
// ...
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
pub enum Status {
|
|
25
|
-
Pending,
|
|
26
|
-
Active,
|
|
27
|
-
Failed,
|
|
28
|
-
}
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
## Good
|
|
32
|
-
|
|
33
|
-
```rust
|
|
34
|
-
/// Configuration for establishing a connection to the service.
|
|
35
|
-
///
|
|
36
|
-
/// # Examples
|
|
37
|
-
///
|
|
38
|
-
/// ```
|
|
39
|
-
/// use my_crate::Config;
|
|
40
|
-
/// use std::time::Duration;
|
|
41
|
-
///
|
|
42
|
-
/// let config = Config {
|
|
43
|
-
/// timeout: Duration::from_secs(30),
|
|
44
|
-
/// retries: 3,
|
|
45
|
-
/// base_url: "https://api.example.com".to_string(),
|
|
46
|
-
/// };
|
|
47
|
-
/// ```
|
|
48
|
-
pub struct Config {
|
|
49
|
-
/// Maximum time to wait for a response before timing out.
|
|
50
|
-
pub timeout: Duration,
|
|
51
|
-
|
|
52
|
-
/// Number of retry attempts for failed requests.
|
|
53
|
-
pub retries: u32,
|
|
54
|
-
|
|
55
|
-
/// Base URL for all API requests.
|
|
56
|
-
pub base_url: String,
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/// Establishes a connection using the provided configuration.
|
|
60
|
-
///
|
|
61
|
-
/// # Errors
|
|
62
|
-
///
|
|
63
|
-
/// Returns an error if the connection cannot be established
|
|
64
|
-
/// or if the configuration is invalid.
|
|
65
|
-
pub fn connect(config: Config) -> Result<Connection, Error> {
|
|
66
|
-
// ...
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/// Represents the current status of a job.
|
|
70
|
-
pub enum Status {
|
|
71
|
-
/// Job is waiting to be processed.
|
|
72
|
-
Pending,
|
|
73
|
-
/// Job is currently being processed.
|
|
74
|
-
Active,
|
|
75
|
-
/// Job has failed and will not be retried.
|
|
76
|
-
Failed,
|
|
77
|
-
}
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
## What to Document
|
|
81
|
-
|
|
82
|
-
| Item Type | Required Content |
|
|
83
|
-
|-----------|------------------|
|
|
84
|
-
| Structs | Purpose, usage example |
|
|
85
|
-
| Struct fields | What the field represents |
|
|
86
|
-
| Enums | When to use each variant |
|
|
87
|
-
| Enum variants | What state it represents |
|
|
88
|
-
| Functions | What it does, parameters, return value |
|
|
89
|
-
| Traits | Contract and expected behavior |
|
|
90
|
-
| Trait methods | Default implementation behavior |
|
|
91
|
-
| Type aliases | Why the alias exists |
|
|
92
|
-
| Constants | What the value represents |
|
|
93
|
-
|
|
94
|
-
## Enforcement
|
|
95
|
-
|
|
96
|
-
Enable the `missing_docs` lint to catch undocumented public items:
|
|
97
|
-
|
|
98
|
-
```rust
|
|
99
|
-
#![warn(missing_docs)]
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
Or in `Cargo.toml` for workspace-wide enforcement:
|
|
103
|
-
|
|
104
|
-
```toml
|
|
105
|
-
[workspace.lints.rust]
|
|
106
|
-
missing_docs = "warn"
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
## See Also
|
|
110
|
-
|
|
111
|
-
- [doc-module-inner](./doc-module-inner.md) - Module-level documentation
|
|
112
|
-
- [doc-examples-section](./doc-examples-section.md) - Adding examples
|
|
113
|
-
- [lint-missing-docs](./lint-missing-docs.md) - Enforcing documentation
|
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
# doc-cargo-metadata
|
|
2
|
-
|
|
3
|
-
> Fill `Cargo.toml` metadata for published crates
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Cargo.toml metadata appears on crates.io, in search results, and helps users evaluate your crate. Missing metadata makes your crate look unprofessional, harder to find, and harder to trust. Complete metadata improves discoverability and adoption.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```toml
|
|
12
|
-
[package]
|
|
13
|
-
name = "my-awesome-crate"
|
|
14
|
-
version = "0.1.0"
|
|
15
|
-
edition = "2021"
|
|
16
|
-
|
|
17
|
-
[dependencies]
|
|
18
|
-
# ...
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
## Good
|
|
22
|
-
|
|
23
|
-
```toml
|
|
24
|
-
[package]
|
|
25
|
-
name = "my-awesome-crate"
|
|
26
|
-
version = "0.1.0"
|
|
27
|
-
edition = "2021"
|
|
28
|
-
rust-version = "1.70"
|
|
29
|
-
|
|
30
|
-
# Required for crates.io
|
|
31
|
-
description = "A fast, ergonomic HTTP client for Rust"
|
|
32
|
-
license = "MIT OR Apache-2.0"
|
|
33
|
-
repository = "https://github.com/username/my-awesome-crate"
|
|
34
|
-
|
|
35
|
-
# Highly recommended
|
|
36
|
-
documentation = "https://docs.rs/my-awesome-crate"
|
|
37
|
-
readme = "README.md"
|
|
38
|
-
keywords = ["http", "client", "async", "networking"]
|
|
39
|
-
categories = ["network-programming", "web-programming::http-client"]
|
|
40
|
-
authors = ["Your Name <you@example.com>"]
|
|
41
|
-
homepage = "https://my-awesome-crate.dev"
|
|
42
|
-
|
|
43
|
-
# Optional but helpful
|
|
44
|
-
include = ["src/**/*", "Cargo.toml", "LICENSE*", "README.md"]
|
|
45
|
-
exclude = ["tests/fixtures/*", ".github/*"]
|
|
46
|
-
|
|
47
|
-
[badges]
|
|
48
|
-
maintenance = { status = "actively-developed" }
|
|
49
|
-
|
|
50
|
-
[dependencies]
|
|
51
|
-
# ...
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
## Required Fields for Publishing
|
|
55
|
-
|
|
56
|
-
| Field | Purpose |
|
|
57
|
-
|-------|---------|
|
|
58
|
-
| `name` | Crate name on crates.io |
|
|
59
|
-
| `version` | Semver version |
|
|
60
|
-
| `license` or `license-file` | SPDX license identifier |
|
|
61
|
-
| `description` | One-line summary (≤256 chars) |
|
|
62
|
-
|
|
63
|
-
## Recommended Fields
|
|
64
|
-
|
|
65
|
-
| Field | Purpose | Example |
|
|
66
|
-
|-------|---------|---------|
|
|
67
|
-
| `repository` | Link to source code | `https://github.com/user/repo` |
|
|
68
|
-
| `documentation` | Link to docs | `https://docs.rs/crate` |
|
|
69
|
-
| `readme` | Path to README | `README.md` |
|
|
70
|
-
| `keywords` | Search terms (max 5) | `["http", "async"]` |
|
|
71
|
-
| `categories` | crates.io categories | `["network-programming"]` |
|
|
72
|
-
| `rust-version` | MSRV | `"1.70"` |
|
|
73
|
-
|
|
74
|
-
## Keywords Best Practices
|
|
75
|
-
|
|
76
|
-
```toml
|
|
77
|
-
# Good: specific, searchable terms
|
|
78
|
-
keywords = ["json", "serialization", "serde", "parsing"]
|
|
79
|
-
|
|
80
|
-
# Bad: too generic or redundant
|
|
81
|
-
keywords = ["rust", "library", "awesome", "fast", "best"]
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
## Categories
|
|
85
|
-
|
|
86
|
-
Choose from [crates.io categories](https://crates.io/category_slugs):
|
|
87
|
-
|
|
88
|
-
```toml
|
|
89
|
-
categories = [
|
|
90
|
-
"network-programming",
|
|
91
|
-
"web-programming::http-client",
|
|
92
|
-
"asynchronous",
|
|
93
|
-
]
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
## License Patterns
|
|
97
|
-
|
|
98
|
-
```toml
|
|
99
|
-
# Single license
|
|
100
|
-
license = "MIT"
|
|
101
|
-
|
|
102
|
-
# Dual license (common in Rust ecosystem)
|
|
103
|
-
license = "MIT OR Apache-2.0"
|
|
104
|
-
|
|
105
|
-
# Custom license file
|
|
106
|
-
license-file = "LICENSE"
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
## Include/Exclude
|
|
110
|
-
|
|
111
|
-
Control what gets published:
|
|
112
|
-
|
|
113
|
-
```toml
|
|
114
|
-
# Explicit include (whitelist)
|
|
115
|
-
include = [
|
|
116
|
-
"src/**/*",
|
|
117
|
-
"Cargo.toml",
|
|
118
|
-
"LICENSE*",
|
|
119
|
-
"README.md",
|
|
120
|
-
"CHANGELOG.md",
|
|
121
|
-
]
|
|
122
|
-
|
|
123
|
-
# Or exclude (blacklist)
|
|
124
|
-
exclude = [
|
|
125
|
-
"tests/fixtures/large-file.bin",
|
|
126
|
-
".github/*",
|
|
127
|
-
"benches/*",
|
|
128
|
-
]
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
## Verification
|
|
132
|
-
|
|
133
|
-
Check your package before publishing:
|
|
134
|
-
|
|
135
|
-
```bash
|
|
136
|
-
# See what will be included
|
|
137
|
-
cargo package --list
|
|
138
|
-
|
|
139
|
-
# Check metadata
|
|
140
|
-
cargo publish --dry-run
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
## See Also
|
|
144
|
-
|
|
145
|
-
- [doc-module-inner](./doc-module-inner.md) - Crate-level documentation
|
|
146
|
-
- [lint-cargo-metadata](./lint-cargo-metadata.md) - Linting Cargo.toml
|
|
147
|
-
- [proj-workspace-deps](./proj-workspace-deps.md) - Workspace management
|