[INFO] cloning repository https://github.com/fearschism/nomad-dl [INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/fearschism/nomad-dl" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Ffearschism%2Fnomad-dl", kill_on_drop: false }` [INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Ffearschism%2Fnomad-dl'... [INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }` [INFO] [stdout] b3b6f5153c3d6e3b05ea5a7fdb5661fe9f55ceba [INFO] linting fearschism/nomad-dl against nightly for clippy-nonminimal_bool-denied [INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Ffearschism%2Fnomad-dl" "/workspace/builds/worker-6-tc1/source", kill_on_drop: false }` [INFO] [stderr] Cloning into '/workspace/builds/worker-6-tc1/source'... [INFO] [stderr] done. [INFO] started tweaking git repo https://github.com/fearschism/nomad-dl [INFO] finished tweaking git repo https://github.com/fearschism/nomad-dl [INFO] tweaked toml for git repo https://github.com/fearschism/nomad-dl written to /workspace/builds/worker-6-tc1/source/Cargo.toml [INFO] validating manifest of git repo https://github.com/fearschism/nomad-dl 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/fearschism/nomad-dl 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 rctree v0.5.0 [INFO] [stderr] Downloaded compression-core v0.4.28 [INFO] [stderr] Downloaded boa_interner v0.17.3 [INFO] [stderr] Downloaded usvg-tree v0.37.0 [INFO] [stderr] Downloaded icu_provider_blob v1.2.0 [INFO] [stderr] Downloaded boa_gc v0.17.3 [INFO] [stderr] Downloaded icu_provider_adapters v1.2.0 [INFO] [stderr] Downloaded boa_macros v0.17.3 [INFO] [stderr] Downloaded roxmltree v0.19.0 [INFO] [stderr] Downloaded icu_locid v1.2.0 [INFO] [stderr] Downloaded zerovec v0.9.7 [INFO] [stderr] Downloaded regress v0.6.0 [INFO] [stderr] Downloaded boa_ast v0.17.3 [INFO] [stderr] Downloaded icu_collections v1.2.0 [INFO] [stderr] Downloaded icu_normalizer v1.2.0 [INFO] [stderr] Downloaded boa_parser v0.17.3 [INFO] [stderr] Downloaded ryu-js v0.2.2 [INFO] [stderr] Downloaded async-compression v0.4.28 [INFO] [stderr] Downloaded usvg-parser v0.37.0 [INFO] [stderr] Downloaded resvg v0.37.0 [INFO] [stderr] Downloaded boa_profiler v0.17.3 [INFO] [stderr] Downloaded icu_properties v1.2.0 [INFO] [stderr] Downloaded svgtypes v0.13.0 [INFO] [stderr] Downloaded tinystr v0.7.2 [INFO] [stderr] Downloaded icu_provider_macros v1.2.0 [INFO] [stderr] Downloaded zerovec-derive v0.9.7 [INFO] [stderr] Downloaded usvg v0.37.0 [INFO] [stderr] Downloaded compression-codecs v0.4.28 [INFO] [stderr] Downloaded kurbo v0.9.5 [INFO] [stderr] Downloaded egui_code_editor v0.2.17 [INFO] [stderr] Downloaded boa_engine v0.17.3 [INFO] [stderr] Downloaded boa_icu_provider v0.17.3 [INFO] [stderr] Downloaded icu_provider v1.2.0 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-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] ec82b104a0537a49462f5b59cb449989d209f7d94ae1701fdcaf7a39b86ced84 [INFO] running `Command { std: "docker" "start" "-a" "ec82b104a0537a49462f5b59cb449989d209f7d94ae1701fdcaf7a39b86ced84", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "ec82b104a0537a49462f5b59cb449989d209f7d94ae1701fdcaf7a39b86ced84", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "ec82b104a0537a49462f5b59cb449989d209f7d94ae1701fdcaf7a39b86ced84", kill_on_drop: false }` [INFO] [stdout] ec82b104a0537a49462f5b59cb449989d209f7d94ae1701fdcaf7a39b86ced84 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-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] e7746898f9e0283c9db9d2b50e01ca0c3169add164e06e5c07a2dfefdea477a3 [INFO] running `Command { std: "docker" "start" "-a" "e7746898f9e0283c9db9d2b50e01ca0c3169add164e06e5c07a2dfefdea477a3", kill_on_drop: false }` [INFO] [stderr] Compiling serde v1.0.219 [INFO] [stderr] Compiling libc v0.2.175 [INFO] [stderr] Compiling portable-atomic v1.11.1 [INFO] [stderr] Checking critical-section v1.2.0 [INFO] [stderr] Compiling proc-macro2 v1.0.101 [INFO] [stderr] Compiling cc v1.2.34 [INFO] [stderr] Compiling rustix v1.0.8 [INFO] [stderr] Checking linux-raw-sys v0.9.4 [INFO] [stderr] Compiling ahash v0.8.12 [INFO] [stderr] Checking libloading v0.8.8 [INFO] [stderr] Compiling zerocopy v0.8.26 [INFO] [stderr] Compiling wayland-sys v0.31.7 [INFO] [stderr] Compiling phf_shared v0.11.3 [INFO] [stderr] Compiling memchr v2.7.5 [INFO] [stderr] Compiling rustix v0.38.44 [INFO] [stderr] Compiling hashbrown v0.15.5 [INFO] [stderr] Compiling toml_datetime v0.6.11 [INFO] [stderr] Checking flate2 v1.1.2 [INFO] [stderr] Compiling khronos_api v3.1.0 [INFO] [stderr] Compiling thiserror v2.0.16 [INFO] [stderr] Checking dlib v0.5.2 [INFO] [stderr] Compiling quote v1.0.40 [INFO] [stderr] Checking ttf-parser v0.25.1 [INFO] [stderr] Checking ab_glyph_rasterizer v0.1.10 [INFO] [stderr] Compiling syn v2.0.106 [INFO] [stderr] Compiling indexmap v2.11.0 [INFO] [stderr] Compiling syn v1.0.109 [INFO] [stderr] Compiling xml-rs v0.8.27 [INFO] [stderr] Checking litemap v0.7.5 [INFO] [stderr] Compiling quick-xml v0.37.5 [INFO] [stderr] Checking once_cell v1.21.3 [INFO] [stderr] Checking nohash-hasher v0.2.0 [INFO] [stderr] Checking tracing-core v0.1.34 [INFO] [stderr] Compiling x11-dl v2.21.0 [INFO] [stderr] Checking cursor-icon v1.2.0 [INFO] [stderr] Checking float-cmp v0.9.0 [INFO] [stderr] Compiling gl_generator v0.14.0 [INFO] [stderr] Checking xcursor v0.3.10 [INFO] [stderr] Compiling getrandom v0.2.16 [INFO] [stderr] Compiling toml_edit v0.22.27 [INFO] [stderr] Checking strict-num v0.1.1 [INFO] [stderr] Checking kurbo v0.9.5 [INFO] [stderr] Compiling smithay-client-toolkit v0.18.1 [INFO] [stderr] Checking getrandom v0.3.3 [INFO] [stderr] Compiling rand_core v0.6.4 [INFO] [stderr] Checking parking_lot_core v0.9.11 [INFO] [stderr] Checking socket2 v0.6.0 [INFO] [stderr] Compiling wayland-scanner v0.31.7 [INFO] [stderr] Checking mio v1.0.4 [INFO] [stderr] Checking memmap2 v0.9.8 [INFO] [stderr] Checking png v0.17.16 [INFO] [stderr] Compiling glutin_egl_sys v0.6.0 [INFO] [stderr] Checking rand_chacha v0.3.1 [INFO] [stderr] Compiling glutin_glx_sys v0.5.0 [INFO] [stderr] Checking parking_lot v0.12.4 [INFO] [stderr] Compiling wayland-backend v0.3.11 [INFO] [stderr] Compiling ring v0.17.14 [INFO] [stderr] Compiling nix v0.29.0 [INFO] [stderr] Compiling winit v0.29.15 [INFO] [stderr] Checking raw-window-handle v0.5.2 [INFO] [stderr] Checking svgtypes v0.13.0 [INFO] [stderr] Compiling ppv-lite86 v0.2.21 [INFO] [stderr] Checking rctree v0.5.0 [INFO] [stderr] Compiling rustls v0.23.31 [INFO] [stderr] Compiling rustls v0.21.12 [INFO] [stderr] Checking thin-vec v0.2.14 [INFO] [stderr] Checking boa_profiler v0.17.3 [INFO] [stderr] Checking endi v1.1.0 [INFO] [stderr] Compiling smithay-client-toolkit v0.19.2 [INFO] [stderr] Compiling toml_edit v0.19.15 [INFO] [stderr] Checking rand v0.8.5 [INFO] [stderr] Checking webpki-roots v1.0.2 [INFO] [stderr] Checking num-integer v0.1.46 [INFO] [stderr] Compiling glutin v0.31.3 [INFO] [stderr] Compiling phf v0.11.3 [INFO] [stderr] Checking simplecss v0.2.2 [INFO] [stderr] Checking dtoa v1.0.10 [INFO] [stderr] Checking emath v0.32.1 [INFO] [stderr] Checking imagesize v0.12.0 [INFO] [stderr] Checking weezl v0.1.10 [INFO] [stderr] Checking roxmltree v0.19.0 [INFO] [stderr] Checking data-url v0.3.2 [INFO] [stderr] Compiling proc-macro-crate v3.3.0 [INFO] [stderr] Checking gif v0.13.3 [INFO] [stderr] Checking ecolor v0.32.1 [INFO] [stderr] Compiling document-features v0.2.11 [INFO] [stderr] Compiling libsqlite3-sys v0.26.0 [INFO] [stderr] Checking sha1 v0.10.6 [INFO] [stderr] Compiling mime_guess2 v2.3.1 [INFO] [stderr] Checking owned_ttf_parser v0.25.1 [INFO] [stderr] Checking dtoa-short v0.3.5 [INFO] [stderr] Checking ab_glyph v0.2.31 [INFO] [stderr] Checking webpki-roots v0.26.11 [INFO] [stderr] Checking brotli v8.0.2 [INFO] [stderr] Checking async-fs v2.1.3 [INFO] [stderr] Checking http-body v0.4.6 [INFO] [stderr] Checking xdg-home v1.3.0 [INFO] [stderr] Checking socket2 v0.5.10 [INFO] [stderr] Checking brotli-decompressor v4.0.3 [INFO] [stderr] Compiling glutin-winit v0.4.2 [INFO] [stderr] Checking ordered-stream v0.2.0 [INFO] [stderr] Checking epaint_default_fonts v0.32.1 [INFO] [stderr] Checking compression-core v0.4.28 [INFO] [stderr] Checking xmlwriter v0.1.0 [INFO] [stderr] Checking pico-args v0.5.0 [INFO] [stderr] Checking regex-automata v0.4.10 [INFO] [stderr] Checking dirs-sys v0.4.1 [INFO] [stderr] Compiling mime_guess v2.0.5 [INFO] [stderr] Checking servo_arc v0.3.0 [INFO] [stderr] Checking web-time v0.2.4 [INFO] [stderr] Compiling synstructure v0.13.2 [INFO] [stderr] Compiling zvariant_utils v2.1.0 [INFO] [stderr] Checking pollster v0.3.0 [INFO] [stderr] Checking either v1.15.0 [INFO] [stderr] Checking unicode-width v0.2.1 [INFO] [stderr] Compiling phf_generator v0.11.3 [INFO] [stderr] Compiling phf_generator v0.10.0 [INFO] [stderr] Checking fast-float v0.2.0 [INFO] [stderr] Compiling phf_codegen v0.10.0 [INFO] [stderr] Compiling string_cache_codegen v0.5.4 [INFO] [stderr] Compiling selectors v0.25.0 [INFO] [stderr] Compiling proc-macro-crate v1.3.1 [INFO] [stderr] Compiling rfd v0.14.1 [INFO] [stderr] Compiling anyhow v1.0.99 [INFO] [stderr] Checking getopts v0.2.23 [INFO] [stderr] Checking itertools v0.11.0 [INFO] [stderr] Checking directories v5.0.1 [INFO] [stderr] Checking is-terminal v0.4.16 [INFO] [stderr] Checking encoding_rs v0.8.35 [INFO] [stderr] Compiling icnx v0.1.0 (/opt/rustwide/workdir) [INFO] [stderr] Checking sptr v0.3.2 [INFO] [stderr] Checking fallible-iterator v0.2.0 [INFO] [stderr] Checking webpki-roots v0.25.4 [INFO] [stderr] Checking ryu-js v0.2.2 [INFO] [stderr] Compiling markup5ever v0.11.0 [INFO] [stderr] Compiling serde_derive v1.0.219 [INFO] [stderr] Compiling zerofrom-derive v0.1.6 [INFO] [stderr] Compiling displaydoc v0.2.5 [INFO] [stderr] Compiling yoke-derive v0.8.0 [INFO] [stderr] Compiling zerovec-derive v0.11.1 [INFO] [stderr] Compiling bytemuck_derive v1.10.1 [INFO] [stderr] Compiling thiserror-impl v1.0.69 [INFO] [stderr] Compiling yoke-derive v0.7.5 [INFO] [stderr] Compiling zerovec-derive v0.9.7 [INFO] [stderr] Compiling thiserror-impl v2.0.16 [INFO] [stderr] Compiling futures-macro v0.3.31 [INFO] [stderr] Compiling icu_provider_macros v1.2.0 [INFO] [stderr] Compiling tracing-attributes v0.1.30 [INFO] [stderr] Compiling tokio-macros v2.5.0 [INFO] [stderr] Compiling phf_macros v0.11.3 [INFO] [stderr] Compiling enumflags2_derive v0.7.12 [INFO] [stderr] Compiling zvariant_derive v4.2.0 [INFO] [stderr] Checking futures-util v0.3.31 [INFO] [stderr] Compiling boa_macros v0.17.3 [INFO] [stderr] Checking rustls-webpki v0.101.7 [INFO] [stderr] Checking sct v0.7.1 [INFO] [stderr] Checking rustls-webpki v0.103.4 [INFO] [stderr] Compiling html5ever v0.26.0 [INFO] [stderr] Checking tokio v1.47.1 [INFO] [stderr] Compiling cssparser-macros v0.6.1 [INFO] [stderr] Compiling zbus_macros v4.4.0 [INFO] [stderr] Checking zerofrom v0.1.6 [INFO] [stderr] Checking thiserror v1.0.69 [INFO] [stderr] Checking boa_gc v0.17.3 [INFO] [stderr] Compiling serde_repr v0.1.20 [INFO] [stderr] Checking yoke v0.8.0 [INFO] [stderr] Checking bytemuck v1.23.2 [INFO] [stderr] Compiling async-trait v0.1.89 [INFO] [stderr] Checking cobs v0.3.0 [INFO] [stderr] Checking tiny-skia-path v0.11.4 [INFO] [stderr] Checking image v0.25.6 [INFO] [stderr] Checking zerovec v0.11.4 [INFO] [stderr] Checking zerotrie v0.2.2 [INFO] [stderr] Checking rgb v0.8.52 [INFO] [stderr] Checking tracing v0.1.41 [INFO] [stderr] Checking cssparser v0.31.2 [INFO] [stderr] Checking compression-codecs v0.4.28 [INFO] [stderr] Checking usvg-tree v0.37.0 [INFO] [stderr] Checking tiny-skia v0.11.4 [INFO] [stderr] Compiling enum-map-derive v0.17.0 [INFO] [stderr] Compiling num_enum_derive v0.6.1 [INFO] [stderr] Compiling derive_more v0.99.20 [INFO] [stderr] Checking regex v1.11.2 [INFO] [stderr] Checking env_logger v0.10.2 [INFO] [stderr] Checking usvg-parser v0.37.0 [INFO] [stderr] Checking tinystr v0.8.1 [INFO] [stderr] Checking potential_utf v0.1.2 [INFO] [stderr] Checking num_enum v0.6.1 [INFO] [stderr] Checking icu_locale_core v2.0.0 [INFO] [stderr] Checking icu_collections v2.0.0 [INFO] [stderr] Checking futures-executor v0.3.31 [INFO] [stderr] Checking futures v0.3.31 [INFO] [stderr] Checking icu_provider v2.0.0 [INFO] [stderr] Checking icu_properties v2.0.1 [INFO] [stderr] Checking icu_normalizer v2.0.0 [INFO] [stderr] Checking usvg v0.37.0 [INFO] [stderr] Checking resvg v0.37.0 [INFO] [stderr] Checking idna_adapter v1.2.1 [INFO] [stderr] Checking idna v1.1.0 [INFO] [stderr] Checking tokio-util v0.7.16 [INFO] [stderr] Checking tokio-rustls v0.24.1 [INFO] [stderr] Checking async-compression v0.4.28 [INFO] [stderr] Checking h2 v0.3.27 [INFO] [stderr] Checking bitflags v2.9.3 [INFO] [stderr] Checking url v2.5.7 [INFO] [stderr] Checking yoke v0.7.5 [INFO] [stderr] Checking postcard v1.1.3 [INFO] [stderr] Checking emath v0.28.1 [INFO] [stderr] Checking enumflags2 v0.7.12 [INFO] [stderr] Checking num-bigint v0.4.6 [INFO] [stderr] Checking string_cache v0.8.9 [INFO] [stderr] Checking serde_json v1.0.143 [INFO] [stderr] Checking chrono v0.4.41 [INFO] [stderr] Checking serde_urlencoded v0.7.1 [INFO] [stderr] Checking enum-map v2.7.3 [INFO] [stderr] Checking uuid v1.18.0 [INFO] [stderr] Checking hashbrown v0.14.5 [INFO] [stderr] Checking ron v0.8.1 [INFO] [stderr] Checking zerovec v0.9.7 [INFO] [stderr] Checking zvariant v4.2.0 [INFO] [stderr] Checking xkbcommon-dl v0.4.2 [INFO] [stderr] Checking ecolor v0.28.1 [INFO] [stderr] Checking hashbrown v0.13.2 [INFO] [stderr] Checking epaint v0.28.1 [INFO] [stderr] Checking boa_interner v0.17.3 [INFO] [stderr] Checking ureq v2.12.1 [INFO] [stderr] Checking webbrowser v1.0.5 [INFO] [stderr] Checking regress v0.6.0 [INFO] [stderr] Checking epaint v0.32.1 [INFO] [stderr] Checking hashlink v0.8.4 [INFO] [stderr] Checking boa_ast v0.17.3 [INFO] [stderr] Checking dashmap v5.5.3 [INFO] [stderr] Checking ehttp v0.5.0 [INFO] [stderr] Checking rusqlite v0.29.0 [INFO] [stderr] Checking zbus_names v3.0.0 [INFO] [stderr] Checking tinystr v0.7.2 [INFO] [stderr] Checking icu_collections v1.2.0 [INFO] [stderr] Checking egui v0.32.1 [INFO] [stderr] Checking icu_locid v1.2.0 [INFO] [stderr] Checking icu_provider v1.2.0 [INFO] [stderr] Checking scraper v0.18.1 [INFO] [stderr] Checking icu_properties v1.2.0 [INFO] [stderr] Checking icu_provider_adapters v1.2.0 [INFO] [stderr] Checking icu_provider_blob v1.2.0 [INFO] [stderr] Checking hyper v0.14.32 [INFO] [stderr] Checking egui v0.28.1 [INFO] [stderr] Checking icu_normalizer v1.2.0 [INFO] [stderr] Checking x11rb v0.13.1 [INFO] [stderr] Checking hyper-rustls v0.24.2 [INFO] [stderr] Checking polling v3.10.0 [INFO] [stderr] Checking tempfile v3.21.0 [INFO] [stderr] Checking boa_icu_provider v0.17.3 [INFO] [stderr] Checking boa_parser v0.17.3 [INFO] [stderr] Checking reqwest v0.11.27 [INFO] [stderr] Checking calloop v0.12.4 [INFO] [stderr] Checking calloop v0.13.0 [INFO] [stderr] Checking async-io v2.5.0 [INFO] [stderr] Checking zbus v4.4.0 [INFO] [stderr] Checking async-net v2.0.0 [INFO] [stderr] Checking egui_code_editor v0.2.17 [INFO] [stderr] Checking wayland-client v0.31.11 [INFO] [stderr] Checking wayland-csd-frame v0.3.0 [INFO] [stderr] Checking boa_engine v0.17.3 [INFO] [stderr] Checking arboard v3.6.1 [INFO] [stderr] Checking wayland-protocols v0.31.2 [INFO] [stderr] Checking wayland-cursor v0.31.11 [INFO] [stderr] Checking calloop-wayland-source v0.2.0 [INFO] [stderr] Checking wayland-protocols v0.32.9 [INFO] [stderr] Checking calloop-wayland-source v0.3.0 [INFO] [stderr] Checking egui_glow v0.28.1 [INFO] [stderr] Checking egui_extras v0.28.1 [INFO] [stderr] Checking ashpd v0.8.1 [INFO] [stderr] Checking wayland-protocols-wlr v0.2.0 [INFO] [stderr] Checking wayland-protocols-plasma v0.2.0 [INFO] [stderr] Checking wayland-protocols-wlr v0.3.9 [INFO] [stderr] Checking smithay-clipboard v0.7.2 [INFO] [stderr] Checking egui-winit v0.28.1 [INFO] [stderr] Checking eframe v0.28.1 [INFO] [stdout] warning: unused import: `egui::Context` [INFO] [stdout] --> src/theme/mod.rs:1:5 [INFO] [stdout] | [INFO] [stdout] 1 | use egui::Context; [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: `egui::Context` [INFO] [stdout] --> src/theme/mod.rs:1:5 [INFO] [stdout] | [INFO] [stdout] 1 | use egui::Context; [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 variable: `script_name` [INFO] [stdout] --> src/core/runtime.rs:313:49 [INFO] [stdout] | [INFO] [stdout] 313 | ...nd_get_output(&self, script_name: &str, source: &str, options: Option) -> Result<(Option, Vec src/theme/icons.rs:59:51 [INFO] [stdout] | [INFO] [stdout] 59 | pub fn icon_with_text(icon: &str, text: &str, icon_size: f32) -> String { [INFO] [stdout] | ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_icon_size` [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused variable: `script_name` [INFO] [stdout] --> src/core/runtime.rs:313:49 [INFO] [stdout] | [INFO] [stdout] 313 | ...nd_get_output(&self, script_name: &str, source: &str, options: Option) -> Result<(Option, Vec src/components/dialogs/script_picker.rs:11:1 [INFO] [stdout] | [INFO] [stdout] 11 | / impl Default for ScriptPickerDialog { [INFO] [stdout] 12 | | fn default() -> Self { [INFO] [stdout] 13 | | Self { [INFO] [stdout] 14 | | open: false, [INFO] [stdout] ... | [INFO] [stdout] 20 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#derivable_impls [INFO] [stdout] = note: `#[warn(clippy::derivable_impls)]` on by default [INFO] [stdout] help: replace the manual implementation with a derive attribute [INFO] [stdout] | [INFO] [stdout] 4 + #[derive(Default)] [INFO] [stdout] 5 | pub struct ScriptPickerDialog { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/components/dialogs/script_picker.rs:81:29 [INFO] [stdout] | [INFO] [stdout] 81 | / ... if self.selected_script.is_some() { [INFO] [stdout] 82 | | ... if ui.button("โœ… Use Selected Script").clicked() { [INFO] [stdout] 83 | | ... self.open = false; [INFO] [stdout] 84 | | ... selected_script = self.selected_script.clone(); [INFO] [stdout] 85 | | ... } [INFO] [stdout] 86 | | ... } [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] 81 ~ if self.selected_script.is_some() [INFO] [stdout] 82 ~ && ui.button("โœ… Use Selected Script").clicked() { [INFO] [stdout] 83 | self.open = false; [INFO] [stdout] 84 | selected_script = self.selected_script.clone(); [INFO] [stdout] 85 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `impl` can be derived [INFO] [stdout] --> src/components/dialogs/stress_test.rs:33:1 [INFO] [stdout] | [INFO] [stdout] 33 | / impl Default for StressTestDialog { [INFO] [stdout] 34 | | fn default() -> Self { [INFO] [stdout] 35 | | Self { [INFO] [stdout] 36 | | open: false, [INFO] [stdout] ... | [INFO] [stdout] 40 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#derivable_impls [INFO] [stdout] help: replace the manual implementation with a derive attribute [INFO] [stdout] | [INFO] [stdout] 28 + #[derive(Default)] [INFO] [stdout] 29 | pub struct StressTestDialog { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/components/dialogs/stress_test.rs:85:29 [INFO] [stdout] | [INFO] [stdout] 85 | / ... if self.selected_test.is_some() { [INFO] [stdout] 86 | | ... if ui.button("๐Ÿš€ Start Stress Test").clicked() { [INFO] [stdout] 87 | | ... self.open = false; [INFO] [stdout] 88 | | ... selected_test = self.selected_test.clone(); [INFO] [stdout] 89 | | ... } [INFO] [stdout] 90 | | ... } [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] 85 ~ if self.selected_test.is_some() [INFO] [stdout] 86 ~ && ui.button("๐Ÿš€ Start Stress Test").clicked() { [INFO] [stdout] 87 | self.open = false; [INFO] [stdout] 88 | selected_test = self.selected_test.clone(); [INFO] [stdout] 89 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `impl` can be derived [INFO] [stdout] --> src/components/dialogs/test_dialog.rs:46:1 [INFO] [stdout] | [INFO] [stdout] 46 | / impl Default for TestDialog { [INFO] [stdout] 47 | | fn default() -> Self { [INFO] [stdout] 48 | | Self { [INFO] [stdout] 49 | | open: false, [INFO] [stdout] ... | [INFO] [stdout] 53 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#derivable_impls [INFO] [stdout] help: replace the manual implementation with a derive attribute [INFO] [stdout] | [INFO] [stdout] 41 + #[derive(Default)] [INFO] [stdout] 42 | pub struct TestDialog { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused variable: `icon_size` [INFO] [stdout] --> src/theme/icons.rs:59:51 [INFO] [stdout] | [INFO] [stdout] 59 | pub fn icon_with_text(icon: &str, text: &str, icon_size: f32) -> String { [INFO] [stdout] | ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_icon_size` [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `impl` can be derived [INFO] [stdout] --> src/components/dialogs/script_picker.rs:11:1 [INFO] [stdout] | [INFO] [stdout] 11 | / impl Default for ScriptPickerDialog { [INFO] [stdout] 12 | | fn default() -> Self { [INFO] [stdout] 13 | | Self { [INFO] [stdout] 14 | | open: false, [INFO] [stdout] ... | [INFO] [stdout] 20 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#derivable_impls [INFO] [stdout] = note: `#[warn(clippy::derivable_impls)]` on by default [INFO] [stdout] help: replace the manual implementation with a derive attribute [INFO] [stdout] | [INFO] [stdout] 4 + #[derive(Default)] [INFO] [stdout] 5 | pub struct ScriptPickerDialog { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/components/dialogs/script_picker.rs:81:29 [INFO] [stdout] | [INFO] [stdout] 81 | / ... if self.selected_script.is_some() { [INFO] [stdout] 82 | | ... if ui.button("โœ… Use Selected Script").clicked() { [INFO] [stdout] 83 | | ... self.open = false; [INFO] [stdout] 84 | | ... selected_script = self.selected_script.clone(); [INFO] [stdout] 85 | | ... } [INFO] [stdout] 86 | | ... } [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] 81 ~ if self.selected_script.is_some() [INFO] [stdout] 82 ~ && ui.button("โœ… Use Selected Script").clicked() { [INFO] [stdout] 83 | self.open = false; [INFO] [stdout] 84 | selected_script = self.selected_script.clone(); [INFO] [stdout] 85 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `impl` can be derived [INFO] [stdout] --> src/components/dialogs/stress_test.rs:33:1 [INFO] [stdout] | [INFO] [stdout] 33 | / impl Default for StressTestDialog { [INFO] [stdout] 34 | | fn default() -> Self { [INFO] [stdout] 35 | | Self { [INFO] [stdout] 36 | | open: false, [INFO] [stdout] ... | [INFO] [stdout] 40 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#derivable_impls [INFO] [stdout] help: replace the manual implementation with a derive attribute [INFO] [stdout] | [INFO] [stdout] 28 + #[derive(Default)] [INFO] [stdout] 29 | pub struct StressTestDialog { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/components/dialogs/stress_test.rs:85:29 [INFO] [stdout] | [INFO] [stdout] 85 | / ... if self.selected_test.is_some() { [INFO] [stdout] 86 | | ... if ui.button("๐Ÿš€ Start Stress Test").clicked() { [INFO] [stdout] 87 | | ... self.open = false; [INFO] [stdout] 88 | | ... selected_test = self.selected_test.clone(); [INFO] [stdout] 89 | | ... } [INFO] [stdout] 90 | | ... } [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] 85 ~ if self.selected_test.is_some() [INFO] [stdout] 86 ~ && ui.button("๐Ÿš€ Start Stress Test").clicked() { [INFO] [stdout] 87 | self.open = false; [INFO] [stdout] 88 | selected_test = self.selected_test.clone(); [INFO] [stdout] 89 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `impl` can be derived [INFO] [stdout] --> src/components/dialogs/test_dialog.rs:46:1 [INFO] [stdout] | [INFO] [stdout] 46 | / impl Default for TestDialog { [INFO] [stdout] 47 | | fn default() -> Self { [INFO] [stdout] 48 | | Self { [INFO] [stdout] 49 | | open: false, [INFO] [stdout] ... | [INFO] [stdout] 53 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#derivable_impls [INFO] [stdout] help: replace the manual implementation with a derive attribute [INFO] [stdout] | [INFO] [stdout] 41 + #[derive(Default)] [INFO] [stdout] 42 | pub struct TestDialog { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: returning the result of a `let` binding from a block [INFO] [stdout] --> src/core/runtime.rs:239:41 [INFO] [stdout] | [INFO] [stdout] 230 | / ... let result = if !url.is_empty() { [INFO] [stdout] 231 | | ... match ureq::get(url).call() { [INFO] [stdout] 232 | | ... Ok(resp) => match resp.into_string() { [INFO] [stdout] 233 | | ... Ok(t) => json!({"id": id, "result": t}), [INFO] [stdout] ... | [INFO] [stdout] 238 | | ... } else { json!({"id": id, "result": null}) }; [INFO] [stdout] | |___________________________________________________________________- unnecessary `let` binding [INFO] [stdout] 239 | ... result [INFO] [stdout] | ^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return [INFO] [stdout] = note: `#[warn(clippy::let_and_return)]` on by default [INFO] [stdout] help: return the expression directly [INFO] [stdout] | [INFO] [stdout] 230 ~ [INFO] [stdout] 231 ~ if !url.is_empty() { [INFO] [stdout] 232 + match ureq::get(url).call() { [INFO] [stdout] 233 + Ok(resp) => match resp.into_string() { [INFO] [stdout] 234 + Ok(t) => json!({"id": id, "result": t}), [INFO] [stdout] 235 + Err(_) => json!({"id": id, "result": null}) [INFO] [stdout] 236 + }, [INFO] [stdout] 237 + Err(_) => json!({"id": id, "result": null}), [INFO] [stdout] 238 + } [INFO] [stdout] 239 + } else { json!({"id": id, "result": null}) } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: returning the result of a `let` binding from a block [INFO] [stdout] --> src/core/runtime.rs:506:41 [INFO] [stdout] | [INFO] [stdout] 497 | / ... let result = if !url.is_empty() { [INFO] [stdout] 498 | | ... match ureq::get(url).call() { [INFO] [stdout] 499 | | ... Ok(resp) => match resp.into_string() { [INFO] [stdout] 500 | | ... Ok(t) => json!({"id": id, "result": t}), [INFO] [stdout] ... | [INFO] [stdout] 505 | | ... } else { json!({"id": id, "result": null}) }; [INFO] [stdout] | |___________________________________________________________________- unnecessary `let` binding [INFO] [stdout] 506 | ... result [INFO] [stdout] | ^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return [INFO] [stdout] help: return the expression directly [INFO] [stdout] | [INFO] [stdout] 497 ~ [INFO] [stdout] 498 ~ if !url.is_empty() { [INFO] [stdout] 499 + match ureq::get(url).call() { [INFO] [stdout] 500 + Ok(resp) => match resp.into_string() { [INFO] [stdout] 501 + Ok(t) => json!({"id": id, "result": t}), [INFO] [stdout] 502 + Err(_) => json!({"id": id, "result": null}) [INFO] [stdout] 503 + }, [INFO] [stdout] 504 + Err(_) => json!({"id": id, "result": null}), [INFO] [stdout] 505 + } [INFO] [stdout] 506 + } else { json!({"id": id, "result": null}) } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: matching on `Some` with `ok()` is redundant [INFO] [stdout] --> src/core/runtime.rs:562:17 [INFO] [stdout] | [INFO] [stdout] 562 | if let Some(length_val) = arr.get("length", &mut ctx).ok() { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_result_ok [INFO] [stdout] = note: `#[warn(clippy::match_result_ok)]` on by default [INFO] [stdout] help: consider matching on `Ok(length_val)` and removing the call to `ok` instead [INFO] [stdout] | [INFO] [stdout] 562 - if let Some(length_val) = arr.get("length", &mut ctx).ok() { [INFO] [stdout] 562 + if let Ok(length_val) = arr.get("length", &mut ctx) { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unnecessary `if let` since only the `Ok` variant of the iterator element is used [INFO] [stdout] --> src/core/script_detector.rs:40:17 [INFO] [stdout] | [INFO] [stdout] 40 | / for entry in entries { [INFO] [stdout] 41 | | if let Ok(entry) = entry { [INFO] [stdout] 42 | | let path = entry.path(); [INFO] [stdout] 43 | | if path.is_dir() { [INFO] [stdout] ... | [INFO] [stdout] 89 | | } [INFO] [stdout] | |_________________^ [INFO] [stdout] | [INFO] [stdout] help: try `.flatten()` and remove the `if let` statement in the for loop [INFO] [stdout] --> src/core/script_detector.rs:41:21 [INFO] [stdout] | [INFO] [stdout] 41 | / if let Ok(entry) = entry { [INFO] [stdout] 42 | | let path = entry.path(); [INFO] [stdout] 43 | | if path.is_dir() { [INFO] [stdout] 44 | | let manifest_path = path.join("manifest.json"); [INFO] [stdout] ... | [INFO] [stdout] 88 | | } [INFO] [stdout] | |_____________________^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_flatten [INFO] [stdout] = note: `#[warn(clippy::manual_flatten)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 40 ~ for entry in entries.flatten() { [INFO] [stdout] 41 + let path = entry.path(); [INFO] [stdout] 42 + if path.is_dir() { [INFO] [stdout] 43 + let manifest_path = path.join("manifest.json"); [INFO] [stdout] 44 + if manifest_path.exists() { [INFO] [stdout] 45 + match fs::read_to_string(&manifest_path) { [INFO] [stdout] 46 + Ok(content) => { [INFO] [stdout] 47 + if content.trim().is_empty() { [INFO] [stdout] 48 + eprintln!("Warning: Empty manifest file: {}", manifest_path.display()); [INFO] [stdout] 49 + continue; [INFO] [stdout] 50 + } [INFO] [stdout] 51 + match serde_json::from_str::(&content) { [INFO] [stdout] 52 + Ok(manifest) => { [INFO] [stdout] 53 + let script_info = ScriptInfo { [INFO] [stdout] 54 + name: manifest["name"].as_str().unwrap_or("Unknown").to_string(), [INFO] [stdout] 55 + description: manifest["description"].as_str().unwrap_or("").to_string(), [INFO] [stdout] 56 + version: manifest["version"].as_str().unwrap_or("0.1.0").to_string(), [INFO] [stdout] 57 + author: manifest["author"].as_str().unwrap_or("Unknown").to_string(), [INFO] [stdout] 58 + category: manifest["category"].as_str().map(|s| s.to_string()), [INFO] [stdout] 59 + tags: manifest["tags"].as_array() [INFO] [stdout] 60 + .map(|arr| arr.iter() [INFO] [stdout] 61 + .filter_map(|v| v.as_str()) [INFO] [stdout] 62 + .map(|s| s.to_string()) [INFO] [stdout] 63 + .collect()), [INFO] [stdout] 64 + icon: manifest["icon"].as_str().map(|s| s.to_string()), [INFO] [stdout] 65 + website: manifest["website"].as_str().map(|s| s.to_string()), [INFO] [stdout] 66 + supported_domains: manifest["supportedDomains"].as_array() [INFO] [stdout] 67 + .map(|arr| arr.iter() [INFO] [stdout] 68 + .filter_map(|v| v.as_str()) [INFO] [stdout] 69 + .map(|s| s.to_string()) [INFO] [stdout] 70 + .collect()), [INFO] [stdout] 71 + dir: path.file_name().unwrap_or_default().to_string_lossy().to_string(), [INFO] [stdout] 72 + }; [INFO] [stdout] 73 + println!("Loaded script: {} with domains: {:?}", script_info.name, script_info.supported_domains); [INFO] [stdout] 74 + scripts.push(script_info); [INFO] [stdout] 75 + } [INFO] [stdout] 76 + Err(e) => { [INFO] [stdout] 77 + eprintln!("Error parsing manifest JSON {}: {}", manifest_path.display(), e); [INFO] [stdout] 78 + } [INFO] [stdout] 79 + } [INFO] [stdout] 80 + } [INFO] [stdout] 81 + Err(e) => { [INFO] [stdout] 82 + eprintln!("Error reading manifest {}: {}", manifest_path.display(), e); [INFO] [stdout] 83 + } [INFO] [stdout] 84 + } [INFO] [stdout] 85 + } [INFO] [stdout] 86 + } [INFO] [stdout] 87 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: stripping a prefix manually [INFO] [stdout] --> src/core/script_detector.rs:159:31 [INFO] [stdout] | [INFO] [stdout] 159 | let base_domain = &pattern[2..]; [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] note: the prefix was tested here [INFO] [stdout] --> src/core/script_detector.rs:158:9 [INFO] [stdout] | [INFO] [stdout] 158 | if pattern.starts_with("*.") { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_strip [INFO] [stdout] = note: `#[warn(clippy::manual_strip)]` on by default [INFO] [stdout] help: try using the `strip_prefix` method [INFO] [stdout] | [INFO] [stdout] 158 ~ if let Some(base_domain) = pattern.strip_prefix("*.") { [INFO] [stdout] 159 ~ return host == base_domain || host.ends_with(&format!(".{}", base_domain)); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: returning the result of a `let` binding from a block [INFO] [stdout] --> src/core/runtime.rs:239:41 [INFO] [stdout] | [INFO] [stdout] 230 | / ... let result = if !url.is_empty() { [INFO] [stdout] 231 | | ... match ureq::get(url).call() { [INFO] [stdout] 232 | | ... Ok(resp) => match resp.into_string() { [INFO] [stdout] 233 | | ... Ok(t) => json!({"id": id, "result": t}), [INFO] [stdout] ... | [INFO] [stdout] 238 | | ... } else { json!({"id": id, "result": null}) }; [INFO] [stdout] | |___________________________________________________________________- unnecessary `let` binding [INFO] [stdout] 239 | ... result [INFO] [stdout] | ^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return [INFO] [stdout] = note: `#[warn(clippy::let_and_return)]` on by default [INFO] [stdout] help: return the expression directly [INFO] [stdout] | [INFO] [stdout] 230 ~ [INFO] [stdout] 231 ~ if !url.is_empty() { [INFO] [stdout] 232 + match ureq::get(url).call() { [INFO] [stdout] 233 + Ok(resp) => match resp.into_string() { [INFO] [stdout] 234 + Ok(t) => json!({"id": id, "result": t}), [INFO] [stdout] 235 + Err(_) => json!({"id": id, "result": null}) [INFO] [stdout] 236 + }, [INFO] [stdout] 237 + Err(_) => json!({"id": id, "result": null}), [INFO] [stdout] 238 + } [INFO] [stdout] 239 + } else { json!({"id": id, "result": null}) } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: returning the result of a `let` binding from a block [INFO] [stdout] --> src/core/runtime.rs:506:41 [INFO] [stdout] | [INFO] [stdout] 497 | / ... let result = if !url.is_empty() { [INFO] [stdout] 498 | | ... match ureq::get(url).call() { [INFO] [stdout] 499 | | ... Ok(resp) => match resp.into_string() { [INFO] [stdout] 500 | | ... Ok(t) => json!({"id": id, "result": t}), [INFO] [stdout] ... | [INFO] [stdout] 505 | | ... } else { json!({"id": id, "result": null}) }; [INFO] [stdout] | |___________________________________________________________________- unnecessary `let` binding [INFO] [stdout] 506 | ... result [INFO] [stdout] | ^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return [INFO] [stdout] help: return the expression directly [INFO] [stdout] | [INFO] [stdout] 497 ~ [INFO] [stdout] 498 ~ if !url.is_empty() { [INFO] [stdout] 499 + match ureq::get(url).call() { [INFO] [stdout] 500 + Ok(resp) => match resp.into_string() { [INFO] [stdout] 501 + Ok(t) => json!({"id": id, "result": t}), [INFO] [stdout] 502 + Err(_) => json!({"id": id, "result": null}) [INFO] [stdout] 503 + }, [INFO] [stdout] 504 + Err(_) => json!({"id": id, "result": null}), [INFO] [stdout] 505 + } [INFO] [stdout] 506 + } else { json!({"id": id, "result": null}) } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: matching on `Some` with `ok()` is redundant [INFO] [stdout] --> src/core/runtime.rs:562:17 [INFO] [stdout] | [INFO] [stdout] 562 | if let Some(length_val) = arr.get("length", &mut ctx).ok() { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_result_ok [INFO] [stdout] = note: `#[warn(clippy::match_result_ok)]` on by default [INFO] [stdout] help: consider matching on `Ok(length_val)` and removing the call to `ok` instead [INFO] [stdout] | [INFO] [stdout] 562 - if let Some(length_val) = arr.get("length", &mut ctx).ok() { [INFO] [stdout] 562 + if let Ok(length_val) = arr.get("length", &mut ctx) { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unnecessary `if let` since only the `Ok` variant of the iterator element is used [INFO] [stdout] --> src/core/script_detector.rs:40:17 [INFO] [stdout] | [INFO] [stdout] 40 | / for entry in entries { [INFO] [stdout] 41 | | if let Ok(entry) = entry { [INFO] [stdout] 42 | | let path = entry.path(); [INFO] [stdout] 43 | | if path.is_dir() { [INFO] [stdout] ... | [INFO] [stdout] 89 | | } [INFO] [stdout] | |_________________^ [INFO] [stdout] | [INFO] [stdout] help: try `.flatten()` and remove the `if let` statement in the for loop [INFO] [stdout] --> src/core/script_detector.rs:41:21 [INFO] [stdout] | [INFO] [stdout] 41 | / if let Ok(entry) = entry { [INFO] [stdout] 42 | | let path = entry.path(); [INFO] [stdout] 43 | | if path.is_dir() { [INFO] [stdout] 44 | | let manifest_path = path.join("manifest.json"); [INFO] [stdout] ... | [INFO] [stdout] 88 | | } [INFO] [stdout] | |_____________________^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_flatten [INFO] [stdout] = note: `#[warn(clippy::manual_flatten)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 40 ~ for entry in entries.flatten() { [INFO] [stdout] 41 + let path = entry.path(); [INFO] [stdout] 42 + if path.is_dir() { [INFO] [stdout] 43 + let manifest_path = path.join("manifest.json"); [INFO] [stdout] 44 + if manifest_path.exists() { [INFO] [stdout] 45 + match fs::read_to_string(&manifest_path) { [INFO] [stdout] 46 + Ok(content) => { [INFO] [stdout] 47 + if content.trim().is_empty() { [INFO] [stdout] 48 + eprintln!("Warning: Empty manifest file: {}", manifest_path.display()); [INFO] [stdout] 49 + continue; [INFO] [stdout] 50 + } [INFO] [stdout] 51 + match serde_json::from_str::(&content) { [INFO] [stdout] 52 + Ok(manifest) => { [INFO] [stdout] 53 + let script_info = ScriptInfo { [INFO] [stdout] 54 + name: manifest["name"].as_str().unwrap_or("Unknown").to_string(), [INFO] [stdout] 55 + description: manifest["description"].as_str().unwrap_or("").to_string(), [INFO] [stdout] 56 + version: manifest["version"].as_str().unwrap_or("0.1.0").to_string(), [INFO] [stdout] 57 + author: manifest["author"].as_str().unwrap_or("Unknown").to_string(), [INFO] [stdout] 58 + category: manifest["category"].as_str().map(|s| s.to_string()), [INFO] [stdout] 59 + tags: manifest["tags"].as_array() [INFO] [stdout] 60 + .map(|arr| arr.iter() [INFO] [stdout] 61 + .filter_map(|v| v.as_str()) [INFO] [stdout] 62 + .map(|s| s.to_string()) [INFO] [stdout] 63 + .collect()), [INFO] [stdout] 64 + icon: manifest["icon"].as_str().map(|s| s.to_string()), [INFO] [stdout] 65 + website: manifest["website"].as_str().map(|s| s.to_string()), [INFO] [stdout] 66 + supported_domains: manifest["supportedDomains"].as_array() [INFO] [stdout] 67 + .map(|arr| arr.iter() [INFO] [stdout] 68 + .filter_map(|v| v.as_str()) [INFO] [stdout] 69 + .map(|s| s.to_string()) [INFO] [stdout] 70 + .collect()), [INFO] [stdout] 71 + dir: path.file_name().unwrap_or_default().to_string_lossy().to_string(), [INFO] [stdout] 72 + }; [INFO] [stdout] 73 + println!("Loaded script: {} with domains: {:?}", script_info.name, script_info.supported_domains); [INFO] [stdout] 74 + scripts.push(script_info); [INFO] [stdout] 75 + } [INFO] [stdout] 76 + Err(e) => { [INFO] [stdout] 77 + eprintln!("Error parsing manifest JSON {}: {}", manifest_path.display(), e); [INFO] [stdout] 78 + } [INFO] [stdout] 79 + } [INFO] [stdout] 80 + } [INFO] [stdout] 81 + Err(e) => { [INFO] [stdout] 82 + eprintln!("Error reading manifest {}: {}", manifest_path.display(), e); [INFO] [stdout] 83 + } [INFO] [stdout] 84 + } [INFO] [stdout] 85 + } [INFO] [stdout] 86 + } [INFO] [stdout] 87 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: stripping a prefix manually [INFO] [stdout] --> src/core/script_detector.rs:159:31 [INFO] [stdout] | [INFO] [stdout] 159 | let base_domain = &pattern[2..]; [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] note: the prefix was tested here [INFO] [stdout] --> src/core/script_detector.rs:158:9 [INFO] [stdout] | [INFO] [stdout] 158 | if pattern.starts_with("*.") { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_strip [INFO] [stdout] = note: `#[warn(clippy::manual_strip)]` on by default [INFO] [stdout] help: try using the `strip_prefix` method [INFO] [stdout] | [INFO] [stdout] 158 ~ if let Some(base_domain) = pattern.strip_prefix("*.") { [INFO] [stdout] 159 ~ return host == base_domain || host.ends_with(&format!(".{}", base_domain)); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&PathBuf` instead of `&Path` involves a new object where a slice will do [INFO] [stdout] --> src/downloader.rs:20:62 [INFO] [stdout] | [INFO] [stdout] 20 | pub async fn download(&self, url: &str, destination_dir: &PathBuf) -> Result<()> { [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] 20 - pub async fn download(&self, url: &str, destination_dir: &PathBuf) -> Result<()> { [INFO] [stdout] 20 + pub async fn download(&self, url: &str, destination_dir: &Path) -> Result<()> { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `Iterator::last` on a `DoubleEndedIterator`; this will needlessly iterate the entire iterator [INFO] [stdout] --> src/downloader.rs:35:24 [INFO] [stdout] | [INFO] [stdout] 35 | let filename = url.split('/').last() [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#double_ended_iterator_last [INFO] [stdout] = note: `#[warn(clippy::double_ended_iterator_last)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 35 - let filename = url.split('/').last() [INFO] [stdout] 35 + let filename = url.split('/').next_back() [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&PathBuf` instead of `&Path` involves a new object where a slice will do [INFO] [stdout] --> src/downloader.rs:20:62 [INFO] [stdout] | [INFO] [stdout] 20 | pub async fn download(&self, url: &str, destination_dir: &PathBuf) -> Result<()> { [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] 20 - pub async fn download(&self, url: &str, destination_dir: &PathBuf) -> Result<()> { [INFO] [stdout] 20 + pub async fn download(&self, url: &str, destination_dir: &Path) -> Result<()> { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `Iterator::last` on a `DoubleEndedIterator`; this will needlessly iterate the entire iterator [INFO] [stdout] --> src/downloader.rs:35:24 [INFO] [stdout] | [INFO] [stdout] 35 | let filename = url.split('/').last() [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#double_ended_iterator_last [INFO] [stdout] = note: `#[warn(clippy::double_ended_iterator_last)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 35 - let filename = url.split('/').last() [INFO] [stdout] 35 + let filename = url.split('/').next_back() [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/theme/mod.rs:41:30 [INFO] [stdout] | [INFO] [stdout] 41 | std::sync::LazyLock::new(|| DesignTokens::dark_theme()); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the associated function itself: `DesignTokens::dark_theme` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] = note: `#[warn(clippy::redundant_closure)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/theme/mod.rs:41:30 [INFO] [stdout] | [INFO] [stdout] 41 | std::sync::LazyLock::new(|| DesignTokens::dark_theme()); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the associated function itself: `DesignTokens::dark_theme` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] = note: `#[warn(clippy::redundant_closure)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `egui::Context` [INFO] [stdout] --> src/theme/mod.rs:1:5 [INFO] [stdout] | [INFO] [stdout] 1 | use egui::Context; [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: `egui::Context` [INFO] [stdout] --> src/theme/mod.rs:1:5 [INFO] [stdout] | [INFO] [stdout] 1 | use egui::Context; [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 variable: `ui` [INFO] [stdout] --> src/tabs/quick_download.rs:129:44 [INFO] [stdout] | [INFO] [stdout] 129 | fn show_add_download_dialog(&mut self, ui: &mut egui::Ui, ctx: &egui::Context, settings: &crate::data::Settings, navigate_to_se... [INFO] [stdout] | ^^ help: if this is intentional, prefix it with an underscore: `_ui` [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused variable: `icon_size` [INFO] [stdout] --> src/theme/icons.rs:59:51 [INFO] [stdout] | [INFO] [stdout] 59 | pub fn icon_with_text(icon: &str, text: &str, icon_size: f32) -> String { [INFO] [stdout] | ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_icon_size` [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused variable: `script_name` [INFO] [stdout] --> src/core/runtime.rs:313:49 [INFO] [stdout] | [INFO] [stdout] 313 | ...nd_get_output(&self, script_name: &str, source: &str, options: Option) -> Result<(Option, Vec src/app.rs:30:5 [INFO] [stdout] | [INFO] [stdout] 11 | pub struct IcnxApp { [INFO] [stdout] | ------- field in this struct [INFO] [stdout] ... [INFO] [stdout] 30 | runtime: tokio::runtime::Runtime, [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 `close` is never used [INFO] [stdout] --> src/components/dialogs/script_picker.rs:239:12 [INFO] [stdout] | [INFO] [stdout] 22 | impl ScriptPickerDialog { [INFO] [stdout] | ----------------------- method in this implementation [INFO] [stdout] ... [INFO] [stdout] 239 | pub fn close(&mut self) { [INFO] [stdout] | ^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enum `StressTestType` is never used [INFO] [stdout] --> src/components/dialogs/stress_test.rs:4:10 [INFO] [stdout] | [INFO] [stdout] 4 | pub enum StressTestType { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `display_name` and `description` are never used [INFO] [stdout] --> src/components/dialogs/stress_test.rs:11:12 [INFO] [stdout] | [INFO] [stdout] 10 | impl StressTestType { [INFO] [stdout] | ------------------- methods in this implementation [INFO] [stdout] 11 | pub fn display_name(&self) -> &str { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 19 | pub fn description(&self) -> &str { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `StressTestDialog` is never constructed [INFO] [stdout] --> src/components/dialogs/stress_test.rs:28:12 [INFO] [stdout] | [INFO] [stdout] 28 | pub struct StressTestDialog { [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `show`, `render_scenario_option`, `open_dialog`, and `close` are never used [INFO] [stdout] --> src/components/dialogs/stress_test.rs:43:12 [INFO] [stdout] | [INFO] [stdout] 42 | impl StressTestDialog { [INFO] [stdout] | --------------------- methods in this implementation [INFO] [stdout] 43 | pub fn show(&mut self, ctx: &egui::Context, tokens: &crate::theme::DesignTokens) -> Option { [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 99 | fn render_scenario_option(&mut self, ui: &mut egui::Ui, scenario: &StressTestType, tokens: &crate::theme::DesignTokens) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 150 | pub fn open_dialog(&mut self) { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 155 | pub fn close(&mut self) { [INFO] [stdout] | ^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `DownloadWindow` is never constructed [INFO] [stdout] --> src/download_window.rs:12:12 [INFO] [stdout] | [INFO] [stdout] 12 | pub struct DownloadWindow { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated function `new` is never used [INFO] [stdout] --> src/download_window.rs:25:12 [INFO] [stdout] | [INFO] [stdout] 24 | impl DownloadWindow { [INFO] [stdout] | ------------------- associated function in this implementation [INFO] [stdout] 25 | pub fn new( [INFO] [stdout] | ^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `start_download` is never used [INFO] [stdout] --> src/download_window.rs:240:8 [INFO] [stdout] | [INFO] [stdout] 239 | impl DownloadWindow { [INFO] [stdout] | ------------------- method in this implementation [INFO] [stdout] 240 | fn start_download(&mut self, settings: &crate::data::Settings) { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: variants `ScrapeItem`, `NavigateToTab`, and `ShowError` are never constructed [INFO] [stdout] --> src/events.rs:27:5 [INFO] [stdout] | [INFO] [stdout] 8 | pub enum AppEvent { [INFO] [stdout] | -------- variants in this enum [INFO] [stdout] ... [INFO] [stdout] 27 | ScrapeItem { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 33 | NavigateToTab { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 40 | ShowError { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `AppEvent` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: variants `DownloadSession` and `ScrapeSession` are never constructed [INFO] [stdout] --> src/events.rs:57:5 [INFO] [stdout] | [INFO] [stdout] 51 | pub enum Tab { [INFO] [stdout] | --- variants in this enum [INFO] [stdout] ... [INFO] [stdout] 57 | DownloadSession, [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] 58 | ScrapeSession, [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `Tab` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `send` is never used [INFO] [stdout] --> src/events.rs:121:12 [INFO] [stdout] | [INFO] [stdout] 115 | impl EventSystem { [INFO] [stdout] | ---------------- method in this implementation [INFO] [stdout] ... [INFO] [stdout] 121 | pub fn send(&self, event: AppEvent) { [INFO] [stdout] | ^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `downloader` is never read [INFO] [stdout] --> src/tabs/quick_download.rs:19:5 [INFO] [stdout] | [INFO] [stdout] 13 | pub struct QuickDownloadTab { [INFO] [stdout] | ---------------- field in this struct [INFO] [stdout] ... [INFO] [stdout] 19 | downloader: Downloader, [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `get_design_tokens` is never used [INFO] [stdout] --> src/theme/mod.rs:24:8 [INFO] [stdout] | [INFO] [stdout] 24 | pub fn get_design_tokens() -> &'static DesignTokens { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated constants are never used [INFO] [stdout] --> src/theme/colors.rs:9:15 [INFO] [stdout] | [INFO] [stdout] 7 | impl IcnxColors { [INFO] [stdout] | --------------- associated constants in this implementation [INFO] [stdout] 8 | // Primary Brand Colors [INFO] [stdout] 9 | pub const PRIMARY_50: Color32 = Color32::from_rgb(240, 249, 255); [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] 10 | pub const PRIMARY_100: Color32 = Color32::from_rgb(224, 242, 254); [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 11 | pub const PRIMARY_200: Color32 = Color32::from_rgb(186, 230, 253); [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 12 | pub const PRIMARY_300: Color32 = Color32::from_rgb(125, 211, 252); [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 15 | pub const PRIMARY_600: Color32 = Color32::from_rgb(2, 132, 199); [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 16 | pub const PRIMARY_700: Color32 = Color32::from_rgb(3, 105, 161); [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 17 | pub const PRIMARY_800: Color32 = Color32::from_rgb(7, 89, 133); [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 18 | pub const PRIMARY_900: Color32 = Color32::from_rgb(12, 74, 110); [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 21 | pub const GRAY_50: Color32 = Color32::from_rgb(249, 250, 251); [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] 22 | pub const GRAY_100: Color32 = Color32::from_rgb(243, 244, 246); [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 23 | pub const GRAY_200: Color32 = Color32::from_rgb(229, 231, 235); [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 24 | pub const GRAY_300: Color32 = Color32::from_rgb(209, 213, 219); [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 25 | pub const GRAY_400: Color32 = Color32::from_rgb(156, 163, 175); [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 26 | pub const GRAY_500: Color32 = Color32::from_rgb(107, 114, 128); [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 27 | pub const GRAY_600: Color32 = Color32::from_rgb(75, 85, 99); [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 28 | pub const GRAY_700: Color32 = Color32::from_rgb(55, 65, 81); [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 29 | pub const GRAY_800: Color32 = Color32::from_rgb(31, 41, 55); [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 30 | pub const GRAY_900: Color32 = Color32::from_rgb(17, 24, 39); [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 34 | pub const SUCCESS_500: Color32 = Color32::from_rgb(34, 197, 94); [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 35 | pub const SUCCESS_600: Color32 = Color32::from_rgb(22, 163, 74); [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 38 | pub const WARNING_500: Color32 = Color32::from_rgb(245, 158, 11); [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 39 | pub const WARNING_600: Color32 = Color32::from_rgb(217, 119, 6); [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 42 | pub const ERROR_500: Color32 = Color32::from_rgb(239, 68, 68); [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] 43 | pub const ERROR_600: Color32 = Color32::from_rgb(220, 38, 38); [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 46 | pub const INFO_500: Color32 = Color32::from_rgb(59, 130, 246); [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 47 | pub const INFO_600: Color32 = Color32::from_rgb(37, 99, 235); [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `LightTheme` is never constructed [INFO] [stdout] --> src/theme/colors.rs:88:12 [INFO] [stdout] | [INFO] [stdout] 88 | pub struct LightTheme; [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated constants are never used [INFO] [stdout] --> src/theme/colors.rs:92:15 [INFO] [stdout] | [INFO] [stdout] 90 | impl LightTheme { [INFO] [stdout] | --------------- associated constants in this implementation [INFO] [stdout] 91 | // Backgrounds [INFO] [stdout] 92 | pub const BACKGROUND_PRIMARY: Color32 = Color32::from_rgb(255, 255, 255); // Pure white [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 93 | pub const BACKGROUND_SECONDARY: Color32 = Color32::from_rgb(248, 250, 252); // Slight gray [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 94 | pub const BACKGROUND_TERTIARY: Color32 = Color32::from_rgb(241, 245, 249); // Panel backgrounds [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 95 | pub const BACKGROUND_ELEVATED: Color32 = Color32::from_rgb(255, 255, 255); // Modals, dropdowns (with shadow) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 98 | pub const TEXT_PRIMARY: Color32 = Color32::from_rgb(15, 23, 42); // Main text [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] 99 | pub const TEXT_SECONDARY: Color32 = Color32::from_rgb(51, 65, 85); // Secondary text [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] 100 | pub const TEXT_TERTIARY: Color32 = Color32::from_rgb(100, 116, 139); // Subdued text [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] 101 | pub const TEXT_DISABLED: Color32 = Color32::from_rgb(148, 163, 184); // Disabled state [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 104 | pub const BORDER_PRIMARY: Color32 = Color32::from_rgb(226, 232, 240); // Main borders [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] 105 | pub const BORDER_SECONDARY: Color32 = Color32::from_rgb(241, 245, 249); // Subtle borders [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] 106 | pub const BORDER_FOCUS: Color32 = IcnxColors::PRIMARY_500; // Focus indicators [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 109 | pub const INTERACTIVE_HOVER: Color32 = Color32::from_rgb(248, 250, 252); // Hover state [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] 110 | pub const INTERACTIVE_ACTIVE: Color32 = Color32::from_rgb(241, 245, 249); // Active/pressed state [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 111 | pub const INTERACTIVE_SELECTED: Color32 = Color32::from_rgb(219, 234, 254); // Selected state [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 114 | pub const SUCCESS: Color32 = IcnxColors::SUCCESS_600; [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] 115 | pub const WARNING: Color32 = IcnxColors::WARNING_600; [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] 116 | pub const ERROR: Color32 = IcnxColors::ERROR_600; [INFO] [stdout] | ^^^^^ [INFO] [stdout] 117 | pub const INFO: Color32 = IcnxColors::INFO_600; [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 120 | pub const ACCENT: Color32 = IcnxColors::PRIMARY_600; // Accent color [INFO] [stdout] | ^^^^^^ [INFO] [stdout] 121 | pub const SHADOW: Color32 = Color32::from_rgba_premultiplied(0, 0, 0, 15); // Drop shadows [INFO] [stdout] | ^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `colors_for_dark_theme` is never used [INFO] [stdout] --> src/theme/colors.rs:125:8 [INFO] [stdout] | [INFO] [stdout] 125 | pub fn colors_for_dark_theme() -> Box { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `colors_for_light_theme` is never used [INFO] [stdout] --> src/theme/colors.rs:130:8 [INFO] [stdout] | [INFO] [stdout] 130 | pub fn colors_for_light_theme() -> Box { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `ThemeColors` is never used [INFO] [stdout] --> src/theme/colors.rs:135:11 [INFO] [stdout] | [INFO] [stdout] 135 | pub trait ThemeColors { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple fields are never read [INFO] [stdout] --> src/theme/design_tokens.rs:10:9 [INFO] [stdout] | [INFO] [stdout] 8 | pub struct DesignTokens { [INFO] [stdout] | ------------ fields in this struct [INFO] [stdout] 9 | // Core colors [INFO] [stdout] 10 | pub background_primary: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 18 | pub text_disabled: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 29 | pub success_color: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 32 | pub info_color: Color32, [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 36 | pub button_primary_bg: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] 37 | pub button_primary_text: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 38 | pub button_secondary_bg: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 39 | pub button_secondary_text: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 40 | pub button_danger_bg: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] 41 | pub button_danger_text: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 42 | [INFO] [stdout] 43 | pub input_bg: Color32, [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 44 | pub input_border: Color32, [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] 45 | pub input_text: Color32, [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] 46 | pub input_placeholder: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] 47 | [INFO] [stdout] 48 | pub tab_active_bg: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] 49 | pub tab_active_text: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] 50 | pub tab_inactive_bg: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] 51 | pub tab_inactive_text: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 54 | pub panel_border: Color32, [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] 55 | pub panel_title_text: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] 56 | [INFO] [stdout] 57 | pub tooltip_bg: Color32, [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] 58 | pub tooltip_text: Color32, [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] 59 | pub tooltip_border: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 67 | pub modal_corner_radius: Rounding, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 70 | pub input_padding: Vec2, [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 81 | pub input_height: f32, [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] 82 | pub icon_size: Vec2, [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 85 | pub sidebar_width: f32, [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] 86 | pub topbar_height: f32, [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `DesignTokens` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `panel_frame`, `card_frame`, and `modal_frame` are never used [INFO] [stdout] --> src/theme/design_tokens.rs:324:12 [INFO] [stdout] | [INFO] [stdout] 89 | impl DesignTokens { [INFO] [stdout] | ----------------- methods in this implementation [INFO] [stdout] ... [INFO] [stdout] 324 | pub fn panel_frame(&self) -> egui::Frame { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 335 | pub fn card_frame(&self) -> egui::Frame { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 352 | pub fn modal_frame(&self) -> egui::Frame { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/theme/icons.rs:17:15 [INFO] [stdout] | [INFO] [stdout] 10 | impl Icons { [INFO] [stdout] | ---------- associated items in this implementation [INFO] [stdout] ... [INFO] [stdout] 17 | pub const NAVIGATION: &'static str = "๐Ÿงญ"; [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] 18 | pub const THEME: &'static str = "๐ŸŽจ"; [INFO] [stdout] | ^^^^^ [INFO] [stdout] ... [INFO] [stdout] 23 | pub const STOP: &'static str = "โน"; [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 26 | pub const EDIT: &'static str = "โœ"; [INFO] [stdout] | ^^^^ [INFO] [stdout] 27 | pub const SAVE: &'static str = "๐Ÿ’พ"; [INFO] [stdout] | ^^^^ [INFO] [stdout] 28 | pub const FOLDER: &'static str = "๐Ÿ“"; [INFO] [stdout] 29 | pub const FILE: &'static str = "๐Ÿ“„"; [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 32 | pub const SUCCESS: &'static str = "โœ…"; [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] 33 | pub const ERROR: &'static str = "โŒ"; [INFO] [stdout] 34 | pub const WARNING: &'static str = "โš "; [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 39 | pub const CHEVRON_RIGHT: &'static str = "โ–ถ"; [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] 40 | pub const CHEVRON_DOWN: &'static str = "โ–ผ"; [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] 41 | pub const CHEVRON_UP: &'static str = "โ–ฒ"; [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] 42 | pub const CHEVRON_LEFT: &'static str = "โ—€"; [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] 43 | pub const PLUS: &'static str = "+"; [INFO] [stdout] | ^^^^ [INFO] [stdout] 44 | pub const MINUS: &'static str = "-"; [INFO] [stdout] | ^^^^^ [INFO] [stdout] ... [INFO] [stdout] 50 | pub const GLOBE: &'static str = "๐ŸŒ"; [INFO] [stdout] | ^^^^^ [INFO] [stdout] 51 | pub const WIFI: &'static str = "๐Ÿ“ถ"; [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 54 | pub fn icon_text(icon: &str, size: f32) -> RichText { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 59 | pub fn icon_with_text(icon: &str, text: &str, icon_size: f32) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `IconExt` is never used [INFO] [stdout] --> src/theme/icons.rs:65:11 [INFO] [stdout] | [INFO] [stdout] 65 | pub trait IconExt { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated constants are never used [INFO] [stdout] --> src/theme/spacing.rs:9:15 [INFO] [stdout] | [INFO] [stdout] 6 | impl Spacing { [INFO] [stdout] | ------------ associated constants in this implementation [INFO] [stdout] ... [INFO] [stdout] 9 | pub const XS: f32 = Self::UNIT; // 4px [INFO] [stdout] | ^^ [INFO] [stdout] ... [INFO] [stdout] 13 | pub const XL: f32 = Self::UNIT * 6.0; // 24px [INFO] [stdout] | ^^ [INFO] [stdout] 14 | pub const XXL: f32 = Self::UNIT * 8.0; // 32px [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 17 | pub const MARGIN_TIGHT: Margin = Margin::same(Self::SM); [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] 18 | pub const MARGIN_NORMAL: Margin = Margin::same(Self::MD); [INFO] [stdout] 19 | pub const MARGIN_LOOSE: Margin = Margin::same(Self::LG); [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] 20 | pub const MARGIN_PANEL: Margin = Margin::same(Self::XL); [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 23 | pub const MARGIN_VERTICAL_SM: Margin = Margin { left: 0.0, right: 0.0, top: Self::SM, bottom: Self::SM }; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 24 | pub const MARGIN_VERTICAL_MD: Margin = Margin { left: 0.0, right: 0.0, top: Self::MD, bottom: Self::MD }; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 25 | pub const MARGIN_VERTICAL_LG: Margin = Margin { left: 0.0, right: 0.0, top: Self::LG, bottom: Self::LG }; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 28 | pub const MARGIN_HORIZONTAL_SM: Margin = Margin { left: Self::SM, right: Self::SM, top: 0.0, bottom: 0.0 }; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 29 | pub const MARGIN_HORIZONTAL_MD: Margin = Margin { left: Self::MD, right: Self::MD, top: 0.0, bottom: 0.0 }; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 30 | pub const MARGIN_HORIZONTAL_LG: Margin = Margin { left: Self::LG, right: Self::LG, top: 0.0, bottom: 0.0 }; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated constants are never used [INFO] [stdout] --> src/theme/spacing.rs:38:15 [INFO] [stdout] | [INFO] [stdout] 36 | impl Sizing { [INFO] [stdout] | ----------- associated constants in this implementation [INFO] [stdout] 37 | // Button sizes [INFO] [stdout] 38 | pub const BUTTON_HEIGHT_SM: f32 = 28.0; [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] 39 | pub const BUTTON_HEIGHT_MD: f32 = 36.0; [INFO] [stdout] 40 | pub const BUTTON_HEIGHT_LG: f32 = 44.0; [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] 41 | [INFO] [stdout] 42 | pub const BUTTON_PADDING_SM: Vec2 = Vec2::new(Spacing::SM, Spacing::XS); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] 43 | pub const BUTTON_PADDING_MD: Vec2 = Vec2::new(Spacing::MD, Spacing::SM); [INFO] [stdout] 44 | pub const BUTTON_PADDING_LG: Vec2 = Vec2::new(Spacing::LG, Spacing::MD); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 47 | pub const ICON_XS: Vec2 = Vec2::splat(12.0); [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] 48 | pub const ICON_SM: Vec2 = Vec2::splat(16.0); [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] 49 | pub const ICON_MD: Vec2 = Vec2::splat(20.0); [INFO] [stdout] 50 | pub const ICON_LG: Vec2 = Vec2::splat(24.0); [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] 51 | pub const ICON_XL: Vec2 = Vec2::splat(32.0); [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 55 | pub const INPUT_MIN_WIDTH: f32 = 120.0; [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 59 | pub const SIDEBAR_WIDTH_COLLAPSED: f32 = 60.0; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 60 | pub const TOPBAR_HEIGHT: f32 = 48.0; [INFO] [stdout] 61 | pub const STATUSBAR_HEIGHT: f32 = 24.0; [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 64 | pub const MODAL_MIN_WIDTH: f32 = 400.0; [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] 65 | pub const MODAL_MAX_WIDTH: f32 = 800.0; [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] 66 | pub const DIALOG_MIN_WIDTH: f32 = 320.0; [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 69 | pub const MIN_TOUCH_TARGET: Vec2 = Vec2::splat(44.0); [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated constants `NONE`, `SM`, `FULL`, and `PILL` are never used [INFO] [stdout] --> src/theme/spacing.rs:76:15 [INFO] [stdout] | [INFO] [stdout] 75 | impl BorderRadius { [INFO] [stdout] | ----------------- associated constants in this implementation [INFO] [stdout] 76 | pub const NONE: Rounding = Rounding::ZERO; [INFO] [stdout] | ^^^^ [INFO] [stdout] 77 | pub const SM: Rounding = Rounding::same(4.0); [INFO] [stdout] | ^^ [INFO] [stdout] ... [INFO] [stdout] 81 | pub const FULL: Rounding = Rounding::same(999.0); // Fully rounded (pills) [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 88 | pub const PILL: Rounding = Self::FULL; [INFO] [stdout] | ^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ZIndex` is never constructed [INFO] [stdout] --> src/theme/spacing.rs:92:12 [INFO] [stdout] | [INFO] [stdout] 92 | pub struct ZIndex; [INFO] [stdout] | ^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated constants are never used [INFO] [stdout] --> src/theme/spacing.rs:95:15 [INFO] [stdout] | [INFO] [stdout] 94 | impl ZIndex { [INFO] [stdout] | ----------- associated constants in this implementation [INFO] [stdout] 95 | pub const BASE: i32 = 0; [INFO] [stdout] | ^^^^ [INFO] [stdout] 96 | pub const DROPDOWN: i32 = 10; [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 97 | pub const STICKY: i32 = 20; [INFO] [stdout] | ^^^^^^ [INFO] [stdout] 98 | pub const MODAL_BACKDROP: i32 = 30; [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] 99 | pub const MODAL: i32 = 40; [INFO] [stdout] | ^^^^^ [INFO] [stdout] 100 | pub const TOOLTIP: i32 = 50; [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] 101 | pub const NOTIFICATION: i32 = 60; [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `Timing` is never constructed [INFO] [stdout] --> src/theme/spacing.rs:105:12 [INFO] [stdout] | [INFO] [stdout] 105 | pub struct Timing; [INFO] [stdout] | ^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated constants are never used [INFO] [stdout] --> src/theme/spacing.rs:108:15 [INFO] [stdout] | [INFO] [stdout] 107 | impl Timing { [INFO] [stdout] | ----------- associated constants in this implementation [INFO] [stdout] 108 | pub const INSTANT: f64 = 0.0; [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] 109 | pub const FAST: f64 = 0.15; [INFO] [stdout] | ^^^^ [INFO] [stdout] 110 | pub const NORMAL: f64 = 0.25; [INFO] [stdout] | ^^^^^^ [INFO] [stdout] 111 | pub const SLOW: f64 = 0.4; [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 114 | pub const EASE_IN: &'static str = "ease-in"; [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] 115 | pub const EASE_OUT: &'static str = "ease-out"; [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 116 | pub const EASE_IN_OUT: &'static str = "ease-in-out"; [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated constants are never used [INFO] [stdout] --> src/theme/spacing.rs:124:15 [INFO] [stdout] | [INFO] [stdout] 122 | impl Typography { [INFO] [stdout] | --------------- associated constants in this implementation [INFO] [stdout] 123 | // Font sizes (in pixels) [INFO] [stdout] 124 | pub const SIZE_XS: f32 = 10.0; [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 128 | pub const SIZE_XL: f32 = 18.0; [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] 129 | pub const SIZE_2XL: f32 = 24.0; [INFO] [stdout] 130 | pub const SIZE_3XL: f32 = 30.0; [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 131 | pub const SIZE_4XL: f32 = 36.0; [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 134 | pub const LINE_HEIGHT_TIGHT: f32 = 1.2; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] 135 | pub const LINE_HEIGHT_NORMAL: f32 = 1.4; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 136 | pub const LINE_HEIGHT_RELAXED: f32 = 1.6; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 139 | pub const LETTER_SPACING_TIGHT: f32 = -0.01; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 140 | pub const LETTER_SPACING_NORMAL: f32 = 0.0; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 141 | pub const LETTER_SPACING_WIDE: f32 = 0.02; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `Shadows` is never constructed [INFO] [stdout] --> src/theme/spacing.rs:145:12 [INFO] [stdout] | [INFO] [stdout] 145 | pub struct Shadows; [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated constants `ELEVATION_1`, `ELEVATION_2`, `ELEVATION_3`, `ELEVATION_4`, and `ELEVATION_5` are never used [INFO] [stdout] --> src/theme/spacing.rs:151:15 [INFO] [stdout] | [INFO] [stdout] 147 | impl Shadows { [INFO] [stdout] | ------------ associated constants in this implementation [INFO] [stdout] ... [INFO] [stdout] 151 | pub const ELEVATION_1: (f32, Vec2) = (2.0, Vec2::new(0.0, 1.0)); // Buttons, cards [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 152 | pub const ELEVATION_2: (f32, Vec2) = (4.0, Vec2::new(0.0, 2.0)); // Dropdowns [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 153 | pub const ELEVATION_3: (f32, Vec2) = (8.0, Vec2::new(0.0, 4.0)); // Modals [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 154 | pub const ELEVATION_4: (f32, Vec2) = (16.0, Vec2::new(0.0, 8.0)); // Overlays [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 155 | pub const ELEVATION_5: (f32, Vec2) = (24.0, Vec2::new(0.0, 12.0)); // Maximum elevation [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `Grid` is never constructed [INFO] [stdout] --> src/theme/spacing.rs:159:12 [INFO] [stdout] | [INFO] [stdout] 159 | pub struct Grid; [INFO] [stdout] | ^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated constants `COLUMNS`, `GUTTER`, `BREAKPOINT_SM`, `BREAKPOINT_MD`, `BREAKPOINT_LG`, and `BREAKPOINT_XL` are never used [INFO] [stdout] --> src/theme/spacing.rs:162:15 [INFO] [stdout] | [INFO] [stdout] 161 | impl Grid { [INFO] [stdout] | --------- associated constants in this implementation [INFO] [stdout] 162 | pub const COLUMNS: usize = 12; [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] 163 | pub const GUTTER: f32 = Spacing::LG; [INFO] [stdout] | ^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 166 | pub const BREAKPOINT_SM: f32 = 640.0; [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] 167 | pub const BREAKPOINT_MD: f32 = 768.0; [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] 168 | pub const BREAKPOINT_LG: f32 = 1024.0; [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] 169 | pub const BREAKPOINT_XL: f32 = 1280.0; [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `format_duration` is never used [INFO] [stdout] --> src/utils.rs:27:8 [INFO] [stdout] | [INFO] [stdout] 27 | pub fn format_duration(seconds: u64) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `get_file_extension` is never used [INFO] [stdout] --> src/utils.rs:38:8 [INFO] [stdout] | [INFO] [stdout] 38 | pub fn get_file_extension(path: &Path) -> Option<&str> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `generate_id` is never used [INFO] [stdout] --> src/utils.rs:57:8 [INFO] [stdout] | [INFO] [stdout] 57 | pub fn generate_id() -> String { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ScriptInfo` is never constructed [INFO] [stdout] --> src/core/model.rs:25:12 [INFO] [stdout] | [INFO] [stdout] 25 | pub struct ScriptInfo { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ScriptOption` is never constructed [INFO] [stdout] --> src/core/model.rs:40:12 [INFO] [stdout] | [INFO] [stdout] 40 | pub struct ScriptOption { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `SelectOption` is never constructed [INFO] [stdout] --> src/core/model.rs:55:12 [INFO] [stdout] | [INFO] [stdout] 55 | pub struct SelectOption { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `DependsOn` is never constructed [INFO] [stdout] --> src/core/model.rs:61:12 [INFO] [stdout] | [INFO] [stdout] 61 | pub struct DependsOn { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `execute_script`, `execute_script_with_options`, and `get_result` are never used [INFO] [stdout] --> src/core/runtime.rs:23:12 [INFO] [stdout] | [INFO] [stdout] 15 | impl JsEngine { [INFO] [stdout] | ------------- methods in this implementation [INFO] [stdout] ... [INFO] [stdout] 23 | pub fn execute_script(&self, script_name: &str, source: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 27 | pub fn execute_script_with_options(&self, _script_name: &str, source: &str, options: Option) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 601 | pub fn get_result(&self) -> Option { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `website` is never read [INFO] [stdout] --> src/core/script_detector.rs:14:9 [INFO] [stdout] | [INFO] [stdout] 6 | pub struct ScriptInfo { [INFO] [stdout] | ---------- field in this struct [INFO] [stdout] ... [INFO] [stdout] 14 | pub website: Option, [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `ScriptInfo` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `get_all_scripts` is never used [INFO] [stdout] --> src/core/script_detector.rs:171:12 [INFO] [stdout] | [INFO] [stdout] 23 | impl ScriptDetector { [INFO] [stdout] | ------------------- method in this implementation [INFO] [stdout] ... [INFO] [stdout] 171 | pub fn get_all_scripts(&self) -> &[ScriptInfo] { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `save_history` is never used [INFO] [stdout] --> src/data.rs:106:8 [INFO] [stdout] | [INFO] [stdout] 106 | pub fn save_history(history: &History) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/app.rs:157:13 [INFO] [stdout] | [INFO] [stdout] 157 | / if self.settings.dev_mode { [INFO] [stdout] 158 | | if ui [INFO] [stdout] 159 | | .selectable_label( [INFO] [stdout] 160 | | self.active_tab == Tab::Playground, [INFO] [stdout] ... | [INFO] [stdout] 167 | | } [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] 157 ~ if self.settings.dev_mode [INFO] [stdout] 158 ~ && ui [INFO] [stdout] 159 | .selectable_label( [INFO] [stdout] ... [INFO] [stdout] 165 | self.active_tab = Tab::Playground; [INFO] [stdout] 166 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `impl` can be derived [INFO] [stdout] --> src/components/dialogs/script_picker.rs:11:1 [INFO] [stdout] | [INFO] [stdout] 11 | / impl Default for ScriptPickerDialog { [INFO] [stdout] 12 | | fn default() -> Self { [INFO] [stdout] 13 | | Self { [INFO] [stdout] 14 | | open: false, [INFO] [stdout] ... | [INFO] [stdout] 20 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#derivable_impls [INFO] [stdout] = note: `#[warn(clippy::derivable_impls)]` on by default [INFO] [stdout] help: replace the manual implementation with a derive attribute [INFO] [stdout] | [INFO] [stdout] 4 + #[derive(Default)] [INFO] [stdout] 5 | pub struct ScriptPickerDialog { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/components/dialogs/script_picker.rs:81:29 [INFO] [stdout] | [INFO] [stdout] 81 | / ... if self.selected_script.is_some() { [INFO] [stdout] 82 | | ... if ui.button("โœ… Use Selected Script").clicked() { [INFO] [stdout] 83 | | ... self.open = false; [INFO] [stdout] 84 | | ... selected_script = self.selected_script.clone(); [INFO] [stdout] 85 | | ... } [INFO] [stdout] 86 | | ... } [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] 81 ~ if self.selected_script.is_some() [INFO] [stdout] 82 ~ && ui.button("โœ… Use Selected Script").clicked() { [INFO] [stdout] 83 | self.open = false; [INFO] [stdout] 84 | selected_script = self.selected_script.clone(); [INFO] [stdout] 85 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `impl` can be derived [INFO] [stdout] --> src/components/dialogs/stress_test.rs:33:1 [INFO] [stdout] | [INFO] [stdout] 33 | / impl Default for StressTestDialog { [INFO] [stdout] 34 | | fn default() -> Self { [INFO] [stdout] 35 | | Self { [INFO] [stdout] 36 | | open: false, [INFO] [stdout] ... | [INFO] [stdout] 40 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#derivable_impls [INFO] [stdout] help: replace the manual implementation with a derive attribute [INFO] [stdout] | [INFO] [stdout] 28 + #[derive(Default)] [INFO] [stdout] 29 | pub struct StressTestDialog { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/components/dialogs/stress_test.rs:85:29 [INFO] [stdout] | [INFO] [stdout] 85 | / ... if self.selected_test.is_some() { [INFO] [stdout] 86 | | ... if ui.button("๐Ÿš€ Start Stress Test").clicked() { [INFO] [stdout] 87 | | ... self.open = false; [INFO] [stdout] 88 | | ... selected_test = self.selected_test.clone(); [INFO] [stdout] 89 | | ... } [INFO] [stdout] 90 | | ... } [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] 85 ~ if self.selected_test.is_some() [INFO] [stdout] 86 ~ && ui.button("๐Ÿš€ Start Stress Test").clicked() { [INFO] [stdout] 87 | self.open = false; [INFO] [stdout] 88 | selected_test = self.selected_test.clone(); [INFO] [stdout] 89 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `impl` can be derived [INFO] [stdout] --> src/components/dialogs/test_dialog.rs:46:1 [INFO] [stdout] | [INFO] [stdout] 46 | / impl Default for TestDialog { [INFO] [stdout] 47 | | fn default() -> Self { [INFO] [stdout] 48 | | Self { [INFO] [stdout] 49 | | open: false, [INFO] [stdout] ... | [INFO] [stdout] 53 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#derivable_impls [INFO] [stdout] help: replace the manual implementation with a derive attribute [INFO] [stdout] | [INFO] [stdout] 41 + #[derive(Default)] [INFO] [stdout] 42 | pub struct TestDialog { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused variable: `ui` [INFO] [stdout] --> src/tabs/quick_download.rs:129:44 [INFO] [stdout] | [INFO] [stdout] 129 | fn show_add_download_dialog(&mut self, ui: &mut egui::Ui, ctx: &egui::Context, settings: &crate::data::Settings, navigate_to_se... [INFO] [stdout] | ^^ help: if this is intentional, prefix it with an underscore: `_ui` [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/download_window.rs:233:76 [INFO] [stdout] | [INFO] [stdout] 233 | if let Some(selected_script) = self.script_picker_dialog.show(ctx, &tokens) { [INFO] [stdout] | ^^^^^^^ help: change this to: `tokens` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] = note: `#[warn(clippy::needless_borrow)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&PathBuf` instead of `&Path` involves a new object where a slice will do [INFO] [stdout] --> src/downloader.rs:20:62 [INFO] [stdout] | [INFO] [stdout] 20 | pub async fn download(&self, url: &str, destination_dir: &PathBuf) -> Result<()> { [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] 20 - pub async fn download(&self, url: &str, destination_dir: &PathBuf) -> Result<()> { [INFO] [stdout] 20 + pub async fn download(&self, url: &str, destination_dir: &Path) -> Result<()> { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `Iterator::last` on a `DoubleEndedIterator`; this will needlessly iterate the entire iterator [INFO] [stdout] --> src/downloader.rs:35:24 [INFO] [stdout] | [INFO] [stdout] 35 | let filename = url.split('/').last() [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#double_ended_iterator_last [INFO] [stdout] = note: `#[warn(clippy::double_ended_iterator_last)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 35 - let filename = url.split('/').last() [INFO] [stdout] 35 + let filename = url.split('/').next_back() [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/tabs/quick_download.rs:76:21 [INFO] [stdout] | [INFO] [stdout] 76 | / if settings.dev_mode { [INFO] [stdout] 77 | | if ui.button("๐Ÿงช Tests").clicked() { [INFO] [stdout] 78 | | self.test_dialog.open_dialog(); [INFO] [stdout] 79 | | } [INFO] [stdout] 80 | | } [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] 76 ~ if settings.dev_mode [INFO] [stdout] 77 ~ && ui.button("๐Ÿงช Tests").clicked() { [INFO] [stdout] 78 | self.test_dialog.open_dialog(); [INFO] [stdout] 79 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/tabs/quick_download.rs:121:61 [INFO] [stdout] | [INFO] [stdout] 121 | if let Some(test_type) = self.test_dialog.show(ctx, &tokens) { [INFO] [stdout] | ^^^^^^^ help: change this to: `tokens` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/tabs/quick_download.rs:362:76 [INFO] [stdout] | [INFO] [stdout] 362 | if let Some(selected_script) = self.script_picker_dialog.show(ctx, &tokens) { [INFO] [stdout] | ^^^^^^^ help: change this to: `tokens` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: casting to the same type is unnecessary (`u64` -> `u64`) [INFO] [stdout] --> src/tabs/quick_download.rs:888:23 [INFO] [stdout] | [INFO] [stdout] 888 | eta: Some((total_size / 1_000_000) as u64), // Rough initial ETA [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `((total_size / 1_000_000))` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_cast [INFO] [stdout] = note: `#[warn(clippy::unnecessary_cast)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/theme/mod.rs:41:30 [INFO] [stdout] | [INFO] [stdout] 41 | std::sync::LazyLock::new(|| DesignTokens::dark_theme()); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the associated function itself: `DesignTokens::dark_theme` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] = note: `#[warn(clippy::redundant_closure)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused variable: `icon_size` [INFO] [stdout] --> src/theme/icons.rs:59:51 [INFO] [stdout] | [INFO] [stdout] 59 | pub fn icon_with_text(icon: &str, text: &str, icon_size: f32) -> String { [INFO] [stdout] | ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_icon_size` [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: returning the result of a `let` binding from a block [INFO] [stdout] --> src/core/runtime.rs:239:41 [INFO] [stdout] | [INFO] [stdout] 230 | / ... let result = if !url.is_empty() { [INFO] [stdout] 231 | | ... match ureq::get(url).call() { [INFO] [stdout] 232 | | ... Ok(resp) => match resp.into_string() { [INFO] [stdout] 233 | | ... Ok(t) => json!({"id": id, "result": t}), [INFO] [stdout] ... | [INFO] [stdout] 238 | | ... } else { json!({"id": id, "result": null}) }; [INFO] [stdout] | |___________________________________________________________________- unnecessary `let` binding [INFO] [stdout] 239 | ... result [INFO] [stdout] | ^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return [INFO] [stdout] = note: `#[warn(clippy::let_and_return)]` on by default [INFO] [stdout] help: return the expression directly [INFO] [stdout] | [INFO] [stdout] 230 ~ [INFO] [stdout] 231 ~ if !url.is_empty() { [INFO] [stdout] 232 + match ureq::get(url).call() { [INFO] [stdout] 233 + Ok(resp) => match resp.into_string() { [INFO] [stdout] 234 + Ok(t) => json!({"id": id, "result": t}), [INFO] [stdout] 235 + Err(_) => json!({"id": id, "result": null}) [INFO] [stdout] 236 + }, [INFO] [stdout] 237 + Err(_) => json!({"id": id, "result": null}), [INFO] [stdout] 238 + } [INFO] [stdout] 239 + } else { json!({"id": id, "result": null}) } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: returning the result of a `let` binding from a block [INFO] [stdout] --> src/core/runtime.rs:506:41 [INFO] [stdout] | [INFO] [stdout] 497 | / ... let result = if !url.is_empty() { [INFO] [stdout] 498 | | ... match ureq::get(url).call() { [INFO] [stdout] 499 | | ... Ok(resp) => match resp.into_string() { [INFO] [stdout] 500 | | ... Ok(t) => json!({"id": id, "result": t}), [INFO] [stdout] ... | [INFO] [stdout] 505 | | ... } else { json!({"id": id, "result": null}) }; [INFO] [stdout] | |___________________________________________________________________- unnecessary `let` binding [INFO] [stdout] 506 | ... result [INFO] [stdout] | ^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return [INFO] [stdout] help: return the expression directly [INFO] [stdout] | [INFO] [stdout] 497 ~ [INFO] [stdout] 498 ~ if !url.is_empty() { [INFO] [stdout] 499 + match ureq::get(url).call() { [INFO] [stdout] 500 + Ok(resp) => match resp.into_string() { [INFO] [stdout] 501 + Ok(t) => json!({"id": id, "result": t}), [INFO] [stdout] 502 + Err(_) => json!({"id": id, "result": null}) [INFO] [stdout] 503 + }, [INFO] [stdout] 504 + Err(_) => json!({"id": id, "result": null}), [INFO] [stdout] 505 + } [INFO] [stdout] 506 + } else { json!({"id": id, "result": null}) } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: matching on `Some` with `ok()` is redundant [INFO] [stdout] --> src/core/runtime.rs:562:17 [INFO] [stdout] | [INFO] [stdout] 562 | if let Some(length_val) = arr.get("length", &mut ctx).ok() { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_result_ok [INFO] [stdout] = note: `#[warn(clippy::match_result_ok)]` on by default [INFO] [stdout] help: consider matching on `Ok(length_val)` and removing the call to `ok` instead [INFO] [stdout] | [INFO] [stdout] 562 - if let Some(length_val) = arr.get("length", &mut ctx).ok() { [INFO] [stdout] 562 + if let Ok(length_val) = arr.get("length", &mut ctx) { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unnecessary `if let` since only the `Ok` variant of the iterator element is used [INFO] [stdout] --> src/core/script_detector.rs:40:17 [INFO] [stdout] | [INFO] [stdout] 40 | / for entry in entries { [INFO] [stdout] 41 | | if let Ok(entry) = entry { [INFO] [stdout] 42 | | let path = entry.path(); [INFO] [stdout] 43 | | if path.is_dir() { [INFO] [stdout] ... | [INFO] [stdout] 89 | | } [INFO] [stdout] | |_________________^ [INFO] [stdout] | [INFO] [stdout] help: try `.flatten()` and remove the `if let` statement in the for loop [INFO] [stdout] --> src/core/script_detector.rs:41:21 [INFO] [stdout] | [INFO] [stdout] 41 | / if let Ok(entry) = entry { [INFO] [stdout] 42 | | let path = entry.path(); [INFO] [stdout] 43 | | if path.is_dir() { [INFO] [stdout] 44 | | let manifest_path = path.join("manifest.json"); [INFO] [stdout] ... | [INFO] [stdout] 88 | | } [INFO] [stdout] | |_____________________^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_flatten [INFO] [stdout] = note: `#[warn(clippy::manual_flatten)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 40 ~ for entry in entries.flatten() { [INFO] [stdout] 41 + let path = entry.path(); [INFO] [stdout] 42 + if path.is_dir() { [INFO] [stdout] 43 + let manifest_path = path.join("manifest.json"); [INFO] [stdout] 44 + if manifest_path.exists() { [INFO] [stdout] 45 + match fs::read_to_string(&manifest_path) { [INFO] [stdout] 46 + Ok(content) => { [INFO] [stdout] 47 + if content.trim().is_empty() { [INFO] [stdout] 48 + eprintln!("Warning: Empty manifest file: {}", manifest_path.display()); [INFO] [stdout] 49 + continue; [INFO] [stdout] 50 + } [INFO] [stdout] 51 + match serde_json::from_str::(&content) { [INFO] [stdout] 52 + Ok(manifest) => { [INFO] [stdout] 53 + let script_info = ScriptInfo { [INFO] [stdout] 54 + name: manifest["name"].as_str().unwrap_or("Unknown").to_string(), [INFO] [stdout] 55 + description: manifest["description"].as_str().unwrap_or("").to_string(), [INFO] [stdout] 56 + version: manifest["version"].as_str().unwrap_or("0.1.0").to_string(), [INFO] [stdout] 57 + author: manifest["author"].as_str().unwrap_or("Unknown").to_string(), [INFO] [stdout] 58 + category: manifest["category"].as_str().map(|s| s.to_string()), [INFO] [stdout] 59 + tags: manifest["tags"].as_array() [INFO] [stdout] 60 + .map(|arr| arr.iter() [INFO] [stdout] 61 + .filter_map(|v| v.as_str()) [INFO] [stdout] 62 + .map(|s| s.to_string()) [INFO] [stdout] 63 + .collect()), [INFO] [stdout] 64 + icon: manifest["icon"].as_str().map(|s| s.to_string()), [INFO] [stdout] 65 + website: manifest["website"].as_str().map(|s| s.to_string()), [INFO] [stdout] 66 + supported_domains: manifest["supportedDomains"].as_array() [INFO] [stdout] 67 + .map(|arr| arr.iter() [INFO] [stdout] 68 + .filter_map(|v| v.as_str()) [INFO] [stdout] 69 + .map(|s| s.to_string()) [INFO] [stdout] 70 + .collect()), [INFO] [stdout] 71 + dir: path.file_name().unwrap_or_default().to_string_lossy().to_string(), [INFO] [stdout] 72 + }; [INFO] [stdout] 73 + println!("Loaded script: {} with domains: {:?}", script_info.name, script_info.supported_domains); [INFO] [stdout] 74 + scripts.push(script_info); [INFO] [stdout] 75 + } [INFO] [stdout] 76 + Err(e) => { [INFO] [stdout] 77 + eprintln!("Error parsing manifest JSON {}: {}", manifest_path.display(), e); [INFO] [stdout] 78 + } [INFO] [stdout] 79 + } [INFO] [stdout] 80 + } [INFO] [stdout] 81 + Err(e) => { [INFO] [stdout] 82 + eprintln!("Error reading manifest {}: {}", manifest_path.display(), e); [INFO] [stdout] 83 + } [INFO] [stdout] 84 + } [INFO] [stdout] 85 + } [INFO] [stdout] 86 + } [INFO] [stdout] 87 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: stripping a prefix manually [INFO] [stdout] --> src/core/script_detector.rs:159:31 [INFO] [stdout] | [INFO] [stdout] 159 | let base_domain = &pattern[2..]; [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] note: the prefix was tested here [INFO] [stdout] --> src/core/script_detector.rs:158:9 [INFO] [stdout] | [INFO] [stdout] 158 | if pattern.starts_with("*.") { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_strip [INFO] [stdout] = note: `#[warn(clippy::manual_strip)]` on by default [INFO] [stdout] help: try using the `strip_prefix` method [INFO] [stdout] | [INFO] [stdout] 158 ~ if let Some(base_domain) = pattern.strip_prefix("*.") { [INFO] [stdout] 159 ~ return host == base_domain || host.ends_with(&format!(".{}", base_domain)); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused variable: `script_name` [INFO] [stdout] --> src/core/runtime.rs:313:49 [INFO] [stdout] | [INFO] [stdout] 313 | ...nd_get_output(&self, script_name: &str, source: &str, options: Option) -> Result<(Option, Vec src/app.rs:30:5 [INFO] [stdout] | [INFO] [stdout] 11 | pub struct IcnxApp { [INFO] [stdout] | ------- field in this struct [INFO] [stdout] ... [INFO] [stdout] 30 | runtime: tokio::runtime::Runtime, [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 `close` is never used [INFO] [stdout] --> src/components/dialogs/script_picker.rs:239:12 [INFO] [stdout] | [INFO] [stdout] 22 | impl ScriptPickerDialog { [INFO] [stdout] | ----------------------- method in this implementation [INFO] [stdout] ... [INFO] [stdout] 239 | pub fn close(&mut self) { [INFO] [stdout] | ^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enum `StressTestType` is never used [INFO] [stdout] --> src/components/dialogs/stress_test.rs:4:10 [INFO] [stdout] | [INFO] [stdout] 4 | pub enum StressTestType { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `display_name` and `description` are never used [INFO] [stdout] --> src/components/dialogs/stress_test.rs:11:12 [INFO] [stdout] | [INFO] [stdout] 10 | impl StressTestType { [INFO] [stdout] | ------------------- methods in this implementation [INFO] [stdout] 11 | pub fn display_name(&self) -> &str { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 19 | pub fn description(&self) -> &str { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `StressTestDialog` is never constructed [INFO] [stdout] --> src/components/dialogs/stress_test.rs:28:12 [INFO] [stdout] | [INFO] [stdout] 28 | pub struct StressTestDialog { [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `show`, `render_scenario_option`, `open_dialog`, and `close` are never used [INFO] [stdout] --> src/components/dialogs/stress_test.rs:43:12 [INFO] [stdout] | [INFO] [stdout] 42 | impl StressTestDialog { [INFO] [stdout] | --------------------- methods in this implementation [INFO] [stdout] 43 | pub fn show(&mut self, ctx: &egui::Context, tokens: &crate::theme::DesignTokens) -> Option { [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 99 | fn render_scenario_option(&mut self, ui: &mut egui::Ui, scenario: &StressTestType, tokens: &crate::theme::DesignTokens) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 150 | pub fn open_dialog(&mut self) { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 155 | pub fn close(&mut self) { [INFO] [stdout] | ^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `DownloadWindow` is never constructed [INFO] [stdout] --> src/download_window.rs:12:12 [INFO] [stdout] | [INFO] [stdout] 12 | pub struct DownloadWindow { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated function `new` is never used [INFO] [stdout] --> src/download_window.rs:25:12 [INFO] [stdout] | [INFO] [stdout] 24 | impl DownloadWindow { [INFO] [stdout] | ------------------- associated function in this implementation [INFO] [stdout] 25 | pub fn new( [INFO] [stdout] | ^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `start_download` is never used [INFO] [stdout] --> src/download_window.rs:240:8 [INFO] [stdout] | [INFO] [stdout] 239 | impl DownloadWindow { [INFO] [stdout] | ------------------- method in this implementation [INFO] [stdout] 240 | fn start_download(&mut self, settings: &crate::data::Settings) { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: variants `ScrapeItem`, `NavigateToTab`, and `ShowError` are never constructed [INFO] [stdout] --> src/events.rs:27:5 [INFO] [stdout] | [INFO] [stdout] 8 | pub enum AppEvent { [INFO] [stdout] | -------- variants in this enum [INFO] [stdout] ... [INFO] [stdout] 27 | ScrapeItem { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 33 | NavigateToTab { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 40 | ShowError { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `AppEvent` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: variants `DownloadSession` and `ScrapeSession` are never constructed [INFO] [stdout] --> src/events.rs:57:5 [INFO] [stdout] | [INFO] [stdout] 51 | pub enum Tab { [INFO] [stdout] | --- variants in this enum [INFO] [stdout] ... [INFO] [stdout] 57 | DownloadSession, [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] 58 | ScrapeSession, [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `Tab` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `send` is never used [INFO] [stdout] --> src/events.rs:121:12 [INFO] [stdout] | [INFO] [stdout] 115 | impl EventSystem { [INFO] [stdout] | ---------------- method in this implementation [INFO] [stdout] ... [INFO] [stdout] 121 | pub fn send(&self, event: AppEvent) { [INFO] [stdout] | ^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `downloader` is never read [INFO] [stdout] --> src/tabs/quick_download.rs:19:5 [INFO] [stdout] | [INFO] [stdout] 13 | pub struct QuickDownloadTab { [INFO] [stdout] | ---------------- field in this struct [INFO] [stdout] ... [INFO] [stdout] 19 | downloader: Downloader, [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `get_design_tokens` is never used [INFO] [stdout] --> src/theme/mod.rs:24:8 [INFO] [stdout] | [INFO] [stdout] 24 | pub fn get_design_tokens() -> &'static DesignTokens { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated constants are never used [INFO] [stdout] --> src/theme/colors.rs:9:15 [INFO] [stdout] | [INFO] [stdout] 7 | impl IcnxColors { [INFO] [stdout] | --------------- associated constants in this implementation [INFO] [stdout] 8 | // Primary Brand Colors [INFO] [stdout] 9 | pub const PRIMARY_50: Color32 = Color32::from_rgb(240, 249, 255); [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] 10 | pub const PRIMARY_100: Color32 = Color32::from_rgb(224, 242, 254); [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 11 | pub const PRIMARY_200: Color32 = Color32::from_rgb(186, 230, 253); [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 12 | pub const PRIMARY_300: Color32 = Color32::from_rgb(125, 211, 252); [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 15 | pub const PRIMARY_600: Color32 = Color32::from_rgb(2, 132, 199); [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 16 | pub const PRIMARY_700: Color32 = Color32::from_rgb(3, 105, 161); [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 17 | pub const PRIMARY_800: Color32 = Color32::from_rgb(7, 89, 133); [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 18 | pub const PRIMARY_900: Color32 = Color32::from_rgb(12, 74, 110); [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 21 | pub const GRAY_50: Color32 = Color32::from_rgb(249, 250, 251); [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] 22 | pub const GRAY_100: Color32 = Color32::from_rgb(243, 244, 246); [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 23 | pub const GRAY_200: Color32 = Color32::from_rgb(229, 231, 235); [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 24 | pub const GRAY_300: Color32 = Color32::from_rgb(209, 213, 219); [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 25 | pub const GRAY_400: Color32 = Color32::from_rgb(156, 163, 175); [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 26 | pub const GRAY_500: Color32 = Color32::from_rgb(107, 114, 128); [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 27 | pub const GRAY_600: Color32 = Color32::from_rgb(75, 85, 99); [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 28 | pub const GRAY_700: Color32 = Color32::from_rgb(55, 65, 81); [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 29 | pub const GRAY_800: Color32 = Color32::from_rgb(31, 41, 55); [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 30 | pub const GRAY_900: Color32 = Color32::from_rgb(17, 24, 39); [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 34 | pub const SUCCESS_500: Color32 = Color32::from_rgb(34, 197, 94); [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 35 | pub const SUCCESS_600: Color32 = Color32::from_rgb(22, 163, 74); [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 38 | pub const WARNING_500: Color32 = Color32::from_rgb(245, 158, 11); [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 39 | pub const WARNING_600: Color32 = Color32::from_rgb(217, 119, 6); [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 42 | pub const ERROR_500: Color32 = Color32::from_rgb(239, 68, 68); [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] 43 | pub const ERROR_600: Color32 = Color32::from_rgb(220, 38, 38); [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 46 | pub const INFO_500: Color32 = Color32::from_rgb(59, 130, 246); [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 47 | pub const INFO_600: Color32 = Color32::from_rgb(37, 99, 235); [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `LightTheme` is never constructed [INFO] [stdout] --> src/theme/colors.rs:88:12 [INFO] [stdout] | [INFO] [stdout] 88 | pub struct LightTheme; [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated constants are never used [INFO] [stdout] --> src/theme/colors.rs:92:15 [INFO] [stdout] | [INFO] [stdout] 90 | impl LightTheme { [INFO] [stdout] | --------------- associated constants in this implementation [INFO] [stdout] 91 | // Backgrounds [INFO] [stdout] 92 | pub const BACKGROUND_PRIMARY: Color32 = Color32::from_rgb(255, 255, 255); // Pure white [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 93 | pub const BACKGROUND_SECONDARY: Color32 = Color32::from_rgb(248, 250, 252); // Slight gray [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 94 | pub const BACKGROUND_TERTIARY: Color32 = Color32::from_rgb(241, 245, 249); // Panel backgrounds [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 95 | pub const BACKGROUND_ELEVATED: Color32 = Color32::from_rgb(255, 255, 255); // Modals, dropdowns (with shadow) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 98 | pub const TEXT_PRIMARY: Color32 = Color32::from_rgb(15, 23, 42); // Main text [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] 99 | pub const TEXT_SECONDARY: Color32 = Color32::from_rgb(51, 65, 85); // Secondary text [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] 100 | pub const TEXT_TERTIARY: Color32 = Color32::from_rgb(100, 116, 139); // Subdued text [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] 101 | pub const TEXT_DISABLED: Color32 = Color32::from_rgb(148, 163, 184); // Disabled state [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 104 | pub const BORDER_PRIMARY: Color32 = Color32::from_rgb(226, 232, 240); // Main borders [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] 105 | pub const BORDER_SECONDARY: Color32 = Color32::from_rgb(241, 245, 249); // Subtle borders [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] 106 | pub const BORDER_FOCUS: Color32 = IcnxColors::PRIMARY_500; // Focus indicators [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 109 | pub const INTERACTIVE_HOVER: Color32 = Color32::from_rgb(248, 250, 252); // Hover state [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] 110 | pub const INTERACTIVE_ACTIVE: Color32 = Color32::from_rgb(241, 245, 249); // Active/pressed state [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 111 | pub const INTERACTIVE_SELECTED: Color32 = Color32::from_rgb(219, 234, 254); // Selected state [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 114 | pub const SUCCESS: Color32 = IcnxColors::SUCCESS_600; [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] 115 | pub const WARNING: Color32 = IcnxColors::WARNING_600; [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] 116 | pub const ERROR: Color32 = IcnxColors::ERROR_600; [INFO] [stdout] | ^^^^^ [INFO] [stdout] 117 | pub const INFO: Color32 = IcnxColors::INFO_600; [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 120 | pub const ACCENT: Color32 = IcnxColors::PRIMARY_600; // Accent color [INFO] [stdout] | ^^^^^^ [INFO] [stdout] 121 | pub const SHADOW: Color32 = Color32::from_rgba_premultiplied(0, 0, 0, 15); // Drop shadows [INFO] [stdout] | ^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `colors_for_dark_theme` is never used [INFO] [stdout] --> src/theme/colors.rs:125:8 [INFO] [stdout] | [INFO] [stdout] 125 | pub fn colors_for_dark_theme() -> Box { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `colors_for_light_theme` is never used [INFO] [stdout] --> src/theme/colors.rs:130:8 [INFO] [stdout] | [INFO] [stdout] 130 | pub fn colors_for_light_theme() -> Box { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `ThemeColors` is never used [INFO] [stdout] --> src/theme/colors.rs:135:11 [INFO] [stdout] | [INFO] [stdout] 135 | pub trait ThemeColors { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple fields are never read [INFO] [stdout] --> src/theme/design_tokens.rs:10:9 [INFO] [stdout] | [INFO] [stdout] 8 | pub struct DesignTokens { [INFO] [stdout] | ------------ fields in this struct [INFO] [stdout] 9 | // Core colors [INFO] [stdout] 10 | pub background_primary: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 18 | pub text_disabled: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 29 | pub success_color: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 32 | pub info_color: Color32, [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 36 | pub button_primary_bg: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] 37 | pub button_primary_text: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 38 | pub button_secondary_bg: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 39 | pub button_secondary_text: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 40 | pub button_danger_bg: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] 41 | pub button_danger_text: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 42 | [INFO] [stdout] 43 | pub input_bg: Color32, [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 44 | pub input_border: Color32, [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] 45 | pub input_text: Color32, [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] 46 | pub input_placeholder: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] 47 | [INFO] [stdout] 48 | pub tab_active_bg: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] 49 | pub tab_active_text: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] 50 | pub tab_inactive_bg: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] 51 | pub tab_inactive_text: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 54 | pub panel_border: Color32, [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] 55 | pub panel_title_text: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] 56 | [INFO] [stdout] 57 | pub tooltip_bg: Color32, [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] 58 | pub tooltip_text: Color32, [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] 59 | pub tooltip_border: Color32, [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 67 | pub modal_corner_radius: Rounding, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 70 | pub input_padding: Vec2, [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 81 | pub input_height: f32, [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] 82 | pub icon_size: Vec2, [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 85 | pub sidebar_width: f32, [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] 86 | pub topbar_height: f32, [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `DesignTokens` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `panel_frame`, `card_frame`, and `modal_frame` are never used [INFO] [stdout] --> src/theme/design_tokens.rs:324:12 [INFO] [stdout] | [INFO] [stdout] 89 | impl DesignTokens { [INFO] [stdout] | ----------------- methods in this implementation [INFO] [stdout] ... [INFO] [stdout] 324 | pub fn panel_frame(&self) -> egui::Frame { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 335 | pub fn card_frame(&self) -> egui::Frame { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 352 | pub fn modal_frame(&self) -> egui::Frame { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/theme/icons.rs:17:15 [INFO] [stdout] | [INFO] [stdout] 10 | impl Icons { [INFO] [stdout] | ---------- associated items in this implementation [INFO] [stdout] ... [INFO] [stdout] 17 | pub const NAVIGATION: &'static str = "๐Ÿงญ"; [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] 18 | pub const THEME: &'static str = "๐ŸŽจ"; [INFO] [stdout] | ^^^^^ [INFO] [stdout] ... [INFO] [stdout] 23 | pub const STOP: &'static str = "โน"; [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 26 | pub const EDIT: &'static str = "โœ"; [INFO] [stdout] | ^^^^ [INFO] [stdout] 27 | pub const SAVE: &'static str = "๐Ÿ’พ"; [INFO] [stdout] | ^^^^ [INFO] [stdout] 28 | pub const FOLDER: &'static str = "๐Ÿ“"; [INFO] [stdout] 29 | pub const FILE: &'static str = "๐Ÿ“„"; [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 32 | pub const SUCCESS: &'static str = "โœ…"; [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] 33 | pub const ERROR: &'static str = "โŒ"; [INFO] [stdout] 34 | pub const WARNING: &'static str = "โš "; [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 39 | pub const CHEVRON_RIGHT: &'static str = "โ–ถ"; [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] 40 | pub const CHEVRON_DOWN: &'static str = "โ–ผ"; [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] 41 | pub const CHEVRON_UP: &'static str = "โ–ฒ"; [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] 42 | pub const CHEVRON_LEFT: &'static str = "โ—€"; [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] 43 | pub const PLUS: &'static str = "+"; [INFO] [stdout] | ^^^^ [INFO] [stdout] 44 | pub const MINUS: &'static str = "-"; [INFO] [stdout] | ^^^^^ [INFO] [stdout] ... [INFO] [stdout] 50 | pub const GLOBE: &'static str = "๐ŸŒ"; [INFO] [stdout] | ^^^^^ [INFO] [stdout] 51 | pub const WIFI: &'static str = "๐Ÿ“ถ"; [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 54 | pub fn icon_text(icon: &str, size: f32) -> RichText { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 59 | pub fn icon_with_text(icon: &str, text: &str, icon_size: f32) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: trait `IconExt` is never used [INFO] [stdout] --> src/theme/icons.rs:65:11 [INFO] [stdout] | [INFO] [stdout] 65 | pub trait IconExt { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated constants are never used [INFO] [stdout] --> src/theme/spacing.rs:9:15 [INFO] [stdout] | [INFO] [stdout] 6 | impl Spacing { [INFO] [stdout] | ------------ associated constants in this implementation [INFO] [stdout] ... [INFO] [stdout] 9 | pub const XS: f32 = Self::UNIT; // 4px [INFO] [stdout] | ^^ [INFO] [stdout] ... [INFO] [stdout] 13 | pub const XL: f32 = Self::UNIT * 6.0; // 24px [INFO] [stdout] | ^^ [INFO] [stdout] 14 | pub const XXL: f32 = Self::UNIT * 8.0; // 32px [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 17 | pub const MARGIN_TIGHT: Margin = Margin::same(Self::SM); [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] 18 | pub const MARGIN_NORMAL: Margin = Margin::same(Self::MD); [INFO] [stdout] 19 | pub const MARGIN_LOOSE: Margin = Margin::same(Self::LG); [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] 20 | pub const MARGIN_PANEL: Margin = Margin::same(Self::XL); [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 23 | pub const MARGIN_VERTICAL_SM: Margin = Margin { left: 0.0, right: 0.0, top: Self::SM, bottom: Self::SM }; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 24 | pub const MARGIN_VERTICAL_MD: Margin = Margin { left: 0.0, right: 0.0, top: Self::MD, bottom: Self::MD }; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 25 | pub const MARGIN_VERTICAL_LG: Margin = Margin { left: 0.0, right: 0.0, top: Self::LG, bottom: Self::LG }; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 28 | pub const MARGIN_HORIZONTAL_SM: Margin = Margin { left: Self::SM, right: Self::SM, top: 0.0, bottom: 0.0 }; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 29 | pub const MARGIN_HORIZONTAL_MD: Margin = Margin { left: Self::MD, right: Self::MD, top: 0.0, bottom: 0.0 }; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 30 | pub const MARGIN_HORIZONTAL_LG: Margin = Margin { left: Self::LG, right: Self::LG, top: 0.0, bottom: 0.0 }; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated constants are never used [INFO] [stdout] --> src/theme/spacing.rs:38:15 [INFO] [stdout] | [INFO] [stdout] 36 | impl Sizing { [INFO] [stdout] | ----------- associated constants in this implementation [INFO] [stdout] 37 | // Button sizes [INFO] [stdout] 38 | pub const BUTTON_HEIGHT_SM: f32 = 28.0; [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] 39 | pub const BUTTON_HEIGHT_MD: f32 = 36.0; [INFO] [stdout] 40 | pub const BUTTON_HEIGHT_LG: f32 = 44.0; [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] 41 | [INFO] [stdout] 42 | pub const BUTTON_PADDING_SM: Vec2 = Vec2::new(Spacing::SM, Spacing::XS); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] 43 | pub const BUTTON_PADDING_MD: Vec2 = Vec2::new(Spacing::MD, Spacing::SM); [INFO] [stdout] 44 | pub const BUTTON_PADDING_LG: Vec2 = Vec2::new(Spacing::LG, Spacing::MD); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 47 | pub const ICON_XS: Vec2 = Vec2::splat(12.0); [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] 48 | pub const ICON_SM: Vec2 = Vec2::splat(16.0); [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] 49 | pub const ICON_MD: Vec2 = Vec2::splat(20.0); [INFO] [stdout] 50 | pub const ICON_LG: Vec2 = Vec2::splat(24.0); [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] 51 | pub const ICON_XL: Vec2 = Vec2::splat(32.0); [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 55 | pub const INPUT_MIN_WIDTH: f32 = 120.0; [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 59 | pub const SIDEBAR_WIDTH_COLLAPSED: f32 = 60.0; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 60 | pub const TOPBAR_HEIGHT: f32 = 48.0; [INFO] [stdout] 61 | pub const STATUSBAR_HEIGHT: f32 = 24.0; [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 64 | pub const MODAL_MIN_WIDTH: f32 = 400.0; [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] 65 | pub const MODAL_MAX_WIDTH: f32 = 800.0; [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] 66 | pub const DIALOG_MIN_WIDTH: f32 = 320.0; [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 69 | pub const MIN_TOUCH_TARGET: Vec2 = Vec2::splat(44.0); [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated constants `NONE`, `SM`, `FULL`, and `PILL` are never used [INFO] [stdout] --> src/theme/spacing.rs:76:15 [INFO] [stdout] | [INFO] [stdout] 75 | impl BorderRadius { [INFO] [stdout] | ----------------- associated constants in this implementation [INFO] [stdout] 76 | pub const NONE: Rounding = Rounding::ZERO; [INFO] [stdout] | ^^^^ [INFO] [stdout] 77 | pub const SM: Rounding = Rounding::same(4.0); [INFO] [stdout] | ^^ [INFO] [stdout] ... [INFO] [stdout] 81 | pub const FULL: Rounding = Rounding::same(999.0); // Fully rounded (pills) [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 88 | pub const PILL: Rounding = Self::FULL; [INFO] [stdout] | ^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ZIndex` is never constructed [INFO] [stdout] --> src/theme/spacing.rs:92:12 [INFO] [stdout] | [INFO] [stdout] 92 | pub struct ZIndex; [INFO] [stdout] | ^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated constants are never used [INFO] [stdout] --> src/theme/spacing.rs:95:15 [INFO] [stdout] | [INFO] [stdout] 94 | impl ZIndex { [INFO] [stdout] | ----------- associated constants in this implementation [INFO] [stdout] 95 | pub const BASE: i32 = 0; [INFO] [stdout] | ^^^^ [INFO] [stdout] 96 | pub const DROPDOWN: i32 = 10; [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 97 | pub const STICKY: i32 = 20; [INFO] [stdout] | ^^^^^^ [INFO] [stdout] 98 | pub const MODAL_BACKDROP: i32 = 30; [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] 99 | pub const MODAL: i32 = 40; [INFO] [stdout] | ^^^^^ [INFO] [stdout] 100 | pub const TOOLTIP: i32 = 50; [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] 101 | pub const NOTIFICATION: i32 = 60; [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `Timing` is never constructed [INFO] [stdout] --> src/theme/spacing.rs:105:12 [INFO] [stdout] | [INFO] [stdout] 105 | pub struct Timing; [INFO] [stdout] | ^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated constants are never used [INFO] [stdout] --> src/theme/spacing.rs:108:15 [INFO] [stdout] | [INFO] [stdout] 107 | impl Timing { [INFO] [stdout] | ----------- associated constants in this implementation [INFO] [stdout] 108 | pub const INSTANT: f64 = 0.0; [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] 109 | pub const FAST: f64 = 0.15; [INFO] [stdout] | ^^^^ [INFO] [stdout] 110 | pub const NORMAL: f64 = 0.25; [INFO] [stdout] | ^^^^^^ [INFO] [stdout] 111 | pub const SLOW: f64 = 0.4; [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 114 | pub const EASE_IN: &'static str = "ease-in"; [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] 115 | pub const EASE_OUT: &'static str = "ease-out"; [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 116 | pub const EASE_IN_OUT: &'static str = "ease-in-out"; [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated constants are never used [INFO] [stdout] --> src/theme/spacing.rs:124:15 [INFO] [stdout] | [INFO] [stdout] 122 | impl Typography { [INFO] [stdout] | --------------- associated constants in this implementation [INFO] [stdout] 123 | // Font sizes (in pixels) [INFO] [stdout] 124 | pub const SIZE_XS: f32 = 10.0; [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 128 | pub const SIZE_XL: f32 = 18.0; [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] 129 | pub const SIZE_2XL: f32 = 24.0; [INFO] [stdout] 130 | pub const SIZE_3XL: f32 = 30.0; [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] 131 | pub const SIZE_4XL: f32 = 36.0; [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 134 | pub const LINE_HEIGHT_TIGHT: f32 = 1.2; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] 135 | pub const LINE_HEIGHT_NORMAL: f32 = 1.4; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 136 | pub const LINE_HEIGHT_RELAXED: f32 = 1.6; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 139 | pub const LETTER_SPACING_TIGHT: f32 = -0.01; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 140 | pub const LETTER_SPACING_NORMAL: f32 = 0.0; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 141 | pub const LETTER_SPACING_WIDE: f32 = 0.02; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `Shadows` is never constructed [INFO] [stdout] --> src/theme/spacing.rs:145:12 [INFO] [stdout] | [INFO] [stdout] 145 | pub struct Shadows; [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated constants `ELEVATION_1`, `ELEVATION_2`, `ELEVATION_3`, `ELEVATION_4`, and `ELEVATION_5` are never used [INFO] [stdout] --> src/theme/spacing.rs:151:15 [INFO] [stdout] | [INFO] [stdout] 147 | impl Shadows { [INFO] [stdout] | ------------ associated constants in this implementation [INFO] [stdout] ... [INFO] [stdout] 151 | pub const ELEVATION_1: (f32, Vec2) = (2.0, Vec2::new(0.0, 1.0)); // Buttons, cards [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 152 | pub const ELEVATION_2: (f32, Vec2) = (4.0, Vec2::new(0.0, 2.0)); // Dropdowns [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 153 | pub const ELEVATION_3: (f32, Vec2) = (8.0, Vec2::new(0.0, 4.0)); // Modals [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 154 | pub const ELEVATION_4: (f32, Vec2) = (16.0, Vec2::new(0.0, 8.0)); // Overlays [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 155 | pub const ELEVATION_5: (f32, Vec2) = (24.0, Vec2::new(0.0, 12.0)); // Maximum elevation [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `Grid` is never constructed [INFO] [stdout] --> src/theme/spacing.rs:159:12 [INFO] [stdout] | [INFO] [stdout] 159 | pub struct Grid; [INFO] [stdout] | ^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated constants `COLUMNS`, `GUTTER`, `BREAKPOINT_SM`, `BREAKPOINT_MD`, `BREAKPOINT_LG`, and `BREAKPOINT_XL` are never used [INFO] [stdout] --> src/theme/spacing.rs:162:15 [INFO] [stdout] | [INFO] [stdout] 161 | impl Grid { [INFO] [stdout] | --------- associated constants in this implementation [INFO] [stdout] 162 | pub const COLUMNS: usize = 12; [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] 163 | pub const GUTTER: f32 = Spacing::LG; [INFO] [stdout] | ^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 166 | pub const BREAKPOINT_SM: f32 = 640.0; [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] 167 | pub const BREAKPOINT_MD: f32 = 768.0; [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] 168 | pub const BREAKPOINT_LG: f32 = 1024.0; [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] 169 | pub const BREAKPOINT_XL: f32 = 1280.0; [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `format_duration` is never used [INFO] [stdout] --> src/utils.rs:27:8 [INFO] [stdout] | [INFO] [stdout] 27 | pub fn format_duration(seconds: u64) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `get_file_extension` is never used [INFO] [stdout] --> src/utils.rs:38:8 [INFO] [stdout] | [INFO] [stdout] 38 | pub fn get_file_extension(path: &Path) -> Option<&str> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `generate_id` is never used [INFO] [stdout] --> src/utils.rs:57:8 [INFO] [stdout] | [INFO] [stdout] 57 | pub fn generate_id() -> String { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ScriptInfo` is never constructed [INFO] [stdout] --> src/core/model.rs:25:12 [INFO] [stdout] | [INFO] [stdout] 25 | pub struct ScriptInfo { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `ScriptOption` is never constructed [INFO] [stdout] --> src/core/model.rs:40:12 [INFO] [stdout] | [INFO] [stdout] 40 | pub struct ScriptOption { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `SelectOption` is never constructed [INFO] [stdout] --> src/core/model.rs:55:12 [INFO] [stdout] | [INFO] [stdout] 55 | pub struct SelectOption { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `DependsOn` is never constructed [INFO] [stdout] --> src/core/model.rs:61:12 [INFO] [stdout] | [INFO] [stdout] 61 | pub struct DependsOn { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `execute_script`, `execute_script_with_options`, and `get_result` are never used [INFO] [stdout] --> src/core/runtime.rs:23:12 [INFO] [stdout] | [INFO] [stdout] 15 | impl JsEngine { [INFO] [stdout] | ------------- methods in this implementation [INFO] [stdout] ... [INFO] [stdout] 23 | pub fn execute_script(&self, script_name: &str, source: &str) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 27 | pub fn execute_script_with_options(&self, _script_name: &str, source: &str, options: Option) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 601 | pub fn get_result(&self) -> Option { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `website` is never read [INFO] [stdout] --> src/core/script_detector.rs:14:9 [INFO] [stdout] | [INFO] [stdout] 6 | pub struct ScriptInfo { [INFO] [stdout] | ---------- field in this struct [INFO] [stdout] ... [INFO] [stdout] 14 | pub website: Option, [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `ScriptInfo` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `get_all_scripts` is never used [INFO] [stdout] --> src/core/script_detector.rs:171:12 [INFO] [stdout] | [INFO] [stdout] 23 | impl ScriptDetector { [INFO] [stdout] | ------------------- method in this implementation [INFO] [stdout] ... [INFO] [stdout] 171 | pub fn get_all_scripts(&self) -> &[ScriptInfo] { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `save_history` is never used [INFO] [stdout] --> src/data.rs:106:8 [INFO] [stdout] | [INFO] [stdout] 106 | pub fn save_history(history: &History) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/app.rs:157:13 [INFO] [stdout] | [INFO] [stdout] 157 | / if self.settings.dev_mode { [INFO] [stdout] 158 | | if ui [INFO] [stdout] 159 | | .selectable_label( [INFO] [stdout] 160 | | self.active_tab == Tab::Playground, [INFO] [stdout] ... | [INFO] [stdout] 167 | | } [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] 157 ~ if self.settings.dev_mode [INFO] [stdout] 158 ~ && ui [INFO] [stdout] 159 | .selectable_label( [INFO] [stdout] ... [INFO] [stdout] 165 | self.active_tab = Tab::Playground; [INFO] [stdout] 166 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `impl` can be derived [INFO] [stdout] --> src/components/dialogs/script_picker.rs:11:1 [INFO] [stdout] | [INFO] [stdout] 11 | / impl Default for ScriptPickerDialog { [INFO] [stdout] 12 | | fn default() -> Self { [INFO] [stdout] 13 | | Self { [INFO] [stdout] 14 | | open: false, [INFO] [stdout] ... | [INFO] [stdout] 20 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#derivable_impls [INFO] [stdout] = note: `#[warn(clippy::derivable_impls)]` on by default [INFO] [stdout] help: replace the manual implementation with a derive attribute [INFO] [stdout] | [INFO] [stdout] 4 + #[derive(Default)] [INFO] [stdout] 5 | pub struct ScriptPickerDialog { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/components/dialogs/script_picker.rs:81:29 [INFO] [stdout] | [INFO] [stdout] 81 | / ... if self.selected_script.is_some() { [INFO] [stdout] 82 | | ... if ui.button("โœ… Use Selected Script").clicked() { [INFO] [stdout] 83 | | ... self.open = false; [INFO] [stdout] 84 | | ... selected_script = self.selected_script.clone(); [INFO] [stdout] 85 | | ... } [INFO] [stdout] 86 | | ... } [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] 81 ~ if self.selected_script.is_some() [INFO] [stdout] 82 ~ && ui.button("โœ… Use Selected Script").clicked() { [INFO] [stdout] 83 | self.open = false; [INFO] [stdout] 84 | selected_script = self.selected_script.clone(); [INFO] [stdout] 85 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `impl` can be derived [INFO] [stdout] --> src/components/dialogs/stress_test.rs:33:1 [INFO] [stdout] | [INFO] [stdout] 33 | / impl Default for StressTestDialog { [INFO] [stdout] 34 | | fn default() -> Self { [INFO] [stdout] 35 | | Self { [INFO] [stdout] 36 | | open: false, [INFO] [stdout] ... | [INFO] [stdout] 40 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#derivable_impls [INFO] [stdout] help: replace the manual implementation with a derive attribute [INFO] [stdout] | [INFO] [stdout] 28 + #[derive(Default)] [INFO] [stdout] 29 | pub struct StressTestDialog { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/components/dialogs/stress_test.rs:85:29 [INFO] [stdout] | [INFO] [stdout] 85 | / ... if self.selected_test.is_some() { [INFO] [stdout] 86 | | ... if ui.button("๐Ÿš€ Start Stress Test").clicked() { [INFO] [stdout] 87 | | ... self.open = false; [INFO] [stdout] 88 | | ... selected_test = self.selected_test.clone(); [INFO] [stdout] 89 | | ... } [INFO] [stdout] 90 | | ... } [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] 85 ~ if self.selected_test.is_some() [INFO] [stdout] 86 ~ && ui.button("๐Ÿš€ Start Stress Test").clicked() { [INFO] [stdout] 87 | self.open = false; [INFO] [stdout] 88 | selected_test = self.selected_test.clone(); [INFO] [stdout] 89 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `impl` can be derived [INFO] [stdout] --> src/components/dialogs/test_dialog.rs:46:1 [INFO] [stdout] | [INFO] [stdout] 46 | / impl Default for TestDialog { [INFO] [stdout] 47 | | fn default() -> Self { [INFO] [stdout] 48 | | Self { [INFO] [stdout] 49 | | open: false, [INFO] [stdout] ... | [INFO] [stdout] 53 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#derivable_impls [INFO] [stdout] help: replace the manual implementation with a derive attribute [INFO] [stdout] | [INFO] [stdout] 41 + #[derive(Default)] [INFO] [stdout] 42 | pub struct TestDialog { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/download_window.rs:233:76 [INFO] [stdout] | [INFO] [stdout] 233 | if let Some(selected_script) = self.script_picker_dialog.show(ctx, &tokens) { [INFO] [stdout] | ^^^^^^^ help: change this to: `tokens` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] = note: `#[warn(clippy::needless_borrow)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&PathBuf` instead of `&Path` involves a new object where a slice will do [INFO] [stdout] --> src/downloader.rs:20:62 [INFO] [stdout] | [INFO] [stdout] 20 | pub async fn download(&self, url: &str, destination_dir: &PathBuf) -> Result<()> { [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] 20 - pub async fn download(&self, url: &str, destination_dir: &PathBuf) -> Result<()> { [INFO] [stdout] 20 + pub async fn download(&self, url: &str, destination_dir: &Path) -> Result<()> { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `Iterator::last` on a `DoubleEndedIterator`; this will needlessly iterate the entire iterator [INFO] [stdout] --> src/downloader.rs:35:24 [INFO] [stdout] | [INFO] [stdout] 35 | let filename = url.split('/').last() [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#double_ended_iterator_last [INFO] [stdout] = note: `#[warn(clippy::double_ended_iterator_last)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 35 - let filename = url.split('/').last() [INFO] [stdout] 35 + let filename = url.split('/').next_back() [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/tabs/quick_download.rs:76:21 [INFO] [stdout] | [INFO] [stdout] 76 | / if settings.dev_mode { [INFO] [stdout] 77 | | if ui.button("๐Ÿงช Tests").clicked() { [INFO] [stdout] 78 | | self.test_dialog.open_dialog(); [INFO] [stdout] 79 | | } [INFO] [stdout] 80 | | } [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] 76 ~ if settings.dev_mode [INFO] [stdout] 77 ~ && ui.button("๐Ÿงช Tests").clicked() { [INFO] [stdout] 78 | self.test_dialog.open_dialog(); [INFO] [stdout] 79 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/tabs/quick_download.rs:121:61 [INFO] [stdout] | [INFO] [stdout] 121 | if let Some(test_type) = self.test_dialog.show(ctx, &tokens) { [INFO] [stdout] | ^^^^^^^ help: change this to: `tokens` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/tabs/quick_download.rs:362:76 [INFO] [stdout] | [INFO] [stdout] 362 | if let Some(selected_script) = self.script_picker_dialog.show(ctx, &tokens) { [INFO] [stdout] | ^^^^^^^ help: change this to: `tokens` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: casting to the same type is unnecessary (`u64` -> `u64`) [INFO] [stdout] --> src/tabs/quick_download.rs:888:23 [INFO] [stdout] | [INFO] [stdout] 888 | eta: Some((total_size / 1_000_000) as u64), // Rough initial ETA [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `((total_size / 1_000_000))` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_cast [INFO] [stdout] = note: `#[warn(clippy::unnecessary_cast)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/theme/mod.rs:41:30 [INFO] [stdout] | [INFO] [stdout] 41 | std::sync::LazyLock::new(|| DesignTokens::dark_theme()); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the associated function itself: `DesignTokens::dark_theme` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] = note: `#[warn(clippy::redundant_closure)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: returning the result of a `let` binding from a block [INFO] [stdout] --> src/core/runtime.rs:239:41 [INFO] [stdout] | [INFO] [stdout] 230 | / ... let result = if !url.is_empty() { [INFO] [stdout] 231 | | ... match ureq::get(url).call() { [INFO] [stdout] 232 | | ... Ok(resp) => match resp.into_string() { [INFO] [stdout] 233 | | ... Ok(t) => json!({"id": id, "result": t}), [INFO] [stdout] ... | [INFO] [stdout] 238 | | ... } else { json!({"id": id, "result": null}) }; [INFO] [stdout] | |___________________________________________________________________- unnecessary `let` binding [INFO] [stdout] 239 | ... result [INFO] [stdout] | ^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return [INFO] [stdout] = note: `#[warn(clippy::let_and_return)]` on by default [INFO] [stdout] help: return the expression directly [INFO] [stdout] | [INFO] [stdout] 230 ~ [INFO] [stdout] 231 ~ if !url.is_empty() { [INFO] [stdout] 232 + match ureq::get(url).call() { [INFO] [stdout] 233 + Ok(resp) => match resp.into_string() { [INFO] [stdout] 234 + Ok(t) => json!({"id": id, "result": t}), [INFO] [stdout] 235 + Err(_) => json!({"id": id, "result": null}) [INFO] [stdout] 236 + }, [INFO] [stdout] 237 + Err(_) => json!({"id": id, "result": null}), [INFO] [stdout] 238 + } [INFO] [stdout] 239 + } else { json!({"id": id, "result": null}) } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: returning the result of a `let` binding from a block [INFO] [stdout] --> src/core/runtime.rs:506:41 [INFO] [stdout] | [INFO] [stdout] 497 | / ... let result = if !url.is_empty() { [INFO] [stdout] 498 | | ... match ureq::get(url).call() { [INFO] [stdout] 499 | | ... Ok(resp) => match resp.into_string() { [INFO] [stdout] 500 | | ... Ok(t) => json!({"id": id, "result": t}), [INFO] [stdout] ... | [INFO] [stdout] 505 | | ... } else { json!({"id": id, "result": null}) }; [INFO] [stdout] | |___________________________________________________________________- unnecessary `let` binding [INFO] [stdout] 506 | ... result [INFO] [stdout] | ^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return [INFO] [stdout] help: return the expression directly [INFO] [stdout] | [INFO] [stdout] 497 ~ [INFO] [stdout] 498 ~ if !url.is_empty() { [INFO] [stdout] 499 + match ureq::get(url).call() { [INFO] [stdout] 500 + Ok(resp) => match resp.into_string() { [INFO] [stdout] 501 + Ok(t) => json!({"id": id, "result": t}), [INFO] [stdout] 502 + Err(_) => json!({"id": id, "result": null}) [INFO] [stdout] 503 + }, [INFO] [stdout] 504 + Err(_) => json!({"id": id, "result": null}), [INFO] [stdout] 505 + } [INFO] [stdout] 506 + } else { json!({"id": id, "result": null}) } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: matching on `Some` with `ok()` is redundant [INFO] [stdout] --> src/core/runtime.rs:562:17 [INFO] [stdout] | [INFO] [stdout] 562 | if let Some(length_val) = arr.get("length", &mut ctx).ok() { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_result_ok [INFO] [stdout] = note: `#[warn(clippy::match_result_ok)]` on by default [INFO] [stdout] help: consider matching on `Ok(length_val)` and removing the call to `ok` instead [INFO] [stdout] | [INFO] [stdout] 562 - if let Some(length_val) = arr.get("length", &mut ctx).ok() { [INFO] [stdout] 562 + if let Ok(length_val) = arr.get("length", &mut ctx) { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unnecessary `if let` since only the `Ok` variant of the iterator element is used [INFO] [stdout] --> src/core/script_detector.rs:40:17 [INFO] [stdout] | [INFO] [stdout] 40 | / for entry in entries { [INFO] [stdout] 41 | | if let Ok(entry) = entry { [INFO] [stdout] 42 | | let path = entry.path(); [INFO] [stdout] 43 | | if path.is_dir() { [INFO] [stdout] ... | [INFO] [stdout] 89 | | } [INFO] [stdout] | |_________________^ [INFO] [stdout] | [INFO] [stdout] help: try `.flatten()` and remove the `if let` statement in the for loop [INFO] [stdout] --> src/core/script_detector.rs:41:21 [INFO] [stdout] | [INFO] [stdout] 41 | / if let Ok(entry) = entry { [INFO] [stdout] 42 | | let path = entry.path(); [INFO] [stdout] 43 | | if path.is_dir() { [INFO] [stdout] 44 | | let manifest_path = path.join("manifest.json"); [INFO] [stdout] ... | [INFO] [stdout] 88 | | } [INFO] [stdout] | |_____________________^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_flatten [INFO] [stdout] = note: `#[warn(clippy::manual_flatten)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 40 ~ for entry in entries.flatten() { [INFO] [stdout] 41 + let path = entry.path(); [INFO] [stdout] 42 + if path.is_dir() { [INFO] [stdout] 43 + let manifest_path = path.join("manifest.json"); [INFO] [stdout] 44 + if manifest_path.exists() { [INFO] [stdout] 45 + match fs::read_to_string(&manifest_path) { [INFO] [stdout] 46 + Ok(content) => { [INFO] [stdout] 47 + if content.trim().is_empty() { [INFO] [stdout] 48 + eprintln!("Warning: Empty manifest file: {}", manifest_path.display()); [INFO] [stdout] 49 + continue; [INFO] [stdout] 50 + } [INFO] [stdout] 51 + match serde_json::from_str::(&content) { [INFO] [stdout] 52 + Ok(manifest) => { [INFO] [stdout] 53 + let script_info = ScriptInfo { [INFO] [stdout] 54 + name: manifest["name"].as_str().unwrap_or("Unknown").to_string(), [INFO] [stdout] 55 + description: manifest["description"].as_str().unwrap_or("").to_string(), [INFO] [stdout] 56 + version: manifest["version"].as_str().unwrap_or("0.1.0").to_string(), [INFO] [stdout] 57 + author: manifest["author"].as_str().unwrap_or("Unknown").to_string(), [INFO] [stdout] 58 + category: manifest["category"].as_str().map(|s| s.to_string()), [INFO] [stdout] 59 + tags: manifest["tags"].as_array() [INFO] [stdout] 60 + .map(|arr| arr.iter() [INFO] [stdout] 61 + .filter_map(|v| v.as_str()) [INFO] [stdout] 62 + .map(|s| s.to_string()) [INFO] [stdout] 63 + .collect()), [INFO] [stdout] 64 + icon: manifest["icon"].as_str().map(|s| s.to_string()), [INFO] [stdout] 65 + website: manifest["website"].as_str().map(|s| s.to_string()), [INFO] [stdout] 66 + supported_domains: manifest["supportedDomains"].as_array() [INFO] [stdout] 67 + .map(|arr| arr.iter() [INFO] [stdout] 68 + .filter_map(|v| v.as_str()) [INFO] [stdout] 69 + .map(|s| s.to_string()) [INFO] [stdout] 70 + .collect()), [INFO] [stdout] 71 + dir: path.file_name().unwrap_or_default().to_string_lossy().to_string(), [INFO] [stdout] 72 + }; [INFO] [stdout] 73 + println!("Loaded script: {} with domains: {:?}", script_info.name, script_info.supported_domains); [INFO] [stdout] 74 + scripts.push(script_info); [INFO] [stdout] 75 + } [INFO] [stdout] 76 + Err(e) => { [INFO] [stdout] 77 + eprintln!("Error parsing manifest JSON {}: {}", manifest_path.display(), e); [INFO] [stdout] 78 + } [INFO] [stdout] 79 + } [INFO] [stdout] 80 + } [INFO] [stdout] 81 + Err(e) => { [INFO] [stdout] 82 + eprintln!("Error reading manifest {}: {}", manifest_path.display(), e); [INFO] [stdout] 83 + } [INFO] [stdout] 84 + } [INFO] [stdout] 85 + } [INFO] [stdout] 86 + } [INFO] [stdout] 87 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: stripping a prefix manually [INFO] [stdout] --> src/core/script_detector.rs:159:31 [INFO] [stdout] | [INFO] [stdout] 159 | let base_domain = &pattern[2..]; [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] note: the prefix was tested here [INFO] [stdout] --> src/core/script_detector.rs:158:9 [INFO] [stdout] | [INFO] [stdout] 158 | if pattern.starts_with("*.") { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_strip [INFO] [stdout] = note: `#[warn(clippy::manual_strip)]` on by default [INFO] [stdout] help: try using the `strip_prefix` method [INFO] [stdout] | [INFO] [stdout] 158 ~ if let Some(base_domain) = pattern.strip_prefix("*.") { [INFO] [stdout] 159 ~ return host == base_domain || host.ends_with(&format!(".{}", base_domain)); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 38s [INFO] [stderr] warning: the following packages contain code that will be rejected by a future version of Rust: ashpd v0.8.1 [INFO] [stderr] note: to see what the problems were, use the option `--future-incompat-report`, or run `cargo report future-incompatibilities --id 2` [INFO] running `Command { std: "docker" "inspect" "e7746898f9e0283c9db9d2b50e01ca0c3169add164e06e5c07a2dfefdea477a3", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "e7746898f9e0283c9db9d2b50e01ca0c3169add164e06e5c07a2dfefdea477a3", kill_on_drop: false }` [INFO] [stdout] e7746898f9e0283c9db9d2b50e01ca0c3169add164e06e5c07a2dfefdea477a3