[INFO] cloning repository https://github.com/YunlongChen/cloud_disk_sync [INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/YunlongChen/cloud_disk_sync" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FYunlongChen%2Fcloud_disk_sync", kill_on_drop: false }` [INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FYunlongChen%2Fcloud_disk_sync'... [INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }` [INFO] [stdout] 9c71a88f7b35f60838fc8856b42588cb1f57b3cc [INFO] linting YunlongChen/cloud_disk_sync against nightly for clippy-nonminimal_bool-denied [INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FYunlongChen%2Fcloud_disk_sync" "/workspace/builds/worker-2-tc1/source", kill_on_drop: false }` [INFO] [stderr] Cloning into '/workspace/builds/worker-2-tc1/source'... [INFO] [stderr] done. [INFO] started tweaking git repo https://github.com/YunlongChen/cloud_disk_sync [INFO] finished tweaking git repo https://github.com/YunlongChen/cloud_disk_sync [INFO] tweaked toml for git repo https://github.com/YunlongChen/cloud_disk_sync written to /workspace/builds/worker-2-tc1/source/Cargo.toml [INFO] validating manifest of git repo https://github.com/YunlongChen/cloud_disk_sync 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/YunlongChen/cloud_disk_sync 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 winfsp v0.12.4+winfsp-2.1 [INFO] [stderr] Downloaded block-buffer v0.11.0-rc.5 [INFO] [stderr] Downloaded page_size v0.6.0 [INFO] [stderr] Downloaded phf_shared v0.12.1 [INFO] [stderr] Downloaded shell-words v1.1.1 [INFO] [stderr] Downloaded crypto-common v0.2.0-rc.4 [INFO] [stderr] Downloaded derive_builder_macro v0.20.2 [INFO] [stderr] Downloaded dirs-sys v0.5.0 [INFO] [stderr] Downloaded fs2 v0.4.3 [INFO] [stderr] Downloaded pbkdf2 v0.13.0-rc.1 [INFO] [stderr] Downloaded digest v0.11.0-rc.3 [INFO] [stderr] Downloaded cron v0.15.0 [INFO] [stderr] Downloaded term v0.7.0 [INFO] [stderr] Downloaded clap_complete v4.5.65 [INFO] [stderr] Downloaded qrcode v0.14.1 [INFO] [stderr] Downloaded fuser v0.15.1 [INFO] [stderr] Downloaded cc v1.2.52 [INFO] [stderr] Downloaded rpassword v7.4.0 [INFO] [stderr] Downloaded croner v3.0.1 [INFO] [stderr] Downloaded winnow v0.6.26 [INFO] [stderr] Downloaded reqwest v0.13.1 [INFO] [stderr] Downloaded quick-xml v0.39.0 [INFO] [stderr] Downloaded rusqlite v0.38.0 [INFO] [stderr] Downloaded sysinfo v0.37.2 [INFO] [stderr] Downloaded objc2-io-kit v0.3.2 [INFO] [stderr] Downloaded bindgen v0.72.1 [INFO] [stderr] Downloaded tokio-cron-scheduler v0.15.1 [INFO] [stderr] Downloaded hmac v0.13.0-rc.2 [INFO] [stderr] Downloaded bytemuck v1.24.0 [INFO] [stderr] Downloaded prettytable v0.10.0 [INFO] [stderr] Downloaded qr2term v0.3.3 [INFO] [stderr] Downloaded rlimit v0.10.2 [INFO] [stderr] Downloaded derive_builder v0.20.2 [INFO] [stderr] Downloaded warp v0.4.2 [INFO] [stderr] Downloaded widestring v1.2.1 [INFO] [stderr] Downloaded winfsp-sys v0.12.1+winfsp-2.1 [INFO] [stderr] Downloaded dialoguer v0.12.0 [INFO] [stderr] Downloaded redox_users v0.5.2 [INFO] [stderr] Downloaded dirs v6.0.0 [INFO] [stderr] Downloaded hybrid-array v0.4.5 [INFO] [stderr] Downloaded hashlink v0.11.0 [INFO] [stderr] Downloaded phf v0.12.1 [INFO] [stderr] Downloaded find-msvc-tools v0.1.7 [INFO] [stderr] Downloaded derive_builder_core v0.20.2 [INFO] [stderr] Downloaded unicase v2.9.0 [INFO] [stderr] Downloaded zmij v1.0.14 [INFO] [stderr] Downloaded rtoolbox v0.0.3 [INFO] [stderr] Downloaded chrono-tz v0.10.4 [INFO] [stderr] Downloaded libsqlite3-sys v0.36.0 [INFO] [stderr] Downloaded sqlite-wasm-rs v0.5.1 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-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] 14fd72f7d4872c3ed26e8e9380cd11f54837e5bf7c6856111486ff30a1ffdfcc [INFO] running `Command { std: "docker" "start" "-a" "14fd72f7d4872c3ed26e8e9380cd11f54837e5bf7c6856111486ff30a1ffdfcc", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "14fd72f7d4872c3ed26e8e9380cd11f54837e5bf7c6856111486ff30a1ffdfcc", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "14fd72f7d4872c3ed26e8e9380cd11f54837e5bf7c6856111486ff30a1ffdfcc", kill_on_drop: false }` [INFO] [stdout] 14fd72f7d4872c3ed26e8e9380cd11f54837e5bf7c6856111486ff30a1ffdfcc [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-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] d84e0fcc3304d5f5da5ed568d674a5908427f31736a00532ed314e167a57e369 [INFO] running `Command { std: "docker" "start" "-a" "d84e0fcc3304d5f5da5ed568d674a5908427f31736a00532ed314e167a57e369", kill_on_drop: false }` [INFO] [stderr] Compiling syn v2.0.114 [INFO] [stderr] Compiling libc v0.2.180 [INFO] [stderr] Compiling typenum v1.19.0 [INFO] [stderr] Compiling find-msvc-tools v0.1.7 [INFO] [stderr] Checking foldhash v0.2.0 [INFO] [stderr] Compiling strsim v0.11.1 [INFO] [stderr] Compiling serde_core v1.0.228 [INFO] [stderr] Checking ryu v1.0.22 [INFO] [stderr] Checking hashbrown v0.16.1 [INFO] [stderr] Compiling cc v1.2.52 [INFO] [stderr] Checking http v1.4.0 [INFO] [stderr] Compiling rustversion v1.0.22 [INFO] [stderr] Checking unicode-width v0.2.2 [INFO] [stderr] Checking indexmap v2.13.0 [INFO] [stderr] Checking generic-array v0.14.7 [INFO] [stderr] Checking http-body v1.0.1 [INFO] [stderr] Compiling rustix v1.1.3 [INFO] [stderr] Checking itertools v0.14.0 [INFO] [stderr] Checking castaway v0.2.4 [INFO] [stderr] Compiling instability v0.3.11 [INFO] [stderr] Compiling signal-hook v0.3.18 [INFO] [stderr] Checking foreign-types-shared v0.1.1 [INFO] [stderr] Compiling openssl v0.10.75 [INFO] [stderr] Compiling unicode-segmentation v1.12.0 [INFO] [stderr] Compiling indoc v2.0.7 [INFO] [stderr] Checking compact_str v0.9.0 [INFO] [stderr] Checking parking_lot_core v0.9.12 [INFO] [stderr] Checking errno v0.3.14 [INFO] [stderr] Checking parking_lot v0.12.5 [INFO] [stderr] Checking signal-hook-registry v1.4.8 [INFO] [stderr] Checking mio v1.1.1 [INFO] [stderr] Checking getrandom v0.2.17 [INFO] [stderr] Checking socket2 v0.6.1 [INFO] [stderr] Checking getrandom v0.3.4 [INFO] [stderr] Compiling convert_case v0.10.0 [INFO] [stderr] Checking rand_core v0.6.4 [INFO] [stderr] Checking crypto-common v0.1.7 [INFO] [stderr] Checking block-buffer v0.10.4 [INFO] [stderr] Compiling openssl-sys v0.9.111 [INFO] [stderr] Checking foreign-types v0.3.2 [INFO] [stderr] Checking hybrid-array v0.4.5 [INFO] [stderr] Checking lru v0.16.3 [INFO] [stderr] Compiling native-tls v0.2.14 [INFO] [stderr] Compiling zerocopy v0.8.33 [INFO] [stderr] Compiling zmij v1.0.14 [INFO] [stderr] Checking deranged v0.5.5 [INFO] [stderr] Checking digest v0.10.7 [INFO] [stderr] Checking inout v0.1.4 [INFO] [stderr] Checking time-core v0.1.7 [INFO] [stderr] Compiling serde_json v1.0.149 [INFO] [stderr] Checking num_threads v0.1.7 [INFO] [stderr] Compiling litrs v1.0.0 [INFO] [stderr] Checking siphasher v1.0.1 [INFO] [stderr] Checking signal-hook-mio v0.2.5 [INFO] [stderr] Checking cipher v0.4.4 [INFO] [stderr] Checking phf_shared v0.12.1 [INFO] [stderr] Checking crypto-common v0.2.0-rc.4 [INFO] [stderr] Checking block-buffer v0.11.0-rc.5 [INFO] [stderr] Checking unicode-truncate v2.0.1 [INFO] [stderr] Compiling synstructure v0.13.2 [INFO] [stderr] Compiling darling_core v0.23.0 [INFO] [stderr] Compiling darling_core v0.20.11 [INFO] [stderr] Compiling document-features v0.2.12 [INFO] [stderr] Checking time v0.3.45 [INFO] [stderr] Checking universal-hash v0.5.1 [INFO] [stderr] Compiling libsqlite3-sys v0.36.0 [INFO] [stderr] Checking dirs-sys-next v0.1.2 [INFO] [stderr] Checking http-body-util v0.1.3 [INFO] [stderr] Checking line-clipping v0.3.5 [INFO] [stderr] Compiling chrono-tz v0.10.4 [INFO] [stderr] Checking clap_lex v0.7.7 [INFO] [stderr] Compiling portable-atomic v1.13.0 [INFO] [stderr] Checking polyval v0.6.2 [INFO] [stderr] Checking clap_builder v4.5.54 [INFO] [stderr] Checking regex-automata v0.4.13 [INFO] [stderr] Checking rustix v0.38.44 [INFO] [stderr] Compiling zerofrom-derive v0.1.6 [INFO] [stderr] Compiling yoke-derive v0.8.1 [INFO] [stderr] Compiling tokio-macros v2.6.0 [INFO] [stderr] Compiling zerovec-derive v0.11.2 [INFO] [stderr] Checking zerofrom v0.1.6 [INFO] [stderr] Compiling displaydoc v0.2.5 [INFO] [stderr] Checking tokio v1.49.0 [INFO] [stderr] Checking yoke v0.8.1 [INFO] [stderr] Compiling serde_derive v1.0.228 [INFO] [stderr] Compiling tracing-attributes v0.1.31 [INFO] [stderr] Compiling futures-macro v0.3.31 [INFO] [stderr] Compiling strum_macros v0.27.2 [INFO] [stderr] Checking zerotrie v0.2.3 [INFO] [stderr] Compiling thiserror-impl v2.0.17 [INFO] [stderr] Checking futures-util v0.3.31 [INFO] [stderr] Checking zerovec v0.11.5 [INFO] [stderr] Checking tracing v0.1.44 [INFO] [stderr] Compiling darling_macro v0.20.11 [INFO] [stderr] Checking tinystr v0.8.2 [INFO] [stderr] Checking icu_locale_core v2.1.1 [INFO] [stderr] Checking potential_utf v0.1.4 [INFO] [stderr] Checking icu_collections v2.1.1 [INFO] [stderr] Checking thiserror v2.0.17 [INFO] [stderr] Compiling darling_macro v0.23.0 [INFO] [stderr] Checking kasuari v0.4.11 [INFO] [stderr] Compiling darling v0.23.0 [INFO] [stderr] Compiling darling v0.20.11 [INFO] [stderr] Compiling openssl-macros v0.1.1 [INFO] [stderr] Compiling derive_builder_core v0.20.2 [INFO] [stderr] Checking icu_provider v2.1.1 [INFO] [stderr] Checking icu_properties v2.1.2 [INFO] [stderr] Checking strum v0.27.2 [INFO] [stderr] Checking ratatui-core v0.1.0 [INFO] [stderr] Checking icu_normalizer v2.1.1 [INFO] [stderr] Checking serde v1.0.228 [INFO] [stderr] Compiling derive_more-impl v2.1.1 [INFO] [stderr] Checking idna_adapter v1.2.1 [INFO] [stderr] Compiling derive_builder_macro v0.20.2 [INFO] [stderr] Checking ratatui-widgets v0.3.0 [INFO] [stderr] Checking idna v1.1.0 [INFO] [stderr] Checking chrono v0.4.42 [INFO] [stderr] Checking derive_builder v0.20.2 [INFO] [stderr] Checking serde_urlencoded v0.7.1 [INFO] [stderr] Checking ppv-lite86 v0.2.21 [INFO] [stderr] Compiling clap_derive v4.5.49 [INFO] [stderr] Checking derive_more v2.1.1 [INFO] [stderr] Checking crossterm v0.29.0 [INFO] [stderr] Checking dirs-next v2.0.0 [INFO] [stderr] Checking tokio-util v0.7.18 [INFO] [stderr] Checking tower v0.5.3 [INFO] [stderr] Checking digest v0.11.0-rc.3 [INFO] [stderr] Checking phf v0.12.1 [INFO] [stderr] Compiling sys-info v0.9.1 [INFO] [stderr] Checking h2 v0.4.13 [INFO] [stderr] Checking rand_core v0.9.5 [INFO] [stderr] Checking console v0.16.2 [INFO] [stderr] Checking csv-core v0.1.13 [INFO] [stderr] Compiling tokio-cron-scheduler v0.15.1 [INFO] [stderr] Checking iri-string v0.7.10 [INFO] [stderr] Compiling unicase v2.9.0 [INFO] [stderr] Compiling rlimit v0.10.2 [INFO] [stderr] Checking tempfile v3.24.0 [INFO] [stderr] Compiling mime_guess v2.0.5 [INFO] [stderr] Checking dirs-sys v0.5.0 [INFO] [stderr] Checking tokio-native-tls v0.3.1 [INFO] [stderr] Checking rand_chacha v0.9.0 [INFO] [stderr] Checking csv v1.4.0 [INFO] [stderr] Checking ratatui-crossterm v0.1.0 [INFO] [stderr] Checking hmac v0.13.0-rc.2 [INFO] [stderr] Checking croner v3.0.1 [INFO] [stderr] Checking ratatui-macros v0.7.0 [INFO] [stderr] Checking term v0.7.0 [INFO] [stderr] Checking url v2.5.8 [INFO] [stderr] Checking clap v4.5.54 [INFO] [stderr] Checking futures-executor v0.3.31 [INFO] [stderr] Checking matchers v0.2.0 [INFO] [stderr] Checking crossterm v0.28.1 [INFO] [stderr] Compiling num-derive v0.4.2 [INFO] [stderr] Checking ghash v0.5.1 [INFO] [stderr] Checking rustls-pki-types v1.13.2 [INFO] [stderr] Checking aes v0.8.4 [INFO] [stderr] Checking tower-http v0.6.8 [INFO] [stderr] Checking ctr v0.9.2 [INFO] [stderr] Checking aead v0.5.2 [INFO] [stderr] Checking uuid v1.19.0 [INFO] [stderr] Checking rtoolbox v0.0.3 [INFO] [stderr] Checking is-terminal v0.4.17 [INFO] [stderr] Checking hashlink v0.11.0 [INFO] [stderr] Checking qrcode v0.14.1 [INFO] [stderr] Checking hashbrown v0.14.5 [INFO] [stderr] Checking fallible-iterator v0.3.0 [INFO] [stderr] Checking encode_unicode v1.0.0 [INFO] [stderr] Checking shell-words v1.1.1 [INFO] [stderr] Checking fallible-streaming-iterator v0.1.9 [INFO] [stderr] Checking unit-prefix v0.5.2 [INFO] [stderr] Checking winnow v0.6.26 [INFO] [stderr] Checking unsafe-libyaml v0.2.11 [INFO] [stderr] Checking indicatif v0.18.3 [INFO] [stderr] Checking prettytable v0.10.0 [INFO] [stderr] Checking dashmap v6.1.0 [INFO] [stderr] Checking dialoguer v0.12.0 [INFO] [stderr] Checking tracing-subscriber v0.3.22 [INFO] [stderr] Checking qr2term v0.3.3 [INFO] [stderr] Checking aes-gcm v0.10.3 [INFO] [stderr] Checking serde_yaml v0.9.34+deprecated [INFO] [stderr] Checking rpassword v7.4.0 [INFO] [stderr] Checking futures v0.3.31 [INFO] [stderr] Checking clap_complete v4.5.65 [INFO] [stderr] Checking ratatui v0.30.0 [INFO] [stderr] Checking pbkdf2 v0.13.0-rc.1 [INFO] [stderr] Checking rand v0.9.2 [INFO] [stderr] Checking dirs v6.0.0 [INFO] [stderr] Compiling async-trait v0.1.89 [INFO] [stderr] Checking rusqlite v0.38.0 [INFO] [stderr] Checking cron v0.15.0 [INFO] [stderr] Compiling pin-project-internal v1.1.10 [INFO] [stderr] Checking sha1 v0.10.6 [INFO] [stderr] Checking sha2 v0.10.9 [INFO] [stderr] Checking fs2 v0.4.3 [INFO] [stderr] Checking sysinfo v0.37.2 [INFO] [stderr] Checking headers-core v0.3.0 [INFO] [stderr] Checking quick-xml v0.39.0 [INFO] [stderr] Checking hyper v1.8.1 [INFO] [stderr] Checking urlencoding v2.1.3 [INFO] [stderr] Checking headers v0.4.1 [INFO] [stderr] Checking scoped-tls v1.0.1 [INFO] [stderr] Checking pin-project v1.1.10 [INFO] [stderr] Checking hyper-util v0.1.19 [INFO] [stderr] Checking hyper-tls v0.6.0 [INFO] [stderr] Checking warp v0.4.2 [INFO] [stderr] Checking reqwest v0.13.1 [INFO] [stderr] Checking cloud-disk-sync v0.1.0 (/opt/rustwide/workdir) [INFO] [stdout] warning: unused import: `rand::Rng` [INFO] [stdout] --> src/core/retry.rs:3:5 [INFO] [stdout] | [INFO] [stdout] 3 | use rand::Rng; [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `TimeZone` [INFO] [stdout] --> src/core/scheduler.rs:6:24 [INFO] [stdout] | [INFO] [stdout] 6 | use chrono::{DateTime, TimeZone, Utc}; [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `rand::Rng` [INFO] [stdout] --> src/core/retry.rs:3:5 [INFO] [stdout] | [INFO] [stdout] 3 | use rand::Rng; [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `TimeZone` [INFO] [stdout] --> src/core/scheduler.rs:6:24 [INFO] [stdout] | [INFO] [stdout] 6 | use chrono::{DateTime, TimeZone, Utc}; [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: value assigned to `d` is never read [INFO] [stdout] --> src/sync/engine.rs:806:37 [INFO] [stdout] | [INFO] [stdout] 806 | let mut d = FileDiff::unchanged( [INFO] [stdout] | _____________________________________^ [INFO] [stdout] 807 | | path.clone(), [INFO] [stdout] 808 | | crate::sync::diff::FileMetadata::new(std::path::PathBuf::from(&path)), [INFO] [stdout] 809 | | t.clone(), [INFO] [stdout] 810 | | ); [INFO] [stdout] | |_________________________^ [INFO] [stdout] | [INFO] [stdout] = help: maybe it is overwritten before being read? [INFO] [stdout] = note: `#[warn(unused_assignments)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: type `core::health::TempStorageHealth` is more private than the item `core::health::StorageHealth::temp_storage` [INFO] [stdout] --> src/core/health.rs:133:5 [INFO] [stdout] | [INFO] [stdout] 133 | pub temp_storage: TempStorageHealth, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ field `core::health::StorageHealth::temp_storage` is reachable at visibility `pub` [INFO] [stdout] | [INFO] [stdout] note: but type `core::health::TempStorageHealth` is only usable at visibility `pub(self)` [INFO] [stdout] --> src/core/health.rs:18:1 [INFO] [stdout] | [INFO] [stdout] 18 | struct TempStorageHealth {} [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] = note: `#[warn(private_interfaces)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: type `sync::ErrorResult` is more private than the item `sync::VerificationResult::errors` [INFO] [stdout] --> src/sync/mod.rs:9:5 [INFO] [stdout] | [INFO] [stdout] 9 | pub errors: Vec, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ field `sync::VerificationResult::errors` is reachable at visibility `pub` [INFO] [stdout] | [INFO] [stdout] note: but type `sync::ErrorResult` is only usable at visibility `pub(self)` [INFO] [stdout] --> src/sync/mod.rs:12:1 [INFO] [stdout] | [INFO] [stdout] 12 | struct ErrorResult {} [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated functions `backup_config`, `restore_config`, and `list_backups` are never used [INFO] [stdout] --> src/config/migrator.rs:45:12 [INFO] [stdout] | [INFO] [stdout] 7 | impl ConfigMigrator { [INFO] [stdout] | ------------------- associated functions in this implementation [INFO] [stdout] ... [INFO] [stdout] 45 | pub fn backup_config(config_path: &std::path::Path) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 62 | pub fn restore_config(config_path: &std::path::Path, backup_name: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 84 | pub fn list_backups(config_path: &std::path::Path) -> Result> { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `key_path` is never read [INFO] [stdout] --> src/config/security.rs:14:5 [INFO] [stdout] | [INFO] [stdout] 13 | pub struct SecurityManager { [INFO] [stdout] | --------------- field in this struct [INFO] [stdout] 14 | key_path: PathBuf, [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ConfigUtils` is never constructed [INFO] [stdout] --> src/config/utils.rs:4:12 [INFO] [stdout] | [INFO] [stdout] 4 | pub struct ConfigUtils; [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated functions are never used [INFO] [stdout] --> src/config/utils.rs:8:12 [INFO] [stdout] | [INFO] [stdout] 6 | impl ConfigUtils { [INFO] [stdout] | ---------------- associated functions in this implementation [INFO] [stdout] 7 | /// 生成默认配置文件 [INFO] [stdout] 8 | pub fn generate_default_config() -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 14 | pub fn validate_config_syntax(content: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 21 | pub fn find_config_files() -> Vec { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 51 | pub fn merge_configs(configs: &[super::ConfigFile]) -> super::ConfigFile { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 82 | pub fn load_from_env() -> super::ConfigFile { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 120 | pub fn generate_template(template_type: ConfigTemplate) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 198 | pub fn diff_configs(config1: &super::ConfigFile, config2: &super::ConfigFile) -> ConfigDiff { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enum `ConfigTemplate` is never used [INFO] [stdout] --> src/config/utils.rs:236:10 [INFO] [stdout] | [INFO] [stdout] 236 | pub enum ConfigTemplate { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ConfigDiff` is never constructed [INFO] [stdout] --> src/config/utils.rs:244:12 [INFO] [stdout] | [INFO] [stdout] 244 | pub struct ConfigDiff { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `new` and `has_changes` are never used [INFO] [stdout] --> src/config/utils.rs:253:12 [INFO] [stdout] | [INFO] [stdout] 252 | impl ConfigDiff { [INFO] [stdout] | --------------- associated items in this implementation [INFO] [stdout] 253 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 263 | pub fn has_changes(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ConfigValidatorImpl` is never constructed [INFO] [stdout] --> src/config/validator.rs:5:12 [INFO] [stdout] | [INFO] [stdout] 5 | pub struct ConfigValidatorImpl; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `is_valid_cron` is never used [INFO] [stdout] --> src/config/validator.rs:124:4 [INFO] [stdout] | [INFO] [stdout] 124 | fn is_valid_cron(expr: &str) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `DatabaseAuditLogger` is never constructed [INFO] [stdout] --> src/core/audit.rs:52:12 [INFO] [stdout] | [INFO] [stdout] 52 | pub struct DatabaseAuditLogger { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated function `new` is never used [INFO] [stdout] --> src/core/audit.rs:57:12 [INFO] [stdout] | [INFO] [stdout] 56 | impl DatabaseAuditLogger { [INFO] [stdout] | ------------------------ associated function in this implementation [INFO] [stdout] 57 | pub fn new(db_path: &std::path::Path) -> Result { [INFO] [stdout] | ^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `HealthCheckerImpl` is never constructed [INFO] [stdout] --> src/core/health.rs:7:12 [INFO] [stdout] | [INFO] [stdout] 7 | pub struct HealthCheckerImpl { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated function `new` is never used [INFO] [stdout] --> src/core/health.rs:12:12 [INFO] [stdout] | [INFO] [stdout] 11 | impl HealthCheckerImpl { [INFO] [stdout] | ---------------------- associated function in this implementation [INFO] [stdout] 12 | pub fn new(providers: HashMap>) -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `semaphore` is never read [INFO] [stdout] --> src/core/rate_limit.rs:15:5 [INFO] [stdout] | [INFO] [stdout] 10 | pub struct TokenBucketRateLimiter { [INFO] [stdout] | ---------------------- field in this struct [INFO] [stdout] ... [INFO] [stdout] 15 | semaphore: Arc, [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ResourceManagerImpl` is never constructed [INFO] [stdout] --> src/core/resources.rs:295:12 [INFO] [stdout] | [INFO] [stdout] 295 | pub struct ResourceManagerImpl { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/core/resources.rs:306:12 [INFO] [stdout] | [INFO] [stdout] 305 | impl ResourceManagerImpl { [INFO] [stdout] | ------------------------ associated items in this implementation [INFO] [stdout] 306 | pub fn new(limits: ResourceLimits) -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 320 | pub fn allocate_memory(&self, size: usize) -> Result { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 351 | pub fn allocate_disk(&self, size: u64) -> Result { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 397 | pub fn deallocate_memory(&self, handle_id: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 413 | pub fn deallocate_disk(&self, handle_id: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 433 | pub fn current_usage(&self) -> ResourceUsage { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 461 | pub fn set_limits(&self, limits: ResourceLimits) { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 466 | pub fn start_task(&self) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 482 | pub fn end_task(&self) { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 486 | pub fn cleanup_old_resources(&self, max_age: Duration) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ExponentialBackoffRetry` is never constructed [INFO] [stdout] --> src/core/retry.rs:7:12 [INFO] [stdout] | [INFO] [stdout] 7 | pub struct ExponentialBackoffRetry { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated functions `new` and `builder` are never used [INFO] [stdout] --> src/core/retry.rs:16:12 [INFO] [stdout] | [INFO] [stdout] 15 | impl ExponentialBackoffRetry { [INFO] [stdout] | ---------------------------- associated functions in this implementation [INFO] [stdout] 16 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 32 | pub fn builder() -> ExponentialBackoffRetryBuilder { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ExponentialBackoffRetryBuilder` is never constructed [INFO] [stdout] --> src/core/retry.rs:64:12 [INFO] [stdout] | [INFO] [stdout] 64 | pub struct ExponentialBackoffRetryBuilder { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/core/retry.rs:73:12 [INFO] [stdout] | [INFO] [stdout] 72 | impl ExponentialBackoffRetryBuilder { [INFO] [stdout] | ----------------------------------- associated items in this implementation [INFO] [stdout] 73 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 83 | pub fn max_attempts(mut self, attempts: u32) -> Self { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 88 | pub fn initial_delay(mut self, delay: Duration) -> Self { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 93 | pub fn max_delay(mut self, delay: Duration) -> Self { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 98 | pub fn backoff_factor(mut self, factor: f64) -> Self { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 103 | pub fn retryable_error(mut self, error_code: u32) -> Self { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 108 | pub fn build(self) -> ExponentialBackoffRetry { [INFO] [stdout] | ^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `JitterRetry` is never constructed [INFO] [stdout] --> src/core/retry.rs:120:12 [INFO] [stdout] | [INFO] [stdout] 120 | pub struct JitterRetry { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `new` and `add_jitter` are never used [INFO] [stdout] --> src/core/retry.rs:126:12 [INFO] [stdout] | [INFO] [stdout] 125 | impl JitterRetry { [INFO] [stdout] | ---------------- associated items in this implementation [INFO] [stdout] 126 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 133 | fn add_jitter(&self, delay: Duration) -> Duration { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `SchedulerManager` is never constructed [INFO] [stdout] --> src/core/scheduler.rs:262:12 [INFO] [stdout] | [INFO] [stdout] 262 | pub struct SchedulerManager { [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/core/scheduler.rs:270:18 [INFO] [stdout] | [INFO] [stdout] 269 | impl SchedulerManager { [INFO] [stdout] | --------------------- associated items in this implementation [INFO] [stdout] 270 | pub async fn new(sync_engine: SyncEngine) -> Result { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 285 | pub async fn add_task(&self, mut scheduled_task: ScheduledTask) -> Result<()> { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 309 | async fn schedule_job(&self, scheduled_task: &ScheduledTask) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 367 | async fn execute_task( [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 433 | pub async fn start(&self) -> Result<()> { [INFO] [stdout] | ^^^^^ [INFO] [stdout] ... [INFO] [stdout] 440 | pub async fn stop(&mut self) -> Result<()> { [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 447 | pub async fn get_tasks(&self) -> Vec { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 452 | pub async fn get_task(&self, task_id: &str) -> Option { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 458 | pub async fn delete_task(&self, task_id: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 469 | pub async fn trigger_task(&self, task_id: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 506 | pub async fn pause_task(&self, task_id: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 517 | pub async fn resume_task(&self, task_id: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 528 | pub async fn reschedule_all(&mut self) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 554 | pub async fn get_stats(&self) -> SchedulerStats { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 584 | pub async fn cleanup_completed_tasks(&self, max_age_days: u32) -> Result { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 604 | pub async fn export_tasks(&self, format: ExportFormat) -> Result { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 618 | pub async fn import_tasks(&self, data: &str, format: ExportFormat) -> Result { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 640 | fn tasks_to_csv(tasks: &[ScheduledTask]) -> Result { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `SchedulerStats` is never constructed [INFO] [stdout] --> src/core/scheduler.rs:671:12 [INFO] [stdout] | [INFO] [stdout] 671 | pub struct SchedulerStats { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `new`, `success_rate`, and `health_score` are never used [INFO] [stdout] --> src/core/scheduler.rs:705:12 [INFO] [stdout] | [INFO] [stdout] 704 | impl SchedulerStats { [INFO] [stdout] | ------------------- associated items in this implementation [INFO] [stdout] 705 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 725 | pub fn success_rate(&self) -> f64 { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 733 | pub fn health_score(&self) -> f64 { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enum `ExportFormat` is never used [INFO] [stdout] --> src/core/scheduler.rs:751:10 [INFO] [stdout] | [INFO] [stdout] 751 | pub enum ExportFormat { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `CsvTask` is never constructed [INFO] [stdout] --> src/core/scheduler.rs:759:8 [INFO] [stdout] | [INFO] [stdout] 759 | struct CsvTask<'a> { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `TaskNotifier` is never constructed [INFO] [stdout] --> src/core/scheduler.rs:773:12 [INFO] [stdout] | [INFO] [stdout] 773 | pub struct TaskNotifier { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/core/scheduler.rs:779:12 [INFO] [stdout] | [INFO] [stdout] 778 | impl TaskNotifier { [INFO] [stdout] | ----------------- associated items in this implementation [INFO] [stdout] 779 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 787 | pub async fn notify_task_start(&self, task: &ScheduledTask) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 799 | pub async fn notify_task_complete( [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 819 | pub async fn notify_task_failed( [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 838 | async fn send_notification(&self, message: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 852 | async fn send_email(&self, _config: &EmailConfig, _message: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 858 | async fn send_webhook(&self, url: &str, message: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `EmailConfig` is never constructed [INFO] [stdout] --> src/core/scheduler.rs:873:12 [INFO] [stdout] | [INFO] [stdout] 873 | pub struct EmailConfig { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `cmd_schedule_task` is never used [INFO] [stdout] --> src/core/scheduler.rs:883:14 [INFO] [stdout] | [INFO] [stdout] 883 | pub async fn cmd_schedule_task( [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `cmd_list_scheduled_tasks` is never used [INFO] [stdout] --> src/core/scheduler.rs:922:14 [INFO] [stdout] | [INFO] [stdout] 922 | pub async fn cmd_list_scheduled_tasks(scheduler: &SchedulerManager) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `hooks_by_priority` is never read [INFO] [stdout] --> src/plugins/manager.rs:9:5 [INFO] [stdout] | [INFO] [stdout] 7 | pub struct HookManager { [INFO] [stdout] | ----------- field in this struct [INFO] [stdout] 8 | handlers: HashMap>>, [INFO] [stdout] 9 | hooks_by_priority: HashMap>>, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated function `all_hook_types` is never used [INFO] [stdout] --> src/plugins/manager.rs:51:8 [INFO] [stdout] | [INFO] [stdout] 18 | impl HookManager { [INFO] [stdout] | ---------------- associated function in this implementation [INFO] [stdout] ... [INFO] [stdout] 51 | fn all_hook_types() -> Vec<&'static str> { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: fields `client`, `token`, `refresh_token`, and `rate_limiter` are never read [INFO] [stdout] --> src/providers/aliyun.rs:14:5 [INFO] [stdout] | [INFO] [stdout] 13 | pub struct AliYunDriveProvider { [INFO] [stdout] | ------------------- fields in this struct [INFO] [stdout] 14 | client: reqwest::Client, [INFO] [stdout] | ^^^^^^ [INFO] [stdout] 15 | token: String, [INFO] [stdout] | ^^^^^ [INFO] [stdout] 16 | refresh_token: String, [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] 17 | rate_limiter: Arc, [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `refresh_token_if_needed` is never used [INFO] [stdout] --> src/providers/aliyun.rs:43:14 [INFO] [stdout] | [INFO] [stdout] 20 | impl AliYunDriveProvider { [INFO] [stdout] | ------------------------ method in this implementation [INFO] [stdout] ... [INFO] [stdout] 43 | async fn refresh_token_if_needed(&mut self) -> Result<(), ProviderError> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `diff_cache` is never read [INFO] [stdout] --> src/sync/engine.rs:19:5 [INFO] [stdout] | [INFO] [stdout] 16 | pub struct SyncEngine { [INFO] [stdout] | ---------- field in this struct [INFO] [stdout] ... [INFO] [stdout] 19 | diff_cache: DashMap, [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` can be collapsed into the outer `match` [INFO] [stdout] --> src/config/validator.rs:20:17 [INFO] [stdout] | [INFO] [stdout] 20 | / if !account.credentials.contains_key("refresh_token") { [INFO] [stdout] 21 | | return Err( [INFO] [stdout] 22 | | ConfigError::MissingField("refresh_token for AliYunDrive".into()).into(), [INFO] [stdout] 23 | | ); [INFO] [stdout] 24 | | } [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] 19 ~ ProviderType::AliYunDrive [INFO] [stdout] 20 ~ if !account.credentials.contains_key("refresh_token") => { [INFO] [stdout] 21 | return Err( [INFO] [stdout] 22 | ConfigError::MissingField("refresh_token for AliYunDrive".into()).into(), [INFO] [stdout] 23 | ); [INFO] [stdout] 24 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: explicit call to `.into_iter()` in function argument accepting `IntoIterator` [INFO] [stdout] --> src/core/audit.rs:184:62 [INFO] [stdout] | [INFO] [stdout] 184 | let mut rows = stmt.query(rusqlite::params_from_iter(params.into_iter()))?; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()` [INFO] [stdout] --> /opt/rustwide/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/rusqlite-0.38.0/src/params.rs:431:8 [INFO] [stdout] | [INFO] [stdout] 431 | I: IntoIterator, [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_conversion [INFO] [stdout] = note: `#[warn(clippy::useless_conversion)]` on by default [INFO] [stdout] help: consider removing the `.into_iter()` [INFO] [stdout] | [INFO] [stdout] 184 - let mut rows = stmt.query(rusqlite::params_from_iter(params.into_iter()))?; [INFO] [stdout] 184 + let mut rows = stmt.query(rusqlite::params_from_iter(params))?; [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `TCP` contains a capitalized acronym [INFO] [stdout] --> src/core/health.rs:170:5 [INFO] [stdout] | [INFO] [stdout] 170 | TCP, [INFO] [stdout] | ^^^ help: consider making the acronym lowercase, except the initial letter: `Tcp` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] = note: `#[warn(clippy::upper_case_acronyms)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `UDP` contains a capitalized acronym [INFO] [stdout] --> src/core/health.rs:171:5 [INFO] [stdout] | [INFO] [stdout] 171 | UDP, [INFO] [stdout] | ^^^ help: consider making the acronym lowercase, except the initial letter: `Udp` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `HTTP` contains a capitalized acronym [INFO] [stdout] --> src/core/health.rs:172:5 [INFO] [stdout] | [INFO] [stdout] 172 | HTTP, [INFO] [stdout] | ^^^^ help: consider making the acronym lowercase, except the initial letter: `Http` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `HTTPS` contains a capitalized acronym [INFO] [stdout] --> src/core/health.rs:173:5 [INFO] [stdout] | [INFO] [stdout] 173 | HTTPS, [INFO] [stdout] | ^^^^^ help: consider making the acronym lowercase, except the initial letter: `Https` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: implementation of inherent method `to_string(&self) -> String` for type `core::resources::ResourceUsage` [INFO] [stdout] --> src/core/resources.rs:224:5 [INFO] [stdout] | [INFO] [stdout] 224 | / pub fn to_string(&self) -> String { [INFO] [stdout] 225 | | format!( [INFO] [stdout] 226 | | "Memory: {:.1}% used, Disk: {:.1}% used, CPU: {:.1}%, Tasks: {}/{}", [INFO] [stdout] 227 | | self.memory_percentage, [INFO] [stdout] ... | [INFO] [stdout] 233 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: implement trait `Display` for type `core::resources::ResourceUsage` instead [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#inherent_to_string [INFO] [stdout] = note: `#[warn(clippy::inherent_to_string)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the loop variable `i` is used to index `iv` [INFO] [stdout] --> src/encryption/types.rs:128:18 [INFO] [stdout] | [INFO] [stdout] 128 | for i in 0..8 { [INFO] [stdout] | ^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stdout] = note: `#[warn(clippy::needless_range_loop)]` on by default [INFO] [stdout] help: consider using an iterator and enumerate() [INFO] [stdout] | [INFO] [stdout] 128 - for i in 0..8 { [INFO] [stdout] 128 + for (i, ) in iv.iter_mut().enumerate().take(8) { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the loop variable `i` is used to index `iv` [INFO] [stdout] --> src/encryption/types.rs:141:18 [INFO] [stdout] | [INFO] [stdout] 141 | for i in 0..8 { [INFO] [stdout] | ^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stdout] help: consider using an iterator and enumerate() [INFO] [stdout] | [INFO] [stdout] 141 - for i in 0..8 { [INFO] [stdout] 141 + for (i, ) in iv.iter_mut().enumerate().take(8) { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: match expression looks like `matches!` macro [INFO] [stdout] --> src/error/mod.rs:185:9 [INFO] [stdout] | [INFO] [stdout] 185 | / match self { [INFO] [stdout] 186 | | SyncError::Network(_) [INFO] [stdout] 187 | | | SyncError::Timeout(_) [INFO] [stdout] 188 | | | SyncError::RateLimitExceeded(_) [INFO] [stdout] ... | [INFO] [stdout] 193 | | _ => false, [INFO] [stdout] 194 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_like_matches_macro [INFO] [stdout] = note: `#[warn(clippy::match_like_matches_macro)]` on by default [INFO] [stdout] help: use `matches!` directly [INFO] [stdout] | [INFO] [stdout] 185 ~ matches!(self, SyncError::Network(_) [INFO] [stdout] 186 + | SyncError::Timeout(_) [INFO] [stdout] 187 + | SyncError::RateLimitExceeded(_) [INFO] [stdout] 188 + | SyncError::ResourceExhausted(_) | SyncError::Provider(ProviderError::RateLimited(_)) [INFO] [stdout] 189 + | SyncError::Provider(ProviderError::Timeout(_)) [INFO] [stdout] 190 + | SyncError::Provider(ProviderError::ConnectionFailed(_))) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: match expression looks like `matches!` macro [INFO] [stdout] --> src/error/mod.rs:198:9 [INFO] [stdout] | [INFO] [stdout] 198 | / match self { [INFO] [stdout] 199 | | SyncError::Provider(ProviderError::NotFound(_)) [INFO] [stdout] 200 | | | SyncError::Provider(ProviderError::NotSupported(_)) [INFO] [stdout] 201 | | | SyncError::Provider(ProviderError::InvalidCredentials(_)) [INFO] [stdout] ... | [INFO] [stdout] 206 | | _ => false, [INFO] [stdout] 207 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_like_matches_macro [INFO] [stdout] help: use `matches!` directly [INFO] [stdout] | [INFO] [stdout] 198 ~ matches!(self, SyncError::Provider(ProviderError::NotFound(_)) [INFO] [stdout] 199 + | SyncError::Provider(ProviderError::NotSupported(_)) [INFO] [stdout] 200 + | SyncError::Provider(ProviderError::InvalidCredentials(_)) [INFO] [stdout] 201 + | SyncError::Provider(ProviderError::PermissionDenied(_)) [INFO] [stdout] 202 + | SyncError::Encryption(EncryptionError::KeyNotFound(_)) [INFO] [stdout] 203 + | SyncError::Encryption(EncryptionError::InvalidKey(_)) [INFO] [stdout] 204 + | SyncError::Validation(_)) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: match expression looks like `matches!` macro [INFO] [stdout] --> src/plugins/manager.rs:155:9 [INFO] [stdout] | [INFO] [stdout] 155 | / match hook { [INFO] [stdout] 156 | | PluginHook::PreSync { .. } => true, [INFO] [stdout] 157 | | PluginHook::PostSync { .. } => true, [INFO] [stdout] 158 | | PluginHook::OnError { .. } => true, [INFO] [stdout] 159 | | _ => false, [INFO] [stdout] 160 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_like_matches_macro [INFO] [stdout] help: use `matches!` directly [INFO] [stdout] | [INFO] [stdout] 155 - match hook { [INFO] [stdout] 156 - PluginHook::PreSync { .. } => true, [INFO] [stdout] 157 - PluginHook::PostSync { .. } => true, [INFO] [stdout] 158 - PluginHook::OnError { .. } => true, [INFO] [stdout] 159 - _ => false, [INFO] [stdout] 160 - } [INFO] [stdout] 155 + matches!(hook, PluginHook::PreSync { .. } | PluginHook::PostSync { .. } | PluginHook::OnError { .. }) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&String` instead of `&str` involves a new object where a slice will do [INFO] [stdout] --> src/report/mod.rs:22:54 [INFO] [stdout] | [INFO] [stdout] 22 | pub(crate) fn add_conflict(&mut self, diff_path: &String) { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stdout] = note: `#[warn(clippy::ptr_arg)]` on by default [INFO] [stdout] help: change this to [INFO] [stdout] | [INFO] [stdout] 22 ~ pub(crate) fn add_conflict(&mut self, diff_path: &str) { [INFO] [stdout] 23 | self.statistics.conflicts += 1; [INFO] [stdout] 24 | self.statistics.total_files += 1; [INFO] [stdout] 25 ~ let mut result = FileSyncResult::new(diff_path.to_owned(), FileOperation::Verify); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&String` instead of `&str` involves a new object where a slice will do [INFO] [stdout] --> src/report/mod.rs:30:53 [INFO] [stdout] | [INFO] [stdout] 30 | pub(crate) fn add_success(&mut self, diff_path: &String, diff_size: i64) { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stdout] help: change this to [INFO] [stdout] | [INFO] [stdout] 30 ~ pub(crate) fn add_success(&mut self, diff_path: &str, diff_size: i64) { [INFO] [stdout] 31 ~ let mut result = FileSyncResult::new(diff_path.to_owned(), FileOperation::Upload); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: consider using `sort_by_key` [INFO] [stdout] --> src/sync/diff.rs:716:9 [INFO] [stdout] | [INFO] [stdout] 716 | self.files.sort_by(|a, b| b.priority.cmp(&a.priority)); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_sort_by [INFO] [stdout] = note: `#[warn(clippy::unnecessary_sort_by)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 716 - self.files.sort_by(|a, b| b.priority.cmp(&a.priority)); [INFO] [stdout] 716 + self.files.sort_by_key(|b| std::cmp::Reverse(b.priority)); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual checked division [INFO] [stdout] --> src/sync/diff.rs:1000:48 [INFO] [stdout] | [INFO] [stdout] 1000 | details.change_percentage = if source.size > 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^ check performed here [INFO] [stdout] 1001 | ((source.size.abs_diff(target.size) * 100) / source.size) as u8 [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 boolean expression can be simplified [INFO] [stdout] --> src/sync/diff.rs:1077:20 [INFO] [stdout] | [INFO] [stdout] 1077 | if (has_upload && has_delete) || (has_upload && has_update) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#nonminimal_bool [INFO] [stdout] = note: `#[warn(clippy::nonminimal_bool)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 1077 - if (has_upload && has_delete) || (has_upload && has_update) { [INFO] [stdout] 1077 + if !(!has_upload || !has_delete && !has_update) { [INFO] [stdout] | [INFO] [stdout] 1077 - if (has_upload && has_delete) || (has_upload && has_update) { [INFO] [stdout] 1077 + if (has_update || has_delete) && has_upload { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you seem to be trying to use `&Box`. Consider using just `&T` [INFO] [stdout] --> src/sync/engine.rs:85:60 [INFO] [stdout] | [INFO] [stdout] 85 | pub fn get_provider(&self, account_id: &str) -> Option<&Box> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&dyn StorageProvider` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#borrowed_box [INFO] [stdout] = note: `#[warn(clippy::borrowed_box)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this function has too many arguments (9/7) [INFO] [stdout] --> src/sync/engine.rs:643:5 [INFO] [stdout] | [INFO] [stdout] 643 | / async fn calculate_diff( [INFO] [stdout] 644 | | &self, [INFO] [stdout] 645 | | source: &dyn StorageProvider, [INFO] [stdout] 646 | | target: &dyn StorageProvider, [INFO] [stdout] ... | [INFO] [stdout] 652 | | target_key: &str, [INFO] [stdout] 653 | | ) -> Result { [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: this `MutexGuard` is held across an await point [INFO] [stdout] --> src/sync/engine.rs:856:17 [INFO] [stdout] | [INFO] [stdout] 856 | let conn = self.resume_store.lock().unwrap(); [INFO] [stdout] | ^^^^ [INFO] [stdout] | [INFO] [stdout] = help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling `await` [INFO] [stdout] note: these are all the await points this lock is held through [INFO] [stdout] --> src/sync/engine.rs:866:26 [INFO] [stdout] | [INFO] [stdout] 866 | .await; [INFO] [stdout] | ^^^^^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#await_holding_lock [INFO] [stdout] = note: `#[warn(clippy::await_holding_lock)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: value assigned to `d` is never read [INFO] [stdout] --> src/sync/engine.rs:806:37 [INFO] [stdout] | [INFO] [stdout] 806 | let mut d = FileDiff::unchanged( [INFO] [stdout] | _____________________________________^ [INFO] [stdout] 807 | | path.clone(), [INFO] [stdout] 808 | | crate::sync::diff::FileMetadata::new(std::path::PathBuf::from(&path)), [INFO] [stdout] 809 | | t.clone(), [INFO] [stdout] 810 | | ); [INFO] [stdout] | |_________________________^ [INFO] [stdout] | [INFO] [stdout] = help: maybe it is overwritten before being read? [INFO] [stdout] = note: `#[warn(unused_assignments)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: type `core::health::TempStorageHealth` is more private than the item `core::health::StorageHealth::temp_storage` [INFO] [stdout] --> src/core/health.rs:133:5 [INFO] [stdout] | [INFO] [stdout] 133 | pub temp_storage: TempStorageHealth, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ field `core::health::StorageHealth::temp_storage` is reachable at visibility `pub` [INFO] [stdout] | [INFO] [stdout] note: but type `core::health::TempStorageHealth` is only usable at visibility `pub(self)` [INFO] [stdout] --> src/core/health.rs:18:1 [INFO] [stdout] | [INFO] [stdout] 18 | struct TempStorageHealth {} [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] = note: `#[warn(private_interfaces)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: type `sync::ErrorResult` is more private than the item `sync::VerificationResult::errors` [INFO] [stdout] --> src/sync/mod.rs:9:5 [INFO] [stdout] | [INFO] [stdout] 9 | pub errors: Vec, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ field `sync::VerificationResult::errors` is reachable at visibility `pub` [INFO] [stdout] | [INFO] [stdout] note: but type `sync::ErrorResult` is only usable at visibility `pub(self)` [INFO] [stdout] --> src/sync/mod.rs:12:1 [INFO] [stdout] | [INFO] [stdout] 12 | struct ErrorResult {} [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated functions `backup_config`, `restore_config`, and `list_backups` are never used [INFO] [stdout] --> src/config/migrator.rs:45:12 [INFO] [stdout] | [INFO] [stdout] 7 | impl ConfigMigrator { [INFO] [stdout] | ------------------- associated functions in this implementation [INFO] [stdout] ... [INFO] [stdout] 45 | pub fn backup_config(config_path: &std::path::Path) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 62 | pub fn restore_config(config_path: &std::path::Path, backup_name: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 84 | pub fn list_backups(config_path: &std::path::Path) -> Result> { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `key_path` is never read [INFO] [stdout] --> src/config/security.rs:14:5 [INFO] [stdout] | [INFO] [stdout] 13 | pub struct SecurityManager { [INFO] [stdout] | --------------- field in this struct [INFO] [stdout] 14 | key_path: PathBuf, [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ConfigUtils` is never constructed [INFO] [stdout] --> src/config/utils.rs:4:12 [INFO] [stdout] | [INFO] [stdout] 4 | pub struct ConfigUtils; [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated functions are never used [INFO] [stdout] --> src/config/utils.rs:8:12 [INFO] [stdout] | [INFO] [stdout] 6 | impl ConfigUtils { [INFO] [stdout] | ---------------- associated functions in this implementation [INFO] [stdout] 7 | /// 生成默认配置文件 [INFO] [stdout] 8 | pub fn generate_default_config() -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 14 | pub fn validate_config_syntax(content: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 21 | pub fn find_config_files() -> Vec { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 51 | pub fn merge_configs(configs: &[super::ConfigFile]) -> super::ConfigFile { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 82 | pub fn load_from_env() -> super::ConfigFile { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 120 | pub fn generate_template(template_type: ConfigTemplate) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 198 | pub fn diff_configs(config1: &super::ConfigFile, config2: &super::ConfigFile) -> ConfigDiff { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enum `ConfigTemplate` is never used [INFO] [stdout] --> src/config/utils.rs:236:10 [INFO] [stdout] | [INFO] [stdout] 236 | pub enum ConfigTemplate { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ConfigDiff` is never constructed [INFO] [stdout] --> src/config/utils.rs:244:12 [INFO] [stdout] | [INFO] [stdout] 244 | pub struct ConfigDiff { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `new` and `has_changes` are never used [INFO] [stdout] --> src/config/utils.rs:253:12 [INFO] [stdout] | [INFO] [stdout] 252 | impl ConfigDiff { [INFO] [stdout] | --------------- associated items in this implementation [INFO] [stdout] 253 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 263 | pub fn has_changes(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ConfigValidatorImpl` is never constructed [INFO] [stdout] --> src/config/validator.rs:5:12 [INFO] [stdout] | [INFO] [stdout] 5 | pub struct ConfigValidatorImpl; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `is_valid_cron` is never used [INFO] [stdout] --> src/config/validator.rs:124:4 [INFO] [stdout] | [INFO] [stdout] 124 | fn is_valid_cron(expr: &str) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `DatabaseAuditLogger` is never constructed [INFO] [stdout] --> src/core/audit.rs:52:12 [INFO] [stdout] | [INFO] [stdout] 52 | pub struct DatabaseAuditLogger { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated function `new` is never used [INFO] [stdout] --> src/core/audit.rs:57:12 [INFO] [stdout] | [INFO] [stdout] 56 | impl DatabaseAuditLogger { [INFO] [stdout] | ------------------------ associated function in this implementation [INFO] [stdout] 57 | pub fn new(db_path: &std::path::Path) -> Result { [INFO] [stdout] | ^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `HealthCheckerImpl` is never constructed [INFO] [stdout] --> src/core/health.rs:7:12 [INFO] [stdout] | [INFO] [stdout] 7 | pub struct HealthCheckerImpl { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated function `new` is never used [INFO] [stdout] --> src/core/health.rs:12:12 [INFO] [stdout] | [INFO] [stdout] 11 | impl HealthCheckerImpl { [INFO] [stdout] | ---------------------- associated function in this implementation [INFO] [stdout] 12 | pub fn new(providers: HashMap>) -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `semaphore` is never read [INFO] [stdout] --> src/core/rate_limit.rs:15:5 [INFO] [stdout] | [INFO] [stdout] 10 | pub struct TokenBucketRateLimiter { [INFO] [stdout] | ---------------------- field in this struct [INFO] [stdout] ... [INFO] [stdout] 15 | semaphore: Arc, [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ResourceManagerImpl` is never constructed [INFO] [stdout] --> src/core/resources.rs:295:12 [INFO] [stdout] | [INFO] [stdout] 295 | pub struct ResourceManagerImpl { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/core/resources.rs:306:12 [INFO] [stdout] | [INFO] [stdout] 305 | impl ResourceManagerImpl { [INFO] [stdout] | ------------------------ associated items in this implementation [INFO] [stdout] 306 | pub fn new(limits: ResourceLimits) -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 320 | pub fn allocate_memory(&self, size: usize) -> Result { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 351 | pub fn allocate_disk(&self, size: u64) -> Result { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 397 | pub fn deallocate_memory(&self, handle_id: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 413 | pub fn deallocate_disk(&self, handle_id: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 433 | pub fn current_usage(&self) -> ResourceUsage { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 461 | pub fn set_limits(&self, limits: ResourceLimits) { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 466 | pub fn start_task(&self) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 482 | pub fn end_task(&self) { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 486 | pub fn cleanup_old_resources(&self, max_age: Duration) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ExponentialBackoffRetry` is never constructed [INFO] [stdout] --> src/core/retry.rs:7:12 [INFO] [stdout] | [INFO] [stdout] 7 | pub struct ExponentialBackoffRetry { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated functions `new` and `builder` are never used [INFO] [stdout] --> src/core/retry.rs:16:12 [INFO] [stdout] | [INFO] [stdout] 15 | impl ExponentialBackoffRetry { [INFO] [stdout] | ---------------------------- associated functions in this implementation [INFO] [stdout] 16 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 32 | pub fn builder() -> ExponentialBackoffRetryBuilder { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ExponentialBackoffRetryBuilder` is never constructed [INFO] [stdout] --> src/core/retry.rs:64:12 [INFO] [stdout] | [INFO] [stdout] 64 | pub struct ExponentialBackoffRetryBuilder { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/core/retry.rs:73:12 [INFO] [stdout] | [INFO] [stdout] 72 | impl ExponentialBackoffRetryBuilder { [INFO] [stdout] | ----------------------------------- associated items in this implementation [INFO] [stdout] 73 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 83 | pub fn max_attempts(mut self, attempts: u32) -> Self { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 88 | pub fn initial_delay(mut self, delay: Duration) -> Self { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 93 | pub fn max_delay(mut self, delay: Duration) -> Self { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 98 | pub fn backoff_factor(mut self, factor: f64) -> Self { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 103 | pub fn retryable_error(mut self, error_code: u32) -> Self { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 108 | pub fn build(self) -> ExponentialBackoffRetry { [INFO] [stdout] | ^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `JitterRetry` is never constructed [INFO] [stdout] --> src/core/retry.rs:120:12 [INFO] [stdout] | [INFO] [stdout] 120 | pub struct JitterRetry { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `new` and `add_jitter` are never used [INFO] [stdout] --> src/core/retry.rs:126:12 [INFO] [stdout] | [INFO] [stdout] 125 | impl JitterRetry { [INFO] [stdout] | ---------------- associated items in this implementation [INFO] [stdout] 126 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 133 | fn add_jitter(&self, delay: Duration) -> Duration { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `SchedulerManager` is never constructed [INFO] [stdout] --> src/core/scheduler.rs:262:12 [INFO] [stdout] | [INFO] [stdout] 262 | pub struct SchedulerManager { [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/core/scheduler.rs:270:18 [INFO] [stdout] | [INFO] [stdout] 269 | impl SchedulerManager { [INFO] [stdout] | --------------------- associated items in this implementation [INFO] [stdout] 270 | pub async fn new(sync_engine: SyncEngine) -> Result { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 285 | pub async fn add_task(&self, mut scheduled_task: ScheduledTask) -> Result<()> { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 309 | async fn schedule_job(&self, scheduled_task: &ScheduledTask) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 367 | async fn execute_task( [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 433 | pub async fn start(&self) -> Result<()> { [INFO] [stdout] | ^^^^^ [INFO] [stdout] ... [INFO] [stdout] 440 | pub async fn stop(&mut self) -> Result<()> { [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 447 | pub async fn get_tasks(&self) -> Vec { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 452 | pub async fn get_task(&self, task_id: &str) -> Option { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 458 | pub async fn delete_task(&self, task_id: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 469 | pub async fn trigger_task(&self, task_id: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 506 | pub async fn pause_task(&self, task_id: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 517 | pub async fn resume_task(&self, task_id: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 528 | pub async fn reschedule_all(&mut self) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 554 | pub async fn get_stats(&self) -> SchedulerStats { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 584 | pub async fn cleanup_completed_tasks(&self, max_age_days: u32) -> Result { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 604 | pub async fn export_tasks(&self, format: ExportFormat) -> Result { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 618 | pub async fn import_tasks(&self, data: &str, format: ExportFormat) -> Result { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 640 | fn tasks_to_csv(tasks: &[ScheduledTask]) -> Result { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `SchedulerStats` is never constructed [INFO] [stdout] --> src/core/scheduler.rs:671:12 [INFO] [stdout] | [INFO] [stdout] 671 | pub struct SchedulerStats { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `new`, `success_rate`, and `health_score` are never used [INFO] [stdout] --> src/core/scheduler.rs:705:12 [INFO] [stdout] | [INFO] [stdout] 704 | impl SchedulerStats { [INFO] [stdout] | ------------------- associated items in this implementation [INFO] [stdout] 705 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 725 | pub fn success_rate(&self) -> f64 { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 733 | pub fn health_score(&self) -> f64 { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enum `ExportFormat` is never used [INFO] [stdout] --> src/core/scheduler.rs:751:10 [INFO] [stdout] | [INFO] [stdout] 751 | pub enum ExportFormat { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `CsvTask` is never constructed [INFO] [stdout] --> src/core/scheduler.rs:759:8 [INFO] [stdout] | [INFO] [stdout] 759 | struct CsvTask<'a> { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `TaskNotifier` is never constructed [INFO] [stdout] --> src/core/scheduler.rs:773:12 [INFO] [stdout] | [INFO] [stdout] 773 | pub struct TaskNotifier { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `std::path::PathBuf` [INFO] [stdout] --> tests/e2e_config_test.rs:4:5 [INFO] [stdout] | [INFO] [stdout] 4 | use std::path::PathBuf; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/core/scheduler.rs:779:12 [INFO] [stdout] | [INFO] [stdout] 778 | impl TaskNotifier { [INFO] [stdout] | ----------------- associated items in this implementation [INFO] [stdout] 779 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 787 | pub async fn notify_task_start(&self, task: &ScheduledTask) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 799 | pub async fn notify_task_complete( [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 819 | pub async fn notify_task_failed( [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 838 | async fn send_notification(&self, message: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 852 | async fn send_email(&self, _config: &EmailConfig, _message: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 858 | async fn send_webhook(&self, url: &str, message: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `EmailConfig` is never constructed [INFO] [stdout] --> src/core/scheduler.rs:873:12 [INFO] [stdout] | [INFO] [stdout] 873 | pub struct EmailConfig { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `cmd_schedule_task` is never used [INFO] [stdout] --> src/core/scheduler.rs:883:14 [INFO] [stdout] | [INFO] [stdout] 883 | pub async fn cmd_schedule_task( [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `cmd_list_scheduled_tasks` is never used [INFO] [stdout] --> src/core/scheduler.rs:922:14 [INFO] [stdout] | [INFO] [stdout] 922 | pub async fn cmd_list_scheduled_tasks(scheduler: &SchedulerManager) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `hooks_by_priority` is never read [INFO] [stdout] --> src/plugins/manager.rs:9:5 [INFO] [stdout] | [INFO] [stdout] 7 | pub struct HookManager { [INFO] [stdout] | ----------- field in this struct [INFO] [stdout] 8 | handlers: HashMap>>, [INFO] [stdout] 9 | hooks_by_priority: HashMap>>, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated function `all_hook_types` is never used [INFO] [stdout] --> src/plugins/manager.rs:51:8 [INFO] [stdout] | [INFO] [stdout] 18 | impl HookManager { [INFO] [stdout] | ---------------- associated function in this implementation [INFO] [stdout] ... [INFO] [stdout] 51 | fn all_hook_types() -> Vec<&'static str> { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: fields `client`, `token`, `refresh_token`, and `rate_limiter` are never read [INFO] [stdout] --> src/providers/aliyun.rs:14:5 [INFO] [stdout] | [INFO] [stdout] 13 | pub struct AliYunDriveProvider { [INFO] [stdout] | ------------------- fields in this struct [INFO] [stdout] 14 | client: reqwest::Client, [INFO] [stdout] | ^^^^^^ [INFO] [stdout] 15 | token: String, [INFO] [stdout] | ^^^^^ [INFO] [stdout] 16 | refresh_token: String, [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] 17 | rate_limiter: Arc, [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `refresh_token_if_needed` is never used [INFO] [stdout] --> src/providers/aliyun.rs:43:14 [INFO] [stdout] | [INFO] [stdout] 20 | impl AliYunDriveProvider { [INFO] [stdout] | ------------------------ method in this implementation [INFO] [stdout] ... [INFO] [stdout] 43 | async fn refresh_token_if_needed(&mut self) -> Result<(), ProviderError> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `diff_cache` is never read [INFO] [stdout] --> src/sync/engine.rs:19:5 [INFO] [stdout] | [INFO] [stdout] 16 | pub struct SyncEngine { [INFO] [stdout] | ---------- field in this struct [INFO] [stdout] ... [INFO] [stdout] 19 | diff_cache: DashMap, [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `std::net::SocketAddr` [INFO] [stdout] --> tests/webdav_sync_basic.rs:2:5 [INFO] [stdout] | [INFO] [stdout] 2 | use std::net::SocketAddr; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `std::sync::Arc` [INFO] [stdout] --> tests/webdav_sync_basic.rs:3:5 [INFO] [stdout] | [INFO] [stdout] 3 | use std::sync::Arc; [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `bytes::Bytes` [INFO] [stdout] --> tests/webdav_sync_basic.rs:6:5 [INFO] [stdout] | [INFO] [stdout] 6 | use bytes::Bytes; [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `tokio::sync::RwLock` [INFO] [stdout] --> tests/webdav_sync_basic.rs:7:5 [INFO] [stdout] | [INFO] [stdout] 7 | use tokio::sync::RwLock; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `tracing::info` [INFO] [stdout] --> tests/webdav_sync_basic.rs:8:5 [INFO] [stdout] | [INFO] [stdout] 8 | use tracing::info; [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `warp::Filter` [INFO] [stdout] --> tests/webdav_sync_basic.rs:9:5 [INFO] [stdout] | [INFO] [stdout] 9 | use warp::Filter; [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `warp::http::Method` [INFO] [stdout] --> tests/webdav_sync_basic.rs:10:5 [INFO] [stdout] | [INFO] [stdout] 10 | use warp::http::Method; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `rng` [INFO] [stdout] --> tests/common/mod.rs:5:17 [INFO] [stdout] | [INFO] [stdout] 5 | use rand::{Rng, rng}; [INFO] [stdout] | ^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `FileStore` [INFO] [stdout] --> tests/webdav_sync_basic.rs:20:14 [INFO] [stdout] | [INFO] [stdout] 20 | use common::{FileStore, InMemoryFile, start_mock_server_with_seed}; [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` can be collapsed into the outer `match` [INFO] [stdout] --> src/config/validator.rs:20:17 [INFO] [stdout] | [INFO] [stdout] 20 | / if !account.credentials.contains_key("refresh_token") { [INFO] [stdout] 21 | | return Err( [INFO] [stdout] 22 | | ConfigError::MissingField("refresh_token for AliYunDrive".into()).into(), [INFO] [stdout] 23 | | ); [INFO] [stdout] 24 | | } [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] 19 ~ ProviderType::AliYunDrive [INFO] [stdout] 20 ~ if !account.credentials.contains_key("refresh_token") => { [INFO] [stdout] 21 | return Err( [INFO] [stdout] 22 | ConfigError::MissingField("refresh_token for AliYunDrive".into()).into(), [INFO] [stdout] 23 | ); [INFO] [stdout] 24 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `std::path::Path` [INFO] [stdout] --> tests/manual_oneonefive_test.rs:15:5 [INFO] [stdout] | [INFO] [stdout] 15 | use std::path::Path; [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `std::time::Duration` [INFO] [stdout] --> tests/manual_oneonefive_test.rs:16:5 [INFO] [stdout] | [INFO] [stdout] 16 | use std::time::Duration; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `tokio::fs` [INFO] [stdout] --> tests/manual_oneonefive_test.rs:17:5 [INFO] [stdout] | [INFO] [stdout] 17 | use tokio::fs; [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `debug` [INFO] [stdout] --> tests/manual_oneonefive_test.rs:18:15 [INFO] [stdout] | [INFO] [stdout] 18 | use tracing::{debug, error, info, warn}; [INFO] [stdout] | ^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `rng` [INFO] [stdout] --> tests/common/mod.rs:5:17 [INFO] [stdout] | [INFO] [stdout] 5 | use rand::{Rng, rng}; [INFO] [stdout] | ^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `rng` [INFO] [stdout] --> tests/common/mod.rs:5:17 [INFO] [stdout] | [INFO] [stdout] 5 | use rand::{Rng, rng}; [INFO] [stdout] | ^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `FaultConfig` is never constructed [INFO] [stdout] --> tests/common/mod.rs:30:12 [INFO] [stdout] | [INFO] [stdout] 30 | pub struct FaultConfig { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `FaultInjectionProvider` is never constructed [INFO] [stdout] --> tests/common/mod.rs:48:12 [INFO] [stdout] | [INFO] [stdout] 48 | pub struct FaultInjectionProvider { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `new` and `maybe_inject_fault` are never used [INFO] [stdout] --> tests/common/mod.rs:54:12 [INFO] [stdout] | [INFO] [stdout] 53 | impl FaultInjectionProvider { [INFO] [stdout] | --------------------------- associated items in this implementation [INFO] [stdout] 54 | pub fn new(inner: Box, config: FaultConfig) -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 58 | async fn maybe_inject_fault(&self) -> Result<(), SyncError> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `generate_test_files` is never used [INFO] [stdout] --> tests/common/mod.rs:141:14 [INFO] [stdout] | [INFO] [stdout] 141 | pub async fn generate_test_files(dir: &Path, count: usize, size_bytes: usize) -> Vec { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `generate_deep_structure` is never used [INFO] [stdout] --> tests/common/mod.rs:158:14 [INFO] [stdout] | [INFO] [stdout] 158 | pub async fn generate_deep_structure(root: &Path, depth: usize, files_per_level: usize) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> tests/common/mod.rs:234:21 [INFO] [stdout] | [INFO] [stdout] 234 | / if !parent_str.is_empty() && parent_str != "/" { [INFO] [stdout] 235 | | if !files.contains_key(&parent_str) { [INFO] [stdout] 236 | | files.insert( [INFO] [stdout] 237 | | parent_str, [INFO] [stdout] ... | [INFO] [stdout] 244 | | } [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] 234 ~ if !parent_str.is_empty() && parent_str != "/" [INFO] [stdout] 235 ~ && !files.contains_key(&parent_str) { [INFO] [stdout] 236 | files.insert( [INFO] [stdout] ... [INFO] [stdout] 242 | ); [INFO] [stdout] 243 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: usage of `contains_key` followed by `insert` on a `HashMap` [INFO] [stdout] --> tests/common/mod.rs:235:25 [INFO] [stdout] | [INFO] [stdout] 235 | / if !files.contains_key(&parent_str) { [INFO] [stdout] 236 | | files.insert( [INFO] [stdout] 237 | | parent_str, [INFO] [stdout] 238 | | InMemoryFile { [INFO] [stdout] ... | [INFO] [stdout] 242 | | ); [INFO] [stdout] 243 | | } [INFO] [stdout] | |_________________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_entry [INFO] [stdout] = note: `#[warn(clippy::map_entry)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 235 ~ files.entry(parent_str).or_insert_with(|| InMemoryFile { [INFO] [stdout] 236 + content: vec![], [INFO] [stdout] 237 + is_dir: true, [INFO] [stdout] 238 + }); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> tests/common/mod.rs:266:21 [INFO] [stdout] | [INFO] [stdout] 266 | / if let Some(file) = files.get(&path_str) { [INFO] [stdout] 267 | | if !file.is_dir { [INFO] [stdout] 268 | | return Ok::<_, warp::Rejection>(warp::reply::with_status( [INFO] [stdout] 269 | | file.content.clone(), [INFO] [stdout] ... | [INFO] [stdout] 273 | | } [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] 266 ~ if let Some(file) = files.get(&path_str) [INFO] [stdout] 267 ~ && !file.is_dir { [INFO] [stdout] 268 | return Ok::<_, warp::Rejection>(warp::reply::with_status( [INFO] [stdout] ... [INFO] [stdout] 271 | )); [INFO] [stdout] 272 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `map_or` can be simplified [INFO] [stdout] --> tests/webdav_sync_basic.rs:237:16 [INFO] [stdout] | [INFO] [stdout] 237 | && f.source_info.as_ref().map_or(false, |i| i.is_dir) [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] 237 - && f.source_info.as_ref().map_or(false, |i| i.is_dir) [INFO] [stdout] 237 + && f.source_info.as_ref().is_some_and(|i| i.is_dir) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: literal with an empty format string [INFO] [stdout] --> tests/manual_webdav_test.rs:46:45 [INFO] [stdout] | [INFO] [stdout] 46 | "类型", "修改时间", "大小", "路径" [INFO] [stdout] | ^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#print_literal [INFO] [stdout] = note: `#[warn(clippy::print_literal)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 45 ~ "{:<10} {:<20} {:<10} 路径", [INFO] [stdout] 46 ~ "类型", "修改时间", "大小" [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: explicit call to `.into_iter()` in function argument accepting `IntoIterator` [INFO] [stdout] --> src/core/audit.rs:184:62 [INFO] [stdout] | [INFO] [stdout] 184 | let mut rows = stmt.query(rusqlite::params_from_iter(params.into_iter()))?; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()` [INFO] [stdout] --> /opt/rustwide/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/rusqlite-0.38.0/src/params.rs:431:8 [INFO] [stdout] | [INFO] [stdout] 431 | I: IntoIterator, [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_conversion [INFO] [stdout] = note: `#[warn(clippy::useless_conversion)]` on by default [INFO] [stdout] help: consider removing the `.into_iter()` [INFO] [stdout] | [INFO] [stdout] 184 - let mut rows = stmt.query(rusqlite::params_from_iter(params.into_iter()))?; [INFO] [stdout] 184 + let mut rows = stmt.query(rusqlite::params_from_iter(params))?; [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `TCP` contains a capitalized acronym [INFO] [stdout] --> src/core/health.rs:170:5 [INFO] [stdout] | [INFO] [stdout] 170 | TCP, [INFO] [stdout] | ^^^ help: consider making the acronym lowercase, except the initial letter: `Tcp` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] = note: `#[warn(clippy::upper_case_acronyms)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `UDP` contains a capitalized acronym [INFO] [stdout] --> src/core/health.rs:171:5 [INFO] [stdout] | [INFO] [stdout] 171 | UDP, [INFO] [stdout] | ^^^ help: consider making the acronym lowercase, except the initial letter: `Udp` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `HTTP` contains a capitalized acronym [INFO] [stdout] --> src/core/health.rs:172:5 [INFO] [stdout] | [INFO] [stdout] 172 | HTTP, [INFO] [stdout] | ^^^^ help: consider making the acronym lowercase, except the initial letter: `Http` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `HTTPS` contains a capitalized acronym [INFO] [stdout] --> src/core/health.rs:173:5 [INFO] [stdout] | [INFO] [stdout] 173 | HTTPS, [INFO] [stdout] | ^^^^^ help: consider making the acronym lowercase, except the initial letter: `Https` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: items after a test module [INFO] [stdout] --> src/core/rate_limit.rs:19:1 [INFO] [stdout] | [INFO] [stdout] 19 | mod tests { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 41 | impl TokenBucketRateLimiter { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 70 | impl RateLimiter for TokenBucketRateLimiter { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 117 | pub struct SlidingWindowRateLimiter { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 123 | impl SlidingWindowRateLimiter { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 140 | impl RateLimiter for SlidingWindowRateLimiter { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#items_after_test_module [INFO] [stdout] = note: `#[warn(clippy::items_after_test_module)]` on by default [INFO] [stdout] = help: move the items to before the test module was defined [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `std::time::Duration` [INFO] [stdout] --> tests/consistency_tests.rs:7:5 [INFO] [stdout] | [INFO] [stdout] 7 | use std::time::Duration; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `rng` [INFO] [stdout] --> tests/common/mod.rs:5:17 [INFO] [stdout] | [INFO] [stdout] 5 | use rand::{Rng, rng}; [INFO] [stdout] | ^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `generate_deep_structure` [INFO] [stdout] --> tests/consistency_tests.rs:11:14 [INFO] [stdout] | [INFO] [stdout] 11 | use common::{generate_deep_structure, start_mock_server_with_seed}; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: implementation of inherent method `to_string(&self) -> String` for type `core::resources::ResourceUsage` [INFO] [stdout] --> src/core/resources.rs:224:5 [INFO] [stdout] | [INFO] [stdout] 224 | / pub fn to_string(&self) -> String { [INFO] [stdout] 225 | | format!( [INFO] [stdout] 226 | | "Memory: {:.1}% used, Disk: {:.1}% used, CPU: {:.1}%, Tasks: {}/{}", [INFO] [stdout] 227 | | self.memory_percentage, [INFO] [stdout] ... | [INFO] [stdout] 233 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: implement trait `Display` for type `core::resources::ResourceUsage` instead [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#inherent_to_string [INFO] [stdout] = note: `#[warn(clippy::inherent_to_string)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: variable does not need to be mutable [INFO] [stdout] --> tests/report_tests.rs:14:13 [INFO] [stdout] | [INFO] [stdout] 14 | let mut report = SyncReport { [INFO] [stdout] | ----^^^^^^ [INFO] [stdout] | | [INFO] [stdout] | help: remove this `mut` [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `generate_test_files` is never used [INFO] [stdout] --> tests/common/mod.rs:141:14 [INFO] [stdout] | [INFO] [stdout] 141 | pub async fn generate_test_files(dir: &Path, count: usize, size_bytes: usize) -> Vec { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `generate_deep_structure` is never used [INFO] [stdout] --> tests/common/mod.rs:158:14 [INFO] [stdout] | [INFO] [stdout] 158 | pub async fn generate_deep_structure(root: &Path, depth: usize, files_per_level: usize) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> tests/common/mod.rs:234:21 [INFO] [stdout] | [INFO] [stdout] 234 | / if !parent_str.is_empty() && parent_str != "/" { [INFO] [stdout] 235 | | if !files.contains_key(&parent_str) { [INFO] [stdout] 236 | | files.insert( [INFO] [stdout] 237 | | parent_str, [INFO] [stdout] ... | [INFO] [stdout] 244 | | } [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] 234 ~ if !parent_str.is_empty() && parent_str != "/" [INFO] [stdout] 235 ~ && !files.contains_key(&parent_str) { [INFO] [stdout] 236 | files.insert( [INFO] [stdout] ... [INFO] [stdout] 242 | ); [INFO] [stdout] 243 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: usage of `contains_key` followed by `insert` on a `HashMap` [INFO] [stdout] --> tests/common/mod.rs:235:25 [INFO] [stdout] | [INFO] [stdout] 235 | / if !files.contains_key(&parent_str) { [INFO] [stdout] 236 | | files.insert( [INFO] [stdout] 237 | | parent_str, [INFO] [stdout] 238 | | InMemoryFile { [INFO] [stdout] ... | [INFO] [stdout] 242 | | ); [INFO] [stdout] 243 | | } [INFO] [stdout] | |_________________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_entry [INFO] [stdout] = note: `#[warn(clippy::map_entry)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 235 ~ files.entry(parent_str).or_insert_with(|| InMemoryFile { [INFO] [stdout] 236 + content: vec![], [INFO] [stdout] 237 + is_dir: true, [INFO] [stdout] 238 + }); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> tests/common/mod.rs:266:21 [INFO] [stdout] | [INFO] [stdout] 266 | / if let Some(file) = files.get(&path_str) { [INFO] [stdout] 267 | | if !file.is_dir { [INFO] [stdout] 268 | | return Ok::<_, warp::Rejection>(warp::reply::with_status( [INFO] [stdout] 269 | | file.content.clone(), [INFO] [stdout] ... | [INFO] [stdout] 273 | | } [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] 266 ~ if let Some(file) = files.get(&path_str) [INFO] [stdout] 267 ~ && !file.is_dir { [INFO] [stdout] 268 | return Ok::<_, warp::Rejection>(warp::reply::with_status( [INFO] [stdout] ... [INFO] [stdout] 271 | )); [INFO] [stdout] 272 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused variable: `test_content` [INFO] [stdout] --> tests/manual_oneonefive_test.rs:300:9 [INFO] [stdout] | [INFO] [stdout] 300 | let test_content = "Hello, 115 Cloud Disk! This is a test file for manual testing."; [INFO] [stdout] | ^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_test_content` [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the loop variable `i` is used to index `iv` [INFO] [stdout] --> src/encryption/types.rs:128:18 [INFO] [stdout] | [INFO] [stdout] 128 | for i in 0..8 { [INFO] [stdout] | ^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stdout] = note: `#[warn(clippy::needless_range_loop)]` on by default [INFO] [stdout] help: consider using an iterator and enumerate() [INFO] [stdout] | [INFO] [stdout] 128 - for i in 0..8 { [INFO] [stdout] 128 + for (i, ) in iv.iter_mut().enumerate().take(8) { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the loop variable `i` is used to index `iv` [INFO] [stdout] --> src/encryption/types.rs:141:18 [INFO] [stdout] | [INFO] [stdout] 141 | for i in 0..8 { [INFO] [stdout] | ^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stdout] help: consider using an iterator and enumerate() [INFO] [stdout] | [INFO] [stdout] 141 - for i in 0..8 { [INFO] [stdout] 141 + for (i, ) in iv.iter_mut().enumerate().take(8) { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: match expression looks like `matches!` macro [INFO] [stdout] --> src/error/mod.rs:185:9 [INFO] [stdout] | [INFO] [stdout] 185 | / match self { [INFO] [stdout] 186 | | SyncError::Network(_) [INFO] [stdout] 187 | | | SyncError::Timeout(_) [INFO] [stdout] 188 | | | SyncError::RateLimitExceeded(_) [INFO] [stdout] ... | [INFO] [stdout] 193 | | _ => false, [INFO] [stdout] 194 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_like_matches_macro [INFO] [stdout] = note: `#[warn(clippy::match_like_matches_macro)]` on by default [INFO] [stdout] help: use `matches!` directly [INFO] [stdout] | [INFO] [stdout] 185 ~ matches!(self, SyncError::Network(_) [INFO] [stdout] 186 + | SyncError::Timeout(_) [INFO] [stdout] 187 + | SyncError::RateLimitExceeded(_) [INFO] [stdout] 188 + | SyncError::ResourceExhausted(_) | SyncError::Provider(ProviderError::RateLimited(_)) [INFO] [stdout] 189 + | SyncError::Provider(ProviderError::Timeout(_)) [INFO] [stdout] 190 + | SyncError::Provider(ProviderError::ConnectionFailed(_))) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: match expression looks like `matches!` macro [INFO] [stdout] --> src/error/mod.rs:198:9 [INFO] [stdout] | [INFO] [stdout] 198 | / match self { [INFO] [stdout] 199 | | SyncError::Provider(ProviderError::NotFound(_)) [INFO] [stdout] 200 | | | SyncError::Provider(ProviderError::NotSupported(_)) [INFO] [stdout] 201 | | | SyncError::Provider(ProviderError::InvalidCredentials(_)) [INFO] [stdout] ... | [INFO] [stdout] 206 | | _ => false, [INFO] [stdout] 207 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_like_matches_macro [INFO] [stdout] help: use `matches!` directly [INFO] [stdout] | [INFO] [stdout] 198 ~ matches!(self, SyncError::Provider(ProviderError::NotFound(_)) [INFO] [stdout] 199 + | SyncError::Provider(ProviderError::NotSupported(_)) [INFO] [stdout] 200 + | SyncError::Provider(ProviderError::InvalidCredentials(_)) [INFO] [stdout] 201 + | SyncError::Provider(ProviderError::PermissionDenied(_)) [INFO] [stdout] 202 + | SyncError::Encryption(EncryptionError::KeyNotFound(_)) [INFO] [stdout] 203 + | SyncError::Encryption(EncryptionError::InvalidKey(_)) [INFO] [stdout] 204 + | SyncError::Validation(_)) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `FaultConfig` is never constructed [INFO] [stdout] --> tests/common/mod.rs:30:12 [INFO] [stdout] | [INFO] [stdout] 30 | pub struct FaultConfig { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `FaultInjectionProvider` is never constructed [INFO] [stdout] --> tests/common/mod.rs:48:12 [INFO] [stdout] | [INFO] [stdout] 48 | pub struct FaultInjectionProvider { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `new` and `maybe_inject_fault` are never used [INFO] [stdout] --> tests/common/mod.rs:54:12 [INFO] [stdout] | [INFO] [stdout] 53 | impl FaultInjectionProvider { [INFO] [stdout] | --------------------------- associated items in this implementation [INFO] [stdout] 54 | pub fn new(inner: Box, config: FaultConfig) -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 58 | async fn maybe_inject_fault(&self) -> Result<(), SyncError> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `generate_deep_structure` is never used [INFO] [stdout] --> tests/common/mod.rs:158:14 [INFO] [stdout] | [INFO] [stdout] 158 | pub async fn generate_deep_structure(root: &Path, depth: usize, files_per_level: usize) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> tests/common/mod.rs:234:21 [INFO] [stdout] | [INFO] [stdout] 234 | / if !parent_str.is_empty() && parent_str != "/" { [INFO] [stdout] 235 | | if !files.contains_key(&parent_str) { [INFO] [stdout] 236 | | files.insert( [INFO] [stdout] 237 | | parent_str, [INFO] [stdout] ... | [INFO] [stdout] 244 | | } [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] 234 ~ if !parent_str.is_empty() && parent_str != "/" [INFO] [stdout] 235 ~ && !files.contains_key(&parent_str) { [INFO] [stdout] 236 | files.insert( [INFO] [stdout] ... [INFO] [stdout] 242 | ); [INFO] [stdout] 243 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: usage of `contains_key` followed by `insert` on a `HashMap` [INFO] [stdout] --> tests/common/mod.rs:235:25 [INFO] [stdout] | [INFO] [stdout] 235 | / if !files.contains_key(&parent_str) { [INFO] [stdout] 236 | | files.insert( [INFO] [stdout] 237 | | parent_str, [INFO] [stdout] 238 | | InMemoryFile { [INFO] [stdout] ... | [INFO] [stdout] 242 | | ); [INFO] [stdout] 243 | | } [INFO] [stdout] | |_________________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_entry [INFO] [stdout] = note: `#[warn(clippy::map_entry)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 235 ~ files.entry(parent_str).or_insert_with(|| InMemoryFile { [INFO] [stdout] 236 + content: vec![], [INFO] [stdout] 237 + is_dir: true, [INFO] [stdout] 238 + }); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> tests/common/mod.rs:266:21 [INFO] [stdout] | [INFO] [stdout] 266 | / if let Some(file) = files.get(&path_str) { [INFO] [stdout] 267 | | if !file.is_dir { [INFO] [stdout] 268 | | return Ok::<_, warp::Rejection>(warp::reply::with_status( [INFO] [stdout] 269 | | file.content.clone(), [INFO] [stdout] ... | [INFO] [stdout] 273 | | } [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] 266 ~ if let Some(file) = files.get(&path_str) [INFO] [stdout] 267 ~ && !file.is_dir { [INFO] [stdout] 268 | return Ok::<_, warp::Rejection>(warp::reply::with_status( [INFO] [stdout] ... [INFO] [stdout] 271 | )); [INFO] [stdout] 272 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: match expression looks like `matches!` macro [INFO] [stdout] --> src/plugins/manager.rs:155:9 [INFO] [stdout] | [INFO] [stdout] 155 | / match hook { [INFO] [stdout] 156 | | PluginHook::PreSync { .. } => true, [INFO] [stdout] 157 | | PluginHook::PostSync { .. } => true, [INFO] [stdout] 158 | | PluginHook::OnError { .. } => true, [INFO] [stdout] 159 | | _ => false, [INFO] [stdout] 160 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_like_matches_macro [INFO] [stdout] help: use `matches!` directly [INFO] [stdout] | [INFO] [stdout] 155 - match hook { [INFO] [stdout] 156 - PluginHook::PreSync { .. } => true, [INFO] [stdout] 157 - PluginHook::PostSync { .. } => true, [INFO] [stdout] 158 - PluginHook::OnError { .. } => true, [INFO] [stdout] 159 - _ => false, [INFO] [stdout] 160 - } [INFO] [stdout] 155 + matches!(hook, PluginHook::PreSync { .. } | PluginHook::PostSync { .. } | PluginHook::OnError { .. }) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/providers/webdav.rs:709:25 [INFO] [stdout] | [INFO] [stdout] 709 | / if let Some(file) = files.get(path_str) { [INFO] [stdout] 710 | | if !file.is_dir { [INFO] [stdout] 711 | | return Ok::<_, warp::Rejection>(warp::reply::with_status( [INFO] [stdout] 712 | | file.content.clone(), [INFO] [stdout] ... | [INFO] [stdout] 716 | | } [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] 709 ~ if let Some(file) = files.get(path_str) [INFO] [stdout] 710 ~ && !file.is_dir { [INFO] [stdout] 711 | return Ok::<_, warp::Rejection>(warp::reply::with_status( [INFO] [stdout] ... [INFO] [stdout] 714 | )); [INFO] [stdout] 715 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `FaultConfig` is never constructed [INFO] [stdout] --> tests/common/mod.rs:30:12 [INFO] [stdout] | [INFO] [stdout] 30 | pub struct FaultConfig { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `FaultInjectionProvider` is never constructed [INFO] [stdout] --> tests/common/mod.rs:48:12 [INFO] [stdout] | [INFO] [stdout] 48 | pub struct FaultInjectionProvider { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `new` and `maybe_inject_fault` are never used [INFO] [stdout] --> tests/common/mod.rs:54:12 [INFO] [stdout] | [INFO] [stdout] 53 | impl FaultInjectionProvider { [INFO] [stdout] | --------------------------- associated items in this implementation [INFO] [stdout] 54 | pub fn new(inner: Box, config: FaultConfig) -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 58 | async fn maybe_inject_fault(&self) -> Result<(), SyncError> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&String` instead of `&str` involves a new object where a slice will do [INFO] [stdout] --> src/report/mod.rs:22:54 [INFO] [stdout] | [INFO] [stdout] 22 | pub(crate) fn add_conflict(&mut self, diff_path: &String) { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stdout] = note: `#[warn(clippy::ptr_arg)]` on by default [INFO] [stdout] help: change this to [INFO] [stdout] | [INFO] [stdout] 22 ~ pub(crate) fn add_conflict(&mut self, diff_path: &str) { [INFO] [stdout] 23 | self.statistics.conflicts += 1; [INFO] [stdout] 24 | self.statistics.total_files += 1; [INFO] [stdout] 25 ~ let mut result = FileSyncResult::new(diff_path.to_owned(), FileOperation::Verify); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> tests/common/mod.rs:234:21 [INFO] [stdout] | [INFO] [stdout] 234 | / if !parent_str.is_empty() && parent_str != "/" { [INFO] [stdout] 235 | | if !files.contains_key(&parent_str) { [INFO] [stdout] 236 | | files.insert( [INFO] [stdout] 237 | | parent_str, [INFO] [stdout] ... | [INFO] [stdout] 244 | | } [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] 234 ~ if !parent_str.is_empty() && parent_str != "/" [INFO] [stdout] 235 ~ && !files.contains_key(&parent_str) { [INFO] [stdout] 236 | files.insert( [INFO] [stdout] ... [INFO] [stdout] 242 | ); [INFO] [stdout] 243 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&String` instead of `&str` involves a new object where a slice will do [INFO] [stdout] --> src/report/mod.rs:30:53 [INFO] [stdout] | [INFO] [stdout] 30 | pub(crate) fn add_success(&mut self, diff_path: &String, diff_size: i64) { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stdout] help: change this to [INFO] [stdout] | [INFO] [stdout] 30 ~ pub(crate) fn add_success(&mut self, diff_path: &str, diff_size: i64) { [INFO] [stdout] 31 ~ let mut result = FileSyncResult::new(diff_path.to_owned(), FileOperation::Upload); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: usage of `contains_key` followed by `insert` on a `HashMap` [INFO] [stdout] --> tests/common/mod.rs:235:25 [INFO] [stdout] | [INFO] [stdout] 235 | / if !files.contains_key(&parent_str) { [INFO] [stdout] 236 | | files.insert( [INFO] [stdout] 237 | | parent_str, [INFO] [stdout] 238 | | InMemoryFile { [INFO] [stdout] ... | [INFO] [stdout] 242 | | ); [INFO] [stdout] 243 | | } [INFO] [stdout] | |_________________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_entry [INFO] [stdout] = note: `#[warn(clippy::map_entry)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 235 ~ files.entry(parent_str).or_insert_with(|| InMemoryFile { [INFO] [stdout] 236 + content: vec![], [INFO] [stdout] 237 + is_dir: true, [INFO] [stdout] 238 + }); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> tests/common/mod.rs:266:21 [INFO] [stdout] | [INFO] [stdout] 266 | / if let Some(file) = files.get(&path_str) { [INFO] [stdout] 267 | | if !file.is_dir { [INFO] [stdout] 268 | | return Ok::<_, warp::Rejection>(warp::reply::with_status( [INFO] [stdout] 269 | | file.content.clone(), [INFO] [stdout] ... | [INFO] [stdout] 273 | | } [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] 266 ~ if let Some(file) = files.get(&path_str) [INFO] [stdout] 267 ~ && !file.is_dir { [INFO] [stdout] 268 | return Ok::<_, warp::Rejection>(warp::reply::with_status( [INFO] [stdout] ... [INFO] [stdout] 271 | )); [INFO] [stdout] 272 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: consider using `sort_by_key` [INFO] [stdout] --> src/sync/diff.rs:716:9 [INFO] [stdout] | [INFO] [stdout] 716 | self.files.sort_by(|a, b| b.priority.cmp(&a.priority)); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_sort_by [INFO] [stdout] = note: `#[warn(clippy::unnecessary_sort_by)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 716 - self.files.sort_by(|a, b| b.priority.cmp(&a.priority)); [INFO] [stdout] 716 + self.files.sort_by_key(|b| std::cmp::Reverse(b.priority)); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual checked division [INFO] [stdout] --> src/sync/diff.rs:1000:48 [INFO] [stdout] | [INFO] [stdout] 1000 | details.change_percentage = if source.size > 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^ check performed here [INFO] [stdout] 1001 | ((source.size.abs_diff(target.size) * 100) / source.size) as u8 [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 boolean expression can be simplified [INFO] [stdout] --> src/sync/diff.rs:1077:20 [INFO] [stdout] | [INFO] [stdout] 1077 | if (has_upload && has_delete) || (has_upload && has_update) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#nonminimal_bool [INFO] [stdout] = note: `#[warn(clippy::nonminimal_bool)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 1077 - if (has_upload && has_delete) || (has_upload && has_update) { [INFO] [stdout] 1077 + if !(!has_upload || !has_delete && !has_update) { [INFO] [stdout] | [INFO] [stdout] 1077 - if (has_upload && has_delete) || (has_upload && has_update) { [INFO] [stdout] 1077 + if (has_update || has_delete) && has_upload { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you seem to be trying to use `&Box`. Consider using just `&T` [INFO] [stdout] --> src/sync/engine.rs:85:60 [INFO] [stdout] | [INFO] [stdout] 85 | pub fn get_provider(&self, account_id: &str) -> Option<&Box> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&dyn StorageProvider` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#borrowed_box [INFO] [stdout] = note: `#[warn(clippy::borrowed_box)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this function has too many arguments (9/7) [INFO] [stdout] --> src/sync/engine.rs:643:5 [INFO] [stdout] | [INFO] [stdout] 643 | / async fn calculate_diff( [INFO] [stdout] 644 | | &self, [INFO] [stdout] 645 | | source: &dyn StorageProvider, [INFO] [stdout] 646 | | target: &dyn StorageProvider, [INFO] [stdout] ... | [INFO] [stdout] 652 | | target_key: &str, [INFO] [stdout] 653 | | ) -> Result { [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: this `MutexGuard` is held across an await point [INFO] [stdout] --> src/sync/engine.rs:856:17 [INFO] [stdout] | [INFO] [stdout] 856 | let conn = self.resume_store.lock().unwrap(); [INFO] [stdout] | ^^^^ [INFO] [stdout] | [INFO] [stdout] = help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling `await` [INFO] [stdout] note: these are all the await points this lock is held through [INFO] [stdout] --> src/sync/engine.rs:866:26 [INFO] [stdout] | [INFO] [stdout] 866 | .await; [INFO] [stdout] | ^^^^^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#await_holding_lock [INFO] [stdout] = note: `#[warn(clippy::await_holding_lock)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `rand::Rng` [INFO] [stdout] --> src/core/retry.rs:3:5 [INFO] [stdout] | [INFO] [stdout] 3 | use rand::Rng; [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `TimeZone` [INFO] [stdout] --> src/core/scheduler.rs:6:24 [INFO] [stdout] | [INFO] [stdout] 6 | use chrono::{DateTime, TimeZone, Utc}; [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: value assigned to `d` is never read [INFO] [stdout] --> src/sync/engine.rs:806:37 [INFO] [stdout] | [INFO] [stdout] 806 | let mut d = FileDiff::unchanged( [INFO] [stdout] | _____________________________________^ [INFO] [stdout] 807 | | path.clone(), [INFO] [stdout] 808 | | crate::sync::diff::FileMetadata::new(std::path::PathBuf::from(&path)), [INFO] [stdout] 809 | | t.clone(), [INFO] [stdout] 810 | | ); [INFO] [stdout] | |_________________________^ [INFO] [stdout] | [INFO] [stdout] = help: maybe it is overwritten before being read? [INFO] [stdout] = note: `#[warn(unused_assignments)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `rand::Rng` [INFO] [stdout] --> src/core/retry.rs:3:5 [INFO] [stdout] | [INFO] [stdout] 3 | use rand::Rng; [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `TimeZone` [INFO] [stdout] --> src/core/scheduler.rs:6:24 [INFO] [stdout] | [INFO] [stdout] 6 | use chrono::{DateTime, TimeZone, Utc}; [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: value assigned to `d` is never read [INFO] [stdout] --> src/sync/engine.rs:806:37 [INFO] [stdout] | [INFO] [stdout] 806 | let mut d = FileDiff::unchanged( [INFO] [stdout] | _____________________________________^ [INFO] [stdout] 807 | | path.clone(), [INFO] [stdout] 808 | | crate::sync::diff::FileMetadata::new(std::path::PathBuf::from(&path)), [INFO] [stdout] 809 | | t.clone(), [INFO] [stdout] 810 | | ); [INFO] [stdout] | |_________________________^ [INFO] [stdout] | [INFO] [stdout] = help: maybe it is overwritten before being read? [INFO] [stdout] = note: `#[warn(unused_assignments)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: type `core::health::TempStorageHealth` is more private than the item `core::health::StorageHealth::temp_storage` [INFO] [stdout] --> src/core/health.rs:133:5 [INFO] [stdout] | [INFO] [stdout] 133 | pub temp_storage: TempStorageHealth, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ field `core::health::StorageHealth::temp_storage` is reachable at visibility `pub(crate)` [INFO] [stdout] | [INFO] [stdout] note: but type `core::health::TempStorageHealth` is only usable at visibility `pub(self)` [INFO] [stdout] --> src/core/health.rs:18:1 [INFO] [stdout] | [INFO] [stdout] 18 | struct TempStorageHealth {} [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] = note: `#[warn(private_interfaces)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: type `sync::ErrorResult` is more private than the item `sync::VerificationResult::errors` [INFO] [stdout] --> src/sync/mod.rs:9:5 [INFO] [stdout] | [INFO] [stdout] 9 | pub errors: Vec, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ field `sync::VerificationResult::errors` is reachable at visibility `pub(crate)` [INFO] [stdout] | [INFO] [stdout] note: but type `sync::ErrorResult` is only usable at visibility `pub(self)` [INFO] [stdout] --> src/sync/mod.rs:12:1 [INFO] [stdout] | [INFO] [stdout] 12 | struct ErrorResult {} [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `validate` is never used [INFO] [stdout] --> src/config/mod.rs:38:12 [INFO] [stdout] | [INFO] [stdout] 37 | impl AccountConfig { [INFO] [stdout] | ------------------ method in this implementation [INFO] [stdout] 38 | pub fn validate(&self) -> Result<(), Box> { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `validate` is never used [INFO] [stdout] --> src/config/mod.rs:89:12 [INFO] [stdout] | [INFO] [stdout] 88 | impl SyncTask { [INFO] [stdout] | ------------- method in this implementation [INFO] [stdout] 89 | pub fn validate(&self) -> Result<(), Box> { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `update_account` and `update_task` are never used [INFO] [stdout] --> src/config/mod.rs:290:12 [INFO] [stdout] | [INFO] [stdout] 270 | impl ConfigManager { [INFO] [stdout] | ------------------ methods in this implementation [INFO] [stdout] ... [INFO] [stdout] 290 | pub fn update_account(&mut self, account: AccountConfig) -> Result<(), ConfigError> { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 307 | pub fn update_task(&mut self, task: SyncTask) -> Result<(), ConfigError> { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `validate`, `find_account`, `find_task`, `find_encryption_key`, and `find_schedule` are never used [INFO] [stdout] --> src/config/mod.rs:539:12 [INFO] [stdout] | [INFO] [stdout] 524 | impl ConfigFile { [INFO] [stdout] | --------------- methods in this implementation [INFO] [stdout] ... [INFO] [stdout] 539 | pub fn validate(&self) -> Result<(), Vec> { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 577 | pub fn find_account(&self, account_id: &str) -> Option<&AccountConfig> { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 581 | pub fn find_task(&self, task_id: &str) -> Option<&SyncTask> { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 585 | pub fn find_encryption_key(&self, key_id: &str) -> Option<&EncryptionKey> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 589 | pub fn find_schedule(&self, schedule_id: &str) -> Option<&ScheduleConfig> { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated functions `backup_config`, `restore_config`, and `list_backups` are never used [INFO] [stdout] --> src/config/migrator.rs:45:12 [INFO] [stdout] | [INFO] [stdout] 7 | impl ConfigMigrator { [INFO] [stdout] | ------------------- associated functions in this implementation [INFO] [stdout] ... [INFO] [stdout] 45 | pub fn backup_config(config_path: &std::path::Path) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 62 | pub fn restore_config(config_path: &std::path::Path, backup_name: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 84 | pub fn list_backups(config_path: &std::path::Path) -> Result> { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `key_path` is never read [INFO] [stdout] --> src/config/security.rs:14:5 [INFO] [stdout] | [INFO] [stdout] 13 | pub struct SecurityManager { [INFO] [stdout] | --------------- field in this struct [INFO] [stdout] 14 | key_path: PathBuf, [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ConfigUtils` is never constructed [INFO] [stdout] --> src/config/utils.rs:4:12 [INFO] [stdout] | [INFO] [stdout] 4 | pub struct ConfigUtils; [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated functions are never used [INFO] [stdout] --> src/config/utils.rs:8:12 [INFO] [stdout] | [INFO] [stdout] 6 | impl ConfigUtils { [INFO] [stdout] | ---------------- associated functions in this implementation [INFO] [stdout] 7 | /// 生成默认配置文件 [INFO] [stdout] 8 | pub fn generate_default_config() -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 14 | pub fn validate_config_syntax(content: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 21 | pub fn find_config_files() -> Vec { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 51 | pub fn merge_configs(configs: &[super::ConfigFile]) -> super::ConfigFile { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 82 | pub fn load_from_env() -> super::ConfigFile { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 120 | pub fn generate_template(template_type: ConfigTemplate) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 198 | pub fn diff_configs(config1: &super::ConfigFile, config2: &super::ConfigFile) -> ConfigDiff { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enum `ConfigTemplate` is never used [INFO] [stdout] --> src/config/utils.rs:236:10 [INFO] [stdout] | [INFO] [stdout] 236 | pub enum ConfigTemplate { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ConfigDiff` is never constructed [INFO] [stdout] --> src/config/utils.rs:244:12 [INFO] [stdout] | [INFO] [stdout] 244 | pub struct ConfigDiff { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `new` and `has_changes` are never used [INFO] [stdout] --> src/config/utils.rs:253:12 [INFO] [stdout] | [INFO] [stdout] 252 | impl ConfigDiff { [INFO] [stdout] | --------------- associated items in this implementation [INFO] [stdout] 253 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 263 | pub fn has_changes(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ConfigValidatorImpl` is never constructed [INFO] [stdout] --> src/config/validator.rs:5:12 [INFO] [stdout] | [INFO] [stdout] 5 | pub struct ConfigValidatorImpl; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `is_valid_cron` is never used [INFO] [stdout] --> src/config/validator.rs:124:4 [INFO] [stdout] | [INFO] [stdout] 124 | fn is_valid_cron(expr: &str) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `AuditOperation` is never constructed [INFO] [stdout] --> src/core/audit.rs:8:12 [INFO] [stdout] | [INFO] [stdout] 8 | pub struct AuditOperation { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enum `OperationType` is never used [INFO] [stdout] --> src/core/audit.rs:23:10 [INFO] [stdout] | [INFO] [stdout] 23 | pub enum OperationType { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `AuditFilter` is never constructed [INFO] [stdout] --> src/core/audit.rs:41:12 [INFO] [stdout] | [INFO] [stdout] 41 | pub struct AuditFilter { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `DatabaseAuditLogger` is never constructed [INFO] [stdout] --> src/core/audit.rs:52:12 [INFO] [stdout] | [INFO] [stdout] 52 | pub struct DatabaseAuditLogger { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated function `new` is never used [INFO] [stdout] --> src/core/audit.rs:57:12 [INFO] [stdout] | [INFO] [stdout] 56 | impl DatabaseAuditLogger { [INFO] [stdout] | ------------------------ associated function in this implementation [INFO] [stdout] 57 | pub fn new(db_path: &std::path::Path) -> Result { [INFO] [stdout] | ^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `HealthCheckerImpl` is never constructed [INFO] [stdout] --> src/core/health.rs:7:12 [INFO] [stdout] | [INFO] [stdout] 7 | pub struct HealthCheckerImpl { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated function `new` is never used [INFO] [stdout] --> src/core/health.rs:12:12 [INFO] [stdout] | [INFO] [stdout] 11 | impl HealthCheckerImpl { [INFO] [stdout] | ---------------------- associated function in this implementation [INFO] [stdout] 12 | pub fn new(providers: HashMap>) -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `TempStorageHealth` is never constructed [INFO] [stdout] --> src/core/health.rs:18:8 [INFO] [stdout] | [INFO] [stdout] 18 | struct TempStorageHealth {} [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enum `HealthStatus` is never used [INFO] [stdout] --> src/core/health.rs:112:10 [INFO] [stdout] | [INFO] [stdout] 112 | pub enum HealthStatus { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `StorageHealth` is never constructed [INFO] [stdout] --> src/core/health.rs:131:12 [INFO] [stdout] | [INFO] [stdout] 131 | pub struct StorageHealth { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `LocalStorageHealth` is never constructed [INFO] [stdout] --> src/core/health.rs:139:12 [INFO] [stdout] | [INFO] [stdout] 139 | pub struct LocalStorageHealth { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `DatabaseHealth` is never constructed [INFO] [stdout] --> src/core/health.rs:148:12 [INFO] [stdout] | [INFO] [stdout] 148 | pub struct DatabaseHealth {} [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ConnectivityStatus` is never constructed [INFO] [stdout] --> src/core/health.rs:151:12 [INFO] [stdout] | [INFO] [stdout] 151 | pub struct ConnectivityStatus { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ConnectivityTest` is never constructed [INFO] [stdout] --> src/core/health.rs:159:12 [INFO] [stdout] | [INFO] [stdout] 159 | pub struct ConnectivityTest { [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enum `Protocol` is never used [INFO] [stdout] --> src/core/health.rs:169:10 [INFO] [stdout] | [INFO] [stdout] 169 | pub enum Protocol { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `TokenBucketRateLimiter` is never constructed [INFO] [stdout] --> src/core/rate_limit.rs:10:12 [INFO] [stdout] | [INFO] [stdout] 10 | pub struct TokenBucketRateLimiter { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `new` and `refill_tokens` are never used [INFO] [stdout] --> src/core/rate_limit.rs:42:12 [INFO] [stdout] | [INFO] [stdout] 41 | impl TokenBucketRateLimiter { [INFO] [stdout] | --------------------------- associated items in this implementation [INFO] [stdout] 42 | pub fn new(capacity: u64, requests_per_second: f64) -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 52 | fn refill_tokens(&self) { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: fields `window_size`, `max_requests`, and `requests` are never read [INFO] [stdout] --> src/core/rate_limit.rs:118:16 [INFO] [stdout] | [INFO] [stdout] 117 | pub struct SlidingWindowRateLimiter { [INFO] [stdout] | ------------------------ fields in this struct [INFO] [stdout] 118 | pub(crate) window_size: Duration, [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 119 | pub(crate) max_requests: u64, [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] 120 | pub(crate) requests: Mutex>, [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `new` and `cleanup_old_requests` are never used [INFO] [stdout] --> src/core/rate_limit.rs:124:12 [INFO] [stdout] | [INFO] [stdout] 123 | impl SlidingWindowRateLimiter { [INFO] [stdout] | ----------------------------- associated items in this implementation [INFO] [stdout] 124 | pub fn new(window_size: Duration, max_requests: u64) -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 132 | fn cleanup_old_requests(&self) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `MemoryHandle` is never constructed [INFO] [stdout] --> src/core/resources.rs:11:12 [INFO] [stdout] | [INFO] [stdout] 11 | pub struct MemoryHandle { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `new`, `id`, `size`, `allocated_at`, and `age` are never used [INFO] [stdout] --> src/core/resources.rs:19:12 [INFO] [stdout] | [INFO] [stdout] 18 | impl MemoryHandle { [INFO] [stdout] | ----------------- associated items in this implementation [INFO] [stdout] 19 | pub fn new(id: String, size: usize) -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 27 | pub fn id(&self) -> &str { [INFO] [stdout] | ^^ [INFO] [stdout] ... [INFO] [stdout] 31 | pub fn size(&self) -> usize { [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 35 | pub fn allocated_at(&self) -> Instant { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 39 | pub fn age(&self) -> Duration { [INFO] [stdout] | ^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `DiskHandle` is never constructed [INFO] [stdout] --> src/core/resources.rs:46:12 [INFO] [stdout] | [INFO] [stdout] 46 | pub struct DiskHandle { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/core/resources.rs:55:12 [INFO] [stdout] | [INFO] [stdout] 54 | impl DiskHandle { [INFO] [stdout] | --------------- associated items in this implementation [INFO] [stdout] 55 | pub fn new(id: String, path: std::path::PathBuf, size: u64, is_temporary: bool) -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 65 | pub fn id(&self) -> &str { [INFO] [stdout] | ^^ [INFO] [stdout] ... [INFO] [stdout] 69 | pub fn path(&self) -> &std::path::Path { [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 73 | pub fn size(&self) -> u64 { [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 77 | pub fn is_temporary(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 81 | pub fn allocated_at(&self) -> Instant { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 85 | pub fn age(&self) -> Duration { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 90 | pub fn cleanup(&self) -> Result<()> { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ResourceUsage` is never constructed [INFO] [stdout] --> src/core/resources.rs:104:12 [INFO] [stdout] | [INFO] [stdout] 104 | pub struct ResourceUsage { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `new`, `update_from_system`, `is_overloaded`, and `to_string` are never used [INFO] [stdout] --> src/core/resources.rs:128:12 [INFO] [stdout] | [INFO] [stdout] 127 | impl ResourceUsage { [INFO] [stdout] | ------------------ associated items in this implementation [INFO] [stdout] 128 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 153 | pub fn update_from_system(&mut self) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 197 | pub fn is_overloaded(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 224 | pub fn to_string(&self) -> String { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ResourceLimits` is never constructed [INFO] [stdout] --> src/core/resources.rs:238:12 [INFO] [stdout] | [INFO] [stdout] 238 | pub struct ResourceLimits { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `default` and `validate` are never used [INFO] [stdout] --> src/core/resources.rs:251:12 [INFO] [stdout] | [INFO] [stdout] 250 | impl ResourceLimits { [INFO] [stdout] | ------------------- associated items in this implementation [INFO] [stdout] 251 | pub fn default() -> Self { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 265 | pub fn validate(&self) -> Result<()> { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ResourceManagerImpl` is never constructed [INFO] [stdout] --> src/core/resources.rs:295:12 [INFO] [stdout] | [INFO] [stdout] 295 | pub struct ResourceManagerImpl { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/core/resources.rs:306:12 [INFO] [stdout] | [INFO] [stdout] 305 | impl ResourceManagerImpl { [INFO] [stdout] | ------------------------ associated items in this implementation [INFO] [stdout] 306 | pub fn new(limits: ResourceLimits) -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 320 | pub fn allocate_memory(&self, size: usize) -> Result { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 351 | pub fn allocate_disk(&self, size: u64) -> Result { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 397 | pub fn deallocate_memory(&self, handle_id: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 413 | pub fn deallocate_disk(&self, handle_id: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 433 | pub fn current_usage(&self) -> ResourceUsage { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 461 | pub fn set_limits(&self, limits: ResourceLimits) { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 466 | pub fn start_task(&self) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 482 | pub fn end_task(&self) { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 486 | pub fn cleanup_old_resources(&self, max_age: Duration) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ExponentialBackoffRetry` is never constructed [INFO] [stdout] --> src/core/retry.rs:7:12 [INFO] [stdout] | [INFO] [stdout] 7 | pub struct ExponentialBackoffRetry { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated functions `new` and `builder` are never used [INFO] [stdout] --> src/core/retry.rs:16:12 [INFO] [stdout] | [INFO] [stdout] 15 | impl ExponentialBackoffRetry { [INFO] [stdout] | ---------------------------- associated functions in this implementation [INFO] [stdout] 16 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 32 | pub fn builder() -> ExponentialBackoffRetryBuilder { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ExponentialBackoffRetryBuilder` is never constructed [INFO] [stdout] --> src/core/retry.rs:64:12 [INFO] [stdout] | [INFO] [stdout] 64 | pub struct ExponentialBackoffRetryBuilder { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/core/retry.rs:73:12 [INFO] [stdout] | [INFO] [stdout] 72 | impl ExponentialBackoffRetryBuilder { [INFO] [stdout] | ----------------------------------- associated items in this implementation [INFO] [stdout] 73 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 83 | pub fn max_attempts(mut self, attempts: u32) -> Self { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 88 | pub fn initial_delay(mut self, delay: Duration) -> Self { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 93 | pub fn max_delay(mut self, delay: Duration) -> Self { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 98 | pub fn backoff_factor(mut self, factor: f64) -> Self { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 103 | pub fn retryable_error(mut self, error_code: u32) -> Self { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 108 | pub fn build(self) -> ExponentialBackoffRetry { [INFO] [stdout] | ^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `JitterRetry` is never constructed [INFO] [stdout] --> src/core/retry.rs:120:12 [INFO] [stdout] | [INFO] [stdout] 120 | pub struct JitterRetry { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `new` and `add_jitter` are never used [INFO] [stdout] --> src/core/retry.rs:126:12 [INFO] [stdout] | [INFO] [stdout] 125 | impl JitterRetry { [INFO] [stdout] | ---------------- associated items in this implementation [INFO] [stdout] 126 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 133 | fn add_jitter(&self, delay: Duration) -> Duration { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ScheduledTask` is never constructed [INFO] [stdout] --> src/core/scheduler.rs:20:12 [INFO] [stdout] | [INFO] [stdout] 20 | pub struct ScheduledTask { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/core/scheduler.rs:60:12 [INFO] [stdout] | [INFO] [stdout] 59 | impl ScheduledTask { [INFO] [stdout] | ------------------ associated items in this implementation [INFO] [stdout] 60 | pub fn new(sync_task: &SyncTask, schedule: Schedule) -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 89 | pub fn calculate_next_run(&mut self) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 106 | pub fn update_statistics(&mut self, duration: Duration, success: bool) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 133 | pub fn should_run_now(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 138 | pub fn get_status(&self) -> TaskStatus { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 155 | pub fn get_health(&self) -> TaskHealth { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 177 | pub fn format_next_run(&self) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 200 | pub fn enable(&mut self) { [INFO] [stdout] | ^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 206 | pub fn disable(&mut self) { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 212 | pub fn retry(&mut self) -> bool { [INFO] [stdout] | ^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `TaskResult` is never constructed [INFO] [stdout] --> src/core/scheduler.rs:225:12 [INFO] [stdout] | [INFO] [stdout] 225 | pub struct TaskResult { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enum `TaskStatus` is never used [INFO] [stdout] --> src/core/scheduler.rs:233:10 [INFO] [stdout] | [INFO] [stdout] 233 | pub enum TaskStatus { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enum `TaskHealth` is never used [INFO] [stdout] --> src/core/scheduler.rs:250:10 [INFO] [stdout] | [INFO] [stdout] 250 | pub enum TaskHealth { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `SchedulerManager` is never constructed [INFO] [stdout] --> src/core/scheduler.rs:262:12 [INFO] [stdout] | [INFO] [stdout] 262 | pub struct SchedulerManager { [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/core/scheduler.rs:270:18 [INFO] [stdout] | [INFO] [stdout] 269 | impl SchedulerManager { [INFO] [stdout] | --------------------- associated items in this implementation [INFO] [stdout] 270 | pub async fn new(sync_engine: SyncEngine) -> Result { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 285 | pub async fn add_task(&self, mut scheduled_task: ScheduledTask) -> Result<()> { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 309 | async fn schedule_job(&self, scheduled_task: &ScheduledTask) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 367 | async fn execute_task( [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 433 | pub async fn start(&self) -> Result<()> { [INFO] [stdout] | ^^^^^ [INFO] [stdout] ... [INFO] [stdout] 440 | pub async fn stop(&mut self) -> Result<()> { [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 447 | pub async fn get_tasks(&self) -> Vec { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 452 | pub async fn get_task(&self, task_id: &str) -> Option { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 458 | pub async fn delete_task(&self, task_id: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 469 | pub async fn trigger_task(&self, task_id: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 506 | pub async fn pause_task(&self, task_id: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 517 | pub async fn resume_task(&self, task_id: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 528 | pub async fn reschedule_all(&mut self) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 554 | pub async fn get_stats(&self) -> SchedulerStats { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 584 | pub async fn cleanup_completed_tasks(&self, max_age_days: u32) -> Result { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 604 | pub async fn export_tasks(&self, format: ExportFormat) -> Result { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 618 | pub async fn import_tasks(&self, data: &str, format: ExportFormat) -> Result { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 640 | fn tasks_to_csv(tasks: &[ScheduledTask]) -> Result { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `SchedulerStats` is never constructed [INFO] [stdout] --> src/core/scheduler.rs:671:12 [INFO] [stdout] | [INFO] [stdout] 671 | pub struct SchedulerStats { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `new`, `success_rate`, and `health_score` are never used [INFO] [stdout] --> src/core/scheduler.rs:705:12 [INFO] [stdout] | [INFO] [stdout] 704 | impl SchedulerStats { [INFO] [stdout] | ------------------- associated items in this implementation [INFO] [stdout] 705 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 725 | pub fn success_rate(&self) -> f64 { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 733 | pub fn health_score(&self) -> f64 { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enum `ExportFormat` is never used [INFO] [stdout] --> src/core/scheduler.rs:751:10 [INFO] [stdout] | [INFO] [stdout] 751 | pub enum ExportFormat { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `CsvTask` is never constructed [INFO] [stdout] --> src/core/scheduler.rs:759:8 [INFO] [stdout] | [INFO] [stdout] 759 | struct CsvTask<'a> { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `TaskNotifier` is never constructed [INFO] [stdout] --> src/core/scheduler.rs:773:12 [INFO] [stdout] | [INFO] [stdout] 773 | pub struct TaskNotifier { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/core/scheduler.rs:779:12 [INFO] [stdout] | [INFO] [stdout] 778 | impl TaskNotifier { [INFO] [stdout] | ----------------- associated items in this implementation [INFO] [stdout] 779 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 787 | pub async fn notify_task_start(&self, task: &ScheduledTask) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 799 | pub async fn notify_task_complete( [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 819 | pub async fn notify_task_failed( [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 838 | async fn send_notification(&self, message: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 852 | async fn send_email(&self, _config: &EmailConfig, _message: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 858 | async fn send_webhook(&self, url: &str, message: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `EmailConfig` is never constructed [INFO] [stdout] --> src/core/scheduler.rs:873:12 [INFO] [stdout] | [INFO] [stdout] 873 | pub struct EmailConfig { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `cmd_schedule_task` is never used [INFO] [stdout] --> src/core/scheduler.rs:883:14 [INFO] [stdout] | [INFO] [stdout] 883 | pub async fn cmd_schedule_task( [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `cmd_list_scheduled_tasks` is never used [INFO] [stdout] --> src/core/scheduler.rs:922:14 [INFO] [stdout] | [INFO] [stdout] 922 | pub async fn cmd_list_scheduled_tasks(scheduler: &SchedulerManager) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `StateManager` is never used [INFO] [stdout] --> src/core/traits.rs:14:11 [INFO] [stdout] | [INFO] [stdout] 14 | pub trait StateManager: Send + Sync { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `ProgressReporter` is never used [INFO] [stdout] --> src/core/traits.rs:22:11 [INFO] [stdout] | [INFO] [stdout] 22 | pub trait ProgressReporter: Send + Sync { [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `RetryStrategy` is never used [INFO] [stdout] --> src/core/traits.rs:31:11 [INFO] [stdout] | [INFO] [stdout] 31 | pub trait RetryStrategy: Send + Sync { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `acquire`, `current_rate`, `set_rate`, and `try_acquire` are never used [INFO] [stdout] --> src/core/traits.rs:40:14 [INFO] [stdout] | [INFO] [stdout] 39 | pub trait RateLimiter: Send + Sync { [INFO] [stdout] | ----------- methods in this trait [INFO] [stdout] 40 | async fn acquire<'a>(&'a self) -> Result<()> [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 44 | fn current_rate(&self) -> f64; // 请求/秒 [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] 45 | fn set_rate(&mut self, requests_per_second: f64); [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 46 | fn try_acquire(&self) -> bool; [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `ChecksumCalculator` is never used [INFO] [stdout] --> src/core/traits.rs:50:11 [INFO] [stdout] | [INFO] [stdout] 50 | pub trait ChecksumCalculator: Send + Sync { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `DiffDetector` is never used [INFO] [stdout] --> src/core/traits.rs:57:11 [INFO] [stdout] | [INFO] [stdout] 57 | pub trait DiffDetector: Send + Sync { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `FileFilter` is never used [INFO] [stdout] --> src/core/traits.rs:69:11 [INFO] [stdout] | [INFO] [stdout] 69 | pub trait FileFilter: Send + Sync { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `TaskScheduler` is never used [INFO] [stdout] --> src/core/traits.rs:76:11 [INFO] [stdout] | [INFO] [stdout] 76 | pub trait TaskScheduler: Send + Sync { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `Notifier` is never used [INFO] [stdout] --> src/core/traits.rs:84:11 [INFO] [stdout] | [INFO] [stdout] 84 | pub trait Notifier: Send + Sync { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `AuditLogger` is never used [INFO] [stdout] --> src/core/traits.rs:92:11 [INFO] [stdout] | [INFO] [stdout] 92 | pub trait AuditLogger: Send + Sync { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `ConfigValidator` is never used [INFO] [stdout] --> src/core/traits.rs:102:11 [INFO] [stdout] | [INFO] [stdout] 102 | pub trait ConfigValidator: Send + Sync { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `HealthChecker` is never used [INFO] [stdout] --> src/core/traits.rs:110:11 [INFO] [stdout] | [INFO] [stdout] 110 | pub trait HealthChecker: Send + Sync { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `ResourceManager` is never used [INFO] [stdout] --> src/core/traits.rs:117:11 [INFO] [stdout] | [INFO] [stdout] 117 | pub trait ResourceManager: Send + Sync { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `Plugin` is never used [INFO] [stdout] --> src/core/traits.rs:126:11 [INFO] [stdout] | [INFO] [stdout] 126 | pub trait Plugin: Send + Sync { [INFO] [stdout] | ^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `HookHandler` is never used [INFO] [stdout] --> src/core/traits.rs:139:11 [INFO] [stdout] | [INFO] [stdout] 139 | pub trait HookHandler: Send + Sync { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `TransferStats` is never constructed [INFO] [stdout] --> src/core/traits.rs:149:12 [INFO] [stdout] | [INFO] [stdout] 149 | pub struct TransferStats { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `FileMetadata` is never constructed [INFO] [stdout] --> src/core/traits.rs:164:12 [INFO] [stdout] | [INFO] [stdout] 164 | pub struct FileMetadata { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enum `FileChange` is never used [INFO] [stdout] --> src/core/traits.rs:178:10 [INFO] [stdout] | [INFO] [stdout] 178 | pub enum FileChange { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `DiffOptions` is never constructed [INFO] [stdout] --> src/core/traits.rs:194:12 [INFO] [stdout] | [INFO] [stdout] 194 | pub struct DiffOptions { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ProgressUpdate` is never constructed [INFO] [stdout] --> src/core/traits.rs:205:12 [INFO] [stdout] | [INFO] [stdout] 205 | pub struct ProgressUpdate { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: fields `algorithm`, `key_id`, `nonce`, and `hmac` are never read [INFO] [stdout] --> src/encryption/mod.rs:17:9 [INFO] [stdout] | [INFO] [stdout] 16 | pub struct EncryptionMetadata { [INFO] [stdout] | ------------------ fields in this struct [INFO] [stdout] 17 | pub algorithm: EncryptionAlgorithm, [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] 18 | pub key_id: String, [INFO] [stdout] | ^^^^^^ [INFO] [stdout] 19 | pub nonce: Vec, [INFO] [stdout] | ^^^^^ [INFO] [stdout] 20 | pub hmac: Hmac, [INFO] [stdout] | ^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `decrypt_file` is never used [INFO] [stdout] --> src/encryption/mod.rs:99:18 [INFO] [stdout] | [INFO] [stdout] 29 | impl EncryptionManager { [INFO] [stdout] | ---------------------- method in this implementation [INFO] [stdout] ... [INFO] [stdout] 99 | pub async fn decrypt_file( [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `key_size`, `iv_size`, `tag_size`, and `recommended_iv_mode` are never used [INFO] [stdout] --> src/encryption/types.rs:19:12 [INFO] [stdout] | [INFO] [stdout] 18 | impl EncryptionAlgorithm { [INFO] [stdout] | ------------------------ methods in this implementation [INFO] [stdout] 19 | pub fn key_size(&self) -> usize { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 29 | pub fn iv_size(&self) -> usize { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 39 | pub fn tag_size(&self) -> usize { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 49 | pub fn recommended_iv_mode(&self) -> IvMode { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `requires_unique_per_file`, `generate_iv`, `generate_random_iv`, `generate_derived_iv`, `generate_counter_iv`, and `generate_file_offset_iv` are never used [INFO] [stdout] --> src/encryption/types.rs:75:12 [INFO] [stdout] | [INFO] [stdout] 74 | impl IvMode { [INFO] [stdout] | ----------- methods in this implementation [INFO] [stdout] 75 | pub fn requires_unique_per_file(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 85 | pub fn generate_iv(&self, context: &IvContext) -> Vec { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 95 | fn generate_random_iv(&self, size: usize) -> Vec { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 103 | fn generate_derived_iv(&self, context: &IvContext) -> Vec { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 123 | fn generate_counter_iv(&self, context: &IvContext) -> Vec { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 137 | fn generate_file_offset_iv(&self, context: &IvContext) -> Vec { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `IvContext` is never constructed [INFO] [stdout] --> src/encryption/types.rs:152:12 [INFO] [stdout] | [INFO] [stdout] 152 | pub struct IvContext { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple variants are never constructed [INFO] [stdout] --> src/error/mod.rs:35:5 [INFO] [stdout] | [INFO] [stdout] 9 | pub enum SyncError { [INFO] [stdout] | --------- variants in this enum [INFO] [stdout] ... [INFO] [stdout] 35 | Validation(String), [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 38 | Timeout(String), [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 41 | RateLimitExceeded(String), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 44 | AuthenticationFailed(String), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 47 | PermissionDenied(String), [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 50 | FileNotFound(String), [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 53 | ResourceExhausted(String), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 56 | Conflict(String), [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 59 | IntegrityCheckFailed(String), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 62 | RetryLimitExceeded(String), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 65 | OperationCanceled, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 68 | Unsupported(String), [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `SyncError` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: variants `FileNotFound`, `ReadFailed`, `ParseFailed`, and `MissingField` are never constructed [INFO] [stdout] --> src/error/mod.rs:77:5 [INFO] [stdout] | [INFO] [stdout] 75 | pub enum ConfigError { [INFO] [stdout] | ----------- variants in this enum [INFO] [stdout] 76 | #[error("Configuration file not found: {0}")] [INFO] [stdout] 77 | FileNotFound(PathBuf), [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 80 | ReadFailed(#[source] IoError), [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 83 | ParseFailed(String), [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 86 | MissingField(String), [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `ConfigError` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple variants are never constructed [INFO] [stdout] --> src/error/mod.rs:101:5 [INFO] [stdout] | [INFO] [stdout] 96 | pub enum ProviderError { [INFO] [stdout] | ------------- variants in this enum [INFO] [stdout] ... [INFO] [stdout] 101 | NotSupported(String), [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 107 | InvalidCredentials(String), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 110 | QuotaExceeded(String), [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 113 | RateLimited(String), [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 116 | AuthFailed(String), [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 125 | Timeout(String), [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 131 | PermissionDenied(String), [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `ProviderError` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: variants `InvalidKey`, `DecryptionFailed`, `InvalidIV`, `IntegrityCheckFailed`, and `UnsupportedAlgorithm` are never constructed [INFO] [stdout] --> src/error/mod.rs:143:5 [INFO] [stdout] | [INFO] [stdout] 138 | pub enum EncryptionError { [INFO] [stdout] | --------------- variants in this enum [INFO] [stdout] ... [INFO] [stdout] 143 | InvalidKey(String), [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 149 | DecryptionFailed(String), [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 152 | InvalidIV, [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 155 | IntegrityCheckFailed, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 161 | UnsupportedAlgorithm(String), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `EncryptionError` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: variants `Full`, `NotAvailable`, `Timeout`, `Corruption`, and `VersionMismatch` are never constructed [INFO] [stdout] --> src/error/mod.rs:167:5 [INFO] [stdout] | [INFO] [stdout] 165 | pub enum StorageError { [INFO] [stdout] | ------------ variants in this enum [INFO] [stdout] 166 | #[error("Storage full: {0}")] [INFO] [stdout] 167 | Full(String), [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 170 | NotAvailable(String), [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 173 | Timeout(String), [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 176 | Corruption(String), [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 179 | VersionMismatch(String), [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `StorageError` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `is_retryable`, `is_fatal`, and `error_code` are never used [INFO] [stdout] --> src/error/mod.rs:184:12 [INFO] [stdout] | [INFO] [stdout] 183 | impl SyncError { [INFO] [stdout] | -------------- methods in this implementation [INFO] [stdout] 184 | pub fn is_retryable(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 197 | pub fn is_fatal(&self) -> bool { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 210 | pub fn error_code(&self) -> u32 { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: type alias `ConfigResult` is never used [INFO] [stdout] --> src/error/mod.rs:239:10 [INFO] [stdout] | [INFO] [stdout] 239 | pub type ConfigResult = std::result::Result; [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: type alias `ProviderResult` is never used [INFO] [stdout] --> src/error/mod.rs:240:10 [INFO] [stdout] | [INFO] [stdout] 240 | pub type ProviderResult = std::result::Result; [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: type alias `EncryptionResult` is never used [INFO] [stdout] --> src/error/mod.rs:241:10 [INFO] [stdout] | [INFO] [stdout] 241 | pub type EncryptionResult = std::result::Result; [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `FileMetadata` is never constructed [INFO] [stdout] --> src/plugins/mod.rs:5:12 [INFO] [stdout] | [INFO] [stdout] 5 | pub struct FileMetadata { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enum `PluginHook` is never used [INFO] [stdout] --> src/plugins/hooks.rs:9:10 [INFO] [stdout] | [INFO] [stdout] 9 | pub enum PluginHook { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enum `HookPriority` is never used [INFO] [stdout] --> src/plugins/hooks.rs:43:10 [INFO] [stdout] | [INFO] [stdout] 43 | pub enum HookPriority { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `name`, `priority`, and `set_priority` are never used [INFO] [stdout] --> src/plugins/hooks.rs:57:12 [INFO] [stdout] | [INFO] [stdout] 56 | impl PluginHook { [INFO] [stdout] | --------------- methods in this implementation [INFO] [stdout] 57 | pub fn name(&self) -> &'static str { [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 71 | pub fn priority(&self) -> HookPriority { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 85 | pub fn set_priority(&mut self, priority: HookPriority) { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `HookContext` is never constructed [INFO] [stdout] --> src/plugins/hooks.rs:101:12 [INFO] [stdout] | [INFO] [stdout] 101 | pub struct HookContext { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/plugins/hooks.rs:116:12 [INFO] [stdout] | [INFO] [stdout] 115 | impl HookContext { [INFO] [stdout] | ---------------- associated items in this implementation [INFO] [stdout] 116 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 126 | pub fn with_task(mut self, task: SyncTask) -> Self { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 131 | pub fn with_report(mut self, report: SyncReport) -> Self { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 136 | pub fn with_file(mut self, file: FileMetadata) -> Self { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 141 | pub fn with_error(mut self, error: SyncError) -> Self { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 146 | pub fn set_custom_data(&mut self, key: String, value: serde_json::Value) { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 150 | pub fn get_custom_data(&self, key: &str) -> Option<&serde_json::Value> { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `HookHandler` is never used [INFO] [stdout] --> src/plugins/hooks.rs:156:11 [INFO] [stdout] | [INFO] [stdout] 156 | pub trait HookHandler: Send + Sync { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `HookManager` is never constructed [INFO] [stdout] --> src/plugins/manager.rs:7:12 [INFO] [stdout] | [INFO] [stdout] 7 | pub struct HookManager { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `new`, `register_handler`, `execute_hook`, and `all_hook_types` are never used [INFO] [stdout] --> src/plugins/manager.rs:19:12 [INFO] [stdout] | [INFO] [stdout] 18 | impl HookManager { [INFO] [stdout] | ---------------- associated items in this implementation [INFO] [stdout] 19 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 26 | pub fn register_handler(&mut self, handler: Box) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 31 | pub async fn execute_hook(&self, hook: PluginHook, context: &mut HookContext) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 51 | fn all_hook_types() -> Vec<&'static str> { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `LoggingPlugin` is never constructed [INFO] [stdout] --> src/plugins/manager.rs:58:12 [INFO] [stdout] | [INFO] [stdout] 58 | pub struct LoggingPlugin { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated function `new` is never used [INFO] [stdout] --> src/plugins/manager.rs:71:12 [INFO] [stdout] | [INFO] [stdout] 70 | impl LoggingPlugin { [INFO] [stdout] | ------------------ associated function in this implementation [INFO] [stdout] 71 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `verify`, `stat`, and `exists` are never used [INFO] [stdout] --> src/providers/mod.rs:20:14 [INFO] [stdout] | [INFO] [stdout] 19 | pub trait StorageProvider: Send + Sync { [INFO] [stdout] | --------------- methods in this trait [INFO] [stdout] 20 | async fn verify(&self) -> Result<(), SyncError>; [INFO] [stdout] | ^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 31 | async fn stat(&self, path: &str) -> Result; [INFO] [stdout] | ^^^^ [INFO] [stdout] 32 | async fn exists(&self, path: &str) -> Result; [INFO] [stdout] | ^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: fields `bytes_uploaded`, `file_size`, `checksum`, and `elapsed_time` are never read [INFO] [stdout] --> src/providers/mod.rs:46:9 [INFO] [stdout] | [INFO] [stdout] 45 | pub struct UploadResult { [INFO] [stdout] | ------------ fields in this struct [INFO] [stdout] 46 | pub bytes_uploaded: u64, [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] 47 | pub file_size: u64, [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] 48 | pub checksum: Option, [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 49 | pub elapsed_time: Duration, [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `UploadResult` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: fields `bytes_downloaded`, `file_size`, `checksum`, and `elapsed_time` are never read [INFO] [stdout] --> src/providers/mod.rs:54:9 [INFO] [stdout] | [INFO] [stdout] 53 | pub struct DownloadResult { [INFO] [stdout] | -------------- fields in this struct [INFO] [stdout] 54 | pub bytes_downloaded: u64, [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] 55 | pub file_size: u64, [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] 56 | pub checksum: Option, [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 57 | pub elapsed_time: Duration, [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `DownloadResult` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `RateLimitedProvider` is never constructed [INFO] [stdout] --> src/providers/mod.rs:60:12 [INFO] [stdout] | [INFO] [stdout] 60 | pub struct RateLimitedProvider { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated function `new` is never used [INFO] [stdout] --> src/providers/mod.rs:66:12 [INFO] [stdout] | [INFO] [stdout] 65 | impl RateLimitedProvider { [INFO] [stdout] | ----------------------------------------------- associated function in this implementation [INFO] [stdout] 66 | pub fn new(inner: T, config: RateLimitConfig) -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: fields `client`, `token`, `refresh_token`, and `rate_limiter` are never read [INFO] [stdout] --> src/providers/aliyun.rs:14:5 [INFO] [stdout] | [INFO] [stdout] 13 | pub struct AliYunDriveProvider { [INFO] [stdout] | ------------------- fields in this struct [INFO] [stdout] 14 | client: reqwest::Client, [INFO] [stdout] | ^^^^^^ [INFO] [stdout] 15 | token: String, [INFO] [stdout] | ^^^^^ [INFO] [stdout] 16 | refresh_token: String, [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] 17 | rate_limiter: Arc, [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `refresh_token_if_needed` is never used [INFO] [stdout] --> src/providers/aliyun.rs:43:14 [INFO] [stdout] | [INFO] [stdout] 20 | impl AliYunDriveProvider { [INFO] [stdout] | ------------------------ method in this implementation [INFO] [stdout] ... [INFO] [stdout] 43 | async fn refresh_token_if_needed(&mut self) -> Result<(), ProviderError> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `generate_html`, `generate_file_rows`, `generate_error_list`, and `generate_json` are never used [INFO] [stdout] --> src/report/mod.rs:72:12 [INFO] [stdout] | [INFO] [stdout] 58 | impl SyncReport { [INFO] [stdout] | --------------- methods in this implementation [INFO] [stdout] ... [INFO] [stdout] 72 | pub fn generate_html(&self) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 150 | fn generate_file_rows(&self) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 164 | fn generate_error_list(&self) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 172 | pub fn generate_json(&self) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `as_str`, `emoji`, `is_completed`, `is_successful`, `can_retry`, and `is_active` are never used [INFO] [stdout] --> src/report/mod.rs:205:12 [INFO] [stdout] | [INFO] [stdout] 204 | impl SyncStatus { [INFO] [stdout] | --------------- methods in this implementation [INFO] [stdout] 205 | pub fn as_str(&self) -> &'static str { [INFO] [stdout] | ^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 220 | pub fn emoji(&self) -> &'static str { [INFO] [stdout] | ^^^^^ [INFO] [stdout] ... [INFO] [stdout] 235 | pub fn is_completed(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 242 | pub fn is_successful(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 246 | pub fn can_retry(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 250 | pub fn is_active(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/report/mod.rs:344:12 [INFO] [stdout] | [INFO] [stdout] 313 | impl FileSyncResult { [INFO] [stdout] | ------------------- associated items in this implementation [INFO] [stdout] ... [INFO] [stdout] 344 | pub fn from_diff(diff: &FileDiff, operation: FileOperation) -> Self { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 377 | pub fn mark_started(&mut self) { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 382 | pub fn mark_completed(&mut self, success: bool) { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 403 | pub fn mark_retry(&mut self, error: Option) { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 410 | pub fn mark_verifying(&mut self) { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 414 | pub fn mark_verified(&mut self, verified: bool) { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 423 | pub fn add_warning(&mut self, warning: String) { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 435 | pub fn is_completed(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 443 | pub fn human_readable_size(&self) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 447 | pub fn human_readable_transferred(&self) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 451 | pub fn human_readable_speed(&self) -> Option { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 463 | pub fn summary(&self) -> String { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 483 | pub fn detailed_info(&self) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 550 | pub fn to_json(&self) -> Result { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 554 | pub fn from_json(json: &str) -> Result { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `as_str`, `emoji`, `is_completed`, `is_successful`, and `can_retry` are never used [INFO] [stdout] --> src/report/mod.rs:589:12 [INFO] [stdout] | [INFO] [stdout] 588 | impl FileSyncStatus { [INFO] [stdout] | ------------------- methods in this implementation [INFO] [stdout] 589 | pub fn as_str(&self) -> &'static str { [INFO] [stdout] | ^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 606 | pub fn emoji(&self) -> &'static str { [INFO] [stdout] | ^^^^^ [INFO] [stdout] ... [INFO] [stdout] 623 | pub fn is_completed(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 630 | pub fn is_successful(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 634 | pub fn can_retry(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `from_extension`, `from_path`, `from_metadata`, `from_mime_type`, `is_compressible`, and `is_binary` are never used [INFO] [stdout] --> src/report/mod.rs:771:12 [INFO] [stdout] | [INFO] [stdout] 770 | impl FileType { [INFO] [stdout] | ------------- associated items in this implementation [INFO] [stdout] 771 | pub fn from_extension(extension: &str) -> Self { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 796 | pub fn from_path(path: &Path) -> Self { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 808 | pub fn from_metadata(metadata: &crate::sync::diff::FileMetadata) -> Self { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 822 | pub fn from_mime_type(mime_type: &str) -> Self { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 891 | pub fn is_compressible(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 904 | pub fn is_binary(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `new` and `update_speed_metrics` are never used [INFO] [stdout] --> src/report/mod.rs:962:12 [INFO] [stdout] | [INFO] [stdout] 961 | impl SyncStatistics { [INFO] [stdout] | ------------------- associated items in this implementation [INFO] [stdout] 962 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 1033 | pub fn update_speed_metrics(&mut self, speed: f64) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `success_rate` is never used [INFO] [stdout] --> src/report/mod.rs:1280:12 [INFO] [stdout] | [INFO] [stdout] 1243 | impl FileTypeStats { [INFO] [stdout] | ------------------ method in this implementation [INFO] [stdout] ... [INFO] [stdout] 1280 | pub fn success_rate(&self) -> f64 { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `VerificationResult` is never constructed [INFO] [stdout] --> src/sync/mod.rs:4:12 [INFO] [stdout] | [INFO] [stdout] 4 | pub struct VerificationResult { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ErrorResult` is never constructed [INFO] [stdout] --> src/sync/mod.rs:12:8 [INFO] [stdout] | [INFO] [stdout] 12 | struct ErrorResult {} [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `as_str`, `emoji`, `is_destructive`, and `requires_user_action` are never used [INFO] [stdout] --> src/sync/diff.rs:31:12 [INFO] [stdout] | [INFO] [stdout] 30 | impl DiffAction { [INFO] [stdout] | --------------- methods in this implementation [INFO] [stdout] 31 | pub fn as_str(&self) -> &'static str { [INFO] [stdout] | ^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 44 | pub fn emoji(&self) -> &'static str { [INFO] [stdout] | ^^^^^ [INFO] [stdout] ... [INFO] [stdout] 61 | pub fn is_destructive(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 65 | pub fn requires_user_action(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/sync/diff.rs:157:12 [INFO] [stdout] | [INFO] [stdout] 115 | impl FileDiff { [INFO] [stdout] | ------------- associated items in this implementation [INFO] [stdout] ... [INFO] [stdout] 157 | pub fn download( [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 169 | pub fn conflict(path: String, source_info: FileMetadata, target_info: FileMetadata) -> Self { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 198 | pub fn create_dir(path: String, source_info: FileMetadata) -> Self { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 202 | pub fn move_file( [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 269 | pub fn calculate_similarity(&self) -> f64 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 289 | pub fn is_similar(&self, threshold: f64) -> bool { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 293 | pub fn should_retry(&self, max_retries: u32) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 297 | pub fn mark_retry(&mut self, error: Option) { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 303 | pub fn mark_success(&mut self) { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 309 | pub fn is_expired(&self, timeout: Duration) -> bool { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 335 | pub fn human_readable_size(&self) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 339 | pub fn summary(&self) -> String { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 361 | pub fn to_json(&self) -> Result { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 365 | pub fn from_json(json: &str) -> Result { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 369 | pub fn is_encrypted(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 379 | pub fn requires_decryption(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `calculate_hash` and `update_metadata_hash` are never used [INFO] [stdout] --> src/sync/diff.rs:483:12 [INFO] [stdout] | [INFO] [stdout] 408 | impl FileMetadata { [INFO] [stdout] | ----------------- methods in this implementation [INFO] [stdout] ... [INFO] [stdout] 483 | pub fn calculate_hash(&mut self, _algorithm: ChecksumType) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 511 | pub fn update_metadata_hash(&mut self) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `hash_size` and `recommended` are never used [INFO] [stdout] --> src/sync/diff.rs:613:12 [INFO] [stdout] | [INFO] [stdout] 612 | impl ChecksumType { [INFO] [stdout] | ----------------- associated items in this implementation [INFO] [stdout] 613 | pub fn hash_size(&self) -> usize { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 625 | pub fn recommended() -> Self { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple methods are never used [INFO] [stdout] --> src/sync/diff.rs:715:12 [INFO] [stdout] | [INFO] [stdout] 665 | impl DiffResult { [INFO] [stdout] | --------------- methods in this implementation [INFO] [stdout] ... [INFO] [stdout] 715 | pub fn sort_by_priority(&mut self) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 719 | pub fn filter_by_action(&self, action: DiffAction) -> Vec<&FileDiff> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 726 | pub fn filter_by_tag(&self, tag: &str) -> Vec<&FileDiff> { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 733 | pub fn find_by_path(&self, path: &str) -> Option<&FileDiff> { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 737 | pub fn has_conflicts(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 741 | pub fn is_empty(&self) -> bool { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 745 | pub fn summary(&self) -> String { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 756 | pub fn to_json(&self) -> Result { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 760 | pub fn to_csv(&self) -> Result { [INFO] [stdout] | ^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `finalize` and `human_readable` are never used [INFO] [stdout] --> src/sync/diff.rs:845:12 [INFO] [stdout] | [INFO] [stdout] 808 | impl DiffStats { [INFO] [stdout] | -------------- methods in this implementation [INFO] [stdout] ... [INFO] [stdout] 845 | pub fn finalize(&mut self) { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 853 | pub fn human_readable(&self) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `CsvDiff` is never constructed [INFO] [stdout] --> src/sync/diff.rs:865:8 [INFO] [stdout] | [INFO] [stdout] 865 | struct CsvDiff<'a> { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `DiffDetector` is never constructed [INFO] [stdout] --> src/sync/diff.rs:878:12 [INFO] [stdout] | [INFO] [stdout] 878 | pub struct DiffDetector { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/sync/diff.rs:884:12 [INFO] [stdout] | [INFO] [stdout] 883 | impl DiffDetector { [INFO] [stdout] | ----------------- associated items in this implementation [INFO] [stdout] 884 | pub fn new(options: DiffOptions) -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 891 | pub async fn detect_changes( [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 955 | fn is_file_changed(&self, source: &FileMetadata, target: &FileMetadata) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 978 | fn create_file_diff(&self, source: &FileMetadata, target: Option<&FileMetadata>) -> FileDiff { [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 993 | fn analyze_changes(&self, diff: &mut FileDiff) { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 1021 | fn detect_moves(&self, result: &mut DiffResult) { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 1060 | fn detect_conflicts(&self, result: &mut DiffResult) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 1094 | fn calculate_file_similarity(&self, file1: &FileMetadata, file2: &FileMetadata) -> f64 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 1128 | fn update_cache(&mut self, files: &[FileMetadata]) { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `DiffOptions` is never constructed [INFO] [stdout] --> src/sync/diff.rs:1138:12 [INFO] [stdout] | [INFO] [stdout] 1138 | pub struct DiffOptions { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `diff_cache` is never read [INFO] [stdout] --> src/sync/engine.rs:19:5 [INFO] [stdout] | [INFO] [stdout] 16 | pub struct SyncEngine { [INFO] [stdout] | ---------- field in this struct [INFO] [stdout] ... [INFO] [stdout] 19 | diff_cache: DashMap, [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `sync` is never used [INFO] [stdout] --> src/sync/engine.rs:116:18 [INFO] [stdout] | [INFO] [stdout] 25 | impl SyncEngine { [INFO] [stdout] | --------------- method in this implementation [INFO] [stdout] ... [INFO] [stdout] 116 | pub async fn sync(&mut self, task: &SyncTask) -> Result { [INFO] [stdout] | ^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `speed` is never read [INFO] [stdout] --> src/sync/engine.rs:392:9 [INFO] [stdout] | [INFO] [stdout] 386 | pub struct SyncProgress { [INFO] [stdout] | ------------ field in this struct [INFO] [stdout] ... [INFO] [stdout] 392 | pub speed: f64, [INFO] [stdout] | ^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` has identical blocks [INFO] [stdout] --> src/cli/browse.rs:313:45 [INFO] [stdout] | [INFO] [stdout] 313 | ... let icon_color = if is_selected { type_color } else { type_color }; // Keep icon color or make it white? Let's keep original ... [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] note: same as this [INFO] [stdout] --> src/cli/browse.rs:313:65 [INFO] [stdout] | [INFO] [stdout] 313 | ... let icon_color = if is_selected { type_color } else { type_color }; // Keep icon color or make it white? Let's keep original ... [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#if_same_then_else [INFO] [stdout] = note: `#[warn(clippy::if_same_then_else)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: implementation of inherent method `to_string(&self) -> String` for type `cli::info::SystemInfo` [INFO] [stdout] --> src/cli/info.rs:25:5 [INFO] [stdout] | [INFO] [stdout] 25 | / pub fn to_string(&self) -> String { [INFO] [stdout] 26 | | format!( [INFO] [stdout] 27 | | "Cloud Disk Sync Info\n\ [INFO] [stdout] 28 | | --------------------\n\ [INFO] [stdout] ... | [INFO] [stdout] 37 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: implement trait `Display` for type `cli::info::SystemInfo` instead [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#inherent_to_string [INFO] [stdout] = note: `#[warn(clippy::inherent_to_string)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` can be collapsed into the outer `match` [INFO] [stdout] --> src/config/validator.rs:20:17 [INFO] [stdout] | [INFO] [stdout] 20 | / if !account.credentials.contains_key("refresh_token") { [INFO] [stdout] 21 | | return Err( [INFO] [stdout] 22 | | ConfigError::MissingField("refresh_token for AliYunDrive".into()).into(), [INFO] [stdout] 23 | | ); [INFO] [stdout] 24 | | } [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] 19 ~ ProviderType::AliYunDrive [INFO] [stdout] 20 ~ if !account.credentials.contains_key("refresh_token") => { [INFO] [stdout] 21 | return Err( [INFO] [stdout] 22 | ConfigError::MissingField("refresh_token for AliYunDrive".into()).into(), [INFO] [stdout] 23 | ); [INFO] [stdout] 24 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `SMB` contains a capitalized acronym [INFO] [stdout] --> src/config/mod.rs:23:5 [INFO] [stdout] | [INFO] [stdout] 23 | SMB, [INFO] [stdout] | ^^^ help: consider making the acronym lowercase, except the initial letter: `Smb` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] = note: `#[warn(clippy::upper_case_acronyms)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `HSM` contains a capitalized acronym [INFO] [stdout] --> src/config/mod.rs:377:5 [INFO] [stdout] | [INFO] [stdout] 377 | HSM { [INFO] [stdout] | ^^^ help: consider making the acronym lowercase, except the initial letter: `Hsm` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: explicit call to `.into_iter()` in function argument accepting `IntoIterator` [INFO] [stdout] --> src/core/audit.rs:184:62 [INFO] [stdout] | [INFO] [stdout] 184 | let mut rows = stmt.query(rusqlite::params_from_iter(params.into_iter()))?; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()` [INFO] [stdout] --> /opt/rustwide/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/rusqlite-0.38.0/src/params.rs:431:8 [INFO] [stdout] | [INFO] [stdout] 431 | I: IntoIterator, [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_conversion [INFO] [stdout] = note: `#[warn(clippy::useless_conversion)]` on by default [INFO] [stdout] help: consider removing the `.into_iter()` [INFO] [stdout] | [INFO] [stdout] 184 - let mut rows = stmt.query(rusqlite::params_from_iter(params.into_iter()))?; [INFO] [stdout] 184 + let mut rows = stmt.query(rusqlite::params_from_iter(params))?; [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `TCP` contains a capitalized acronym [INFO] [stdout] --> src/core/health.rs:170:5 [INFO] [stdout] | [INFO] [stdout] 170 | TCP, [INFO] [stdout] | ^^^ help: consider making the acronym lowercase, except the initial letter: `Tcp` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `UDP` contains a capitalized acronym [INFO] [stdout] --> src/core/health.rs:171:5 [INFO] [stdout] | [INFO] [stdout] 171 | UDP, [INFO] [stdout] | ^^^ help: consider making the acronym lowercase, except the initial letter: `Udp` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `HTTP` contains a capitalized acronym [INFO] [stdout] --> src/core/health.rs:172:5 [INFO] [stdout] | [INFO] [stdout] 172 | HTTP, [INFO] [stdout] | ^^^^ help: consider making the acronym lowercase, except the initial letter: `Http` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `HTTPS` contains a capitalized acronym [INFO] [stdout] --> src/core/health.rs:173:5 [INFO] [stdout] | [INFO] [stdout] 173 | HTTPS, [INFO] [stdout] | ^^^^^ help: consider making the acronym lowercase, except the initial letter: `Https` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: implementation of inherent method `to_string(&self) -> String` for type `core::resources::ResourceUsage` [INFO] [stdout] --> src/core/resources.rs:224:5 [INFO] [stdout] | [INFO] [stdout] 224 | / pub fn to_string(&self) -> String { [INFO] [stdout] 225 | | format!( [INFO] [stdout] 226 | | "Memory: {:.1}% used, Disk: {:.1}% used, CPU: {:.1}%, Tasks: {}/{}", [INFO] [stdout] 227 | | self.memory_percentage, [INFO] [stdout] ... | [INFO] [stdout] 233 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: implement trait `Display` for type `core::resources::ResourceUsage` instead [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#inherent_to_string [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the loop variable `i` is used to index `iv` [INFO] [stdout] --> src/encryption/types.rs:128:18 [INFO] [stdout] | [INFO] [stdout] 128 | for i in 0..8 { [INFO] [stdout] | ^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stdout] = note: `#[warn(clippy::needless_range_loop)]` on by default [INFO] [stdout] help: consider using an iterator and enumerate() [INFO] [stdout] | [INFO] [stdout] 128 - for i in 0..8 { [INFO] [stdout] 128 + for (i, ) in iv.iter_mut().enumerate().take(8) { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the loop variable `i` is used to index `iv` [INFO] [stdout] --> src/encryption/types.rs:141:18 [INFO] [stdout] | [INFO] [stdout] 141 | for i in 0..8 { [INFO] [stdout] | ^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stdout] help: consider using an iterator and enumerate() [INFO] [stdout] | [INFO] [stdout] 141 - for i in 0..8 { [INFO] [stdout] 141 + for (i, ) in iv.iter_mut().enumerate().take(8) { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: match expression looks like `matches!` macro [INFO] [stdout] --> src/error/mod.rs:185:9 [INFO] [stdout] | [INFO] [stdout] 185 | / match self { [INFO] [stdout] 186 | | SyncError::Network(_) [INFO] [stdout] 187 | | | SyncError::Timeout(_) [INFO] [stdout] 188 | | | SyncError::RateLimitExceeded(_) [INFO] [stdout] ... | [INFO] [stdout] 193 | | _ => false, [INFO] [stdout] 194 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_like_matches_macro [INFO] [stdout] = note: `#[warn(clippy::match_like_matches_macro)]` on by default [INFO] [stdout] help: use `matches!` directly [INFO] [stdout] | [INFO] [stdout] 185 ~ matches!(self, SyncError::Network(_) [INFO] [stdout] 186 + | SyncError::Timeout(_) [INFO] [stdout] 187 + | SyncError::RateLimitExceeded(_) [INFO] [stdout] 188 + | SyncError::ResourceExhausted(_) | SyncError::Provider(ProviderError::RateLimited(_)) [INFO] [stdout] 189 + | SyncError::Provider(ProviderError::Timeout(_)) [INFO] [stdout] 190 + | SyncError::Provider(ProviderError::ConnectionFailed(_))) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: match expression looks like `matches!` macro [INFO] [stdout] --> src/error/mod.rs:198:9 [INFO] [stdout] | [INFO] [stdout] 198 | / match self { [INFO] [stdout] 199 | | SyncError::Provider(ProviderError::NotFound(_)) [INFO] [stdout] 200 | | | SyncError::Provider(ProviderError::NotSupported(_)) [INFO] [stdout] 201 | | | SyncError::Provider(ProviderError::InvalidCredentials(_)) [INFO] [stdout] ... | [INFO] [stdout] 206 | | _ => false, [INFO] [stdout] 207 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_like_matches_macro [INFO] [stdout] help: use `matches!` directly [INFO] [stdout] | [INFO] [stdout] 198 ~ matches!(self, SyncError::Provider(ProviderError::NotFound(_)) [INFO] [stdout] 199 + | SyncError::Provider(ProviderError::NotSupported(_)) [INFO] [stdout] 200 + | SyncError::Provider(ProviderError::InvalidCredentials(_)) [INFO] [stdout] 201 + | SyncError::Provider(ProviderError::PermissionDenied(_)) [INFO] [stdout] 202 + | SyncError::Encryption(EncryptionError::KeyNotFound(_)) [INFO] [stdout] 203 + | SyncError::Encryption(EncryptionError::InvalidKey(_)) [INFO] [stdout] 204 + | SyncError::Validation(_)) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: match expression looks like `matches!` macro [INFO] [stdout] --> src/plugins/manager.rs:155:9 [INFO] [stdout] | [INFO] [stdout] 155 | / match hook { [INFO] [stdout] 156 | | PluginHook::PreSync { .. } => true, [INFO] [stdout] 157 | | PluginHook::PostSync { .. } => true, [INFO] [stdout] 158 | | PluginHook::OnError { .. } => true, [INFO] [stdout] 159 | | _ => false, [INFO] [stdout] 160 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_like_matches_macro [INFO] [stdout] help: use `matches!` directly [INFO] [stdout] | [INFO] [stdout] 155 - match hook { [INFO] [stdout] 156 - PluginHook::PreSync { .. } => true, [INFO] [stdout] 157 - PluginHook::PostSync { .. } => true, [INFO] [stdout] 158 - PluginHook::OnError { .. } => true, [INFO] [stdout] 159 - _ => false, [INFO] [stdout] 160 - } [INFO] [stdout] 155 + matches!(hook, PluginHook::PreSync { .. } | PluginHook::PostSync { .. } | PluginHook::OnError { .. }) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&String` instead of `&str` involves a new object where a slice will do [INFO] [stdout] --> src/report/mod.rs:22:54 [INFO] [stdout] | [INFO] [stdout] 22 | pub(crate) fn add_conflict(&mut self, diff_path: &String) { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stdout] = note: `#[warn(clippy::ptr_arg)]` on by default [INFO] [stdout] help: change this to [INFO] [stdout] | [INFO] [stdout] 22 ~ pub(crate) fn add_conflict(&mut self, diff_path: &str) { [INFO] [stdout] 23 | self.statistics.conflicts += 1; [INFO] [stdout] 24 | self.statistics.total_files += 1; [INFO] [stdout] 25 ~ let mut result = FileSyncResult::new(diff_path.to_owned(), FileOperation::Verify); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&String` instead of `&str` involves a new object where a slice will do [INFO] [stdout] --> src/report/mod.rs:30:53 [INFO] [stdout] | [INFO] [stdout] 30 | pub(crate) fn add_success(&mut self, diff_path: &String, diff_size: i64) { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stdout] help: change this to [INFO] [stdout] | [INFO] [stdout] 30 ~ pub(crate) fn add_success(&mut self, diff_path: &str, diff_size: i64) { [INFO] [stdout] 31 ~ let mut result = FileSyncResult::new(diff_path.to_owned(), FileOperation::Upload); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: type `core::health::TempStorageHealth` is more private than the item `core::health::StorageHealth::temp_storage` [INFO] [stdout] --> src/core/health.rs:133:5 [INFO] [stdout] | [INFO] [stdout] 133 | pub temp_storage: TempStorageHealth, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ field `core::health::StorageHealth::temp_storage` is reachable at visibility `pub(crate)` [INFO] [stdout] | [INFO] [stdout] note: but type `core::health::TempStorageHealth` is only usable at visibility `pub(self)` [INFO] [stdout] --> src/core/health.rs:18:1 [INFO] [stdout] | [INFO] [stdout] 18 | struct TempStorageHealth {} [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] = note: `#[warn(private_interfaces)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: type `sync::ErrorResult` is more private than the item `sync::VerificationResult::errors` [INFO] [stdout] --> src/sync/mod.rs:9:5 [INFO] [stdout] | [INFO] [stdout] 9 | pub errors: Vec, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ field `sync::VerificationResult::errors` is reachable at visibility `pub(crate)` [INFO] [stdout] | [INFO] [stdout] note: but type `sync::ErrorResult` is only usable at visibility `pub(self)` [INFO] [stdout] --> src/sync/mod.rs:12:1 [INFO] [stdout] | [INFO] [stdout] 12 | struct ErrorResult {} [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `validate` is never used [INFO] [stdout] --> src/config/mod.rs:38:12 [INFO] [stdout] | [INFO] [stdout] 37 | impl AccountConfig { [INFO] [stdout] | ------------------ method in this implementation [INFO] [stdout] 38 | pub fn validate(&self) -> Result<(), Box> { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `validate` is never used [INFO] [stdout] --> src/config/mod.rs:89:12 [INFO] [stdout] | [INFO] [stdout] 88 | impl SyncTask { [INFO] [stdout] | ------------- method in this implementation [INFO] [stdout] 89 | pub fn validate(&self) -> Result<(), Box> { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `update_account` and `update_task` are never used [INFO] [stdout] --> src/config/mod.rs:290:12 [INFO] [stdout] | [INFO] [stdout] 270 | impl ConfigManager { [INFO] [stdout] | ------------------ methods in this implementation [INFO] [stdout] ... [INFO] [stdout] 290 | pub fn update_account(&mut self, account: AccountConfig) -> Result<(), ConfigError> { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 307 | pub fn update_task(&mut self, task: SyncTask) -> Result<(), ConfigError> { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `validate`, `find_account`, `find_task`, `find_encryption_key`, and `find_schedule` are never used [INFO] [stdout] --> src/config/mod.rs:539:12 [INFO] [stdout] | [INFO] [stdout] 524 | impl ConfigFile { [INFO] [stdout] | --------------- methods in this implementation [INFO] [stdout] ... [INFO] [stdout] 539 | pub fn validate(&self) -> Result<(), Vec> { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 577 | pub fn find_account(&self, account_id: &str) -> Option<&AccountConfig> { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 581 | pub fn find_task(&self, task_id: &str) -> Option<&SyncTask> { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 585 | pub fn find_encryption_key(&self, key_id: &str) -> Option<&EncryptionKey> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 589 | pub fn find_schedule(&self, schedule_id: &str) -> Option<&ScheduleConfig> { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated functions `backup_config`, `restore_config`, and `list_backups` are never used [INFO] [stdout] --> src/config/migrator.rs:45:12 [INFO] [stdout] | [INFO] [stdout] 7 | impl ConfigMigrator { [INFO] [stdout] | ------------------- associated functions in this implementation [INFO] [stdout] ... [INFO] [stdout] 45 | pub fn backup_config(config_path: &std::path::Path) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 62 | pub fn restore_config(config_path: &std::path::Path, backup_name: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 84 | pub fn list_backups(config_path: &std::path::Path) -> Result> { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `key_path` is never read [INFO] [stdout] --> src/config/security.rs:14:5 [INFO] [stdout] | [INFO] [stdout] 13 | pub struct SecurityManager { [INFO] [stdout] | --------------- field in this struct [INFO] [stdout] 14 | key_path: PathBuf, [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ConfigUtils` is never constructed [INFO] [stdout] --> src/config/utils.rs:4:12 [INFO] [stdout] | [INFO] [stdout] 4 | pub struct ConfigUtils; [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated functions are never used [INFO] [stdout] --> src/config/utils.rs:8:12 [INFO] [stdout] | [INFO] [stdout] 6 | impl ConfigUtils { [INFO] [stdout] | ---------------- associated functions in this implementation [INFO] [stdout] 7 | /// 生成默认配置文件 [INFO] [stdout] 8 | pub fn generate_default_config() -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 14 | pub fn validate_config_syntax(content: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 21 | pub fn find_config_files() -> Vec { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 51 | pub fn merge_configs(configs: &[super::ConfigFile]) -> super::ConfigFile { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 82 | pub fn load_from_env() -> super::ConfigFile { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 120 | pub fn generate_template(template_type: ConfigTemplate) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 198 | pub fn diff_configs(config1: &super::ConfigFile, config2: &super::ConfigFile) -> ConfigDiff { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enum `ConfigTemplate` is never used [INFO] [stdout] --> src/config/utils.rs:236:10 [INFO] [stdout] | [INFO] [stdout] 236 | pub enum ConfigTemplate { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ConfigDiff` is never constructed [INFO] [stdout] --> src/config/utils.rs:244:12 [INFO] [stdout] | [INFO] [stdout] 244 | pub struct ConfigDiff { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `new` and `has_changes` are never used [INFO] [stdout] --> src/config/utils.rs:253:12 [INFO] [stdout] | [INFO] [stdout] 252 | impl ConfigDiff { [INFO] [stdout] | --------------- associated items in this implementation [INFO] [stdout] 253 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 263 | pub fn has_changes(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ConfigValidatorImpl` is never constructed [INFO] [stdout] --> src/config/validator.rs:5:12 [INFO] [stdout] | [INFO] [stdout] 5 | pub struct ConfigValidatorImpl; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `is_valid_cron` is never used [INFO] [stdout] --> src/config/validator.rs:124:4 [INFO] [stdout] | [INFO] [stdout] 124 | fn is_valid_cron(expr: &str) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `AuditOperation` is never constructed [INFO] [stdout] --> src/core/audit.rs:8:12 [INFO] [stdout] | [INFO] [stdout] 8 | pub struct AuditOperation { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enum `OperationType` is never used [INFO] [stdout] --> src/core/audit.rs:23:10 [INFO] [stdout] | [INFO] [stdout] 23 | pub enum OperationType { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `AuditFilter` is never constructed [INFO] [stdout] --> src/core/audit.rs:41:12 [INFO] [stdout] | [INFO] [stdout] 41 | pub struct AuditFilter { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `DatabaseAuditLogger` is never constructed [INFO] [stdout] --> src/core/audit.rs:52:12 [INFO] [stdout] | [INFO] [stdout] 52 | pub struct DatabaseAuditLogger { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated function `new` is never used [INFO] [stdout] --> src/core/audit.rs:57:12 [INFO] [stdout] | [INFO] [stdout] 56 | impl DatabaseAuditLogger { [INFO] [stdout] | ------------------------ associated function in this implementation [INFO] [stdout] 57 | pub fn new(db_path: &std::path::Path) -> Result { [INFO] [stdout] | ^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `HealthCheckerImpl` is never constructed [INFO] [stdout] --> src/core/health.rs:7:12 [INFO] [stdout] | [INFO] [stdout] 7 | pub struct HealthCheckerImpl { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated function `new` is never used [INFO] [stdout] --> src/core/health.rs:12:12 [INFO] [stdout] | [INFO] [stdout] 11 | impl HealthCheckerImpl { [INFO] [stdout] | ---------------------- associated function in this implementation [INFO] [stdout] 12 | pub fn new(providers: HashMap>) -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `TempStorageHealth` is never constructed [INFO] [stdout] --> src/core/health.rs:18:8 [INFO] [stdout] | [INFO] [stdout] 18 | struct TempStorageHealth {} [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enum `HealthStatus` is never used [INFO] [stdout] --> src/core/health.rs:112:10 [INFO] [stdout] | [INFO] [stdout] 112 | pub enum HealthStatus { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `StorageHealth` is never constructed [INFO] [stdout] --> src/core/health.rs:131:12 [INFO] [stdout] | [INFO] [stdout] 131 | pub struct StorageHealth { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `LocalStorageHealth` is never constructed [INFO] [stdout] --> src/core/health.rs:139:12 [INFO] [stdout] | [INFO] [stdout] 139 | pub struct LocalStorageHealth { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `DatabaseHealth` is never constructed [INFO] [stdout] --> src/core/health.rs:148:12 [INFO] [stdout] | [INFO] [stdout] 148 | pub struct DatabaseHealth {} [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ConnectivityStatus` is never constructed [INFO] [stdout] --> src/core/health.rs:151:12 [INFO] [stdout] | [INFO] [stdout] 151 | pub struct ConnectivityStatus { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ConnectivityTest` is never constructed [INFO] [stdout] --> src/core/health.rs:159:12 [INFO] [stdout] | [INFO] [stdout] 159 | pub struct ConnectivityTest { [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enum `Protocol` is never used [INFO] [stdout] --> src/core/health.rs:169:10 [INFO] [stdout] | [INFO] [stdout] 169 | pub enum Protocol { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `semaphore` is never read [INFO] [stdout] --> src/core/rate_limit.rs:15:5 [INFO] [stdout] | [INFO] [stdout] 10 | pub struct TokenBucketRateLimiter { [INFO] [stdout] | ---------------------- field in this struct [INFO] [stdout] ... [INFO] [stdout] 15 | semaphore: Arc, [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `MemoryHandle` is never constructed [INFO] [stdout] --> src/core/resources.rs:11:12 [INFO] [stdout] | [INFO] [stdout] 11 | pub struct MemoryHandle { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `new`, `id`, `size`, `allocated_at`, and `age` are never used [INFO] [stdout] --> src/core/resources.rs:19:12 [INFO] [stdout] | [INFO] [stdout] 18 | impl MemoryHandle { [INFO] [stdout] | ----------------- associated items in this implementation [INFO] [stdout] 19 | pub fn new(id: String, size: usize) -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 27 | pub fn id(&self) -> &str { [INFO] [stdout] | ^^ [INFO] [stdout] ... [INFO] [stdout] 31 | pub fn size(&self) -> usize { [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 35 | pub fn allocated_at(&self) -> Instant { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 39 | pub fn age(&self) -> Duration { [INFO] [stdout] | ^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `DiskHandle` is never constructed [INFO] [stdout] --> src/core/resources.rs:46:12 [INFO] [stdout] | [INFO] [stdout] 46 | pub struct DiskHandle { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/core/resources.rs:55:12 [INFO] [stdout] | [INFO] [stdout] 54 | impl DiskHandle { [INFO] [stdout] | --------------- associated items in this implementation [INFO] [stdout] 55 | pub fn new(id: String, path: std::path::PathBuf, size: u64, is_temporary: bool) -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 65 | pub fn id(&self) -> &str { [INFO] [stdout] | ^^ [INFO] [stdout] ... [INFO] [stdout] 69 | pub fn path(&self) -> &std::path::Path { [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 73 | pub fn size(&self) -> u64 { [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 77 | pub fn is_temporary(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 81 | pub fn allocated_at(&self) -> Instant { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 85 | pub fn age(&self) -> Duration { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 90 | pub fn cleanup(&self) -> Result<()> { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ResourceUsage` is never constructed [INFO] [stdout] --> src/core/resources.rs:104:12 [INFO] [stdout] | [INFO] [stdout] 104 | pub struct ResourceUsage { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `new`, `update_from_system`, `is_overloaded`, and `to_string` are never used [INFO] [stdout] --> src/core/resources.rs:128:12 [INFO] [stdout] | [INFO] [stdout] 127 | impl ResourceUsage { [INFO] [stdout] | ------------------ associated items in this implementation [INFO] [stdout] 128 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 153 | pub fn update_from_system(&mut self) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 197 | pub fn is_overloaded(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 224 | pub fn to_string(&self) -> String { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ResourceLimits` is never constructed [INFO] [stdout] --> src/core/resources.rs:238:12 [INFO] [stdout] | [INFO] [stdout] 238 | pub struct ResourceLimits { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `default` and `validate` are never used [INFO] [stdout] --> src/core/resources.rs:251:12 [INFO] [stdout] | [INFO] [stdout] 250 | impl ResourceLimits { [INFO] [stdout] | ------------------- associated items in this implementation [INFO] [stdout] 251 | pub fn default() -> Self { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 265 | pub fn validate(&self) -> Result<()> { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ResourceManagerImpl` is never constructed [INFO] [stdout] --> src/core/resources.rs:295:12 [INFO] [stdout] | [INFO] [stdout] 295 | pub struct ResourceManagerImpl { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/core/resources.rs:306:12 [INFO] [stdout] | [INFO] [stdout] 305 | impl ResourceManagerImpl { [INFO] [stdout] | ------------------------ associated items in this implementation [INFO] [stdout] 306 | pub fn new(limits: ResourceLimits) -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 320 | pub fn allocate_memory(&self, size: usize) -> Result { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 351 | pub fn allocate_disk(&self, size: u64) -> Result { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 397 | pub fn deallocate_memory(&self, handle_id: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 413 | pub fn deallocate_disk(&self, handle_id: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 433 | pub fn current_usage(&self) -> ResourceUsage { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 461 | pub fn set_limits(&self, limits: ResourceLimits) { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 466 | pub fn start_task(&self) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 482 | pub fn end_task(&self) { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 486 | pub fn cleanup_old_resources(&self, max_age: Duration) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ExponentialBackoffRetry` is never constructed [INFO] [stdout] --> src/core/retry.rs:7:12 [INFO] [stdout] | [INFO] [stdout] 7 | pub struct ExponentialBackoffRetry { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated functions `new` and `builder` are never used [INFO] [stdout] --> src/core/retry.rs:16:12 [INFO] [stdout] | [INFO] [stdout] 15 | impl ExponentialBackoffRetry { [INFO] [stdout] | ---------------------------- associated functions in this implementation [INFO] [stdout] 16 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 32 | pub fn builder() -> ExponentialBackoffRetryBuilder { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ExponentialBackoffRetryBuilder` is never constructed [INFO] [stdout] --> src/core/retry.rs:64:12 [INFO] [stdout] | [INFO] [stdout] 64 | pub struct ExponentialBackoffRetryBuilder { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/core/retry.rs:73:12 [INFO] [stdout] | [INFO] [stdout] 72 | impl ExponentialBackoffRetryBuilder { [INFO] [stdout] | ----------------------------------- associated items in this implementation [INFO] [stdout] 73 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 83 | pub fn max_attempts(mut self, attempts: u32) -> Self { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 88 | pub fn initial_delay(mut self, delay: Duration) -> Self { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 93 | pub fn max_delay(mut self, delay: Duration) -> Self { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 98 | pub fn backoff_factor(mut self, factor: f64) -> Self { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 103 | pub fn retryable_error(mut self, error_code: u32) -> Self { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 108 | pub fn build(self) -> ExponentialBackoffRetry { [INFO] [stdout] | ^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `JitterRetry` is never constructed [INFO] [stdout] --> src/core/retry.rs:120:12 [INFO] [stdout] | [INFO] [stdout] 120 | pub struct JitterRetry { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `new` and `add_jitter` are never used [INFO] [stdout] --> src/core/retry.rs:126:12 [INFO] [stdout] | [INFO] [stdout] 125 | impl JitterRetry { [INFO] [stdout] | ---------------- associated items in this implementation [INFO] [stdout] 126 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 133 | fn add_jitter(&self, delay: Duration) -> Duration { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ScheduledTask` is never constructed [INFO] [stdout] --> src/core/scheduler.rs:20:12 [INFO] [stdout] | [INFO] [stdout] 20 | pub struct ScheduledTask { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/core/scheduler.rs:60:12 [INFO] [stdout] | [INFO] [stdout] 59 | impl ScheduledTask { [INFO] [stdout] | ------------------ associated items in this implementation [INFO] [stdout] 60 | pub fn new(sync_task: &SyncTask, schedule: Schedule) -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 89 | pub fn calculate_next_run(&mut self) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 106 | pub fn update_statistics(&mut self, duration: Duration, success: bool) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 133 | pub fn should_run_now(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 138 | pub fn get_status(&self) -> TaskStatus { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 155 | pub fn get_health(&self) -> TaskHealth { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 177 | pub fn format_next_run(&self) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 200 | pub fn enable(&mut self) { [INFO] [stdout] | ^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 206 | pub fn disable(&mut self) { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 212 | pub fn retry(&mut self) -> bool { [INFO] [stdout] | ^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `TaskResult` is never constructed [INFO] [stdout] --> src/core/scheduler.rs:225:12 [INFO] [stdout] | [INFO] [stdout] 225 | pub struct TaskResult { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enum `TaskStatus` is never used [INFO] [stdout] --> src/core/scheduler.rs:233:10 [INFO] [stdout] | [INFO] [stdout] 233 | pub enum TaskStatus { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enum `TaskHealth` is never used [INFO] [stdout] --> src/core/scheduler.rs:250:10 [INFO] [stdout] | [INFO] [stdout] 250 | pub enum TaskHealth { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `SchedulerManager` is never constructed [INFO] [stdout] --> src/core/scheduler.rs:262:12 [INFO] [stdout] | [INFO] [stdout] 262 | pub struct SchedulerManager { [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/core/scheduler.rs:270:18 [INFO] [stdout] | [INFO] [stdout] 269 | impl SchedulerManager { [INFO] [stdout] | --------------------- associated items in this implementation [INFO] [stdout] 270 | pub async fn new(sync_engine: SyncEngine) -> Result { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 285 | pub async fn add_task(&self, mut scheduled_task: ScheduledTask) -> Result<()> { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 309 | async fn schedule_job(&self, scheduled_task: &ScheduledTask) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 367 | async fn execute_task( [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 433 | pub async fn start(&self) -> Result<()> { [INFO] [stdout] | ^^^^^ [INFO] [stdout] ... [INFO] [stdout] 440 | pub async fn stop(&mut self) -> Result<()> { [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 447 | pub async fn get_tasks(&self) -> Vec { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 452 | pub async fn get_task(&self, task_id: &str) -> Option { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 458 | pub async fn delete_task(&self, task_id: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 469 | pub async fn trigger_task(&self, task_id: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 506 | pub async fn pause_task(&self, task_id: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 517 | pub async fn resume_task(&self, task_id: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 528 | pub async fn reschedule_all(&mut self) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 554 | pub async fn get_stats(&self) -> SchedulerStats { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 584 | pub async fn cleanup_completed_tasks(&self, max_age_days: u32) -> Result { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 604 | pub async fn export_tasks(&self, format: ExportFormat) -> Result { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 618 | pub async fn import_tasks(&self, data: &str, format: ExportFormat) -> Result { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 640 | fn tasks_to_csv(tasks: &[ScheduledTask]) -> Result { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `SchedulerStats` is never constructed [INFO] [stdout] --> src/core/scheduler.rs:671:12 [INFO] [stdout] | [INFO] [stdout] 671 | pub struct SchedulerStats { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `new`, `success_rate`, and `health_score` are never used [INFO] [stdout] --> src/core/scheduler.rs:705:12 [INFO] [stdout] | [INFO] [stdout] 704 | impl SchedulerStats { [INFO] [stdout] | ------------------- associated items in this implementation [INFO] [stdout] 705 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 725 | pub fn success_rate(&self) -> f64 { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 733 | pub fn health_score(&self) -> f64 { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enum `ExportFormat` is never used [INFO] [stdout] --> src/core/scheduler.rs:751:10 [INFO] [stdout] | [INFO] [stdout] 751 | pub enum ExportFormat { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `CsvTask` is never constructed [INFO] [stdout] --> src/core/scheduler.rs:759:8 [INFO] [stdout] | [INFO] [stdout] 759 | struct CsvTask<'a> { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `TaskNotifier` is never constructed [INFO] [stdout] --> src/core/scheduler.rs:773:12 [INFO] [stdout] | [INFO] [stdout] 773 | pub struct TaskNotifier { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/core/scheduler.rs:779:12 [INFO] [stdout] | [INFO] [stdout] 778 | impl TaskNotifier { [INFO] [stdout] | ----------------- associated items in this implementation [INFO] [stdout] 779 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 787 | pub async fn notify_task_start(&self, task: &ScheduledTask) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 799 | pub async fn notify_task_complete( [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 819 | pub async fn notify_task_failed( [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 838 | async fn send_notification(&self, message: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 852 | async fn send_email(&self, _config: &EmailConfig, _message: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 858 | async fn send_webhook(&self, url: &str, message: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `EmailConfig` is never constructed [INFO] [stdout] --> src/core/scheduler.rs:873:12 [INFO] [stdout] | [INFO] [stdout] 873 | pub struct EmailConfig { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `cmd_schedule_task` is never used [INFO] [stdout] --> src/core/scheduler.rs:883:14 [INFO] [stdout] | [INFO] [stdout] 883 | pub async fn cmd_schedule_task( [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `cmd_list_scheduled_tasks` is never used [INFO] [stdout] --> src/core/scheduler.rs:922:14 [INFO] [stdout] | [INFO] [stdout] 922 | pub async fn cmd_list_scheduled_tasks(scheduler: &SchedulerManager) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `StateManager` is never used [INFO] [stdout] --> src/core/traits.rs:14:11 [INFO] [stdout] | [INFO] [stdout] 14 | pub trait StateManager: Send + Sync { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `ProgressReporter` is never used [INFO] [stdout] --> src/core/traits.rs:22:11 [INFO] [stdout] | [INFO] [stdout] 22 | pub trait ProgressReporter: Send + Sync { [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `RetryStrategy` is never used [INFO] [stdout] --> src/core/traits.rs:31:11 [INFO] [stdout] | [INFO] [stdout] 31 | pub trait RetryStrategy: Send + Sync { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `current_rate` and `set_rate` are never used [INFO] [stdout] --> src/core/traits.rs:44:8 [INFO] [stdout] | [INFO] [stdout] 39 | pub trait RateLimiter: Send + Sync { [INFO] [stdout] | ----------- methods in this trait [INFO] [stdout] ... [INFO] [stdout] 44 | fn current_rate(&self) -> f64; // 请求/秒 [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] 45 | fn set_rate(&mut self, requests_per_second: f64); [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `ChecksumCalculator` is never used [INFO] [stdout] --> src/core/traits.rs:50:11 [INFO] [stdout] | [INFO] [stdout] 50 | pub trait ChecksumCalculator: Send + Sync { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `DiffDetector` is never used [INFO] [stdout] --> src/core/traits.rs:57:11 [INFO] [stdout] | [INFO] [stdout] 57 | pub trait DiffDetector: Send + Sync { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `FileFilter` is never used [INFO] [stdout] --> src/core/traits.rs:69:11 [INFO] [stdout] | [INFO] [stdout] 69 | pub trait FileFilter: Send + Sync { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `TaskScheduler` is never used [INFO] [stdout] --> src/core/traits.rs:76:11 [INFO] [stdout] | [INFO] [stdout] 76 | pub trait TaskScheduler: Send + Sync { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `Notifier` is never used [INFO] [stdout] --> src/core/traits.rs:84:11 [INFO] [stdout] | [INFO] [stdout] 84 | pub trait Notifier: Send + Sync { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `AuditLogger` is never used [INFO] [stdout] --> src/core/traits.rs:92:11 [INFO] [stdout] | [INFO] [stdout] 92 | pub trait AuditLogger: Send + Sync { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `ConfigValidator` is never used [INFO] [stdout] --> src/core/traits.rs:102:11 [INFO] [stdout] | [INFO] [stdout] 102 | pub trait ConfigValidator: Send + Sync { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `HealthChecker` is never used [INFO] [stdout] --> src/core/traits.rs:110:11 [INFO] [stdout] | [INFO] [stdout] 110 | pub trait HealthChecker: Send + Sync { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `ResourceManager` is never used [INFO] [stdout] --> src/core/traits.rs:117:11 [INFO] [stdout] | [INFO] [stdout] 117 | pub trait ResourceManager: Send + Sync { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `Plugin` is never used [INFO] [stdout] --> src/core/traits.rs:126:11 [INFO] [stdout] | [INFO] [stdout] 126 | pub trait Plugin: Send + Sync { [INFO] [stdout] | ^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `HookHandler` is never used [INFO] [stdout] --> src/core/traits.rs:139:11 [INFO] [stdout] | [INFO] [stdout] 139 | pub trait HookHandler: Send + Sync { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `TransferStats` is never constructed [INFO] [stdout] --> src/core/traits.rs:149:12 [INFO] [stdout] | [INFO] [stdout] 149 | pub struct TransferStats { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `FileMetadata` is never constructed [INFO] [stdout] --> src/core/traits.rs:164:12 [INFO] [stdout] | [INFO] [stdout] 164 | pub struct FileMetadata { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enum `FileChange` is never used [INFO] [stdout] --> src/core/traits.rs:178:10 [INFO] [stdout] | [INFO] [stdout] 178 | pub enum FileChange { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `DiffOptions` is never constructed [INFO] [stdout] --> src/core/traits.rs:194:12 [INFO] [stdout] | [INFO] [stdout] 194 | pub struct DiffOptions { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ProgressUpdate` is never constructed [INFO] [stdout] --> src/core/traits.rs:205:12 [INFO] [stdout] | [INFO] [stdout] 205 | pub struct ProgressUpdate { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: fields `algorithm` and `nonce` are never read [INFO] [stdout] --> src/encryption/mod.rs:17:9 [INFO] [stdout] | [INFO] [stdout] 16 | pub struct EncryptionMetadata { [INFO] [stdout] | ------------------ fields in this struct [INFO] [stdout] 17 | pub algorithm: EncryptionAlgorithm, [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] 18 | pub key_id: String, [INFO] [stdout] 19 | pub nonce: Vec, [INFO] [stdout] | ^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `key_size`, `iv_size`, `tag_size`, and `recommended_iv_mode` are never used [INFO] [stdout] --> src/encryption/types.rs:19:12 [INFO] [stdout] | [INFO] [stdout] 18 | impl EncryptionAlgorithm { [INFO] [stdout] | ------------------------ methods in this implementation [INFO] [stdout] 19 | pub fn key_size(&self) -> usize { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 29 | pub fn iv_size(&self) -> usize { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 39 | pub fn tag_size(&self) -> usize { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 49 | pub fn recommended_iv_mode(&self) -> IvMode { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `requires_unique_per_file`, `generate_iv`, `generate_random_iv`, `generate_derived_iv`, `generate_counter_iv`, and `generate_file_offset_iv` are never used [INFO] [stdout] --> src/encryption/types.rs:75:12 [INFO] [stdout] | [INFO] [stdout] 74 | impl IvMode { [INFO] [stdout] | ----------- methods in this implementation [INFO] [stdout] 75 | pub fn requires_unique_per_file(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 85 | pub fn generate_iv(&self, context: &IvContext) -> Vec { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 95 | fn generate_random_iv(&self, size: usize) -> Vec { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 103 | fn generate_derived_iv(&self, context: &IvContext) -> Vec { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 123 | fn generate_counter_iv(&self, context: &IvContext) -> Vec { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 137 | fn generate_file_offset_iv(&self, context: &IvContext) -> Vec { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `IvContext` is never constructed [INFO] [stdout] --> src/encryption/types.rs:152:12 [INFO] [stdout] | [INFO] [stdout] 152 | pub struct IvContext { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple variants are never constructed [INFO] [stdout] --> src/error/mod.rs:35:5 [INFO] [stdout] | [INFO] [stdout] 9 | pub enum SyncError { [INFO] [stdout] | --------- variants in this enum [INFO] [stdout] ... [INFO] [stdout] 35 | Validation(String), [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 38 | Timeout(String), [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 41 | RateLimitExceeded(String), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 44 | AuthenticationFailed(String), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 47 | PermissionDenied(String), [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 50 | FileNotFound(String), [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 53 | ResourceExhausted(String), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 56 | Conflict(String), [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 59 | IntegrityCheckFailed(String), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 62 | RetryLimitExceeded(String), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 65 | OperationCanceled, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 68 | Unsupported(String), [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `SyncError` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: variants `FileNotFound`, `ReadFailed`, `ParseFailed`, and `MissingField` are never constructed [INFO] [stdout] --> src/error/mod.rs:77:5 [INFO] [stdout] | [INFO] [stdout] 75 | pub enum ConfigError { [INFO] [stdout] | ----------- variants in this enum [INFO] [stdout] 76 | #[error("Configuration file not found: {0}")] [INFO] [stdout] 77 | FileNotFound(PathBuf), [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 80 | ReadFailed(#[source] IoError), [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 83 | ParseFailed(String), [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 86 | MissingField(String), [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `ConfigError` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple variants are never constructed [INFO] [stdout] --> src/error/mod.rs:101:5 [INFO] [stdout] | [INFO] [stdout] 96 | pub enum ProviderError { [INFO] [stdout] | ------------- variants in this enum [INFO] [stdout] ... [INFO] [stdout] 101 | NotSupported(String), [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 107 | InvalidCredentials(String), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 110 | QuotaExceeded(String), [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 113 | RateLimited(String), [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 116 | AuthFailed(String), [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 125 | Timeout(String), [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 131 | PermissionDenied(String), [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `ProviderError` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: variants `InvalidKey`, `InvalidIV`, and `UnsupportedAlgorithm` are never constructed [INFO] [stdout] --> src/error/mod.rs:143:5 [INFO] [stdout] | [INFO] [stdout] 138 | pub enum EncryptionError { [INFO] [stdout] | --------------- variants in this enum [INFO] [stdout] ... [INFO] [stdout] 143 | InvalidKey(String), [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 152 | InvalidIV, [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 161 | UnsupportedAlgorithm(String), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `EncryptionError` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: variants `Full`, `NotAvailable`, `Timeout`, `Corruption`, and `VersionMismatch` are never constructed [INFO] [stdout] --> src/error/mod.rs:167:5 [INFO] [stdout] | [INFO] [stdout] 165 | pub enum StorageError { [INFO] [stdout] | ------------ variants in this enum [INFO] [stdout] 166 | #[error("Storage full: {0}")] [INFO] [stdout] 167 | Full(String), [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 170 | NotAvailable(String), [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 173 | Timeout(String), [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 176 | Corruption(String), [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 179 | VersionMismatch(String), [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `StorageError` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `is_retryable`, `is_fatal`, and `error_code` are never used [INFO] [stdout] --> src/error/mod.rs:184:12 [INFO] [stdout] | [INFO] [stdout] 183 | impl SyncError { [INFO] [stdout] | -------------- methods in this implementation [INFO] [stdout] 184 | pub fn is_retryable(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 197 | pub fn is_fatal(&self) -> bool { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 210 | pub fn error_code(&self) -> u32 { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: type alias `ConfigResult` is never used [INFO] [stdout] --> src/error/mod.rs:239:10 [INFO] [stdout] | [INFO] [stdout] 239 | pub type ConfigResult = std::result::Result; [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: type alias `ProviderResult` is never used [INFO] [stdout] --> src/error/mod.rs:240:10 [INFO] [stdout] | [INFO] [stdout] 240 | pub type ProviderResult = std::result::Result; [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: type alias `EncryptionResult` is never used [INFO] [stdout] --> src/error/mod.rs:241:10 [INFO] [stdout] | [INFO] [stdout] 241 | pub type EncryptionResult = std::result::Result; [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `FileMetadata` is never constructed [INFO] [stdout] --> src/plugins/mod.rs:5:12 [INFO] [stdout] | [INFO] [stdout] 5 | pub struct FileMetadata { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enum `PluginHook` is never used [INFO] [stdout] --> src/plugins/hooks.rs:9:10 [INFO] [stdout] | [INFO] [stdout] 9 | pub enum PluginHook { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enum `HookPriority` is never used [INFO] [stdout] --> src/plugins/hooks.rs:43:10 [INFO] [stdout] | [INFO] [stdout] 43 | pub enum HookPriority { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `name`, `priority`, and `set_priority` are never used [INFO] [stdout] --> src/plugins/hooks.rs:57:12 [INFO] [stdout] | [INFO] [stdout] 56 | impl PluginHook { [INFO] [stdout] | --------------- methods in this implementation [INFO] [stdout] 57 | pub fn name(&self) -> &'static str { [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 71 | pub fn priority(&self) -> HookPriority { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 85 | pub fn set_priority(&mut self, priority: HookPriority) { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `HookContext` is never constructed [INFO] [stdout] --> src/plugins/hooks.rs:101:12 [INFO] [stdout] | [INFO] [stdout] 101 | pub struct HookContext { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/plugins/hooks.rs:116:12 [INFO] [stdout] | [INFO] [stdout] 115 | impl HookContext { [INFO] [stdout] | ---------------- associated items in this implementation [INFO] [stdout] 116 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 126 | pub fn with_task(mut self, task: SyncTask) -> Self { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 131 | pub fn with_report(mut self, report: SyncReport) -> Self { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 136 | pub fn with_file(mut self, file: FileMetadata) -> Self { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 141 | pub fn with_error(mut self, error: SyncError) -> Self { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 146 | pub fn set_custom_data(&mut self, key: String, value: serde_json::Value) { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 150 | pub fn get_custom_data(&self, key: &str) -> Option<&serde_json::Value> { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `HookHandler` is never used [INFO] [stdout] --> src/plugins/hooks.rs:156:11 [INFO] [stdout] | [INFO] [stdout] 156 | pub trait HookHandler: Send + Sync { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `HookManager` is never constructed [INFO] [stdout] --> src/plugins/manager.rs:7:12 [INFO] [stdout] | [INFO] [stdout] 7 | pub struct HookManager { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `new`, `register_handler`, `execute_hook`, and `all_hook_types` are never used [INFO] [stdout] --> src/plugins/manager.rs:19:12 [INFO] [stdout] | [INFO] [stdout] 18 | impl HookManager { [INFO] [stdout] | ---------------- associated items in this implementation [INFO] [stdout] 19 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 26 | pub fn register_handler(&mut self, handler: Box) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 31 | pub async fn execute_hook(&self, hook: PluginHook, context: &mut HookContext) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 51 | fn all_hook_types() -> Vec<&'static str> { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `LoggingPlugin` is never constructed [INFO] [stdout] --> src/plugins/manager.rs:58:12 [INFO] [stdout] | [INFO] [stdout] 58 | pub struct LoggingPlugin { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated function `new` is never used [INFO] [stdout] --> src/plugins/manager.rs:71:12 [INFO] [stdout] | [INFO] [stdout] 70 | impl LoggingPlugin { [INFO] [stdout] | ------------------ associated function in this implementation [INFO] [stdout] 71 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `verify`, `stat`, and `exists` are never used [INFO] [stdout] --> src/providers/mod.rs:20:14 [INFO] [stdout] | [INFO] [stdout] 19 | pub trait StorageProvider: Send + Sync { [INFO] [stdout] | --------------- methods in this trait [INFO] [stdout] 20 | async fn verify(&self) -> Result<(), SyncError>; [INFO] [stdout] | ^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 31 | async fn stat(&self, path: &str) -> Result; [INFO] [stdout] | ^^^^ [INFO] [stdout] 32 | async fn exists(&self, path: &str) -> Result; [INFO] [stdout] | ^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: fields `bytes_uploaded`, `checksum`, and `elapsed_time` are never read [INFO] [stdout] --> src/providers/mod.rs:46:9 [INFO] [stdout] | [INFO] [stdout] 45 | pub struct UploadResult { [INFO] [stdout] | ------------ fields in this struct [INFO] [stdout] 46 | pub bytes_uploaded: u64, [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] 47 | pub file_size: u64, [INFO] [stdout] 48 | pub checksum: Option, [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 49 | pub elapsed_time: Duration, [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `UploadResult` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: fields `bytes_downloaded`, `checksum`, and `elapsed_time` are never read [INFO] [stdout] --> src/providers/mod.rs:54:9 [INFO] [stdout] | [INFO] [stdout] 53 | pub struct DownloadResult { [INFO] [stdout] | -------------- fields in this struct [INFO] [stdout] 54 | pub bytes_downloaded: u64, [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] 55 | pub file_size: u64, [INFO] [stdout] 56 | pub checksum: Option, [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 57 | pub elapsed_time: Duration, [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `DownloadResult` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `RateLimitedProvider` is never constructed [INFO] [stdout] --> src/providers/mod.rs:60:12 [INFO] [stdout] | [INFO] [stdout] 60 | pub struct RateLimitedProvider { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated function `new` is never used [INFO] [stdout] --> src/providers/mod.rs:66:12 [INFO] [stdout] | [INFO] [stdout] 65 | impl RateLimitedProvider { [INFO] [stdout] | ----------------------------------------------- associated function in this implementation [INFO] [stdout] 66 | pub fn new(inner: T, config: RateLimitConfig) -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: fields `client`, `token`, `refresh_token`, and `rate_limiter` are never read [INFO] [stdout] --> src/providers/aliyun.rs:14:5 [INFO] [stdout] | [INFO] [stdout] 13 | pub struct AliYunDriveProvider { [INFO] [stdout] | ------------------- fields in this struct [INFO] [stdout] 14 | client: reqwest::Client, [INFO] [stdout] | ^^^^^^ [INFO] [stdout] 15 | token: String, [INFO] [stdout] | ^^^^^ [INFO] [stdout] 16 | refresh_token: String, [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] 17 | rate_limiter: Arc, [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `refresh_token_if_needed` is never used [INFO] [stdout] --> src/providers/aliyun.rs:43:14 [INFO] [stdout] | [INFO] [stdout] 20 | impl AliYunDriveProvider { [INFO] [stdout] | ------------------------ method in this implementation [INFO] [stdout] ... [INFO] [stdout] 43 | async fn refresh_token_if_needed(&mut self) -> Result<(), ProviderError> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `generate_html`, `generate_file_rows`, `generate_error_list`, and `generate_json` are never used [INFO] [stdout] --> src/report/mod.rs:72:12 [INFO] [stdout] | [INFO] [stdout] 58 | impl SyncReport { [INFO] [stdout] | --------------- methods in this implementation [INFO] [stdout] ... [INFO] [stdout] 72 | pub fn generate_html(&self) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 150 | fn generate_file_rows(&self) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 164 | fn generate_error_list(&self) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 172 | pub fn generate_json(&self) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `as_str`, `emoji`, `is_completed`, `is_successful`, `can_retry`, and `is_active` are never used [INFO] [stdout] --> src/report/mod.rs:205:12 [INFO] [stdout] | [INFO] [stdout] 204 | impl SyncStatus { [INFO] [stdout] | --------------- methods in this implementation [INFO] [stdout] 205 | pub fn as_str(&self) -> &'static str { [INFO] [stdout] | ^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 220 | pub fn emoji(&self) -> &'static str { [INFO] [stdout] | ^^^^^ [INFO] [stdout] ... [INFO] [stdout] 235 | pub fn is_completed(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 242 | pub fn is_successful(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 246 | pub fn can_retry(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 250 | pub fn is_active(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/report/mod.rs:344:12 [INFO] [stdout] | [INFO] [stdout] 313 | impl FileSyncResult { [INFO] [stdout] | ------------------- associated items in this implementation [INFO] [stdout] ... [INFO] [stdout] 344 | pub fn from_diff(diff: &FileDiff, operation: FileOperation) -> Self { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 377 | pub fn mark_started(&mut self) { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 382 | pub fn mark_completed(&mut self, success: bool) { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 403 | pub fn mark_retry(&mut self, error: Option) { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 410 | pub fn mark_verifying(&mut self) { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 414 | pub fn mark_verified(&mut self, verified: bool) { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 423 | pub fn add_warning(&mut self, warning: String) { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 435 | pub fn is_completed(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 443 | pub fn human_readable_size(&self) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 447 | pub fn human_readable_transferred(&self) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 451 | pub fn human_readable_speed(&self) -> Option { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 463 | pub fn summary(&self) -> String { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 483 | pub fn detailed_info(&self) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 550 | pub fn to_json(&self) -> Result { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 554 | pub fn from_json(json: &str) -> Result { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `as_str`, `emoji`, `is_completed`, `is_successful`, and `can_retry` are never used [INFO] [stdout] --> src/report/mod.rs:589:12 [INFO] [stdout] | [INFO] [stdout] 588 | impl FileSyncStatus { [INFO] [stdout] | ------------------- methods in this implementation [INFO] [stdout] 589 | pub fn as_str(&self) -> &'static str { [INFO] [stdout] | ^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 606 | pub fn emoji(&self) -> &'static str { [INFO] [stdout] | ^^^^^ [INFO] [stdout] ... [INFO] [stdout] 623 | pub fn is_completed(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 630 | pub fn is_successful(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 634 | pub fn can_retry(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `from_extension`, `from_path`, `from_metadata`, `from_mime_type`, `is_compressible`, and `is_binary` are never used [INFO] [stdout] --> src/report/mod.rs:771:12 [INFO] [stdout] | [INFO] [stdout] 770 | impl FileType { [INFO] [stdout] | ------------- associated items in this implementation [INFO] [stdout] 771 | pub fn from_extension(extension: &str) -> Self { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 796 | pub fn from_path(path: &Path) -> Self { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 808 | pub fn from_metadata(metadata: &crate::sync::diff::FileMetadata) -> Self { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 822 | pub fn from_mime_type(mime_type: &str) -> Self { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 891 | pub fn is_compressible(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 904 | pub fn is_binary(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `new` and `update_speed_metrics` are never used [INFO] [stdout] --> src/report/mod.rs:962:12 [INFO] [stdout] | [INFO] [stdout] 961 | impl SyncStatistics { [INFO] [stdout] | ------------------- associated items in this implementation [INFO] [stdout] 962 | pub fn new() -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 1033 | pub fn update_speed_metrics(&mut self, speed: f64) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `success_rate` is never used [INFO] [stdout] --> src/report/mod.rs:1280:12 [INFO] [stdout] | [INFO] [stdout] 1243 | impl FileTypeStats { [INFO] [stdout] | ------------------ method in this implementation [INFO] [stdout] ... [INFO] [stdout] 1280 | pub fn success_rate(&self) -> f64 { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `VerificationResult` is never constructed [INFO] [stdout] --> src/sync/mod.rs:4:12 [INFO] [stdout] | [INFO] [stdout] 4 | pub struct VerificationResult { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ErrorResult` is never constructed [INFO] [stdout] --> src/sync/mod.rs:12:8 [INFO] [stdout] | [INFO] [stdout] 12 | struct ErrorResult {} [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `as_str`, `emoji`, `is_destructive`, and `requires_user_action` are never used [INFO] [stdout] --> src/sync/diff.rs:31:12 [INFO] [stdout] | [INFO] [stdout] 30 | impl DiffAction { [INFO] [stdout] | --------------- methods in this implementation [INFO] [stdout] 31 | pub fn as_str(&self) -> &'static str { [INFO] [stdout] | ^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 44 | pub fn emoji(&self) -> &'static str { [INFO] [stdout] | ^^^^^ [INFO] [stdout] ... [INFO] [stdout] 61 | pub fn is_destructive(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 65 | pub fn requires_user_action(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/sync/diff.rs:157:12 [INFO] [stdout] | [INFO] [stdout] 115 | impl FileDiff { [INFO] [stdout] | ------------- associated items in this implementation [INFO] [stdout] ... [INFO] [stdout] 157 | pub fn download( [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 169 | pub fn conflict(path: String, source_info: FileMetadata, target_info: FileMetadata) -> Self { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 198 | pub fn create_dir(path: String, source_info: FileMetadata) -> Self { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 202 | pub fn move_file( [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 269 | pub fn calculate_similarity(&self) -> f64 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 289 | pub fn is_similar(&self, threshold: f64) -> bool { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 293 | pub fn should_retry(&self, max_retries: u32) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 297 | pub fn mark_retry(&mut self, error: Option) { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 303 | pub fn mark_success(&mut self) { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 309 | pub fn is_expired(&self, timeout: Duration) -> bool { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 335 | pub fn human_readable_size(&self) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 339 | pub fn summary(&self) -> String { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 361 | pub fn to_json(&self) -> Result { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 365 | pub fn from_json(json: &str) -> Result { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 369 | pub fn is_encrypted(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 379 | pub fn requires_decryption(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `calculate_hash` and `update_metadata_hash` are never used [INFO] [stdout] --> src/sync/diff.rs:483:12 [INFO] [stdout] | [INFO] [stdout] 408 | impl FileMetadata { [INFO] [stdout] | ----------------- methods in this implementation [INFO] [stdout] ... [INFO] [stdout] 483 | pub fn calculate_hash(&mut self, _algorithm: ChecksumType) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 511 | pub fn update_metadata_hash(&mut self) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `hash_size` and `recommended` are never used [INFO] [stdout] --> src/sync/diff.rs:613:12 [INFO] [stdout] | [INFO] [stdout] 612 | impl ChecksumType { [INFO] [stdout] | ----------------- associated items in this implementation [INFO] [stdout] 613 | pub fn hash_size(&self) -> usize { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 625 | pub fn recommended() -> Self { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple methods are never used [INFO] [stdout] --> src/sync/diff.rs:715:12 [INFO] [stdout] | [INFO] [stdout] 665 | impl DiffResult { [INFO] [stdout] | --------------- methods in this implementation [INFO] [stdout] ... [INFO] [stdout] 715 | pub fn sort_by_priority(&mut self) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 719 | pub fn filter_by_action(&self, action: DiffAction) -> Vec<&FileDiff> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 726 | pub fn filter_by_tag(&self, tag: &str) -> Vec<&FileDiff> { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 733 | pub fn find_by_path(&self, path: &str) -> Option<&FileDiff> { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 737 | pub fn has_conflicts(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 741 | pub fn is_empty(&self) -> bool { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 756 | pub fn to_json(&self) -> Result { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 760 | pub fn to_csv(&self) -> Result { [INFO] [stdout] | ^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `finalize` and `human_readable` are never used [INFO] [stdout] --> src/sync/diff.rs:845:12 [INFO] [stdout] | [INFO] [stdout] 808 | impl DiffStats { [INFO] [stdout] | -------------- methods in this implementation [INFO] [stdout] ... [INFO] [stdout] 845 | pub fn finalize(&mut self) { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 853 | pub fn human_readable(&self) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `CsvDiff` is never constructed [INFO] [stdout] --> src/sync/diff.rs:865:8 [INFO] [stdout] | [INFO] [stdout] 865 | struct CsvDiff<'a> { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `DiffDetector` is never constructed [INFO] [stdout] --> src/sync/diff.rs:878:12 [INFO] [stdout] | [INFO] [stdout] 878 | pub struct DiffDetector { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/sync/diff.rs:884:12 [INFO] [stdout] | [INFO] [stdout] 883 | impl DiffDetector { [INFO] [stdout] | ----------------- associated items in this implementation [INFO] [stdout] 884 | pub fn new(options: DiffOptions) -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 891 | pub async fn detect_changes( [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 955 | fn is_file_changed(&self, source: &FileMetadata, target: &FileMetadata) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 978 | fn create_file_diff(&self, source: &FileMetadata, target: Option<&FileMetadata>) -> FileDiff { [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 993 | fn analyze_changes(&self, diff: &mut FileDiff) { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 1021 | fn detect_moves(&self, result: &mut DiffResult) { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 1060 | fn detect_conflicts(&self, result: &mut DiffResult) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 1094 | fn calculate_file_similarity(&self, file1: &FileMetadata, file2: &FileMetadata) -> f64 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 1128 | fn update_cache(&mut self, files: &[FileMetadata]) { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `DiffOptions` is never constructed [INFO] [stdout] --> src/sync/diff.rs:1138:12 [INFO] [stdout] | [INFO] [stdout] 1138 | pub struct DiffOptions { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `diff_cache` is never read [INFO] [stdout] --> src/sync/engine.rs:19:5 [INFO] [stdout] | [INFO] [stdout] 16 | pub struct SyncEngine { [INFO] [stdout] | ---------- field in this struct [INFO] [stdout] ... [INFO] [stdout] 19 | diff_cache: DashMap, [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `sync` is never used [INFO] [stdout] --> src/sync/engine.rs:116:18 [INFO] [stdout] | [INFO] [stdout] 25 | impl SyncEngine { [INFO] [stdout] | --------------- method in this implementation [INFO] [stdout] ... [INFO] [stdout] 116 | pub async fn sync(&mut self, task: &SyncTask) -> Result { [INFO] [stdout] | ^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `speed` is never read [INFO] [stdout] --> src/sync/engine.rs:392:9 [INFO] [stdout] | [INFO] [stdout] 386 | pub struct SyncProgress { [INFO] [stdout] | ------------ field in this struct [INFO] [stdout] ... [INFO] [stdout] 392 | pub speed: f64, [INFO] [stdout] | ^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` has identical blocks [INFO] [stdout] --> src/cli/browse.rs:313:45 [INFO] [stdout] | [INFO] [stdout] 313 | ... let icon_color = if is_selected { type_color } else { type_color }; // Keep icon color or make it white? Let's keep original ... [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] note: same as this [INFO] [stdout] --> src/cli/browse.rs:313:65 [INFO] [stdout] | [INFO] [stdout] 313 | ... let icon_color = if is_selected { type_color } else { type_color }; // Keep icon color or make it white? Let's keep original ... [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#if_same_then_else [INFO] [stdout] = note: `#[warn(clippy::if_same_then_else)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: implementation of inherent method `to_string(&self) -> String` for type `cli::info::SystemInfo` [INFO] [stdout] --> src/cli/info.rs:25:5 [INFO] [stdout] | [INFO] [stdout] 25 | / pub fn to_string(&self) -> String { [INFO] [stdout] 26 | | format!( [INFO] [stdout] 27 | | "Cloud Disk Sync Info\n\ [INFO] [stdout] 28 | | --------------------\n\ [INFO] [stdout] ... | [INFO] [stdout] 37 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: implement trait `Display` for type `cli::info::SystemInfo` instead [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#inherent_to_string [INFO] [stdout] = note: `#[warn(clippy::inherent_to_string)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: consider using `sort_by_key` [INFO] [stdout] --> src/sync/diff.rs:716:9 [INFO] [stdout] | [INFO] [stdout] 716 | self.files.sort_by(|a, b| b.priority.cmp(&a.priority)); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_sort_by [INFO] [stdout] = note: `#[warn(clippy::unnecessary_sort_by)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 716 - self.files.sort_by(|a, b| b.priority.cmp(&a.priority)); [INFO] [stdout] 716 + self.files.sort_by_key(|b| std::cmp::Reverse(b.priority)); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> src/cli/mod.rs:272:35 [INFO] [stdout] | [INFO] [stdout] 272 | let cli = Cli::parse_from(&args); [INFO] [stdout] | ^^^^^ help: change this to: `args` [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] --> src/cli/mod.rs:293:35 [INFO] [stdout] | [INFO] [stdout] 293 | let cli = Cli::parse_from(&args); [INFO] [stdout] | ^^^^^ help: change this to: `args` [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] --> src/cli/mod.rs:306:35 [INFO] [stdout] | [INFO] [stdout] 306 | let cli = Cli::parse_from(&args); [INFO] [stdout] | ^^^^^ help: change this to: `args` [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] --> src/cli/mod.rs:325:35 [INFO] [stdout] | [INFO] [stdout] 325 | let cli = Cli::parse_from(&args); [INFO] [stdout] | ^^^^^ help: change this to: `args` [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: used `assert_eq!` with a literal bool [INFO] [stdout] --> src/cli/mod.rs:334:17 [INFO] [stdout] | [INFO] [stdout] 334 | assert_eq!(force, false); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bool_assert_comparison [INFO] [stdout] = note: `#[warn(clippy::bool_assert_comparison)]` on by default [INFO] [stdout] help: replace it with `assert!(..)` [INFO] [stdout] | [INFO] [stdout] 334 - assert_eq!(force, false); [INFO] [stdout] 334 + assert!(!force); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> src/cli/mod.rs:351:35 [INFO] [stdout] | [INFO] [stdout] 351 | let cli = Cli::parse_from(&args); [INFO] [stdout] | ^^^^^ help: change this to: `args` [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] --> src/cli/mod.rs:371:35 [INFO] [stdout] | [INFO] [stdout] 371 | let cli = Cli::parse_from(&args); [INFO] [stdout] | ^^^^^ help: change this to: `args` [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: used `assert_eq!` with a literal bool [INFO] [stdout] --> src/cli/mod.rs:380:17 [INFO] [stdout] | [INFO] [stdout] 380 | assert_eq!(force, false); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bool_assert_comparison [INFO] [stdout] help: replace it with `assert!(..)` [INFO] [stdout] | [INFO] [stdout] 380 - assert_eq!(force, false); [INFO] [stdout] 380 + assert!(!force); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> src/cli/mod.rs:389:35 [INFO] [stdout] | [INFO] [stdout] 389 | let cli = Cli::parse_from(&args); [INFO] [stdout] | ^^^^^ help: change this to: `args` [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: used `assert_eq!` with a literal bool [INFO] [stdout] --> src/cli/mod.rs:398:17 [INFO] [stdout] | [INFO] [stdout] 398 | assert_eq!(force, true); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bool_assert_comparison [INFO] [stdout] help: replace it with `assert!(..)` [INFO] [stdout] | [INFO] [stdout] 398 - assert_eq!(force, true); [INFO] [stdout] 398 + assert!(force); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> src/cli/mod.rs:414:35 [INFO] [stdout] | [INFO] [stdout] 414 | let cli = Cli::parse_from(&args); [INFO] [stdout] | ^^^^^ help: change this to: `args` [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] --> src/cli/mod.rs:434:35 [INFO] [stdout] | [INFO] [stdout] 434 | let cli = Cli::parse_from(&args); [INFO] [stdout] | ^^^^^ help: change this to: `args` [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] --> src/cli/mod.rs:447:35 [INFO] [stdout] | [INFO] [stdout] 447 | let cli = Cli::parse_from(&args); [INFO] [stdout] | ^^^^^ help: change this to: `args` [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] --> src/cli/mod.rs:471:35 [INFO] [stdout] | [INFO] [stdout] 471 | let cli = Cli::parse_from(&args); [INFO] [stdout] | ^^^^^ help: change this to: `args` [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] --> src/cli/mod.rs:490:35 [INFO] [stdout] | [INFO] [stdout] 490 | let cli = Cli::parse_from(&args); [INFO] [stdout] | ^^^^^ help: change this to: `args` [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: used `assert_eq!` with a literal bool [INFO] [stdout] --> src/cli/mod.rs:501:17 [INFO] [stdout] | [INFO] [stdout] 501 | assert_eq!(force, false); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bool_assert_comparison [INFO] [stdout] help: replace it with `assert!(..)` [INFO] [stdout] | [INFO] [stdout] 501 - assert_eq!(force, false); [INFO] [stdout] 501 + assert!(!force); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> src/cli/mod.rs:510:35 [INFO] [stdout] | [INFO] [stdout] 510 | let cli = Cli::parse_from(&args); [INFO] [stdout] | ^^^^^ help: change this to: `args` [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: used `assert_eq!` with a literal bool [INFO] [stdout] --> src/cli/mod.rs:521:17 [INFO] [stdout] | [INFO] [stdout] 521 | assert_eq!(force, false); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bool_assert_comparison [INFO] [stdout] help: replace it with `assert!(..)` [INFO] [stdout] | [INFO] [stdout] 521 - assert_eq!(force, false); [INFO] [stdout] 521 + assert!(!force); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> src/cli/mod.rs:530:35 [INFO] [stdout] | [INFO] [stdout] 530 | let cli = Cli::parse_from(&args); [INFO] [stdout] | ^^^^^ help: change this to: `args` [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: used `assert_eq!` with a literal bool [INFO] [stdout] --> src/cli/mod.rs:541:17 [INFO] [stdout] | [INFO] [stdout] 541 | assert_eq!(force, false); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bool_assert_comparison [INFO] [stdout] help: replace it with `assert!(..)` [INFO] [stdout] | [INFO] [stdout] 541 - assert_eq!(force, false); [INFO] [stdout] 541 + assert!(!force); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> src/cli/mod.rs:550:35 [INFO] [stdout] | [INFO] [stdout] 550 | let cli = Cli::parse_from(&args); [INFO] [stdout] | ^^^^^ help: change this to: `args` [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: used `assert_eq!` with a literal bool [INFO] [stdout] --> src/cli/mod.rs:561:17 [INFO] [stdout] | [INFO] [stdout] 561 | assert_eq!(force, true); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bool_assert_comparison [INFO] [stdout] help: replace it with `assert!(..)` [INFO] [stdout] | [INFO] [stdout] 561 - assert_eq!(force, true); [INFO] [stdout] 561 + assert!(force); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> src/cli/mod.rs:570:35 [INFO] [stdout] | [INFO] [stdout] 570 | let cli = Cli::parse_from(&args); [INFO] [stdout] | ^^^^^ help: change this to: `args` [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] --> src/cli/mod.rs:583:35 [INFO] [stdout] | [INFO] [stdout] 583 | let cli = Cli::parse_from(&args); [INFO] [stdout] | ^^^^^ help: change this to: `args` [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 checked division [INFO] [stdout] --> src/sync/diff.rs:1000:48 [INFO] [stdout] | [INFO] [stdout] 1000 | details.change_percentage = if source.size > 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^ check performed here [INFO] [stdout] 1001 | ((source.size.abs_diff(target.size) * 100) / source.size) as u8 [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 boolean expression can be simplified [INFO] [stdout] --> src/sync/diff.rs:1077:20 [INFO] [stdout] | [INFO] [stdout] 1077 | if (has_upload && has_delete) || (has_upload && has_update) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#nonminimal_bool [INFO] [stdout] = note: `#[warn(clippy::nonminimal_bool)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 1077 - if (has_upload && has_delete) || (has_upload && has_update) { [INFO] [stdout] 1077 + if !(!has_upload || !has_delete && !has_update) { [INFO] [stdout] | [INFO] [stdout] 1077 - if (has_upload && has_delete) || (has_upload && has_update) { [INFO] [stdout] 1077 + if (has_update || has_delete) && has_upload { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you seem to be trying to use `&Box`. Consider using just `&T` [INFO] [stdout] --> src/sync/engine.rs:85:60 [INFO] [stdout] | [INFO] [stdout] 85 | pub fn get_provider(&self, account_id: &str) -> Option<&Box> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&dyn StorageProvider` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#borrowed_box [INFO] [stdout] = note: `#[warn(clippy::borrowed_box)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this function has too many arguments (9/7) [INFO] [stdout] --> src/sync/engine.rs:643:5 [INFO] [stdout] | [INFO] [stdout] 643 | / async fn calculate_diff( [INFO] [stdout] 644 | | &self, [INFO] [stdout] 645 | | source: &dyn StorageProvider, [INFO] [stdout] 646 | | target: &dyn StorageProvider, [INFO] [stdout] ... | [INFO] [stdout] 652 | | target_key: &str, [INFO] [stdout] 653 | | ) -> Result { [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: this `if` can be collapsed into the outer `match` [INFO] [stdout] --> src/config/validator.rs:20:17 [INFO] [stdout] | [INFO] [stdout] 20 | / if !account.credentials.contains_key("refresh_token") { [INFO] [stdout] 21 | | return Err( [INFO] [stdout] 22 | | ConfigError::MissingField("refresh_token for AliYunDrive".into()).into(), [INFO] [stdout] 23 | | ); [INFO] [stdout] 24 | | } [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] 19 ~ ProviderType::AliYunDrive [INFO] [stdout] 20 ~ if !account.credentials.contains_key("refresh_token") => { [INFO] [stdout] 21 | return Err( [INFO] [stdout] 22 | ConfigError::MissingField("refresh_token for AliYunDrive".into()).into(), [INFO] [stdout] 23 | ); [INFO] [stdout] 24 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `SMB` contains a capitalized acronym [INFO] [stdout] --> src/config/mod.rs:23:5 [INFO] [stdout] | [INFO] [stdout] 23 | SMB, [INFO] [stdout] | ^^^ help: consider making the acronym lowercase, except the initial letter: `Smb` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] = note: `#[warn(clippy::upper_case_acronyms)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `MutexGuard` is held across an await point [INFO] [stdout] --> src/sync/engine.rs:856:17 [INFO] [stdout] | [INFO] [stdout] 856 | let conn = self.resume_store.lock().unwrap(); [INFO] [stdout] | ^^^^ [INFO] [stdout] | [INFO] [stdout] = help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling `await` [INFO] [stdout] note: these are all the await points this lock is held through [INFO] [stdout] --> src/sync/engine.rs:866:26 [INFO] [stdout] | [INFO] [stdout] 866 | .await; [INFO] [stdout] | ^^^^^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#await_holding_lock [INFO] [stdout] = note: `#[warn(clippy::await_holding_lock)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `HSM` contains a capitalized acronym [INFO] [stdout] --> src/config/mod.rs:377:5 [INFO] [stdout] | [INFO] [stdout] 377 | HSM { [INFO] [stdout] | ^^^ help: consider making the acronym lowercase, except the initial letter: `Hsm` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: explicit call to `.into_iter()` in function argument accepting `IntoIterator` [INFO] [stdout] --> src/core/audit.rs:184:62 [INFO] [stdout] | [INFO] [stdout] 184 | let mut rows = stmt.query(rusqlite::params_from_iter(params.into_iter()))?; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()` [INFO] [stdout] --> /opt/rustwide/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/rusqlite-0.38.0/src/params.rs:431:8 [INFO] [stdout] | [INFO] [stdout] 431 | I: IntoIterator, [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_conversion [INFO] [stdout] = note: `#[warn(clippy::useless_conversion)]` on by default [INFO] [stdout] help: consider removing the `.into_iter()` [INFO] [stdout] | [INFO] [stdout] 184 - let mut rows = stmt.query(rusqlite::params_from_iter(params.into_iter()))?; [INFO] [stdout] 184 + let mut rows = stmt.query(rusqlite::params_from_iter(params))?; [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `TCP` contains a capitalized acronym [INFO] [stdout] --> src/core/health.rs:170:5 [INFO] [stdout] | [INFO] [stdout] 170 | TCP, [INFO] [stdout] | ^^^ help: consider making the acronym lowercase, except the initial letter: `Tcp` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `UDP` contains a capitalized acronym [INFO] [stdout] --> src/core/health.rs:171:5 [INFO] [stdout] | [INFO] [stdout] 171 | UDP, [INFO] [stdout] | ^^^ help: consider making the acronym lowercase, except the initial letter: `Udp` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `HTTP` contains a capitalized acronym [INFO] [stdout] --> src/core/health.rs:172:5 [INFO] [stdout] | [INFO] [stdout] 172 | HTTP, [INFO] [stdout] | ^^^^ help: consider making the acronym lowercase, except the initial letter: `Http` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `HTTPS` contains a capitalized acronym [INFO] [stdout] --> src/core/health.rs:173:5 [INFO] [stdout] | [INFO] [stdout] 173 | HTTPS, [INFO] [stdout] | ^^^^^ help: consider making the acronym lowercase, except the initial letter: `Https` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: items after a test module [INFO] [stdout] --> src/core/rate_limit.rs:19:1 [INFO] [stdout] | [INFO] [stdout] 19 | mod tests { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 41 | impl TokenBucketRateLimiter { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 70 | impl RateLimiter for TokenBucketRateLimiter { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 117 | pub struct SlidingWindowRateLimiter { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 123 | impl SlidingWindowRateLimiter { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 140 | impl RateLimiter for SlidingWindowRateLimiter { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#items_after_test_module [INFO] [stdout] = note: `#[warn(clippy::items_after_test_module)]` on by default [INFO] [stdout] = help: move the items to before the test module was defined [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: implementation of inherent method `to_string(&self) -> String` for type `core::resources::ResourceUsage` [INFO] [stdout] --> src/core/resources.rs:224:5 [INFO] [stdout] | [INFO] [stdout] 224 | / pub fn to_string(&self) -> String { [INFO] [stdout] 225 | | format!( [INFO] [stdout] 226 | | "Memory: {:.1}% used, Disk: {:.1}% used, CPU: {:.1}%, Tasks: {}/{}", [INFO] [stdout] 227 | | self.memory_percentage, [INFO] [stdout] ... | [INFO] [stdout] 233 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: implement trait `Display` for type `core::resources::ResourceUsage` instead [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#inherent_to_string [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the loop variable `i` is used to index `iv` [INFO] [stdout] --> src/encryption/types.rs:128:18 [INFO] [stdout] | [INFO] [stdout] 128 | for i in 0..8 { [INFO] [stdout] | ^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stdout] = note: `#[warn(clippy::needless_range_loop)]` on by default [INFO] [stdout] help: consider using an iterator and enumerate() [INFO] [stdout] | [INFO] [stdout] 128 - for i in 0..8 { [INFO] [stdout] 128 + for (i, ) in iv.iter_mut().enumerate().take(8) { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the loop variable `i` is used to index `iv` [INFO] [stdout] --> src/encryption/types.rs:141:18 [INFO] [stdout] | [INFO] [stdout] 141 | for i in 0..8 { [INFO] [stdout] | ^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stdout] help: consider using an iterator and enumerate() [INFO] [stdout] | [INFO] [stdout] 141 - for i in 0..8 { [INFO] [stdout] 141 + for (i, ) in iv.iter_mut().enumerate().take(8) { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: match expression looks like `matches!` macro [INFO] [stdout] --> src/error/mod.rs:185:9 [INFO] [stdout] | [INFO] [stdout] 185 | / match self { [INFO] [stdout] 186 | | SyncError::Network(_) [INFO] [stdout] 187 | | | SyncError::Timeout(_) [INFO] [stdout] 188 | | | SyncError::RateLimitExceeded(_) [INFO] [stdout] ... | [INFO] [stdout] 193 | | _ => false, [INFO] [stdout] 194 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_like_matches_macro [INFO] [stdout] = note: `#[warn(clippy::match_like_matches_macro)]` on by default [INFO] [stdout] help: use `matches!` directly [INFO] [stdout] | [INFO] [stdout] 185 ~ matches!(self, SyncError::Network(_) [INFO] [stdout] 186 + | SyncError::Timeout(_) [INFO] [stdout] 187 + | SyncError::RateLimitExceeded(_) [INFO] [stdout] 188 + | SyncError::ResourceExhausted(_) | SyncError::Provider(ProviderError::RateLimited(_)) [INFO] [stdout] 189 + | SyncError::Provider(ProviderError::Timeout(_)) [INFO] [stdout] 190 + | SyncError::Provider(ProviderError::ConnectionFailed(_))) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: match expression looks like `matches!` macro [INFO] [stdout] --> src/error/mod.rs:198:9 [INFO] [stdout] | [INFO] [stdout] 198 | / match self { [INFO] [stdout] 199 | | SyncError::Provider(ProviderError::NotFound(_)) [INFO] [stdout] 200 | | | SyncError::Provider(ProviderError::NotSupported(_)) [INFO] [stdout] 201 | | | SyncError::Provider(ProviderError::InvalidCredentials(_)) [INFO] [stdout] ... | [INFO] [stdout] 206 | | _ => false, [INFO] [stdout] 207 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_like_matches_macro [INFO] [stdout] help: use `matches!` directly [INFO] [stdout] | [INFO] [stdout] 198 ~ matches!(self, SyncError::Provider(ProviderError::NotFound(_)) [INFO] [stdout] 199 + | SyncError::Provider(ProviderError::NotSupported(_)) [INFO] [stdout] 200 + | SyncError::Provider(ProviderError::InvalidCredentials(_)) [INFO] [stdout] 201 + | SyncError::Provider(ProviderError::PermissionDenied(_)) [INFO] [stdout] 202 + | SyncError::Encryption(EncryptionError::KeyNotFound(_)) [INFO] [stdout] 203 + | SyncError::Encryption(EncryptionError::InvalidKey(_)) [INFO] [stdout] 204 + | SyncError::Validation(_)) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: match expression looks like `matches!` macro [INFO] [stdout] --> src/plugins/manager.rs:155:9 [INFO] [stdout] | [INFO] [stdout] 155 | / match hook { [INFO] [stdout] 156 | | PluginHook::PreSync { .. } => true, [INFO] [stdout] 157 | | PluginHook::PostSync { .. } => true, [INFO] [stdout] 158 | | PluginHook::OnError { .. } => true, [INFO] [stdout] 159 | | _ => false, [INFO] [stdout] 160 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_like_matches_macro [INFO] [stdout] help: use `matches!` directly [INFO] [stdout] | [INFO] [stdout] 155 - match hook { [INFO] [stdout] 156 - PluginHook::PreSync { .. } => true, [INFO] [stdout] 157 - PluginHook::PostSync { .. } => true, [INFO] [stdout] 158 - PluginHook::OnError { .. } => true, [INFO] [stdout] 159 - _ => false, [INFO] [stdout] 160 - } [INFO] [stdout] 155 + matches!(hook, PluginHook::PreSync { .. } | PluginHook::PostSync { .. } | PluginHook::OnError { .. }) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/providers/webdav.rs:709:25 [INFO] [stdout] | [INFO] [stdout] 709 | / if let Some(file) = files.get(path_str) { [INFO] [stdout] 710 | | if !file.is_dir { [INFO] [stdout] 711 | | return Ok::<_, warp::Rejection>(warp::reply::with_status( [INFO] [stdout] 712 | | file.content.clone(), [INFO] [stdout] ... | [INFO] [stdout] 716 | | } [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] 709 ~ if let Some(file) = files.get(path_str) [INFO] [stdout] 710 ~ && !file.is_dir { [INFO] [stdout] 711 | return Ok::<_, warp::Rejection>(warp::reply::with_status( [INFO] [stdout] ... [INFO] [stdout] 714 | )); [INFO] [stdout] 715 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&String` instead of `&str` involves a new object where a slice will do [INFO] [stdout] --> src/report/mod.rs:22:54 [INFO] [stdout] | [INFO] [stdout] 22 | pub(crate) fn add_conflict(&mut self, diff_path: &String) { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stdout] = note: `#[warn(clippy::ptr_arg)]` on by default [INFO] [stdout] help: change this to [INFO] [stdout] | [INFO] [stdout] 22 ~ pub(crate) fn add_conflict(&mut self, diff_path: &str) { [INFO] [stdout] 23 | self.statistics.conflicts += 1; [INFO] [stdout] 24 | self.statistics.total_files += 1; [INFO] [stdout] 25 ~ let mut result = FileSyncResult::new(diff_path.to_owned(), FileOperation::Verify); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&String` instead of `&str` involves a new object where a slice will do [INFO] [stdout] --> src/report/mod.rs:30:53 [INFO] [stdout] | [INFO] [stdout] 30 | pub(crate) fn add_success(&mut self, diff_path: &String, diff_size: i64) { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stdout] help: change this to [INFO] [stdout] | [INFO] [stdout] 30 ~ pub(crate) fn add_success(&mut self, diff_path: &str, diff_size: i64) { [INFO] [stdout] 31 ~ let mut result = FileSyncResult::new(diff_path.to_owned(), FileOperation::Upload); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: consider using `sort_by_key` [INFO] [stdout] --> src/sync/diff.rs:716:9 [INFO] [stdout] | [INFO] [stdout] 716 | self.files.sort_by(|a, b| b.priority.cmp(&a.priority)); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_sort_by [INFO] [stdout] = note: `#[warn(clippy::unnecessary_sort_by)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 716 - self.files.sort_by(|a, b| b.priority.cmp(&a.priority)); [INFO] [stdout] 716 + self.files.sort_by_key(|b| std::cmp::Reverse(b.priority)); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual checked division [INFO] [stdout] --> src/sync/diff.rs:1000:48 [INFO] [stdout] | [INFO] [stdout] 1000 | details.change_percentage = if source.size > 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^ check performed here [INFO] [stdout] 1001 | ((source.size.abs_diff(target.size) * 100) / source.size) as u8 [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 boolean expression can be simplified [INFO] [stdout] --> src/sync/diff.rs:1077:20 [INFO] [stdout] | [INFO] [stdout] 1077 | if (has_upload && has_delete) || (has_upload && has_update) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#nonminimal_bool [INFO] [stdout] = note: `#[warn(clippy::nonminimal_bool)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 1077 - if (has_upload && has_delete) || (has_upload && has_update) { [INFO] [stdout] 1077 + if !(!has_upload || !has_delete && !has_update) { [INFO] [stdout] | [INFO] [stdout] 1077 - if (has_upload && has_delete) || (has_upload && has_update) { [INFO] [stdout] 1077 + if (has_update || has_delete) && has_upload { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you seem to be trying to use `&Box`. Consider using just `&T` [INFO] [stdout] --> src/sync/engine.rs:85:60 [INFO] [stdout] | [INFO] [stdout] 85 | pub fn get_provider(&self, account_id: &str) -> Option<&Box> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&dyn StorageProvider` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#borrowed_box [INFO] [stdout] = note: `#[warn(clippy::borrowed_box)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this function has too many arguments (9/7) [INFO] [stdout] --> src/sync/engine.rs:643:5 [INFO] [stdout] | [INFO] [stdout] 643 | / async fn calculate_diff( [INFO] [stdout] 644 | | &self, [INFO] [stdout] 645 | | source: &dyn StorageProvider, [INFO] [stdout] 646 | | target: &dyn StorageProvider, [INFO] [stdout] ... | [INFO] [stdout] 652 | | target_key: &str, [INFO] [stdout] 653 | | ) -> Result { [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: this `MutexGuard` is held across an await point [INFO] [stdout] --> src/sync/engine.rs:856:17 [INFO] [stdout] | [INFO] [stdout] 856 | let conn = self.resume_store.lock().unwrap(); [INFO] [stdout] | ^^^^ [INFO] [stdout] | [INFO] [stdout] = help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling `await` [INFO] [stdout] note: these are all the await points this lock is held through [INFO] [stdout] --> src/sync/engine.rs:866:26 [INFO] [stdout] | [INFO] [stdout] 866 | .await; [INFO] [stdout] | ^^^^^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#await_holding_lock [INFO] [stdout] = note: `#[warn(clippy::await_holding_lock)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 2m 54s [INFO] running `Command { std: "docker" "inspect" "d84e0fcc3304d5f5da5ed568d674a5908427f31736a00532ed314e167a57e369", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "d84e0fcc3304d5f5da5ed568d674a5908427f31736a00532ed314e167a57e369", kill_on_drop: false }` [INFO] [stdout] d84e0fcc3304d5f5da5ed568d674a5908427f31736a00532ed314e167a57e369