[INFO] cloning repository https://github.com/kobe4cn/badge [INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/kobe4cn/badge" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fkobe4cn%2Fbadge", kill_on_drop: false }` [INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fkobe4cn%2Fbadge'... [INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }` [INFO] [stdout] c4925892d9c23a535976f62f7413280ca9709676 [INFO] linting kobe4cn/badge against nightly for clippy-nonminimal_bool-denied [INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fkobe4cn%2Fbadge" "/workspace/builds/worker-3-tc1/source", kill_on_drop: false }` [INFO] [stderr] Cloning into '/workspace/builds/worker-3-tc1/source'... [INFO] [stderr] done. [INFO] removed /workspace/builds/worker-3-tc1/source/.cargo/config.toml [INFO] removed /workspace/builds/worker-3-tc1/source/rust-toolchain.toml [INFO] started tweaking git repo https://github.com/kobe4cn/badge [INFO] removed 0 missing tests [INFO] finished tweaking git repo https://github.com/kobe4cn/badge [INFO] tweaked toml for git repo https://github.com/kobe4cn/badge written to /workspace/builds/worker-3-tc1/source/Cargo.toml [INFO] validating manifest of git repo https://github.com/kobe4cn/badge on toolchain nightly [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+nightly" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }` [INFO] crate git repo https://github.com/kobe4cn/badge already has a lockfile, it will not be regenerated [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+nightly" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] [stderr] Updating crates.io index [INFO] [stderr] Downloading crates ... [INFO] [stderr] Downloaded criterion-plot v0.8.1 [INFO] [stderr] Downloaded alloca v0.4.0 [INFO] [stderr] Downloaded mockall_derive v0.14.0 [INFO] [stderr] Downloaded validator_derive v0.20.0 [INFO] [stderr] Downloaded dummy v0.11.0 [INFO] [stderr] Downloaded bcrypt v0.17.1 [INFO] [stderr] Downloaded validator v0.20.0 [INFO] [stderr] Downloaded mockall v0.14.0 [INFO] [stderr] Downloaded tonic-build v0.14.3 [INFO] [stderr] Downloaded notify-types v2.1.0 [INFO] [stderr] Downloaded opentelemetry-http v0.31.0 [INFO] [stderr] Downloaded arcstr v1.2.0 [INFO] [stderr] Downloaded axum-extra v0.12.5 [INFO] [stderr] Downloaded arc-swap v1.8.2 [INFO] [stderr] Downloaded tracing-opentelemetry v0.32.1 [INFO] [stderr] Downloaded tonic v0.14.3 [INFO] [stderr] Downloaded fake v4.4.0 [INFO] [stderr] Downloaded rdkafka v0.39.0 [INFO] [stderr] Downloaded criterion v0.8.1 [INFO] [stderr] Downloaded opentelemetry-semantic-conventions v0.31.0 [INFO] [stderr] Downloaded opentelemetry v0.31.0 [INFO] [stderr] Downloaded metrics-exporter-prometheus v0.18.1 [INFO] [stderr] Downloaded opentelemetry-proto v0.31.0 [INFO] [stderr] Downloaded opentelemetry_sdk v0.31.0 [INFO] [stderr] Downloaded opentelemetry-otlp v0.31.0 [INFO] [stderr] Downloaded redis v1.0.3 [INFO] [stderr] Downloaded tonic-prost-build v0.14.3 [INFO] [stderr] Downloaded tonic-prost v0.14.3 [INFO] [stderr] Downloaded rdkafka-sys v4.10.0+2.12.1 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+nightly" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] [stdout] bc06641983b137f85a9afd2979cb7de60f81455010e85eee389b65e66b35b0b5 [INFO] running `Command { std: "docker" "start" "-a" "bc06641983b137f85a9afd2979cb7de60f81455010e85eee389b65e66b35b0b5", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "bc06641983b137f85a9afd2979cb7de60f81455010e85eee389b65e66b35b0b5", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "bc06641983b137f85a9afd2979cb7de60f81455010e85eee389b65e66b35b0b5", kill_on_drop: false }` [INFO] [stdout] bc06641983b137f85a9afd2979cb7de60f81455010e85eee389b65e66b35b0b5 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+nightly" "clippy" "--frozen" "--all" "--all-targets" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] 2e95a8a2a4c268787c4db19a8a11e5c65525ad9457ccdf42eaa7c648407d727c [INFO] running `Command { std: "docker" "start" "-a" "2e95a8a2a4c268787c4db19a8a11e5c65525ad9457ccdf42eaa7c648407d727c", kill_on_drop: false }` [INFO] [stderr] Compiling zmij v1.0.18 [INFO] [stderr] Checking serde_core v1.0.228 [INFO] [stderr] Compiling cc v1.2.55 [INFO] [stderr] Checking hashbrown v0.16.1 [INFO] [stderr] Compiling serde v1.0.228 [INFO] [stderr] Checking tracing v0.1.44 [INFO] [stderr] Checking futures-util v0.3.31 [INFO] [stderr] Checking crypto-common v0.1.7 [INFO] [stderr] Compiling zerocopy v0.8.37 [INFO] [stderr] Compiling zerocopy-derive v0.8.37 [INFO] [stderr] Compiling zerofrom v0.1.6 [INFO] [stderr] Compiling thiserror-impl v2.0.18 [INFO] [stderr] Checking num-traits v0.2.19 [INFO] [stderr] Checking icu_provider v2.1.1 [INFO] [stderr] Compiling getrandom v0.2.17 [INFO] [stderr] Checking rand_core v0.9.5 [INFO] [stderr] Checking digest v0.10.7 [INFO] [stderr] Compiling yoke v0.8.1 [INFO] [stderr] Compiling multer v3.1.0 [INFO] [stderr] Checking spin v0.9.8 [INFO] [stderr] Compiling zerovec v0.11.5 [INFO] [stderr] Checking icu_properties v2.1.2 [INFO] [stderr] Compiling zerotrie v0.2.3 [INFO] [stderr] Checking axum-core v0.5.6 [INFO] [stderr] Compiling pin-project-internal v1.1.10 [INFO] [stderr] Compiling socket2 v0.6.2 [INFO] [stderr] Checking regex-automata v0.4.13 [INFO] [stderr] Checking indexmap v2.13.0 [INFO] [stderr] Compiling either v1.15.0 [INFO] [stderr] Compiling smallvec v1.15.1 [INFO] [stderr] Compiling itertools v0.14.0 [INFO] [stderr] Compiling parking_lot_core v0.9.12 [INFO] [stderr] Compiling tokio v1.49.0 [INFO] [stderr] Compiling tinystr v0.8.2 [INFO] [stderr] Compiling potential_utf v0.1.4 [INFO] [stderr] Compiling cmake v0.1.57 [INFO] [stderr] Compiling icu_locale_core v2.1.1 [INFO] [stderr] Compiling icu_collections v2.1.1 [INFO] [stderr] Compiling parking_lot v0.12.5 [INFO] [stderr] Checking thiserror v2.0.18 [INFO] [stderr] Compiling rand_core v0.6.4 [INFO] [stderr] Checking inout v0.1.4 [INFO] [stderr] Compiling iana-time-zone v0.1.65 [INFO] [stderr] Checking compression-core v0.4.31 [INFO] [stderr] Checking sha1_smol v1.0.1 [INFO] [stderr] Checking pin-project v1.1.10 [INFO] [stderr] Checking bytemuck v1.25.0 [INFO] [stderr] Checking compression-codecs v0.4.36 [INFO] [stderr] Compiling chrono v0.4.43 [INFO] [stderr] Compiling futures-intrusive v0.5.0 [INFO] [stderr] Compiling serde_json v1.0.149 [INFO] [stderr] Checking cipher v0.4.4 [INFO] [stderr] Checking atomic v0.6.1 [INFO] [stderr] Checking opentelemetry v0.31.0 [INFO] [stderr] Compiling aws-lc-sys v0.37.0 [INFO] [stderr] Compiling ring v0.17.14 [INFO] [stderr] Compiling openssl-sys v0.9.111 [INFO] [stderr] Compiling icu_normalizer v2.1.1 [INFO] [stderr] Checking bitflags v2.10.0 [INFO] [stderr] Compiling prost-derive v0.14.3 [INFO] [stderr] Checking serde_path_to_error v0.1.20 [INFO] [stderr] Compiling libz-sys v1.1.23 [INFO] [stderr] Compiling const-random-macro v0.1.16 [INFO] [stderr] Checking serde_urlencoded v0.7.1 [INFO] [stderr] Compiling idna_adapter v1.2.1 [INFO] [stderr] Compiling openssl v0.10.75 [INFO] [stderr] Compiling idna v1.1.0 [INFO] [stderr] Compiling native-tls v0.2.14 [INFO] [stderr] Checking md-5 v0.10.6 [INFO] [stderr] Compiling uuid v1.20.0 [INFO] [stderr] Compiling getrandom v0.3.4 [INFO] [stderr] Checking const-random v0.1.18 [INFO] [stderr] Compiling pest_meta v2.8.5 [INFO] [stderr] Checking typeid v1.0.3 [INFO] [stderr] Checking num-integer v0.1.46 [INFO] [stderr] Checking concurrent-queue v2.5.0 [INFO] [stderr] Compiling home v0.5.11 [INFO] [stderr] Compiling erased-serde v0.4.9 [INFO] [stderr] Compiling url v2.5.8 [INFO] [stderr] Checking byteorder v1.5.0 [INFO] [stderr] Checking futures-executor v0.3.31 [INFO] [stderr] Checking hashbrown v0.14.5 [INFO] [stderr] Checking event-listener v5.4.1 [INFO] [stderr] Compiling pest_generator v2.8.5 [INFO] [stderr] Checking num-bigint v0.4.6 [INFO] [stderr] Compiling num_enum_derive v0.7.5 [INFO] [stderr] Checking dlv-list v0.5.2 [INFO] [stderr] Checking prost v0.14.3 [INFO] [stderr] Checking unicode-normalization v0.1.25 [INFO] [stderr] Compiling prettyplease v0.2.37 [INFO] [stderr] Checking raw-cpuid v11.6.0 [INFO] [stderr] Compiling rdkafka-sys v4.10.0+2.12.1 [INFO] [stderr] Checking sha2 v0.10.9 [INFO] [stderr] Compiling ppv-lite86 v0.2.21 [INFO] [stderr] Compiling tokio-stream v0.1.18 [INFO] [stderr] Checking hmac v0.12.1 [INFO] [stderr] Compiling rand_chacha v0.3.1 [INFO] [stderr] Checking universal-hash v0.5.1 [INFO] [stderr] Checking crossbeam-queue v0.3.12 [INFO] [stderr] Checking unicode-properties v0.1.4 [INFO] [stderr] Compiling rand v0.8.5 [INFO] [stderr] Compiling sqlx-core v0.8.6 [INFO] [stderr] Checking unicode-bidi v0.3.18 [INFO] [stderr] Compiling petgraph v0.8.3 [INFO] [stderr] Compiling tempfile v3.24.0 [INFO] [stderr] Checking pest v2.8.5 [INFO] [stderr] Checking toml_parser v1.0.6+spec-1.1.0 [INFO] [stderr] Checking polyval v0.6.2 [INFO] [stderr] Checking stringprep v0.1.5 [INFO] [stderr] Checking num_enum v0.7.5 [INFO] [stderr] Compiling pest_derive v2.8.5 [INFO] [stderr] Checking hkdf v0.12.4 [INFO] [stderr] Compiling regex v1.12.2 [INFO] [stderr] Checking ahash v0.8.12 [INFO] [stderr] Checking quanta v0.12.6 [INFO] [stderr] Compiling prost-types v0.14.3 [INFO] [stderr] Checking metrics v0.24.3 [INFO] [stderr] Checking rand_chacha v0.9.0 [INFO] [stderr] Checking rand v0.9.2 [INFO] [stderr] Checking ordered-multimap v0.7.3 [INFO] [stderr] Checking tracing-serde v0.2.0 [INFO] [stderr] Checking matchers v0.2.0 [INFO] [stderr] Checking toml_datetime v0.7.5+spec-1.1.0 [INFO] [stderr] Checking serde_spanned v1.0.4 [INFO] [stderr] Checking atoi v2.0.0 [INFO] [stderr] Checking rand_xoshiro v0.7.0 [INFO] [stderr] Checking inotify-sys v0.1.5 [INFO] [stderr] Compiling metrics-exporter-prometheus v0.18.1 [INFO] [stderr] Checking unicode-ident v1.0.22 [INFO] [stderr] Checking whoami v1.6.1 [INFO] [stderr] Checking dotenvy v0.15.7 [INFO] [stderr] Checking sketches-ddsketch v0.3.0 [INFO] [stderr] Checking arraydeque v0.5.1 [INFO] [stderr] Checking rust-ini v0.21.3 [INFO] [stderr] Compiling prost-build v0.14.3 [INFO] [stderr] Checking toml v0.9.11+spec-1.1.0 [INFO] [stderr] Checking ron v0.12.0 [INFO] [stderr] Checking metrics-util v0.20.1 [INFO] [stderr] Checking tracing-subscriber v0.3.22 [INFO] [stderr] Checking convert_case v0.6.0 [INFO] [stderr] Checking inotify v0.11.0 [INFO] [stderr] Checking serde-untagged v0.1.9 [INFO] [stderr] Checking yaml-rust2 v0.10.4 [INFO] [stderr] Checking json5 v0.4.1 [INFO] [stderr] Checking ghash v0.5.1 [INFO] [stderr] Compiling tonic-build v0.14.3 [INFO] [stderr] Checking notify-types v2.1.0 [INFO] [stderr] Checking aes v0.8.4 [INFO] [stderr] Checking ctr v0.9.2 [INFO] [stderr] Checking aead v0.5.2 [INFO] [stderr] Checking arcstr v1.2.0 [INFO] [stderr] Checking xxhash-rust v0.8.15 [INFO] [stderr] Checking pathdiff v0.2.3 [INFO] [stderr] Checking notify v8.2.0 [INFO] [stderr] Checking dashmap v6.1.0 [INFO] [stderr] Checking aes-gcm v0.10.3 [INFO] [stderr] Checking futures v0.3.31 [INFO] [stderr] Checking arc-swap v1.8.2 [INFO] [stderr] Checking opentelemetry-semantic-conventions v0.31.0 [INFO] [stderr] Compiling tonic-prost-build v0.14.3 [INFO] [stderr] Checking predicates-core v1.0.9 [INFO] [stderr] Compiling mockall_derive v0.14.0 [INFO] [stderr] Checking termtree v0.5.1 [INFO] [stderr] Compiling mockall v0.14.0 [INFO] [stderr] Compiling darling_core v0.20.11 [INFO] [stderr] Checking downcast v0.11.0 [INFO] [stderr] Checking predicates-tree v1.0.12 [INFO] [stderr] Checking tokio-util v0.7.18 [INFO] [stderr] Checking tokio-native-tls v0.3.1 [INFO] [stderr] Checking async-compression v0.4.37 [INFO] [stderr] Checking predicates v3.1.3 [INFO] [stderr] Checking config v0.15.19 [INFO] [stderr] Checking fragile v2.0.1 [INFO] [stderr] Checking tracing-opentelemetry v0.32.1 [INFO] [stderr] Checking deunicode v1.6.2 [INFO] [stderr] Checking opentelemetry_sdk v0.31.0 [INFO] [stderr] Checking tokio-test v0.4.5 [INFO] [stderr] Checking clap_builder v4.5.56 [INFO] [stderr] Checking h2 v0.4.13 [INFO] [stderr] Checking tower v0.5.3 [INFO] [stderr] Checking combine v4.6.7 [INFO] [stderr] Compiling clap_derive v4.5.55 [INFO] [stderr] Checking half v2.7.1 [INFO] [stderr] Compiling alloca v0.4.0 [INFO] [stderr] Compiling badge-proto v0.1.0 (/opt/rustwide/workdir/crates/proto) [INFO] [stderr] Checking itertools v0.13.0 [INFO] [stderr] Compiling sqlx-postgres v0.8.6 [INFO] [stderr] Checking ciborium-ll v0.2.2 [INFO] [stderr] Checking ciborium v0.2.2 [INFO] [stderr] Checking tower-http v0.6.8 [INFO] [stderr] Checking rayon v1.11.0 [INFO] [stderr] Checking plotters v0.3.7 [INFO] [stderr] Checking tinytemplate v1.2.1 [INFO] [stderr] Checking page_size v0.6.0 [INFO] [stderr] Compiling time-macros v0.2.18 [INFO] [stderr] Compiling proc-macro-error-attr2 v2.0.0 [INFO] [stderr] Checking criterion-plot v0.8.1 [INFO] [stderr] Checking sha1 v0.10.6 [INFO] [stderr] Compiling proc-macro-error2 v2.0.1 [INFO] [stderr] Checking headers-core v0.3.0 [INFO] [stderr] Checking blowfish v0.9.1 [INFO] [stderr] Checking pem v3.0.6 [INFO] [stderr] Checking headers v0.4.1 [INFO] [stderr] Checking winnow v0.6.26 [INFO] [stderr] Checking bcrypt v0.17.1 [INFO] [stderr] Checking serde_yaml v0.9.34+deprecated [INFO] [stderr] Checking clap v4.5.56 [INFO] [stderr] Compiling darling_macro v0.20.11 [INFO] [stderr] Checking time v0.3.36 [INFO] [stderr] Compiling darling v0.20.11 [INFO] [stderr] Compiling dummy v0.11.0 [INFO] [stderr] Compiling validator_derive v0.20.0 [INFO] [stderr] Checking criterion v0.8.1 [INFO] [stderr] Checking fake v4.4.0 [INFO] [stderr] Checking cron v0.15.0 [INFO] [stderr] Checking hyper v1.8.1 [INFO] [stderr] Checking validator v0.20.0 [INFO] [stderr] Checking simple_asn1 v0.6.3 [INFO] [stderr] Checking jsonwebtoken v9.3.1 [INFO] [stderr] Checking hyper-util v0.1.19 [INFO] [stderr] Checking redis v1.0.3 [INFO] [stderr] Compiling sqlx-macros-core v0.8.6 [INFO] [stderr] Checking axum v0.8.8 [INFO] [stderr] Checking hyper-timeout v0.5.2 [INFO] [stderr] Checking hyper-tls v0.6.0 [INFO] [stderr] Checking reqwest v0.12.28 [INFO] [stderr] Compiling sqlx-macros v0.8.6 [INFO] [stderr] Checking opentelemetry-http v0.31.0 [INFO] [stderr] Checking sqlx v0.8.6 [INFO] [stderr] Checking rdkafka v0.39.0 [INFO] [stderr] Checking axum-extra v0.12.5 [INFO] [stderr] Compiling aws-lc-rs v1.15.4 [INFO] [stderr] Compiling rustls v0.23.36 [INFO] [stderr] Checking rustls-webpki v0.103.9 [INFO] [stderr] Checking tokio-rustls v0.26.4 [INFO] [stderr] Checking tonic v0.14.3 [INFO] [stderr] Checking hyper-rustls v0.27.7 [INFO] [stderr] Checking tonic-prost v0.14.3 [INFO] [stderr] Checking opentelemetry-proto v0.31.0 [INFO] [stderr] Checking opentelemetry-otlp v0.31.0 [INFO] [stderr] Checking badge-shared v0.1.0 (/opt/rustwide/workdir/crates/shared) [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> crates/shared/src/circuit_breaker.rs:163:9 [INFO] [stdout] | [INFO] [stdout] 163 | / if inner.state == CircuitState::Open { [INFO] [stdout] 164 | | if let Some(last_failure) = inner.last_failure_time { [INFO] [stdout] 165 | | let elapsed: Duration = last_failure.elapsed(); [INFO] [stdout] 166 | | if elapsed >= self.config.recovery_timeout { [INFO] [stdout] ... | [INFO] [stdout] 170 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] = note: `#[warn(clippy::collapsible_if)]` on by default [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 163 ~ if inner.state == CircuitState::Open [INFO] [stdout] 164 ~ && let Some(last_failure) = inner.last_failure_time { [INFO] [stdout] 165 | let elapsed: Duration = last_failure.elapsed(); [INFO] [stdout] ... [INFO] [stdout] 168 | } [INFO] [stdout] 169 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `impl` can be derived [INFO] [stdout] --> crates/shared/src/config.rs:243:1 [INFO] [stdout] | [INFO] [stdout] 243 | / impl Default for TlsConfig { [INFO] [stdout] 244 | | fn default() -> Self { [INFO] [stdout] 245 | | Self { [INFO] [stdout] 246 | | enabled: false, [INFO] [stdout] ... | [INFO] [stdout] 252 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#derivable_impls [INFO] [stdout] = note: `#[warn(clippy::derivable_impls)]` on by default [INFO] [stdout] help: replace the manual implementation with a derive attribute [INFO] [stdout] | [INFO] [stdout] 231 + #[derive(Default)] [INFO] [stdout] 232 | pub struct TlsConfig { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `impl` can be derived [INFO] [stdout] --> crates/shared/src/config.rs:301:1 [INFO] [stdout] | [INFO] [stdout] 301 | / impl Default for EncryptionConfig { [INFO] [stdout] 302 | | fn default() -> Self { [INFO] [stdout] 303 | | Self { enabled: false } [INFO] [stdout] 304 | | } [INFO] [stdout] 305 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#derivable_impls [INFO] [stdout] help: replace the manual implementation with a derive attribute [INFO] [stdout] | [INFO] [stdout] 295 + #[derive(Default)] [INFO] [stdout] 296 | pub struct EncryptionConfig { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> crates/shared/src/circuit_breaker.rs:163:9 [INFO] [stdout] | [INFO] [stdout] 163 | / if inner.state == CircuitState::Open { [INFO] [stdout] 164 | | if let Some(last_failure) = inner.last_failure_time { [INFO] [stdout] 165 | | let elapsed: Duration = last_failure.elapsed(); [INFO] [stdout] 166 | | if elapsed >= self.config.recovery_timeout { [INFO] [stdout] ... | [INFO] [stdout] 170 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] = note: `#[warn(clippy::collapsible_if)]` on by default [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 163 ~ if inner.state == CircuitState::Open [INFO] [stdout] 164 ~ && let Some(last_failure) = inner.last_failure_time { [INFO] [stdout] 165 | let elapsed: Duration = last_failure.elapsed(); [INFO] [stdout] ... [INFO] [stdout] 168 | } [INFO] [stdout] 169 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual implementation of `.is_multiple_of()` [INFO] [stdout] --> crates/shared/src/crypto.rs:176:8 [INFO] [stdout] | [INFO] [stdout] 176 | if hex.len() % 2 != 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ help: replace with: `!hex.len().is_multiple_of(2)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_is_multiple_of [INFO] [stdout] = note: `#[warn(clippy::manual_is_multiple_of)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `impl` can be derived [INFO] [stdout] --> crates/shared/src/config.rs:243:1 [INFO] [stdout] | [INFO] [stdout] 243 | / impl Default for TlsConfig { [INFO] [stdout] 244 | | fn default() -> Self { [INFO] [stdout] 245 | | Self { [INFO] [stdout] 246 | | enabled: false, [INFO] [stdout] ... | [INFO] [stdout] 252 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#derivable_impls [INFO] [stdout] = note: `#[warn(clippy::derivable_impls)]` on by default [INFO] [stdout] help: replace the manual implementation with a derive attribute [INFO] [stdout] | [INFO] [stdout] 231 + #[derive(Default)] [INFO] [stdout] 232 | pub struct TlsConfig { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `impl` can be derived [INFO] [stdout] --> crates/shared/src/config.rs:301:1 [INFO] [stdout] | [INFO] [stdout] 301 | / impl Default for EncryptionConfig { [INFO] [stdout] 302 | | fn default() -> Self { [INFO] [stdout] 303 | | Self { enabled: false } [INFO] [stdout] 304 | | } [INFO] [stdout] 305 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#derivable_impls [INFO] [stdout] help: replace the manual implementation with a derive attribute [INFO] [stdout] | [INFO] [stdout] 295 + #[derive(Default)] [INFO] [stdout] 296 | pub struct EncryptionConfig { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual implementation of `.is_multiple_of()` [INFO] [stdout] --> crates/shared/src/crypto.rs:176:8 [INFO] [stdout] | [INFO] [stdout] 176 | if hex.len() % 2 != 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ help: replace with: `!hex.len().is_multiple_of(2)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_is_multiple_of [INFO] [stdout] = note: `#[warn(clippy::manual_is_multiple_of)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> crates/shared/src/kafka.rs:212:42 [INFO] [stdout] | [INFO] [stdout] 212 | .set("max.poll.interval.ms", &config.max_poll_interval_ms.to_string()) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: change this to: `config.max_poll_interval_ms.to_string()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrows_for_generic_args [INFO] [stdout] = note: `#[warn(clippy::needless_borrows_for_generic_args)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> crates/shared/src/kafka.rs:213:40 [INFO] [stdout] | [INFO] [stdout] 213 | .set("session.timeout.ms", &config.session_timeout_ms.to_string()) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: change this to: `config.session_timeout_ms.to_string()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrows_for_generic_args [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> crates/shared/src/kafka.rs:214:43 [INFO] [stdout] | [INFO] [stdout] 214 | .set("heartbeat.interval.ms", &config.heartbeat_interval_ms.to_string()) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: change this to: `config.heartbeat_interval_ms.to_string()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrows_for_generic_args [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> crates/shared/src/kafka.rs:215:41 [INFO] [stdout] | [INFO] [stdout] 215 | .set("metadata.max.age.ms", &config.metadata_max_age_ms.to_string()) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: change this to: `config.metadata_max_age_ms.to_string()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrows_for_generic_args [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> crates/shared/src/kafka.rs:216:56 [INFO] [stdout] | [INFO] [stdout] 216 | .set("topic.metadata.refresh.interval.ms", &config.topic_metadata_refresh_interval_ms.to_string()); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: change this to: `config.topic_metadata_refresh_interval_ms.to_string()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrows_for_generic_args [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> crates/shared/src/kafka.rs:212:42 [INFO] [stdout] | [INFO] [stdout] 212 | .set("max.poll.interval.ms", &config.max_poll_interval_ms.to_string()) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: change this to: `config.max_poll_interval_ms.to_string()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrows_for_generic_args [INFO] [stdout] = note: `#[warn(clippy::needless_borrows_for_generic_args)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> crates/shared/src/kafka.rs:213:40 [INFO] [stdout] | [INFO] [stdout] 213 | .set("session.timeout.ms", &config.session_timeout_ms.to_string()) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: change this to: `config.session_timeout_ms.to_string()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrows_for_generic_args [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> crates/shared/src/kafka.rs:214:43 [INFO] [stdout] | [INFO] [stdout] 214 | .set("heartbeat.interval.ms", &config.heartbeat_interval_ms.to_string()) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: change this to: `config.heartbeat_interval_ms.to_string()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrows_for_generic_args [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> crates/shared/src/kafka.rs:215:41 [INFO] [stdout] | [INFO] [stdout] 215 | .set("metadata.max.age.ms", &config.metadata_max_age_ms.to_string()) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: change this to: `config.metadata_max_age_ms.to_string()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrows_for_generic_args [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> crates/shared/src/kafka.rs:216:56 [INFO] [stdout] | [INFO] [stdout] 216 | .set("topic.metadata.refresh.interval.ms", &config.topic_metadata_refresh_interval_ms.to_string()); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: change this to: `config.topic_metadata_refresh_interval_ms.to_string()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrows_for_generic_args [INFO] [stdout] [INFO] [stdout] [INFO] [stderr] Checking badge-management-service v0.1.0 (/opt/rustwide/workdir/crates/badge-management-service) [INFO] [stderr] Checking unified-rule-engine v0.1.0 (/opt/rustwide/workdir/crates/unified-rule-engine) [INFO] [stderr] Checking event-transaction-service v0.1.0 (/opt/rustwide/workdir/crates/event-transaction-service) [INFO] [stderr] Checking event-engagement-service v0.1.0 (/opt/rustwide/workdir/crates/event-engagement-service) [INFO] [stderr] Checking notification-worker v0.1.0 (/opt/rustwide/workdir/crates/notification-worker) [INFO] [stderr] Checking mock-services v0.1.0 (/opt/rustwide/workdir/crates/mock-services) [INFO] [stdout] warning: this `if` can be collapsed into the outer `match` [INFO] [stdout] --> crates/unified-rule-engine/src/compiler.rs:143:17 [INFO] [stdout] | [INFO] [stdout] 143 | / if !cond.value.is_array() { [INFO] [stdout] 144 | | return Err(RuleError::ParseError(format!( [INFO] [stdout] 145 | | "条件 '{}' 的 {} 操作符需要数组值", [INFO] [stdout] 146 | | path, cond.operator [INFO] [stdout] 147 | | ))); [INFO] [stdout] 148 | | } [INFO] [stdout] | |_________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_match [INFO] [stdout] = note: `#[warn(clippy::collapsible_match)]` on by default [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 142 ~ Operator::In | Operator::NotIn | Operator::ContainsAny | Operator::ContainsAll [INFO] [stdout] 143 ~ if !cond.value.is_array() => { [INFO] [stdout] 144 | return Err(RuleError::ParseError(format!( [INFO] [stdout] ... [INFO] [stdout] 147 | ))); [INFO] [stdout] 148 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` can be collapsed into the outer `match` [INFO] [stdout] --> crates/unified-rule-engine/src/compiler.rs:143:17 [INFO] [stdout] | [INFO] [stdout] 143 | / if !cond.value.is_array() { [INFO] [stdout] 144 | | return Err(RuleError::ParseError(format!( [INFO] [stdout] 145 | | "条件 '{}' 的 {} 操作符需要数组值", [INFO] [stdout] 146 | | path, cond.operator [INFO] [stdout] 147 | | ))); [INFO] [stdout] 148 | | } [INFO] [stdout] | |_________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_match [INFO] [stdout] = note: `#[warn(clippy::collapsible_match)]` on by default [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 142 ~ Operator::In | Operator::NotIn | Operator::ContainsAny | Operator::ContainsAll [INFO] [stdout] 143 ~ if !cond.value.is_array() => { [INFO] [stdout] 144 | return Err(RuleError::ParseError(format!( [INFO] [stdout] ... [INFO] [stdout] 147 | ))); [INFO] [stdout] 148 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stderr] Checking badge-workspace v0.1.0 (/opt/rustwide/workdir) [INFO] [stdout] warning: useless use of `vec!` [INFO] [stdout] --> crates/event-engagement-service/src/consumer.rs:304:32 [INFO] [stdout] | [INFO] [stdout] 304 | let engagement_types = vec![ [INFO] [stdout] | ________________________________^ [INFO] [stdout] 305 | | EventType::CheckIn, [INFO] [stdout] 306 | | EventType::ProfileUpdate, [INFO] [stdout] 307 | | EventType::PageView, [INFO] [stdout] 308 | | EventType::Share, [INFO] [stdout] 309 | | EventType::Review, [INFO] [stdout] 310 | | ]; [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_vec [INFO] [stdout] = note: `#[warn(clippy::useless_vec)]` on by default [INFO] [stdout] help: you can use an array directly [INFO] [stdout] | [INFO] [stdout] 304 ~ let engagement_types = [EventType::CheckIn, [INFO] [stdout] 305 + EventType::ProfileUpdate, [INFO] [stdout] 306 + EventType::PageView, [INFO] [stdout] 307 + EventType::Share, [INFO] [stdout] 308 ~ EventType::Review]; [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: useless use of `vec!` [INFO] [stdout] --> crates/event-engagement-service/src/processor.rs:473:30 [INFO] [stdout] | [INFO] [stdout] 473 | let expected_types = vec![ [INFO] [stdout] | ______________________________^ [INFO] [stdout] 474 | | EventType::CheckIn, [INFO] [stdout] 475 | | EventType::ProfileUpdate, [INFO] [stdout] 476 | | EventType::PageView, [INFO] [stdout] 477 | | EventType::Share, [INFO] [stdout] 478 | | EventType::Review, [INFO] [stdout] 479 | | ]; [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_vec [INFO] [stdout] help: you can use an array directly [INFO] [stdout] | [INFO] [stdout] 473 ~ let expected_types = [EventType::CheckIn, [INFO] [stdout] 474 + EventType::ProfileUpdate, [INFO] [stdout] 475 + EventType::PageView, [INFO] [stdout] 476 + EventType::Share, [INFO] [stdout] 477 ~ EventType::Review]; [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` can be collapsed into the outer `match` [INFO] [stdout] --> crates/event-transaction-service/src/consumer.rs:207:13 [INFO] [stdout] | [INFO] [stdout] 207 | / if !result.granted_badges.is_empty() { [INFO] [stdout] 208 | | send_grant_notification(producer, &event, &result).await; [INFO] [stdout] 209 | | } [INFO] [stdout] | |_____________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_match [INFO] [stdout] = note: `#[warn(clippy::collapsible_match)]` on by default [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 205 ~ EventType::Purchase [INFO] [stdout] 206 | // 有徽章发放时才通知 [INFO] [stdout] 207 ~ if !result.granted_badges.is_empty() => { [INFO] [stdout] 208 | send_grant_notification(producer, &event, &result).await; [INFO] [stdout] 209 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` can be collapsed into the outer `match` [INFO] [stdout] --> crates/event-transaction-service/src/consumer.rs:213:13 [INFO] [stdout] | [INFO] [stdout] 213 | / if result.errors.is_empty() { [INFO] [stdout] 214 | | send_revoke_notification(producer, &event).await; [INFO] [stdout] 215 | | } [INFO] [stdout] | |_____________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_match [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 211 ~ EventType::Refund | EventType::OrderCancel [INFO] [stdout] 212 | // 退款/取消事件中,只要没有全部失败就发送撤销通知 [INFO] [stdout] 213 ~ if result.errors.is_empty() => { [INFO] [stdout] 214 | send_revoke_notification(producer, &event).await; [INFO] [stdout] 215 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` can be collapsed into the outer `match` [INFO] [stdout] --> crates/event-transaction-service/src/consumer.rs:207:13 [INFO] [stdout] | [INFO] [stdout] 207 | / if !result.granted_badges.is_empty() { [INFO] [stdout] 208 | | send_grant_notification(producer, &event, &result).await; [INFO] [stdout] 209 | | } [INFO] [stdout] | |_____________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_match [INFO] [stdout] = note: `#[warn(clippy::collapsible_match)]` on by default [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 205 ~ EventType::Purchase [INFO] [stdout] 206 | // 有徽章发放时才通知 [INFO] [stdout] 207 ~ if !result.granted_badges.is_empty() => { [INFO] [stdout] 208 | send_grant_notification(producer, &event, &result).await; [INFO] [stdout] 209 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` can be collapsed into the outer `match` [INFO] [stdout] --> crates/event-transaction-service/src/consumer.rs:213:13 [INFO] [stdout] | [INFO] [stdout] 213 | / if result.errors.is_empty() { [INFO] [stdout] 214 | | send_revoke_notification(producer, &event).await; [INFO] [stdout] 215 | | } [INFO] [stdout] | |_____________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_match [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 211 ~ EventType::Refund | EventType::OrderCancel [INFO] [stdout] 212 | // 退款/取消事件中,只要没有全部失败就发送撤销通知 [INFO] [stdout] 213 ~ if result.errors.is_empty() => { [INFO] [stdout] 214 | send_revoke_notification(producer, &event).await; [INFO] [stdout] 215 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual implementation of `.is_multiple_of()` [INFO] [stdout] --> benches/rule_engine_bench.rs:53:31 [INFO] [stdout] | [INFO] [stdout] 53 | let operator = if depth % 2 == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^ help: replace with: `depth.is_multiple_of(2)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_is_multiple_of [INFO] [stdout] = note: `#[warn(clippy::manual_is_multiple_of)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: useless use of `vec!` [INFO] [stdout] --> crates/event-transaction-service/src/processor.rs:686:30 [INFO] [stdout] | [INFO] [stdout] 686 | let expected_types = vec![ [INFO] [stdout] | ______________________________^ [INFO] [stdout] 687 | | EventType::Purchase, [INFO] [stdout] 688 | | EventType::Refund, [INFO] [stdout] 689 | | EventType::OrderCancel, [INFO] [stdout] 690 | | ]; [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_vec [INFO] [stdout] = note: `#[warn(clippy::useless_vec)]` on by default [INFO] [stdout] help: you can use an array directly [INFO] [stdout] | [INFO] [stdout] 686 ~ let expected_types = [EventType::Purchase, [INFO] [stdout] 687 + EventType::Refund, [INFO] [stdout] 688 ~ EventType::OrderCancel]; [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual implementation of `.is_multiple_of()` [INFO] [stdout] --> benches/load_test.rs:58:24 [INFO] [stdout] | [INFO] [stdout] 58 | "type": if variant % 2 == 0 { "PURCHASE" } else { "VIEW" }, [INFO] [stdout] | ^^^^^^^^^^^^^^^^ help: replace with: `variant.is_multiple_of(2)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_is_multiple_of [INFO] [stdout] = note: `#[warn(clippy::manual_is_multiple_of)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual implementation of `.is_multiple_of()` [INFO] [stdout] --> benches/load_test.rs:67:26 [INFO] [stdout] | [INFO] [stdout] 67 | "is_active": variant % 3 != 0, [INFO] [stdout] | ^^^^^^^^^^^^^^^^ help: replace with: `!variant.is_multiple_of(3)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_is_multiple_of [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> tests/performance/scenarios/concurrent_grant.rs:193:17 [INFO] [stdout] | [INFO] [stdout] 193 | / if let Ok(resp) = response { [INFO] [stdout] 194 | | if resp.status().is_success() { [INFO] [stdout] 195 | | successful.fetch_add(1, std::sync::atomic::Ordering::SeqCst); [INFO] [stdout] 196 | | let mut guard = users.lock().await; [INFO] [stdout] ... | [INFO] [stdout] 199 | | } [INFO] [stdout] | |_________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] = note: `#[warn(clippy::collapsible_if)]` on by default [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 193 ~ if let Ok(resp) = response [INFO] [stdout] 194 ~ && resp.status().is_success() { [INFO] [stdout] 195 | successful.fetch_add(1, std::sync::atomic::Ordering::SeqCst); [INFO] [stdout] 196 | let mut guard = users.lock().await; [INFO] [stdout] 197 | guard.insert(user_id); [INFO] [stdout] 198 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `unwrap_err` on `result` after checking its variant with `is_err` [INFO] [stdout] --> tests/performance/scenarios/database.rs:126:36 [INFO] [stdout] | [INFO] [stdout] 124 | if result.is_err() { [INFO] [stdout] | ------------------ help: try: `if let Err() = result` [INFO] [stdout] 125 | tx.rollback().await.ok(); [INFO] [stdout] 126 | return Err(result.unwrap_err().to_string()); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_unwrap [INFO] [stdout] = note: `#[warn(clippy::unnecessary_unwrap)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `unwrap_err` on `result` after checking its variant with `is_err` [INFO] [stdout] --> tests/performance/scenarios/database.rs:198:36 [INFO] [stdout] | [INFO] [stdout] 196 | if result.is_err() { [INFO] [stdout] | ------------------ help: try: `if let Err() = result` [INFO] [stdout] 197 | tx.rollback().await.ok(); [INFO] [stdout] 198 | return Err(result.unwrap_err().to_string()); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_unwrap [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> tests/performance/scenarios/event_throughput.rs:174:17 [INFO] [stdout] | [INFO] [stdout] 174 | / if let Ok(resp) = check { [INFO] [stdout] 175 | | if let Ok(body) = resp.json::().await { [INFO] [stdout] 176 | | let items = body["data"]["items"].as_array(); [INFO] [stdout] 177 | | if items.map_or(false, |arr| !arr.is_empty()) { [INFO] [stdout] ... | [INFO] [stdout] 182 | | } [INFO] [stdout] | |_________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 174 ~ if let Ok(resp) = check [INFO] [stdout] 175 ~ && let Ok(body) = resp.json::().await { [INFO] [stdout] 176 | let items = body["data"]["items"].as_array(); [INFO] [stdout] ... [INFO] [stdout] 180 | } [INFO] [stdout] 181 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `map_or` can be simplified [INFO] [stdout] --> tests/performance/scenarios/event_throughput.rs:177:28 [INFO] [stdout] | [INFO] [stdout] 177 | if items.map_or(false, |arr| !arr.is_empty()) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_map_or [INFO] [stdout] = note: `#[warn(clippy::unnecessary_map_or)]` on by default [INFO] [stdout] help: use `is_some_and` instead [INFO] [stdout] | [INFO] [stdout] 177 - if items.map_or(false, |arr| !arr.is_empty()) { [INFO] [stdout] 177 + if items.is_some_and(|arr| !arr.is_empty()) { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> tests/performance/scenarios/event_throughput.rs:270:13 [INFO] [stdout] | [INFO] [stdout] 270 | / if let Ok(resp) = check { [INFO] [stdout] 271 | | if let Ok(body) = resp.json::().await { [INFO] [stdout] 272 | | let enabled = body["data"]["enabled"].as_bool().unwrap_or(false); [INFO] [stdout] 273 | | let status = body["data"]["status"].as_str().unwrap_or(""); [INFO] [stdout] ... | [INFO] [stdout] 279 | | } [INFO] [stdout] | |_____________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 270 ~ if let Ok(resp) = check [INFO] [stdout] 271 ~ && let Ok(body) = resp.json::().await { [INFO] [stdout] 272 | let enabled = body["data"]["enabled"].as_bool().unwrap_or(false); [INFO] [stdout] ... [INFO] [stdout] 277 | } [INFO] [stdout] 278 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual implementation of `.is_multiple_of()` [INFO] [stdout] --> tests/performance/scenarios/rule_engine.rs:140:54 [INFO] [stdout] | [INFO] [stdout] 140 | ... "is_first_purchase": event_id % 100 == 0 [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ help: replace with: `event_id.is_multiple_of(100)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_is_multiple_of [INFO] [stdout] = note: `#[warn(clippy::manual_is_multiple_of)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `RangeInclusive::contains` implementation [INFO] [stdout] --> crates/mock-services/src/event_generator/engagement.rs:150:17 [INFO] [stdout] | [INFO] [stdout] 150 | assert!(days >= 1 && days <= 365); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `(1..=365).contains(&days)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains [INFO] [stdout] = note: `#[warn(clippy::manual_range_contains)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `RangeInclusive::contains` implementation [INFO] [stdout] --> crates/mock-services/src/event_generator/engagement.rs:171:17 [INFO] [stdout] | [INFO] [stdout] 171 | assert!(duration >= 1 && duration <= 600); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `(1..=600).contains(&duration)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `RangeInclusive::contains` implementation [INFO] [stdout] --> crates/mock-services/src/event_generator/engagement.rs:204:17 [INFO] [stdout] | [INFO] [stdout] 204 | assert!(rating >= 1 && rating <= 5); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `(1..=5).contains(&rating)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> tests/e2e/data/fixtures.rs:22:36 [INFO] [stdout] | [INFO] [stdout] 22 | CreateCategoryRequest::new(&format!("Test成就徽章_{}", Self::unique_suffix())) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: change this to: `format!("Test成就徽章_{}", Self::unique_suffix())` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrows_for_generic_args [INFO] [stdout] = note: `#[warn(clippy::needless_borrows_for_generic_args)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> tests/e2e/data/fixtures.rs:29:36 [INFO] [stdout] | [INFO] [stdout] 29 | CreateCategoryRequest::new(&format!("Test活动徽章_{}", Self::unique_suffix())) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: change this to: `format!("Test活动徽章_{}", Self::unique_suffix())` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrows_for_generic_args [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> tests/e2e/data/fixtures.rs:36:36 [INFO] [stdout] | [INFO] [stdout] 36 | CreateCategoryRequest::new(&format!("Test消费徽章_{}", Self::unique_suffix())) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: change this to: `format!("Test消费徽章_{}", Self::unique_suffix())` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrows_for_generic_args [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual implementation of `.is_multiple_of()` [INFO] [stdout] --> tests/e2e/data/generators.rs:149:31 [INFO] [stdout] | [INFO] [stdout] 149 | let operator = if depth % 2 == 0 { "AND" } else { "OR" }; [INFO] [stdout] | ^^^^^^^^^^^^^^ help: replace with: `depth.is_multiple_of(2)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_is_multiple_of [INFO] [stdout] = note: `#[warn(clippy::manual_is_multiple_of)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> tests/e2e/helpers/db_verifier.rs:350:9 [INFO] [stdout] | [INFO] [stdout] 350 | / if let Some(ref badges) = self.granted_badges { [INFO] [stdout] 351 | | if let Some(arr) = badges.as_array() { [INFO] [stdout] 352 | | return arr.iter().any(|b| { [INFO] [stdout] 353 | | b.get("badge_id") [INFO] [stdout] ... | [INFO] [stdout] 359 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] = note: `#[warn(clippy::collapsible_if)]` on by default [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 350 ~ if let Some(ref badges) = self.granted_badges [INFO] [stdout] 351 ~ && let Some(arr) = badges.as_array() { [INFO] [stdout] 352 | return arr.iter().any(|b| { [INFO] [stdout] ... [INFO] [stdout] 357 | }); [INFO] [stdout] 358 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> tests/e2e/helpers/db_verifier.rs:365:9 [INFO] [stdout] | [INFO] [stdout] 365 | / if let Some(ref badges) = self.blocked_badges { [INFO] [stdout] 366 | | if let Some(arr) = badges.as_array() { [INFO] [stdout] 367 | | return arr.iter().any(|b| { [INFO] [stdout] 368 | | b.get("badge_id") [INFO] [stdout] ... | [INFO] [stdout] 374 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 365 ~ if let Some(ref badges) = self.blocked_badges [INFO] [stdout] 366 ~ && let Some(arr) = badges.as_array() { [INFO] [stdout] 367 | return arr.iter().any(|b| { [INFO] [stdout] ... [INFO] [stdout] 372 | }); [INFO] [stdout] 373 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> tests/e2e/helpers/kafka_helper.rs:136:29 [INFO] [stdout] | [INFO] [stdout] 136 | / ... if let Some(payload) = m.payload() { [INFO] [stdout] 137 | | ... if let Ok(parsed) = serde_json::from_slice(payload) { [INFO] [stdout] 138 | | ... messages.push(parsed); [INFO] [stdout] 139 | | ... } [INFO] [stdout] 140 | | ... } [INFO] [stdout] | |_______________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 136 ~ if let Some(payload) = m.payload() [INFO] [stdout] 137 ~ && let Ok(parsed) = serde_json::from_slice(payload) { [INFO] [stdout] 138 | messages.push(parsed); [INFO] [stdout] 139 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field assignment outside of initializer for an instance created with Default::default() [INFO] [stdout] --> tests/e2e/setup/environment.rs:192:9 [INFO] [stdout] | [INFO] [stdout] 192 | config.service_ready_timeout = Duration::from_secs(60); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] note: consider initializing the variable with `setup::environment::TestEnvConfig { service_ready_timeout: Duration::from_secs(60), ..Default::default() }` and removing relevant reassignments [INFO] [stdout] --> tests/e2e/setup/environment.rs:191:9 [INFO] [stdout] | [INFO] [stdout] 191 | let mut config = TestEnvConfig::default(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#field_reassign_with_default [INFO] [stdout] = note: `#[warn(clippy::field_reassign_with_default)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual implementation of `.is_multiple_of()` [INFO] [stdout] --> tests/e2e/suites/deep_nesting.rs:31:27 [INFO] [stdout] | [INFO] [stdout] 31 | let operator = if depth % 2 == 0 { "AND" } else { "OR" }; [INFO] [stdout] | ^^^^^^^^^^^^^^ help: replace with: `depth.is_multiple_of(2)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_is_multiple_of [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> tests/e2e/suites/notification.rs:124:9 [INFO] [stdout] | [INFO] [stdout] 124 | / if let Ok(response) = resp { [INFO] [stdout] 125 | | if response.status().is_success() { [INFO] [stdout] 126 | | env.wait_for_processing(Duration::from_secs(3)) [INFO] [stdout] 127 | | .await [INFO] [stdout] ... | [INFO] [stdout] 141 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 124 ~ if let Ok(response) = resp [INFO] [stdout] 125 ~ && response.status().is_success() { [INFO] [stdout] 126 | env.wait_for_processing(Duration::from_secs(3)) [INFO] [stdout] ... [INFO] [stdout] 139 | assert!(!notification.channels.is_empty(), "通知渠道不应为空"); [INFO] [stdout] 140 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> tests/e2e/suites/notification.rs:196:9 [INFO] [stdout] | [INFO] [stdout] 196 | / if let Ok(response) = resp { [INFO] [stdout] 197 | | if response.status().is_success() { [INFO] [stdout] 198 | | env.wait_for_processing(Duration::from_secs(3)) [INFO] [stdout] 199 | | .await [INFO] [stdout] ... | [INFO] [stdout] 220 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 196 ~ if let Ok(response) = resp [INFO] [stdout] 197 ~ && response.status().is_success() { [INFO] [stdout] 198 | env.wait_for_processing(Duration::from_secs(3)) [INFO] [stdout] ... [INFO] [stdout] 218 | ); [INFO] [stdout] 219 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stderr] Checking badge-admin-service v0.1.0 (/opt/rustwide/workdir/crates/badge-admin-service) [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> crates/badge-management-service/examples/full_pipeline_test.rs:275:12 [INFO] [stdout] | [INFO] [stdout] 275 | if output.stdout.len() > 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!output.stdout.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] = note: `#[warn(clippy::len_zero)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> crates/badge-management-service/tests/badge_flow_test.rs:165:9 [INFO] [stdout] | [INFO] [stdout] 165 | / if let Some(max) = badge.max_supply { [INFO] [stdout] 166 | | if badge.issued_count + quantity as i64 > max { [INFO] [stdout] 167 | | return Err(GrantError::OutOfStock); [INFO] [stdout] 168 | | } [INFO] [stdout] 169 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] = note: `#[warn(clippy::collapsible_if)]` on by default [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 165 ~ if let Some(max) = badge.max_supply [INFO] [stdout] 166 ~ && badge.issued_count + quantity as i64 > max { [INFO] [stdout] 167 | return Err(GrantError::OutOfStock); [INFO] [stdout] 168 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> crates/badge-management-service/tests/badge_flow_test.rs:179:9 [INFO] [stdout] | [INFO] [stdout] 179 | / if let Some(limit) = badge.max_per_user { [INFO] [stdout] 180 | | if current_quantity + quantity > limit { [INFO] [stdout] 181 | | return Err(GrantError::LimitExceeded); [INFO] [stdout] 182 | | } [INFO] [stdout] 183 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 179 ~ if let Some(limit) = badge.max_per_user [INFO] [stdout] 180 ~ && current_quantity + quantity > limit { [INFO] [stdout] 181 | return Err(GrantError::LimitExceeded); [INFO] [stdout] 182 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this function has too many arguments (8/7) [INFO] [stdout] --> crates/badge-management-service/tests/redemption_service_test.rs:134:1 [INFO] [stdout] | [INFO] [stdout] 134 | / async fn seed_redemption_rule( [INFO] [stdout] 135 | | pool: &PgPool, [INFO] [stdout] 136 | | rule_id: i64, [INFO] [stdout] 137 | | name: &str, [INFO] [stdout] ... | [INFO] [stdout] 142 | | end_time: Option>, [INFO] [stdout] 143 | | ) { [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#too_many_arguments [INFO] [stdout] = note: `#[warn(clippy::too_many_arguments)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: useless use of `vec!` [INFO] [stdout] --> crates/badge-management-service/tests/benefit_integration.rs:721:23 [INFO] [stdout] | [INFO] [stdout] 721 | let reasons = vec![ [INFO] [stdout] | _______________________^ [INFO] [stdout] 722 | | RevokeReason::UserRequest, [INFO] [stdout] 723 | | RevokeReason::OrderRefund, [INFO] [stdout] 724 | | RevokeReason::Expiration, [INFO] [stdout] 725 | | RevokeReason::Violation, [INFO] [stdout] 726 | | RevokeReason::SystemError, [INFO] [stdout] 727 | | ]; [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_vec [INFO] [stdout] = note: `#[warn(clippy::useless_vec)]` on by default [INFO] [stdout] help: you can use an array directly [INFO] [stdout] | [INFO] [stdout] 721 ~ let reasons = [RevokeReason::UserRequest, [INFO] [stdout] 722 + RevokeReason::OrderRefund, [INFO] [stdout] 723 + RevokeReason::Expiration, [INFO] [stdout] 724 + RevokeReason::Violation, [INFO] [stdout] 725 ~ RevokeReason::SystemError]; [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this assertion is always `true` [INFO] [stdout] --> crates/badge-management-service/src/lock/lock_manager.rs:565:35 [INFO] [stdout] | [INFO] [stdout] 565 | MockBackend::Redis => assert!(true), [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: remove the assertion [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#assertions_on_constants [INFO] [stdout] = note: `#[warn(clippy::assertions_on_constants)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this assertion is always `true` [INFO] [stdout] --> crates/badge-management-service/src/lock/lock_manager.rs:570:38 [INFO] [stdout] | [INFO] [stdout] 570 | MockBackend::Database => assert!(true), [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: remove the assertion [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#assertions_on_constants [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `from_str` can be confused for the standard trait method `std::str::FromStr::from_str` [INFO] [stdout] --> crates/badge-admin-service/src/handlers/asset.rs:49:5 [INFO] [stdout] | [INFO] [stdout] 49 | / pub fn from_str(s: &str) -> Option { [INFO] [stdout] 50 | | match s.to_uppercase().as_str() { [INFO] [stdout] 51 | | "IMAGE" => Some(AssetType::Image), [INFO] [stdout] 52 | | "ANIMATION" => Some(AssetType::Animation), [INFO] [stdout] ... | [INFO] [stdout] 57 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: consider implementing the trait `std::str::FromStr` or choosing a less ambiguous method name [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#should_implement_trait [INFO] [stdout] = note: `#[warn(clippy::should_implement_trait)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> crates/badge-admin-service/src/handlers/asset.rs:347:11 [INFO] [stdout] | [INFO] [stdout] 347 | .bind(&req.asset_type.to_uppercase()) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: change this to: `req.asset_type.to_uppercase()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrows_for_generic_args [INFO] [stdout] = note: `#[warn(clippy::needless_borrows_for_generic_args)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `from_str` can be confused for the standard trait method `std::str::FromStr::from_str` [INFO] [stdout] --> crates/badge-admin-service/src/handlers/asset.rs:49:5 [INFO] [stdout] | [INFO] [stdout] 49 | / pub fn from_str(s: &str) -> Option { [INFO] [stdout] 50 | | match s.to_uppercase().as_str() { [INFO] [stdout] 51 | | "IMAGE" => Some(AssetType::Image), [INFO] [stdout] 52 | | "ANIMATION" => Some(AssetType::Animation), [INFO] [stdout] ... | [INFO] [stdout] 57 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: consider implementing the trait `std::str::FromStr` or choosing a less ambiguous method name [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#should_implement_trait [INFO] [stdout] = note: `#[warn(clippy::should_implement_trait)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> crates/badge-admin-service/src/handlers/asset.rs:347:11 [INFO] [stdout] | [INFO] [stdout] 347 | .bind(&req.asset_type.to_uppercase()) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: change this to: `req.asset_type.to_uppercase()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrows_for_generic_args [INFO] [stdout] = note: `#[warn(clippy::needless_borrows_for_generic_args)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `map_or` can be simplified [INFO] [stdout] --> crates/badge-admin-service/src/handlers/rule.rs:571:42 [INFO] [stdout] | [INFO] [stdout] 571 | if test_data.is_object() && !test_data.as_object().map_or(true, |m| m.is_empty()) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_map_or [INFO] [stdout] = note: `#[warn(clippy::unnecessary_map_or)]` on by default [INFO] [stdout] help: use `is_none_or` instead [INFO] [stdout] | [INFO] [stdout] 571 - if test_data.is_object() && !test_data.as_object().map_or(true, |m| m.is_empty()) { [INFO] [stdout] 571 + if test_data.is_object() && !test_data.as_object().is_none_or(|m| m.is_empty()) { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `map_or` can be simplified [INFO] [stdout] --> crates/badge-admin-service/src/handlers/rule.rs:571:42 [INFO] [stdout] | [INFO] [stdout] 571 | if test_data.is_object() && !test_data.as_object().map_or(true, |m| m.is_empty()) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_map_or [INFO] [stdout] = note: `#[warn(clippy::unnecessary_map_or)]` on by default [INFO] [stdout] help: use `is_none_or` instead [INFO] [stdout] | [INFO] [stdout] 571 - if test_data.is_object() && !test_data.as_object().map_or(true, |m| m.is_empty()) { [INFO] [stdout] 571 + if test_data.is_object() && !test_data.as_object().is_none_or(|m| m.is_empty()) { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `map(..).flatten()` on `Option` [INFO] [stdout] --> crates/badge-admin-service/src/handlers/notification.rs:394:47 [INFO] [stdout] | [INFO] [stdout] 394 | let channels_json = req.channels.as_ref().map(|c| serde_json::to_value(c).ok()).flatten(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try replacing `map` with `and_then` and remove the `.flatten()`: `and_then(|c| serde_json::to_value(c).ok())` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_flatten [INFO] [stdout] = note: `#[warn(clippy::map_flatten)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> crates/badge-admin-service/src/middleware/audit.rs:134:5 [INFO] [stdout] | [INFO] [stdout] 134 | / if response.status().is_success() { [INFO] [stdout] 135 | | if let Some(claims) = claims { [INFO] [stdout] 136 | | let pool = state.pool.clone(); [INFO] [stdout] 137 | | let encryptor = state.encryptor.clone(); [INFO] [stdout] ... | [INFO] [stdout] 161 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] = note: `#[warn(clippy::collapsible_if)]` on by default [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 134 ~ if response.status().is_success() [INFO] [stdout] 135 ~ && let Some(claims) = claims { [INFO] [stdout] 136 | let pool = state.pool.clone(); [INFO] [stdout] ... [INFO] [stdout] 159 | }); [INFO] [stdout] 160 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: doc list item without indentation [INFO] [stdout] --> crates/badge-admin-service/src/middleware/audit.rs:234:5 [INFO] [stdout] | [INFO] [stdout] 234 | /// 上述字段在写入前通过 FieldEncryptor 加密,passthrough 模式下不加密。 [INFO] [stdout] | ^ [INFO] [stdout] | [INFO] [stdout] = help: if this is supposed to be its own paragraph, add a blank line [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#doc_lazy_continuation [INFO] [stdout] = note: `#[warn(clippy::doc_lazy_continuation)]` on by default [INFO] [stdout] help: indent this line [INFO] [stdout] | [INFO] [stdout] 234 | /// 上述字段在写入前通过 FieldEncryptor 加密,passthrough 模式下不加密。 [INFO] [stdout] | ++ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this function has too many arguments (12/7) [INFO] [stdout] --> crates/badge-admin-service/src/middleware/audit.rs:235:1 [INFO] [stdout] | [INFO] [stdout] 235 | / async fn write_audit_log( [INFO] [stdout] 236 | | pool: &PgPool, [INFO] [stdout] 237 | | encryptor: &FieldEncryptor, [INFO] [stdout] 238 | | operator_id: &str, [INFO] [stdout] ... | [INFO] [stdout] 247 | | request_body: Option<&str>, [INFO] [stdout] 248 | | ) { [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#too_many_arguments [INFO] [stdout] = note: `#[warn(clippy::too_many_arguments)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> crates/badge-admin-service/src/middleware/audit.rs:257:44 [INFO] [stdout] | [INFO] [stdout] 257 | encryptor.encrypt_json(v).ok().map(|s| serde_json::Value::String(s)) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the tuple variant itself: `serde_json::Value::String` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] = note: `#[warn(clippy::redundant_closure)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> crates/badge-admin-service/src/middleware/audit.rs:261:44 [INFO] [stdout] | [INFO] [stdout] 261 | encryptor.encrypt_json(v).ok().map(|s| serde_json::Value::String(s)) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the tuple variant itself: `serde_json::Value::String` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `map(..).flatten()` on `Option` [INFO] [stdout] --> crates/badge-admin-service/src/handlers/notification.rs:394:47 [INFO] [stdout] | [INFO] [stdout] 394 | let channels_json = req.channels.as_ref().map(|c| serde_json::to_value(c).ok()).flatten(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try replacing `map` with `and_then` and remove the `.flatten()`: `and_then(|c| serde_json::to_value(c).ok())` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_flatten [INFO] [stdout] = note: `#[warn(clippy::map_flatten)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> crates/badge-admin-service/src/middleware/api_key_auth.rs:123:5 [INFO] [stdout] | [INFO] [stdout] 123 | / if let Some(limit) = rate_limit { [INFO] [stdout] 124 | | if limit > 0 { [INFO] [stdout] 125 | | if let Err(resp) = check_rate_limit(cache, key_id, limit).await { [INFO] [stdout] 126 | | return Err(resp); [INFO] [stdout] ... | [INFO] [stdout] 129 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 123 ~ if let Some(limit) = rate_limit [INFO] [stdout] 124 ~ && limit > 0 { [INFO] [stdout] 125 | if let Err(resp) = check_rate_limit(cache, key_id, limit).await { [INFO] [stdout] 126 | return Err(resp); [INFO] [stdout] 127 | } [INFO] [stdout] 128 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> crates/badge-admin-service/src/middleware/api_key_auth.rs:124:9 [INFO] [stdout] | [INFO] [stdout] 124 | / if limit > 0 { [INFO] [stdout] 125 | | if let Err(resp) = check_rate_limit(cache, key_id, limit).await { [INFO] [stdout] 126 | | return Err(resp); [INFO] [stdout] 127 | | } [INFO] [stdout] 128 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 124 ~ if limit > 0 [INFO] [stdout] 125 ~ && let Err(resp) = check_rate_limit(cache, key_id, limit).await { [INFO] [stdout] 126 | return Err(resp); [INFO] [stdout] 127 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this block may be rewritten with the `?` operator [INFO] [stdout] --> crates/badge-admin-service/src/middleware/api_key_auth.rs:125:13 [INFO] [stdout] | [INFO] [stdout] 125 | / if let Err(resp) = check_rate_limit(cache, key_id, limit).await { [INFO] [stdout] 126 | | return Err(resp); [INFO] [stdout] 127 | | } [INFO] [stdout] | |_____________^ help: replace it with: `check_rate_limit(cache, key_id, limit).await?` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#question_mark [INFO] [stdout] = note: `#[warn(clippy::question_mark)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> crates/badge-admin-service/src/middleware/api_key_auth.rs:175:9 [INFO] [stdout] | [INFO] [stdout] 175 | return; [INFO] [stdout] | ^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] = note: `#[warn(clippy::needless_return)]` on by default [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 174 - warn!(error = %e, key_id = key_id, "Redis rate limit check failed, allowing request"); [INFO] [stdout] 175 - return; [INFO] [stdout] 174 + warn!(error = %e, key_id = key_id, "Redis rate limit check failed, allowing request"); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> crates/badge-admin-service/src/middleware/api_key_auth.rs:185:5 [INFO] [stdout] | [INFO] [stdout] 185 | / if current == 1 { [INFO] [stdout] 186 | | if let Err(e) = cache.expire(&rate_key, Duration::from_secs(60)).await { [INFO] [stdout] 187 | | warn!(error = %e, "Failed to set rate limit key TTL"); [INFO] [stdout] 188 | | } [INFO] [stdout] 189 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 185 ~ if current == 1 [INFO] [stdout] 186 ~ && let Err(e) = cache.expire(&rate_key, Duration::from_secs(60)).await { [INFO] [stdout] 187 | warn!(error = %e, "Failed to set rate limit key TTL"); [INFO] [stdout] 188 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the following explicit lifetimes could be elided: 'a [INFO] [stdout] --> crates/badge-admin-service/src/middleware/rate_limit.rs:192:24 [INFO] [stdout] | [INFO] [stdout] 192 | fn classify_rate_limit<'a>(path: &str, method: &Method, config: &'a RateLimitConfig) -> RateLimit { [INFO] [stdout] | ^^ ^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_lifetimes [INFO] [stdout] = note: `#[warn(clippy::needless_lifetimes)]` on by default [INFO] [stdout] help: elide the lifetimes [INFO] [stdout] | [INFO] [stdout] 192 - fn classify_rate_limit<'a>(path: &str, method: &Method, config: &'a RateLimitConfig) -> RateLimit { [INFO] [stdout] 192 + fn classify_rate_limit(path: &str, method: &Method, config: &RateLimitConfig) -> RateLimit { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> crates/badge-admin-service/src/middleware/audit.rs:134:5 [INFO] [stdout] | [INFO] [stdout] 134 | / if response.status().is_success() { [INFO] [stdout] 135 | | if let Some(claims) = claims { [INFO] [stdout] 136 | | let pool = state.pool.clone(); [INFO] [stdout] 137 | | let encryptor = state.encryptor.clone(); [INFO] [stdout] ... | [INFO] [stdout] 161 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] = note: `#[warn(clippy::collapsible_if)]` on by default [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 134 ~ if response.status().is_success() [INFO] [stdout] 135 ~ && let Some(claims) = claims { [INFO] [stdout] 136 | let pool = state.pool.clone(); [INFO] [stdout] ... [INFO] [stdout] 159 | }); [INFO] [stdout] 160 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: doc list item without indentation [INFO] [stdout] --> crates/badge-admin-service/src/middleware/audit.rs:234:5 [INFO] [stdout] | [INFO] [stdout] 234 | /// 上述字段在写入前通过 FieldEncryptor 加密,passthrough 模式下不加密。 [INFO] [stdout] | ^ [INFO] [stdout] | [INFO] [stdout] = help: if this is supposed to be its own paragraph, add a blank line [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#doc_lazy_continuation [INFO] [stdout] = note: `#[warn(clippy::doc_lazy_continuation)]` on by default [INFO] [stdout] help: indent this line [INFO] [stdout] | [INFO] [stdout] 234 | /// 上述字段在写入前通过 FieldEncryptor 加密,passthrough 模式下不加密。 [INFO] [stdout] | ++ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this function has too many arguments (12/7) [INFO] [stdout] --> crates/badge-admin-service/src/middleware/audit.rs:235:1 [INFO] [stdout] | [INFO] [stdout] 235 | / async fn write_audit_log( [INFO] [stdout] 236 | | pool: &PgPool, [INFO] [stdout] 237 | | encryptor: &FieldEncryptor, [INFO] [stdout] 238 | | operator_id: &str, [INFO] [stdout] ... | [INFO] [stdout] 247 | | request_body: Option<&str>, [INFO] [stdout] 248 | | ) { [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#too_many_arguments [INFO] [stdout] = note: `#[warn(clippy::too_many_arguments)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> crates/badge-admin-service/src/middleware/audit.rs:257:44 [INFO] [stdout] | [INFO] [stdout] 257 | encryptor.encrypt_json(v).ok().map(|s| serde_json::Value::String(s)) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the tuple variant itself: `serde_json::Value::String` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] = note: `#[warn(clippy::redundant_closure)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> crates/badge-admin-service/src/middleware/audit.rs:261:44 [INFO] [stdout] | [INFO] [stdout] 261 | encryptor.encrypt_json(v).ok().map(|s| serde_json::Value::String(s)) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the tuple variant itself: `serde_json::Value::String` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual checked division [INFO] [stdout] --> crates/badge-admin-service/src/worker/batch_task_worker.rs:312:31 [INFO] [stdout] | [INFO] [stdout] 312 | let progress = if total > 0 { [INFO] [stdout] | ^^^^^^^^^ check performed here [INFO] [stdout] 313 | ((processed * 100) / total).min(100) as i32 [INFO] [stdout] | --------------------------- division performed here [INFO] [stdout] | [INFO] [stdout] = help: consider using `checked_div` [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_checked_ops [INFO] [stdout] = note: `#[warn(clippy::manual_checked_ops)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> crates/badge-admin-service/src/middleware/api_key_auth.rs:123:5 [INFO] [stdout] | [INFO] [stdout] 123 | / if let Some(limit) = rate_limit { [INFO] [stdout] 124 | | if limit > 0 { [INFO] [stdout] 125 | | if let Err(resp) = check_rate_limit(cache, key_id, limit).await { [INFO] [stdout] 126 | | return Err(resp); [INFO] [stdout] ... | [INFO] [stdout] 129 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 123 ~ if let Some(limit) = rate_limit [INFO] [stdout] 124 ~ && limit > 0 { [INFO] [stdout] 125 | if let Err(resp) = check_rate_limit(cache, key_id, limit).await { [INFO] [stdout] 126 | return Err(resp); [INFO] [stdout] 127 | } [INFO] [stdout] 128 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> crates/badge-admin-service/src/middleware/api_key_auth.rs:124:9 [INFO] [stdout] | [INFO] [stdout] 124 | / if limit > 0 { [INFO] [stdout] 125 | | if let Err(resp) = check_rate_limit(cache, key_id, limit).await { [INFO] [stdout] 126 | | return Err(resp); [INFO] [stdout] 127 | | } [INFO] [stdout] 128 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 124 ~ if limit > 0 [INFO] [stdout] 125 ~ && let Err(resp) = check_rate_limit(cache, key_id, limit).await { [INFO] [stdout] 126 | return Err(resp); [INFO] [stdout] 127 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this block may be rewritten with the `?` operator [INFO] [stdout] --> crates/badge-admin-service/src/middleware/api_key_auth.rs:125:13 [INFO] [stdout] | [INFO] [stdout] 125 | / if let Err(resp) = check_rate_limit(cache, key_id, limit).await { [INFO] [stdout] 126 | | return Err(resp); [INFO] [stdout] 127 | | } [INFO] [stdout] | |_____________^ help: replace it with: `check_rate_limit(cache, key_id, limit).await?` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#question_mark [INFO] [stdout] = note: `#[warn(clippy::question_mark)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> crates/badge-admin-service/src/middleware/api_key_auth.rs:175:9 [INFO] [stdout] | [INFO] [stdout] 175 | return; [INFO] [stdout] | ^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] = note: `#[warn(clippy::needless_return)]` on by default [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 174 - warn!(error = %e, key_id = key_id, "Redis rate limit check failed, allowing request"); [INFO] [stdout] 175 - return; [INFO] [stdout] 174 + warn!(error = %e, key_id = key_id, "Redis rate limit check failed, allowing request"); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> crates/badge-admin-service/src/middleware/api_key_auth.rs:185:5 [INFO] [stdout] | [INFO] [stdout] 185 | / if current == 1 { [INFO] [stdout] 186 | | if let Err(e) = cache.expire(&rate_key, Duration::from_secs(60)).await { [INFO] [stdout] 187 | | warn!(error = %e, "Failed to set rate limit key TTL"); [INFO] [stdout] 188 | | } [INFO] [stdout] 189 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 185 ~ if current == 1 [INFO] [stdout] 186 ~ && let Err(e) = cache.expire(&rate_key, Duration::from_secs(60)).await { [INFO] [stdout] 187 | warn!(error = %e, "Failed to set rate limit key TTL"); [INFO] [stdout] 188 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> crates/badge-admin-service/src/worker/batch_task_worker.rs:620:9 [INFO] [stdout] | [INFO] [stdout] 620 | / if let Some(content_length) = head_resp.headers() [INFO] [stdout] 621 | | .get(reqwest::header::CONTENT_LENGTH) [INFO] [stdout] 622 | | .and_then(|v| v.to_str().ok()) [INFO] [stdout] 623 | | .and_then(|v| v.parse::().ok()) [INFO] [stdout] ... | [INFO] [stdout] 632 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 623 ~ .and_then(|v| v.parse::().ok()) [INFO] [stdout] 624 ~ && content_length > self.max_file_size { [INFO] [stdout] 625 | return Err(format!( [INFO] [stdout] ... [INFO] [stdout] 629 | )); [INFO] [stdout] 630 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the following explicit lifetimes could be elided: 'a [INFO] [stdout] --> crates/badge-admin-service/src/middleware/rate_limit.rs:192:24 [INFO] [stdout] | [INFO] [stdout] 192 | fn classify_rate_limit<'a>(path: &str, method: &Method, config: &'a RateLimitConfig) -> RateLimit { [INFO] [stdout] | ^^ ^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_lifetimes [INFO] [stdout] = note: `#[warn(clippy::needless_lifetimes)]` on by default [INFO] [stdout] help: elide the lifetimes [INFO] [stdout] | [INFO] [stdout] 192 - fn classify_rate_limit<'a>(path: &str, method: &Method, config: &'a RateLimitConfig) -> RateLimit { [INFO] [stdout] 192 + fn classify_rate_limit(path: &str, method: &Method, config: &RateLimitConfig) -> RateLimit { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual checked division [INFO] [stdout] --> crates/badge-admin-service/src/worker/batch_task_worker.rs:312:31 [INFO] [stdout] | [INFO] [stdout] 312 | let progress = if total > 0 { [INFO] [stdout] | ^^^^^^^^^ check performed here [INFO] [stdout] 313 | ((processed * 100) / total).min(100) as i32 [INFO] [stdout] | --------------------------- division performed here [INFO] [stdout] | [INFO] [stdout] = help: consider using `checked_div` [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_checked_ops [INFO] [stdout] = note: `#[warn(clippy::manual_checked_ops)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> crates/badge-admin-service/src/worker/batch_task_worker.rs:620:9 [INFO] [stdout] | [INFO] [stdout] 620 | / if let Some(content_length) = head_resp.headers() [INFO] [stdout] 621 | | .get(reqwest::header::CONTENT_LENGTH) [INFO] [stdout] 622 | | .and_then(|v| v.to_str().ok()) [INFO] [stdout] 623 | | .and_then(|v| v.parse::().ok()) [INFO] [stdout] ... | [INFO] [stdout] 632 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 623 ~ .and_then(|v| v.parse::().ok()) [INFO] [stdout] 624 ~ && content_length > self.max_file_size { [INFO] [stdout] 625 | return Err(format!( [INFO] [stdout] ... [INFO] [stdout] 629 | )); [INFO] [stdout] 630 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: useless use of `vec!` [INFO] [stdout] --> crates/badge-admin-service/src/middleware/permission.rs:99:27 [INFO] [stdout] | [INFO] [stdout] 99 | let permissions = vec![ [INFO] [stdout] | ___________________________^ [INFO] [stdout] 100 | | "system:user:read".to_string(), [INFO] [stdout] 101 | | "badge:badge:write".to_string(), [INFO] [stdout] 102 | | ]; [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_vec [INFO] [stdout] = note: `#[warn(clippy::useless_vec)]` on by default [INFO] [stdout] help: you can use an array directly [INFO] [stdout] | [INFO] [stdout] 99 ~ let permissions = ["system:user:read".to_string(), [INFO] [stdout] 100 ~ "badge:badge:write".to_string()]; [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 2m 49s [INFO] running `Command { std: "docker" "inspect" "2e95a8a2a4c268787c4db19a8a11e5c65525ad9457ccdf42eaa7c648407d727c", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "2e95a8a2a4c268787c4db19a8a11e5c65525ad9457ccdf42eaa7c648407d727c", kill_on_drop: false }` [INFO] [stdout] 2e95a8a2a4c268787c4db19a8a11e5c65525ad9457ccdf42eaa7c648407d727c