[INFO] cloning repository https://github.com/DreamPrism/rusty-tsugu
[INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/DreamPrism/rusty-tsugu" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FDreamPrism%2Frusty-tsugu", kill_on_drop: false }`
[INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FDreamPrism%2Frusty-tsugu'...
[INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }`
[INFO] [stdout] 30fdb40aa9a60cc4913fd26bc7d71eb3ba480408
[INFO] checking DreamPrism/rusty-tsugu against master#683dd08db5808c41baceef49368fc82a6c4767bb for pr-149137
[INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FDreamPrism%2Frusty-tsugu" "/workspace/builds/worker-4-tc1/source", kill_on_drop: false }`
[INFO] [stderr] Cloning into '/workspace/builds/worker-4-tc1/source'...
[INFO] [stderr] done.
[INFO] started tweaking git repo https://github.com/DreamPrism/rusty-tsugu
[INFO] finished tweaking git repo https://github.com/DreamPrism/rusty-tsugu
[INFO] tweaked toml for git repo https://github.com/DreamPrism/rusty-tsugu written to /workspace/builds/worker-4-tc1/source/Cargo.toml
[INFO] validating manifest of git repo https://github.com/DreamPrism/rusty-tsugu on toolchain 683dd08db5808c41baceef49368fc82a6c4767bb
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+683dd08db5808c41baceef49368fc82a6c4767bb" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate git repo https://github.com/DreamPrism/rusty-tsugu 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" "+683dd08db5808c41baceef49368fc82a6c4767bb" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] [stderr]  Downloading crates ...
[INFO] [stderr]   Downloaded unicode-bidi-mirroring v0.3.0
[INFO] [stderr]   Downloaded data-url v0.3.2
[INFO] [stderr]   Downloaded unicode-ccc v0.3.0
[INFO] [stderr]   Downloaded resolv-conf v0.7.5
[INFO] [stderr]   Downloaded windows-core v0.62.1
[INFO] [stderr]   Downloaded validator_derive v0.18.2
[INFO] [stderr]   Downloaded validator v0.18.1
[INFO] [stderr]   Downloaded fontdb v0.22.0
[INFO] [stderr]   Downloaded resvg v0.44.0
[INFO] [stderr]   Downloaded imageproc v0.25.0
[INFO] [stderr]   Downloaded bson v2.15.0
[INFO] [stderr]   Downloaded usvg v0.44.0
[INFO] [stderr]   Downloaded kurbo v0.11.3
[INFO] [stderr]   Downloaded moxcms v0.7.5
[INFO] [stderr]   Downloaded rustybuzz v0.18.0
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-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:94a0c148923f5b2b52a63ef0eeb1882ad339ab61bce784c8077cbe41c61feb6c" "/opt/rustwide/cargo-home/bin/cargo" "+683dd08db5808c41baceef49368fc82a6c4767bb" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] [stdout] 3b25bed340873d8be689a7a014d9cf6e8e62b8e969f86fced29f7e7ca701be83
[INFO] running `Command { std: "docker" "start" "-a" "3b25bed340873d8be689a7a014d9cf6e8e62b8e969f86fced29f7e7ca701be83", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "3b25bed340873d8be689a7a014d9cf6e8e62b8e969f86fced29f7e7ca701be83", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "3b25bed340873d8be689a7a014d9cf6e8e62b8e969f86fced29f7e7ca701be83", kill_on_drop: false }`
[INFO] [stdout] 3b25bed340873d8be689a7a014d9cf6e8e62b8e969f86fced29f7e7ca701be83
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-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:94a0c148923f5b2b52a63ef0eeb1882ad339ab61bce784c8077cbe41c61feb6c" "/opt/rustwide/cargo-home/bin/cargo" "+683dd08db5808c41baceef49368fc82a6c4767bb" "check" "--frozen" "--all" "--all-targets" "--message-format=json", kill_on_drop: false }`
[INFO] [stdout] 2b0c576bb91a1034b0e9f5250cc6cdb6dd5b31788699d40547aec59dd2890b48
[INFO] running `Command { std: "docker" "start" "-a" "2b0c576bb91a1034b0e9f5250cc6cdb6dd5b31788699d40547aec59dd2890b48", kill_on_drop: false }`
[INFO] [stderr]    Compiling find-msvc-tools v0.1.2
[INFO] [stderr]    Compiling libc v0.2.176
[INFO] [stderr]    Compiling syn v2.0.106
[INFO] [stderr]     Checking parking_lot_core v0.9.11
[INFO] [stderr]     Checking signal-hook-registry v1.4.6
[INFO] [stderr]     Checking mio v1.0.4
[INFO] [stderr]    Compiling syn v1.0.109
[INFO] [stderr]     Checking bytemuck v1.23.2
[INFO] [stderr]     Checking getrandom v0.2.16
[INFO] [stderr]     Checking getrandom v0.3.3
[INFO] [stderr]     Checking num-integer v0.1.46
[INFO] [stderr]     Checking crossbeam-epoch v0.9.18
[INFO] [stderr]     Checking aho-corasick v1.1.3
[INFO] [stderr]     Checking unicode-normalization v0.1.24
[INFO] [stderr]    Compiling time-macros v0.2.24
[INFO] [stderr]     Checking serde_json v1.0.145
[INFO] [stderr]     Checking rand_core v0.9.3
[INFO] [stderr]     Checking rand_core v0.6.4
[INFO] [stderr]     Checking nom v7.1.3
[INFO] [stderr]     Checking num-bigint v0.4.6
[INFO] [stderr]     Checking crossbeam-deque v0.8.6
[INFO] [stderr]     Checking parking_lot v0.12.4
[INFO] [stderr]     Checking core_maths v0.1.1
[INFO] [stderr]    Compiling serde_core v1.0.228
[INFO] [stderr]     Checking rand_chacha v0.3.1
[INFO] [stderr]     Checking rand_chacha v0.9.0
[INFO] [stderr]    Compiling slotmap v1.0.7
[INFO] [stderr]     Checking rayon-core v1.13.0
[INFO] [stderr]     Checking float-cmp v0.9.0
[INFO] [stderr]    Compiling bytes v1.10.1
[INFO] [stderr]    Compiling tracing-core v0.1.34
[INFO] [stderr]     Checking strict-num v0.1.1
[INFO] [stderr]     Checking rand v0.9.2
[INFO] [stderr]     Checking rand v0.8.5
[INFO] [stderr]     Checking ttf-parser v0.24.1
[INFO] [stderr]     Checking rgb v0.8.52
[INFO] [stderr]     Checking rayon v1.11.0
[INFO] [stderr]    Compiling tracing v0.1.41
[INFO] [stderr]     Checking safe_arch v0.7.4
[INFO] [stderr]     Checking concurrent-queue v2.5.0
[INFO] [stderr]     Checking regex-automata v0.4.11
[INFO] [stderr]     Checking num-complex v0.4.6
[INFO] [stderr]    Compiling simd_helpers v0.1.0
[INFO] [stderr]     Checking time v0.3.44
[INFO] [stderr]    Compiling bytestring v1.5.0
[INFO] [stderr]    Compiling matrixmultiply v0.3.10
[INFO] [stderr]    Compiling jobserver v0.1.34
[INFO] [stderr]    Compiling ahash v0.8.12
[INFO] [stderr]     Checking semver-parser v0.7.0
[INFO] [stderr]     Checking roxmltree v0.20.0
[INFO] [stderr]     Checking num-rational v0.4.2
[INFO] [stderr]     Checking event-listener v5.4.1
[INFO] [stderr]     Checking tiny-skia-path v0.11.4
[INFO] [stderr]     Checking semver v0.9.0
[INFO] [stderr]     Checking idna v0.2.3
[INFO] [stderr]     Checking wide v0.7.33
[INFO] [stderr]    Compiling cc v1.2.39
[INFO] [stderr]    Compiling rustc_version_runtime v0.2.1
[INFO] [stderr]     Checking fontconfig-parser v0.5.8
[INFO] [stderr]    Compiling proc-macro-error-attr v1.0.4
[INFO] [stderr]     Checking sha1 v0.10.6
[INFO] [stderr]     Checking kurbo v0.11.3
[INFO] [stderr]     Checking pxfm v0.1.24
[INFO] [stderr]     Checking memmap2 v0.9.8
[INFO] [stderr]     Checking socket2 v0.5.10
[INFO] [stderr]     Checking ab_glyph_rasterizer v0.1.10
[INFO] [stderr]     Checking unicode-bidi-mirroring v0.3.0
[INFO] [stderr]    Compiling portable-atomic v1.11.1
[INFO] [stderr]     Checking unicode-ccc v0.3.0
[INFO] [stderr]     Checking unicode-script v0.5.7
[INFO] [stderr]     Checking ttf-parser v0.25.1
[INFO] [stderr]     Checking exr v1.73.0
[INFO] [stderr]     Checking svgtypes v0.15.3
[INFO] [stderr]     Checking event-listener-strategy v0.5.4
[INFO] [stderr]     Checking rustc_version v0.2.3
[INFO] [stderr]     Checking qoi v0.4.1
[INFO] [stderr]     Checking num-iter v0.1.45
[INFO] [stderr]     Checking png v0.18.0
[INFO] [stderr]     Checking serde_bytes v0.11.19
[INFO] [stderr]    Compiling serde v1.0.228
[INFO] [stderr]     Checking rustybuzz v0.18.0
[INFO] [stderr]     Checking cookie v0.16.2
[INFO] [stderr]    Compiling openssl-sys v0.9.109
[INFO] [stderr]    Compiling zstd-sys v2.0.16+zstd.1.5.7
[INFO] [stderr]    Compiling ring v0.17.14
[INFO] [stderr]     Checking fontdb v0.22.0
[INFO] [stderr]     Checking maybe-rayon v0.1.1
[INFO] [stderr]     Checking simplecss v0.2.2
[INFO] [stderr]     Checking data-url v0.3.2
[INFO] [stderr]    Compiling moka v0.12.11
[INFO] [stderr]    Compiling darling_core v0.13.4
[INFO] [stderr]     Checking simba v0.8.1
[INFO] [stderr]    Compiling proc-macro-error v1.0.4
[INFO] [stderr]     Checking iana-time-zone v0.1.64
[INFO] [stderr]    Compiling openssl v0.10.73
[INFO] [stderr]    Compiling native-tls v0.2.14
[INFO] [stderr]     Checking unicode-vo v0.1.0
[INFO] [stderr]     Checking regex v1.11.3
[INFO] [stderr]     Checking pico-args v0.5.0
[INFO] [stderr]     Checking imagesize v0.13.0
[INFO] [stderr]    Compiling actix-router v0.5.3
[INFO] [stderr]     Checking xmlwriter v0.1.0
[INFO] [stderr]     Checking resolv-conf v0.7.5
[INFO] [stderr]     Checking matchers v0.2.0
[INFO] [stderr]     Checking chrono v0.4.42
[INFO] [stderr]     Checking owned_ttf_parser v0.15.2
[INFO] [stderr]     Checking num v0.4.3
[INFO] [stderr]     Checking tiny-skia v0.11.4
[INFO] [stderr]     Checking async-lock v3.4.1
[INFO] [stderr]     Checking owned_ttf_parser v0.25.1
[INFO] [stderr]     Checking rand_distr v0.4.3
[INFO] [stderr]     Checking ab_glyph v0.2.32
[INFO] [stderr]     Checking idna v0.5.0
[INFO] [stderr]     Checking moxcms v0.7.5
[INFO] [stderr]     Checking stringprep v0.1.5
[INFO] [stderr]     Checking image-webp v0.1.3
[INFO] [stderr]     Checking sha-1 v0.10.1
[INFO] [stderr]     Checking pbkdf2 v0.11.0
[INFO] [stderr]     Checking md-5 v0.10.6
[INFO] [stderr]     Checking tracing-log v0.2.0
[INFO] [stderr]     Checking crossbeam-channel v0.5.15
[INFO] [stderr]     Checking socket2 v0.4.10
[INFO] [stderr]     Checking tagptr v0.2.0
[INFO] [stderr]    Compiling enum-as-inner v0.4.0
[INFO] [stderr]    Compiling derivative v2.2.0
[INFO] [stderr]    Compiling typed-builder v0.10.0
[INFO] [stderr]     Checking dashmap v6.1.0
[INFO] [stderr]     Checking rusttype v0.9.3
[INFO] [stderr]     Checking usvg v0.44.0
[INFO] [stderr]    Compiling darling_macro v0.13.4
[INFO] [stderr]    Compiling synstructure v0.13.2
[INFO] [stderr]    Compiling darling_core v0.20.11
[INFO] [stderr]    Compiling darling v0.13.4
[INFO] [stderr]    Compiling rustls v0.21.12
[INFO] [stderr]    Compiling serde_with_macros v1.5.2
[INFO] [stderr]     Checking resvg v0.44.0
[INFO] [stderr]    Compiling tokio-macros v2.5.0
[INFO] [stderr]    Compiling zerofrom-derive v0.1.6
[INFO] [stderr]    Compiling yoke-derive v0.8.0
[INFO] [stderr]    Compiling zerovec-derive v0.11.1
[INFO] [stderr]    Compiling displaydoc v0.2.5
[INFO] [stderr]    Compiling futures-macro v0.3.31
[INFO] [stderr]    Compiling serde_derive v1.0.228
[INFO] [stderr]    Compiling tracing-attributes v0.1.30
[INFO] [stderr]    Compiling thiserror-impl v1.0.69
[INFO] [stderr]    Compiling equator-macro v0.4.2
[INFO] [stderr]    Compiling openssl-macros v0.1.1
[INFO] [stderr]    Compiling profiling-procmacros v1.0.17
[INFO] [stderr]     Checking tokio v1.47.1
[INFO] [stderr]     Checking profiling v1.0.17
[INFO] [stderr]    Compiling num-derive v0.4.2
[INFO] [stderr]    Compiling derive_more-impl v2.0.1
[INFO] [stderr]    Compiling fax_derive v0.2.0
[INFO] [stderr]     Checking futures-util v0.3.31
[INFO] [stderr]     Checking equator v0.4.2
[INFO] [stderr]    Compiling arg_enum_proc_macro v0.3.4
[INFO] [stderr]     Checking zerofrom v0.1.6
[INFO] [stderr]     Checking aligned-vec v0.6.4
[INFO] [stderr]     Checking yoke v0.8.0
[INFO] [stderr]     Checking fax v0.2.6
[INFO] [stderr]     Checking sct v0.7.1
[INFO] [stderr]     Checking v_frame v0.3.9
[INFO] [stderr]    Compiling zstd-safe v7.2.4
[INFO] [stderr]     Checking zerovec v0.11.4
[INFO] [stderr]     Checking zerotrie v0.2.2
[INFO] [stderr]     Checking thiserror v1.0.69
[INFO] [stderr]     Checking rustls-webpki v0.101.7
[INFO] [stderr]    Compiling async-trait v0.1.89
[INFO] [stderr]     Checking av1-grain v0.2.4
[INFO] [stderr]     Checking tiff v0.10.3
[INFO] [stderr]    Compiling darling_macro v0.20.11
[INFO] [stderr]    Compiling actix-web-codegen v4.3.0
[INFO] [stderr]     Checking zstd v0.13.3
[INFO] [stderr]    Compiling actix-macros v0.2.4
[INFO] [stderr]     Checking nalgebra v0.32.6
[INFO] [stderr]    Compiling darling v0.20.11
[INFO] [stderr]    Compiling derive_more v0.99.20
[INFO] [stderr]    Compiling validator_derive v0.18.2
[INFO] [stderr]     Checking tracing-subscriber v0.3.20
[INFO] [stderr]     Checking rav1e v0.7.1
[INFO] [stderr]     Checking tinystr v0.8.1
[INFO] [stderr]     Checking potential_utf v0.1.3
[INFO] [stderr]     Checking icu_locale_core v2.0.0
[INFO] [stderr]     Checking icu_collections v2.0.0
[INFO] [stderr]     Checking derive_more v2.0.1
[INFO] [stderr]     Checking icu_provider v2.0.0
[INFO] [stderr]     Checking icu_normalizer v2.0.0
[INFO] [stderr]     Checking icu_properties v2.0.1
[INFO] [stderr]     Checking serde_urlencoded v0.7.1
[INFO] [stderr]     Checking uuid v1.18.1
[INFO] [stderr]     Checking serde_with v1.14.0
[INFO] [stderr]     Checking futures-executor v0.3.31
[INFO] [stderr]     Checking bson v2.15.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 actix-rt v2.11.0
[INFO] [stderr]     Checking tokio-native-tls v0.3.1
[INFO] [stderr]     Checking tower v0.5.2
[INFO] [stderr]     Checking tokio-rustls v0.24.1
[INFO] [stderr]     Checking actix-server v2.6.0
[INFO] [stderr]     Checking url v2.5.7
[INFO] [stderr]     Checking tower-http v0.6.6
[INFO] [stderr]     Checking h2 v0.4.12
[INFO] [stderr]     Checking h2 v0.3.27
[INFO] [stderr]     Checking actix-codec v0.5.2
[INFO] [stderr]     Checking trust-dns-proto v0.21.2
[INFO] [stderr]     Checking validator v0.18.1
[INFO] [stderr]     Checking ravif v0.11.20
[INFO] [stderr]     Checking trust-dns-resolver v0.21.2
[INFO] [stderr]     Checking image v0.25.8
[INFO] [stderr]     Checking mongodb v2.8.2
[INFO] [stderr]     Checking hyper v1.7.0
[INFO] [stderr]     Checking actix-http v3.11.1
[INFO] [stderr]     Checking hyper-util v0.1.17
[INFO] [stderr]     Checking imageproc v0.25.0
[INFO] [stderr]     Checking hyper-tls v0.6.0
[INFO] [stderr]     Checking reqwest v0.12.23
[INFO] [stderr]     Checking actix-web v4.11.0
[INFO] [stderr]     Checking actix-cors v0.7.1
[INFO] [stderr]     Checking rusty-tsugu v0.1.0 (/opt/rustwide/workdir)
[INFO] [stdout] warning: unused import: `bytes::Bytes`
[INFO] [stdout]    --> src/models/server.rs:175:17
[INFO] [stdout]     |
[INFO] [stdout] 175 |             use bytes::Bytes;
[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: `bytes::Bytes`
[INFO] [stdout]    --> src/models/server.rs:175:17
[INFO] [stdout]     |
[INFO] [stdout] 175 |             use bytes::Bytes;
[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: `crate::models::Server`
[INFO] [stdout]   --> src/types/mod.rs:22:5
[INFO] [stdout]    |
[INFO] [stdout] 22 | use crate::models::Server;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `error`
[INFO] [stdout]  --> src/fuzzy_search/engine.rs:5:21
[INFO] [stdout]   |
[INFO] [stdout] 5 | use tracing::{info, error};
[INFO] [stdout]   |                     ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `image::Rgba`
[INFO] [stdout]  --> src/drawing/text.rs:5:5
[INFO] [stdout]   |
[INFO] [stdout] 5 | use image::Rgba;
[INFO] [stdout]   |     ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `apply_opacity`
[INFO] [stdout]  --> src/drawing/rect.rs:2:42
[INFO] [stdout]   |
[INFO] [stdout] 2 | use crate::drawing::utils::{parse_color, apply_opacity};
[INFO] [stdout]   |                                          ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `RgbaImage`
[INFO] [stdout]  --> src/drawing/utils.rs:1:55
[INFO] [stdout]   |
[INFO] [stdout] 1 | use image::{DynamicImage, GenericImageView, imageops, RgbaImage};
[INFO] [stdout]   |                                                       ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Arc`
[INFO] [stdout]   --> src/drawing/card.rs:12:17
[INFO] [stdout]    |
[INFO] [stdout] 12 | use std::sync::{Arc, OnceLock};
[INFO] [stdout]    |                 ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `imageops`
[INFO] [stdout]  --> src/drawing/components/difficulty.rs:1:13
[INFO] [stdout]   |
[INFO] [stdout] 1 | use image::{imageops, Rgba, RgbaImage};
[INFO] [stdout]   |             ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `DIFFICULTY_COLORS`
[INFO] [stdout]  --> src/drawing/components/difficulty.rs:7:46
[INFO] [stdout]   |
[INFO] [stdout] 7 | use crate::types::song::{DifficultyId, Song, DIFFICULTY_COLORS};
[INFO] [stdout]   |                                              ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `GenericImageView`
[INFO] [stdout]  --> src/drawing/components/sdchara.rs:3:13
[INFO] [stdout]   |
[INFO] [stdout] 3 | use image::{GenericImageView, imageops};
[INFO] [stdout]   |             ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `stack_horizontal`
[INFO] [stdout]  --> src/drawing/components/song.rs:6:43
[INFO] [stdout]   |
[INFO] [stdout] 6 | use crate::drawing::utils::{resize_exact, stack_horizontal};
[INFO] [stdout]   |                                           ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `DynamicImage`, `RgbaImage`, `Rgba`, and `imageops`
[INFO] [stdout]   --> src/drawing/components/song.rs:12:13
[INFO] [stdout]    |
[INFO] [stdout] 12 | use image::{imageops, DynamicImage, Rgba, RgbaImage};
[INFO] [stdout]    |             ^^^^^^^^  ^^^^^^^^^^^^  ^^^^  ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `DynamicImage` and `ImageBuffer`
[INFO] [stdout]  --> src/drawing/chart.rs:1:13
[INFO] [stdout]   |
[INFO] [stdout] 1 | use image::{DynamicImage, Rgba, RgbaImage, ImageBuffer};
[INFO] [stdout]   |             ^^^^^^^^^^^^                   ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `draw_text_mut`
[INFO] [stdout]  --> src/drawing/chart.rs:2:71
[INFO] [stdout]   |
[INFO] [stdout] 2 | use imageproc::drawing::{draw_line_segment_mut, draw_filled_rect_mut, draw_text_mut};
[INFO] [stdout]   |                                                                       ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `Font` and `Scale`
[INFO] [stdout]  --> src/drawing/chart.rs:4:16
[INFO] [stdout]   |
[INFO] [stdout] 4 | use rusttype::{Font, Scale};
[INFO] [stdout]   |                ^^^^  ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `DIFFICULTY_COLORS`
[INFO] [stdout]  --> src/drawing/chart.rs:9:64
[INFO] [stdout]   |
[INFO] [stdout] 9 | use crate::types::song::{Song, DifficultyId, DIFFICULTY_NAMES, DIFFICULTY_COLORS};
[INFO] [stdout]   |                                                                ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `serde_json::Value`
[INFO] [stdout]  --> src/view/song_chart.rs:1:5
[INFO] [stdout]   |
[INFO] [stdout] 1 | use serde_json::Value;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `crate::drawing::chart::ChartRenderer`
[INFO] [stdout]  --> src/view/song_chart.rs:5:5
[INFO] [stdout]   |
[INFO] [stdout] 5 | use crate::drawing::chart::ChartRenderer;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `crate::types::chart::ChartData`
[INFO] [stdout]  --> src/view/song_chart.rs:8:5
[INFO] [stdout]   |
[INFO] [stdout] 8 | use crate::types::chart::ChartData;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `crate::drawing::canvas::Canvas`
[INFO] [stdout]  --> src/view/song_list.rs:4:5
[INFO] [stdout]   |
[INFO] [stdout] 4 | use crate::drawing::canvas::Canvas;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `stack_image_horizontal`
[INFO] [stdout]  --> src/view/song_list.rs:6:54
[INFO] [stdout]   |
[INFO] [stdout] 6 | use crate::drawing::components::utils::{stack_image, stack_image_horizontal};
[INFO] [stdout]   |                                                      ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `crate::models::Server`
[INFO] [stdout]   --> src/types/mod.rs:22:5
[INFO] [stdout]    |
[INFO] [stdout] 22 | use crate::models::Server;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `error`
[INFO] [stdout]  --> src/fuzzy_search/engine.rs:5:21
[INFO] [stdout]   |
[INFO] [stdout] 5 | use tracing::{info, error};
[INFO] [stdout]   |                     ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `image::Rgba`
[INFO] [stdout]  --> src/drawing/text.rs:5:5
[INFO] [stdout]   |
[INFO] [stdout] 5 | use image::Rgba;
[INFO] [stdout]   |     ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `apply_opacity`
[INFO] [stdout]  --> src/drawing/rect.rs:2:42
[INFO] [stdout]   |
[INFO] [stdout] 2 | use crate::drawing::utils::{parse_color, apply_opacity};
[INFO] [stdout]   |                                          ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `RgbaImage`
[INFO] [stdout]  --> src/drawing/utils.rs:1:55
[INFO] [stdout]   |
[INFO] [stdout] 1 | use image::{DynamicImage, GenericImageView, imageops, RgbaImage};
[INFO] [stdout]   |                                                       ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Arc`
[INFO] [stdout]   --> src/drawing/card.rs:12:17
[INFO] [stdout]    |
[INFO] [stdout] 12 | use std::sync::{Arc, OnceLock};
[INFO] [stdout]    |                 ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `imageops`
[INFO] [stdout]  --> src/drawing/components/difficulty.rs:1:13
[INFO] [stdout]   |
[INFO] [stdout] 1 | use image::{imageops, Rgba, RgbaImage};
[INFO] [stdout]   |             ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `DIFFICULTY_COLORS`
[INFO] [stdout]  --> src/drawing/components/difficulty.rs:7:46
[INFO] [stdout]   |
[INFO] [stdout] 7 | use crate::types::song::{DifficultyId, Song, DIFFICULTY_COLORS};
[INFO] [stdout]   |                                              ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `GenericImageView`
[INFO] [stdout]  --> src/drawing/components/sdchara.rs:3:13
[INFO] [stdout]   |
[INFO] [stdout] 3 | use image::{GenericImageView, imageops};
[INFO] [stdout]   |             ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `stack_horizontal`
[INFO] [stdout]  --> src/drawing/components/song.rs:6:43
[INFO] [stdout]   |
[INFO] [stdout] 6 | use crate::drawing::utils::{resize_exact, stack_horizontal};
[INFO] [stdout]   |                                           ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `DynamicImage`, `RgbaImage`, `Rgba`, and `imageops`
[INFO] [stdout]   --> src/drawing/components/song.rs:12:13
[INFO] [stdout]    |
[INFO] [stdout] 12 | use image::{imageops, DynamicImage, Rgba, RgbaImage};
[INFO] [stdout]    |             ^^^^^^^^  ^^^^^^^^^^^^  ^^^^  ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `DynamicImage` and `ImageBuffer`
[INFO] [stdout]  --> src/drawing/chart.rs:1:13
[INFO] [stdout]   |
[INFO] [stdout] 1 | use image::{DynamicImage, Rgba, RgbaImage, ImageBuffer};
[INFO] [stdout]   |             ^^^^^^^^^^^^                   ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `draw_text_mut`
[INFO] [stdout]  --> src/drawing/chart.rs:2:71
[INFO] [stdout]   |
[INFO] [stdout] 2 | use imageproc::drawing::{draw_line_segment_mut, draw_filled_rect_mut, draw_text_mut};
[INFO] [stdout]   |                                                                       ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `Font` and `Scale`
[INFO] [stdout]  --> src/drawing/chart.rs:4:16
[INFO] [stdout]   |
[INFO] [stdout] 4 | use rusttype::{Font, Scale};
[INFO] [stdout]   |                ^^^^  ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `DIFFICULTY_COLORS`
[INFO] [stdout]  --> src/drawing/chart.rs:9:64
[INFO] [stdout]   |
[INFO] [stdout] 9 | use crate::types::song::{Song, DifficultyId, DIFFICULTY_NAMES, DIFFICULTY_COLORS};
[INFO] [stdout]   |                                                                ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `serde_json::Value`
[INFO] [stdout]  --> src/view/song_chart.rs:1:5
[INFO] [stdout]   |
[INFO] [stdout] 1 | use serde_json::Value;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `crate::drawing::chart::ChartRenderer`
[INFO] [stdout]  --> src/view/song_chart.rs:5:5
[INFO] [stdout]   |
[INFO] [stdout] 5 | use crate::drawing::chart::ChartRenderer;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `crate::types::chart::ChartData`
[INFO] [stdout]  --> src/view/song_chart.rs:8:5
[INFO] [stdout]   |
[INFO] [stdout] 8 | use crate::types::chart::ChartData;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `crate::drawing::canvas::Canvas`
[INFO] [stdout]  --> src/view/song_list.rs:4:5
[INFO] [stdout]   |
[INFO] [stdout] 4 | use crate::drawing::canvas::Canvas;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `stack_image_horizontal`
[INFO] [stdout]  --> src/view/song_list.rs:6:54
[INFO] [stdout]   |
[INFO] [stdout] 6 | use crate::drawing::components::utils::{stack_image, stack_image_horizontal};
[INFO] [stdout]   |                                                      ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:37:9
[INFO] [stdout]    |
[INFO] [stdout] 37 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(deprecated)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:42:9
[INFO] [stdout]    |
[INFO] [stdout] 42 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:47:9
[INFO] [stdout]    |
[INFO] [stdout] 47 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:52:9
[INFO] [stdout]    |
[INFO] [stdout] 52 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:58:9
[INFO] [stdout]    |
[INFO] [stdout] 58 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:63:9
[INFO] [stdout]    |
[INFO] [stdout] 63 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:69:9
[INFO] [stdout]    |
[INFO] [stdout] 69 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:75:9
[INFO] [stdout]    |
[INFO] [stdout] 75 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:80:9
[INFO] [stdout]    |
[INFO] [stdout] 80 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:85:9
[INFO] [stdout]    |
[INFO] [stdout] 85 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:91:9
[INFO] [stdout]    |
[INFO] [stdout] 91 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:31:20
[INFO] [stdout]    |
[INFO] [stdout] 31 |     use image::io::Reader as ImageReader;
[INFO] [stdout]    |                    ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]  --> src/drawing/components/title.rs:2:16
[INFO] [stdout]   |
[INFO] [stdout] 2 | use image::io::Reader as ImageReader;
[INFO] [stdout]   |                ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/components/title.rs:14:19
[INFO] [stdout]    |
[INFO] [stdout] 14 |         let img = ImageReader::new(Cursor::new(data))
[INFO] [stdout]    |                   ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:37:9
[INFO] [stdout]    |
[INFO] [stdout] 37 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(deprecated)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:42:9
[INFO] [stdout]    |
[INFO] [stdout] 42 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:47:9
[INFO] [stdout]    |
[INFO] [stdout] 47 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:52:9
[INFO] [stdout]    |
[INFO] [stdout] 52 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:58:9
[INFO] [stdout]    |
[INFO] [stdout] 58 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:63:9
[INFO] [stdout]    |
[INFO] [stdout] 63 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:69:9
[INFO] [stdout]    |
[INFO] [stdout] 69 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:75:9
[INFO] [stdout]    |
[INFO] [stdout] 75 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:80:9
[INFO] [stdout]    |
[INFO] [stdout] 80 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:85:9
[INFO] [stdout]    |
[INFO] [stdout] 85 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:91:9
[INFO] [stdout]    |
[INFO] [stdout] 91 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:31:20
[INFO] [stdout]    |
[INFO] [stdout] 31 |     use image::io::Reader as ImageReader;
[INFO] [stdout]    |                    ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]  --> src/drawing/components/title.rs:2:16
[INFO] [stdout]   |
[INFO] [stdout] 2 | use image::io::Reader as ImageReader;
[INFO] [stdout]   |                ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/components/title.rs:14:19
[INFO] [stdout]    |
[INFO] [stdout] 14 |         let img = ImageReader::new(Cursor::new(data))
[INFO] [stdout]    |                   ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `event_id`
[INFO] [stdout]    --> src/downloader/service.rs:233:9
[INFO] [stdout]     |
[INFO] [stdout] 233 |         event_id: u32,
[INFO] [stdout]     |         ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_event_id`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `event_id`
[INFO] [stdout]    --> src/downloader/service.rs:233:9
[INFO] [stdout]     |
[INFO] [stdout] 233 |         event_id: u32,
[INFO] [stdout]     |         ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_event_id`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `glyph`
[INFO] [stdout]    --> src/drawing/text.rs:223:13
[INFO] [stdout]     |
[INFO] [stdout] 223 |         let glyph = glyph_id.with_scale(scale.x);
[INFO] [stdout]     |             ^^^^^ help: if this is intentional, prefix it with an underscore: `_glyph`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/drawing/text.rs:439:9
[INFO] [stdout]     |
[INFO] [stdout] 439 |     let mut new_line = || {
[INFO] [stdout]     |         ----^^^^^^^^
[INFO] [stdout]     |         |
[INFO] [stdout]     |         help: remove this `mut`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `new_line`
[INFO] [stdout]    --> src/drawing/text.rs:439:9
[INFO] [stdout]     |
[INFO] [stdout] 439 |     let mut new_line = || {
[INFO] [stdout]     |         ^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_new_line`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `glyph`
[INFO] [stdout]    --> src/drawing/text.rs:223:13
[INFO] [stdout]     |
[INFO] [stdout] 223 |         let glyph = glyph_id.with_scale(scale.x);
[INFO] [stdout]     |             ^^^^^ help: if this is intentional, prefix it with an underscore: `_glyph`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/drawing/text.rs:439:9
[INFO] [stdout]     |
[INFO] [stdout] 439 |     let mut new_line = || {
[INFO] [stdout]     |         ----^^^^^^^^
[INFO] [stdout]     |         |
[INFO] [stdout]     |         help: remove this `mut`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `new_line`
[INFO] [stdout]    --> src/drawing/text.rs:439:9
[INFO] [stdout]     |
[INFO] [stdout] 439 |     let mut new_line = || {
[INFO] [stdout]     |         ^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_new_line`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `key`
[INFO] [stdout]   --> src/drawing/components/stat.rs:35:5
[INFO] [stdout]    |
[INFO] [stdout] 35 |     key: &str,
[INFO] [stdout]    |     ^^^ help: if this is intentional, prefix it with an underscore: `_key`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `server`
[INFO] [stdout]   --> src/drawing/chart.rs:65:9
[INFO] [stdout]    |
[INFO] [stdout] 65 |         server: Server,
[INFO] [stdout]    |         ^^^^^^ help: if this is intentional, prefix it with an underscore: `_server`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `song_id`
[INFO] [stdout]    --> src/drawing/chart.rs:195:9
[INFO] [stdout]     |
[INFO] [stdout] 195 |         song_id: u32,
[INFO] [stdout]     |         ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_song_id`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `title`
[INFO] [stdout]    --> src/drawing/chart.rs:196:9
[INFO] [stdout]     |
[INFO] [stdout] 196 |         title: &str,
[INFO] [stdout]     |         ^^^^^ help: if this is intentional, prefix it with an underscore: `_title`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `key`
[INFO] [stdout]   --> src/drawing/components/stat.rs:35:5
[INFO] [stdout]    |
[INFO] [stdout] 35 |     key: &str,
[INFO] [stdout]    |     ^^^ help: if this is intentional, prefix it with an underscore: `_key`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `level`
[INFO] [stdout]    --> src/drawing/chart.rs:198:9
[INFO] [stdout]     |
[INFO] [stdout] 198 |         level: u32,
[INFO] [stdout]     |         ^^^^^ help: if this is intentional, prefix it with an underscore: `_level`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `canvas`
[INFO] [stdout]    --> src/drawing/chart.rs:386:9
[INFO] [stdout]     |
[INFO] [stdout] 386 |         canvas: &mut RgbaImage,
[INFO] [stdout]     |         ^^^^^^ help: if this is intentional, prefix it with an underscore: `_canvas`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `x`
[INFO] [stdout]    --> src/drawing/chart.rs:415:17
[INFO] [stdout]     |
[INFO] [stdout] 415 |             let x = self.config.info_area_width + draw_col * original_width + self.config.block_distance;
[INFO] [stdout]     |                 ^ help: if this is intentional, prefix it with an underscore: `_x`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `y`
[INFO] [stdout]    --> src/drawing/chart.rs:416:17
[INFO] [stdout]     |
[INFO] [stdout] 416 |             let y = height as f32 - (i as f32 * self.config.height_per_second as f32) % height as f32;
[INFO] [stdout]     |                 ^ help: if this is intentional, prefix it with an underscore: `_y`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `original_width`
[INFO] [stdout]    --> src/drawing/chart.rs:432:13
[INFO] [stdout]     |
[INFO] [stdout] 432 |         let original_width = self.config.block_distance * 2 + self.config.lane_width * 7;
[INFO] [stdout]     |             ^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_original_width`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `server`
[INFO] [stdout]   --> src/drawing/chart.rs:65:9
[INFO] [stdout]    |
[INFO] [stdout] 65 |         server: Server,
[INFO] [stdout]    |         ^^^^^^ help: if this is intentional, prefix it with an underscore: `_server`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `song_id`
[INFO] [stdout]    --> src/drawing/chart.rs:195:9
[INFO] [stdout]     |
[INFO] [stdout] 195 |         song_id: u32,
[INFO] [stdout]     |         ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_song_id`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `title`
[INFO] [stdout]    --> src/drawing/chart.rs:196:9
[INFO] [stdout]     |
[INFO] [stdout] 196 |         title: &str,
[INFO] [stdout]     |         ^^^^^ help: if this is intentional, prefix it with an underscore: `_title`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `level`
[INFO] [stdout]    --> src/drawing/chart.rs:198:9
[INFO] [stdout]     |
[INFO] [stdout] 198 |         level: u32,
[INFO] [stdout]     |         ^^^^^ help: if this is intentional, prefix it with an underscore: `_level`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `canvas`
[INFO] [stdout]    --> src/drawing/chart.rs:386:9
[INFO] [stdout]     |
[INFO] [stdout] 386 |         canvas: &mut RgbaImage,
[INFO] [stdout]     |         ^^^^^^ help: if this is intentional, prefix it with an underscore: `_canvas`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `x`
[INFO] [stdout]    --> src/drawing/chart.rs:415:17
[INFO] [stdout]     |
[INFO] [stdout] 415 |             let x = self.config.info_area_width + draw_col * original_width + self.config.block_distance;
[INFO] [stdout]     |                 ^ help: if this is intentional, prefix it with an underscore: `_x`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `y`
[INFO] [stdout]    --> src/drawing/chart.rs:416:17
[INFO] [stdout]     |
[INFO] [stdout] 416 |             let y = height as f32 - (i as f32 * self.config.height_per_second as f32) % height as f32;
[INFO] [stdout]     |                 ^ help: if this is intentional, prefix it with an underscore: `_y`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `original_width`
[INFO] [stdout]    --> src/drawing/chart.rs:432:13
[INFO] [stdout]     |
[INFO] [stdout] 432 |         let original_width = self.config.block_distance * 2 + self.config.lane_width * 7;
[INFO] [stdout]     |             ^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_original_width`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `compress`
[INFO] [stdout]    --> src/view/card_list.rs:214:5
[INFO] [stdout]     |
[INFO] [stdout] 214 |     compress: bool,
[INFO] [stdout]     |     ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_compress`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `compress`
[INFO] [stdout]   --> src/view/song_detail.rs:24:5
[INFO] [stdout]    |
[INFO] [stdout] 24 |     compress: bool,
[INFO] [stdout]    |     ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_compress`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `compress`
[INFO] [stdout]    --> src/view/card_list.rs:214:5
[INFO] [stdout]     |
[INFO] [stdout] 214 |     compress: bool,
[INFO] [stdout]     |     ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_compress`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `compress`
[INFO] [stdout]   --> src/view/song_detail.rs:24:5
[INFO] [stdout]    |
[INFO] [stdout] 24 |     compress: bool,
[INFO] [stdout]    |     ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_compress`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `song_id`
[INFO] [stdout]   --> src/view/song_list.rs:82:10
[INFO] [stdout]    |
[INFO] [stdout] 82 |     for (song_id, song) in &temp_song_list {
[INFO] [stdout]    |          ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_song_id`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `song_id`
[INFO] [stdout]   --> src/view/song_list.rs:82:10
[INFO] [stdout]    |
[INFO] [stdout] 82 |     for (song_id, song) in &temp_song_list {
[INFO] [stdout]    |          ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_song_id`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `deserialize_string_or_number` is never used
[INFO] [stdout]   --> src/types/song.rs:21:4
[INFO] [stdout]    |
[INFO] [stdout] 21 | fn deserialize_string_or_number<'de, D>(deserializer: D) -> Result<Option<i64>, D::Error>
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `deserialize_string_or_number` is never used
[INFO] [stdout]   --> src/types/song.rs:21:4
[INFO] [stdout]    |
[INFO] [stdout] 21 | fn deserialize_string_or_number<'de, D>(deserializer: D) -> Result<Option<i64>, D::Error>
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `image::Rgba`
[INFO] [stdout]  --> src/drawing/text.rs:5:5
[INFO] [stdout]   |
[INFO] [stdout] 5 | use image::Rgba;
[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: `apply_opacity`
[INFO] [stdout]  --> src/drawing/rect.rs:2:42
[INFO] [stdout]   |
[INFO] [stdout] 2 | use crate::drawing::utils::{parse_color, apply_opacity};
[INFO] [stdout]   |                                          ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `RgbaImage`
[INFO] [stdout]  --> src/drawing/utils.rs:1:55
[INFO] [stdout]   |
[INFO] [stdout] 1 | use image::{DynamicImage, GenericImageView, imageops, RgbaImage};
[INFO] [stdout]   |                                                       ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Arc`
[INFO] [stdout]   --> src/drawing/card.rs:12:17
[INFO] [stdout]    |
[INFO] [stdout] 12 | use std::sync::{Arc, OnceLock};
[INFO] [stdout]    |                 ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `imageops`
[INFO] [stdout]  --> src/drawing/components/difficulty.rs:1:13
[INFO] [stdout]   |
[INFO] [stdout] 1 | use image::{imageops, Rgba, RgbaImage};
[INFO] [stdout]   |             ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `DIFFICULTY_COLORS`
[INFO] [stdout]  --> src/drawing/components/difficulty.rs:7:46
[INFO] [stdout]   |
[INFO] [stdout] 7 | use crate::types::song::{DifficultyId, Song, DIFFICULTY_COLORS};
[INFO] [stdout]   |                                              ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `GenericImageView`
[INFO] [stdout]  --> src/drawing/components/sdchara.rs:3:13
[INFO] [stdout]   |
[INFO] [stdout] 3 | use image::{GenericImageView, imageops};
[INFO] [stdout]   |             ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `stack_horizontal`
[INFO] [stdout]  --> src/drawing/components/song.rs:6:43
[INFO] [stdout]   |
[INFO] [stdout] 6 | use crate::drawing::utils::{resize_exact, stack_horizontal};
[INFO] [stdout]   |                                           ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `DynamicImage`, `RgbaImage`, `Rgba`, and `imageops`
[INFO] [stdout]   --> src/drawing/components/song.rs:12:13
[INFO] [stdout]    |
[INFO] [stdout] 12 | use image::{imageops, DynamicImage, Rgba, RgbaImage};
[INFO] [stdout]    |             ^^^^^^^^  ^^^^^^^^^^^^  ^^^^  ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `draw_difficulty_list`, `draw_difficulty_with_meta`, and `draw_difficulty`
[INFO] [stdout]   --> src/drawing/components/mod.rs:22:22
[INFO] [stdout]    |
[INFO] [stdout] 22 | pub use difficulty::{draw_difficulty, draw_difficulty_list, draw_difficulty_with_meta};
[INFO] [stdout]    |                      ^^^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `draw_song_data_block` and `draw_song_in_list`
[INFO] [stdout]   --> src/drawing/components/mod.rs:30:16
[INFO] [stdout]    |
[INFO] [stdout] 30 | pub use song::{draw_song_data_block, draw_song_in_list};
[INFO] [stdout]    |                ^^^^^^^^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `DynamicImage` and `ImageBuffer`
[INFO] [stdout]  --> src/drawing/chart.rs:1:13
[INFO] [stdout]   |
[INFO] [stdout] 1 | use image::{DynamicImage, Rgba, RgbaImage, ImageBuffer};
[INFO] [stdout]   |             ^^^^^^^^^^^^                   ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `draw_text_mut`
[INFO] [stdout]  --> src/drawing/chart.rs:2:71
[INFO] [stdout]   |
[INFO] [stdout] 2 | use imageproc::drawing::{draw_line_segment_mut, draw_filled_rect_mut, draw_text_mut};
[INFO] [stdout]   |                                                                       ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `Font` and `Scale`
[INFO] [stdout]  --> src/drawing/chart.rs:4:16
[INFO] [stdout]   |
[INFO] [stdout] 4 | use rusttype::{Font, Scale};
[INFO] [stdout]   |                ^^^^  ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `DIFFICULTY_COLORS`
[INFO] [stdout]  --> src/drawing/chart.rs:9:64
[INFO] [stdout]   |
[INFO] [stdout] 9 | use crate::types::song::{Song, DifficultyId, DIFFICULTY_NAMES, DIFFICULTY_COLORS};
[INFO] [stdout]   |                                                                ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `measure_text_width`
[INFO] [stdout]   --> src/drawing/mod.rs:21:44
[INFO] [stdout]    |
[INFO] [stdout] 21 | pub use text::{draw_text, DrawTextOptions, measure_text_width, draw_text_with_images, DrawTextWithImagesOptions, ContentItem};
[INFO] [stdout]    |                                            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `TextAlign`
[INFO] [stdout]   --> src/drawing/mod.rs:22:112
[INFO] [stdout]    |
[INFO] [stdout] 22 | pub use rect::{draw_rounded_rect, RoundedRectOptions, draw_rounded_rect_with_text, RoundedRectWithTextOptions, TextAlign};
[INFO] [stdout]    |                                                                                                                ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `DataBlockHorizontalOptions`, `ResizeImageOptions`, `TipsInListOptions`, `create_easy_bg`, `draw_datablock_horizontal`, `draw_tips_in_list`, `format_timestamp`, `resize_image`, `stack_image_horizontal`, and `stack_image`
[INFO] [stdout]   --> src/drawing/mod.rs:31:21
[INFO] [stdout]    |
[INFO] [stdout] 31 |     draw_datablock, draw_datablock_horizontal,
[INFO] [stdout]    |                     ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 32 |     DataBlockOptions, DataBlockHorizontalOptions,
[INFO] [stdout]    |                       ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 33 |     draw_list, draw_list_merge, draw_list_by_server_list, draw_tips_in_list, ListOptions, TipsInListOptions, get_list_line,
[INFO] [stdout]    |                                                           ^^^^^^^^^^^^^^^^^               ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 34 |     stack_image, stack_image_horizontal, resize_image, ResizeImageOptions,
[INFO] [stdout]    |     ^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^^^^^^  ^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 35 |     draw_card_prefix,
[INFO] [stdout] 36 |     draw_time_in_list, format_timestamp,
[INFO] [stdout]    |                        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 37 |     output_final_buffer, OutputFinalOptions, create_easy_bg,
[INFO] [stdout]    |                                              ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `error`
[INFO] [stdout]  --> src/fuzzy_search/engine.rs:5:21
[INFO] [stdout]   |
[INFO] [stdout] 5 | use tracing::{info, error};
[INFO] [stdout]   |                     ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `AliasValue`, `FIELD_ALL`, `FIELD_NUMBER`, `FIELD_SONG_LEVELS`, `FuzzySearchConfig`, and `IndexEntry`
[INFO] [stdout]  --> src/fuzzy_search/mod.rs:7:5
[INFO] [stdout]   |
[INFO] [stdout] 7 |     FuzzySearchConfig, FuzzySearchResult, AliasValue, ValueType, IndexEntry,
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^                     ^^^^^^^^^^             ^^^^^^^^^^
[INFO] [stdout] 8 |     FIELD_NUMBER, FIELD_RELATION, FIELD_ALL, FIELD_SONG_LEVELS,
[INFO] [stdout]   |     ^^^^^^^^^^^^                  ^^^^^^^^^  ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `extract_keywords`, `is_integer`, and `parse_query`
[INFO] [stdout]   --> src/fuzzy_search/mod.rs:10:18
[INFO] [stdout]    |
[INFO] [stdout] 10 | pub use parser::{extract_keywords, parse_query, is_integer};
[INFO] [stdout]    |                  ^^^^^^^^^^^^^^^^  ^^^^^^^^^^^  ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `serde_json::Value as JsonValue`
[INFO] [stdout]   --> src/fuzzy_search/mod.rs:15:9
[INFO] [stdout]    |
[INFO] [stdout] 15 | pub use serde_json::Value as JsonValue;
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `bytes::Bytes`
[INFO] [stdout]    --> src/models/server.rs:175:17
[INFO] [stdout]     |
[INFO] [stdout] 175 |             use bytes::Bytes;
[INFO] [stdout]     |                 ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Serialize`
[INFO] [stdout]  --> src/routes/search.rs:2:26
[INFO] [stdout]   |
[INFO] [stdout] 2 | use serde::{Deserialize, Serialize};
[INFO] [stdout]   |                          ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `attribute::Attribute`
[INFO] [stdout]   --> src/types/mod.rs:13:9
[INFO] [stdout]    |
[INFO] [stdout] 13 | pub use attribute::Attribute;
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `BandId` and `Band`
[INFO] [stdout]   --> src/types/mod.rs:14:16
[INFO] [stdout]    |
[INFO] [stdout] 14 | pub use band::{Band, BandId};
[INFO] [stdout]    |                ^^^^  ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `CharacterId`, `CharacterProfile`, and `Character`
[INFO] [stdout]   --> src/types/mod.rs:15:21
[INFO] [stdout]    |
[INFO] [stdout] 15 | pub use character::{Character, CharacterId, CharacterProfile};
[INFO] [stdout]    |                     ^^^^^^^^^  ^^^^^^^^^^^  ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `SkillEffectType` and `SkillId`
[INFO] [stdout]   --> src/types/mod.rs:16:24
[INFO] [stdout]    |
[INFO] [stdout] 16 | pub use skill::{Skill, SkillId, SkillEffectType};
[INFO] [stdout]    |                        ^^^^^^^  ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `CardId`, `CardStat`, `CardType`, and `Rarity`
[INFO] [stdout]   --> src/types/mod.rs:17:22
[INFO] [stdout]    |
[INFO] [stdout] 17 | pub use card::{Card, CardId, CardStat, CardType, Rarity};
[INFO] [stdout]    |                      ^^^^^^  ^^^^^^^^  ^^^^^^^^  ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `CostumeId`
[INFO] [stdout]   --> src/types/mod.rs:18:28
[INFO] [stdout]    |
[INFO] [stdout] 18 | pub use costume::{Costume, CostumeId};
[INFO] [stdout]    |                            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `DifficultyId`, `SongId`, `SongTag`, and `Song`
[INFO] [stdout]   --> src/types/mod.rs:19:16
[INFO] [stdout]    |
[INFO] [stdout] 19 | pub use song::{Song, SongId, DifficultyId, SongTag};
[INFO] [stdout]    |                ^^^^  ^^^^^^  ^^^^^^^^^^^^  ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `AttributeBonus`, `CharacterBonus`, `DoubleBonus`, `EventId`, `EventType`, and `Event`
[INFO] [stdout]   --> src/types/mod.rs:20:17
[INFO] [stdout]    |
[INFO] [stdout] 20 | pub use event::{Event, EventId, EventType, AttributeBonus, CharacterBonus, DoubleBonus};
[INFO] [stdout]    |                 ^^^^^  ^^^^^^^  ^^^^^^^^^  ^^^^^^^^^^^^^^  ^^^^^^^^^^^^^^  ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `crate::models::Server`
[INFO] [stdout]   --> src/types/mod.rs:22:5
[INFO] [stdout]    |
[INFO] [stdout] 22 | use crate::models::Server;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `serde_json::Value`
[INFO] [stdout]  --> src/view/song_chart.rs:1:5
[INFO] [stdout]   |
[INFO] [stdout] 1 | use serde_json::Value;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `crate::drawing::chart::ChartRenderer`
[INFO] [stdout]  --> src/view/song_chart.rs:5:5
[INFO] [stdout]   |
[INFO] [stdout] 5 | use crate::drawing::chart::ChartRenderer;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `crate::types::chart::ChartData`
[INFO] [stdout]  --> src/view/song_chart.rs:8:5
[INFO] [stdout]   |
[INFO] [stdout] 8 | use crate::types::chart::ChartData;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `crate::drawing::canvas::Canvas`
[INFO] [stdout]  --> src/view/song_list.rs:4:5
[INFO] [stdout]   |
[INFO] [stdout] 4 | use crate::drawing::canvas::Canvas;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `stack_image_horizontal`
[INFO] [stdout]  --> src/view/song_list.rs:6:54
[INFO] [stdout]   |
[INFO] [stdout] 6 | use crate::drawing::components::utils::{stack_image, stack_image_horizontal};
[INFO] [stdout]   |                                                      ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `song_detail::draw_song_detail`
[INFO] [stdout]   --> src/view/mod.rs:10:9
[INFO] [stdout]    |
[INFO] [stdout] 10 | pub use song_detail::draw_song_detail;
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `song_list::draw_song_list`
[INFO] [stdout]   --> src/view/mod.rs:11:9
[INFO] [stdout]    |
[INFO] [stdout] 11 | pub use song_list::draw_song_list;
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `image::Rgba`
[INFO] [stdout]  --> src/drawing/text.rs:5:5
[INFO] [stdout]   |
[INFO] [stdout] 5 | use image::Rgba;
[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: `apply_opacity`
[INFO] [stdout]  --> src/drawing/rect.rs:2:42
[INFO] [stdout]   |
[INFO] [stdout] 2 | use crate::drawing::utils::{parse_color, apply_opacity};
[INFO] [stdout]   |                                          ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `RgbaImage`
[INFO] [stdout]  --> src/drawing/utils.rs:1:55
[INFO] [stdout]   |
[INFO] [stdout] 1 | use image::{DynamicImage, GenericImageView, imageops, RgbaImage};
[INFO] [stdout]   |                                                       ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Arc`
[INFO] [stdout]   --> src/drawing/card.rs:12:17
[INFO] [stdout]    |
[INFO] [stdout] 12 | use std::sync::{Arc, OnceLock};
[INFO] [stdout]    |                 ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `imageops`
[INFO] [stdout]  --> src/drawing/components/difficulty.rs:1:13
[INFO] [stdout]   |
[INFO] [stdout] 1 | use image::{imageops, Rgba, RgbaImage};
[INFO] [stdout]   |             ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `DIFFICULTY_COLORS`
[INFO] [stdout]  --> src/drawing/components/difficulty.rs:7:46
[INFO] [stdout]   |
[INFO] [stdout] 7 | use crate::types::song::{DifficultyId, Song, DIFFICULTY_COLORS};
[INFO] [stdout]   |                                              ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `GenericImageView`
[INFO] [stdout]  --> src/drawing/components/sdchara.rs:3:13
[INFO] [stdout]   |
[INFO] [stdout] 3 | use image::{GenericImageView, imageops};
[INFO] [stdout]   |             ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `stack_horizontal`
[INFO] [stdout]  --> src/drawing/components/song.rs:6:43
[INFO] [stdout]   |
[INFO] [stdout] 6 | use crate::drawing::utils::{resize_exact, stack_horizontal};
[INFO] [stdout]   |                                           ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `DynamicImage`, `RgbaImage`, `Rgba`, and `imageops`
[INFO] [stdout]   --> src/drawing/components/song.rs:12:13
[INFO] [stdout]    |
[INFO] [stdout] 12 | use image::{imageops, DynamicImage, Rgba, RgbaImage};
[INFO] [stdout]    |             ^^^^^^^^  ^^^^^^^^^^^^  ^^^^  ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `draw_difficulty_list`, `draw_difficulty_with_meta`, and `draw_difficulty`
[INFO] [stdout]   --> src/drawing/components/mod.rs:22:22
[INFO] [stdout]    |
[INFO] [stdout] 22 | pub use difficulty::{draw_difficulty, draw_difficulty_list, draw_difficulty_with_meta};
[INFO] [stdout]    |                      ^^^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `draw_song_data_block` and `draw_song_in_list`
[INFO] [stdout]   --> src/drawing/components/mod.rs:30:16
[INFO] [stdout]    |
[INFO] [stdout] 30 | pub use song::{draw_song_data_block, draw_song_in_list};
[INFO] [stdout]    |                ^^^^^^^^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `DynamicImage` and `ImageBuffer`
[INFO] [stdout]  --> src/drawing/chart.rs:1:13
[INFO] [stdout]   |
[INFO] [stdout] 1 | use image::{DynamicImage, Rgba, RgbaImage, ImageBuffer};
[INFO] [stdout]   |             ^^^^^^^^^^^^                   ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `draw_text_mut`
[INFO] [stdout]  --> src/drawing/chart.rs:2:71
[INFO] [stdout]   |
[INFO] [stdout] 2 | use imageproc::drawing::{draw_line_segment_mut, draw_filled_rect_mut, draw_text_mut};
[INFO] [stdout]   |                                                                       ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `Font` and `Scale`
[INFO] [stdout]  --> src/drawing/chart.rs:4:16
[INFO] [stdout]   |
[INFO] [stdout] 4 | use rusttype::{Font, Scale};
[INFO] [stdout]   |                ^^^^  ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `DIFFICULTY_COLORS`
[INFO] [stdout]  --> src/drawing/chart.rs:9:64
[INFO] [stdout]   |
[INFO] [stdout] 9 | use crate::types::song::{Song, DifficultyId, DIFFICULTY_NAMES, DIFFICULTY_COLORS};
[INFO] [stdout]   |                                                                ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `measure_text_width`
[INFO] [stdout]   --> src/drawing/mod.rs:21:44
[INFO] [stdout]    |
[INFO] [stdout] 21 | pub use text::{draw_text, DrawTextOptions, measure_text_width, draw_text_with_images, DrawTextWithImagesOptions, ContentItem};
[INFO] [stdout]    |                                            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `TextAlign`
[INFO] [stdout]   --> src/drawing/mod.rs:22:112
[INFO] [stdout]    |
[INFO] [stdout] 22 | pub use rect::{draw_rounded_rect, RoundedRectOptions, draw_rounded_rect_with_text, RoundedRectWithTextOptions, TextAlign};
[INFO] [stdout]    |                                                                                                                ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `DataBlockHorizontalOptions`, `ResizeImageOptions`, `TipsInListOptions`, `create_easy_bg`, `draw_datablock_horizontal`, `draw_tips_in_list`, `format_timestamp`, `resize_image`, `stack_image_horizontal`, and `stack_image`
[INFO] [stdout]   --> src/drawing/mod.rs:31:21
[INFO] [stdout]    |
[INFO] [stdout] 31 |     draw_datablock, draw_datablock_horizontal,
[INFO] [stdout]    |                     ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 32 |     DataBlockOptions, DataBlockHorizontalOptions,
[INFO] [stdout]    |                       ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 33 |     draw_list, draw_list_merge, draw_list_by_server_list, draw_tips_in_list, ListOptions, TipsInListOptions, get_list_line,
[INFO] [stdout]    |                                                           ^^^^^^^^^^^^^^^^^               ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 34 |     stack_image, stack_image_horizontal, resize_image, ResizeImageOptions,
[INFO] [stdout]    |     ^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^^^^^^  ^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 35 |     draw_card_prefix,
[INFO] [stdout] 36 |     draw_time_in_list, format_timestamp,
[INFO] [stdout]    |                        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 37 |     output_final_buffer, OutputFinalOptions, create_easy_bg,
[INFO] [stdout]    |                                              ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `error`
[INFO] [stdout]  --> src/fuzzy_search/engine.rs:5:21
[INFO] [stdout]   |
[INFO] [stdout] 5 | use tracing::{info, error};
[INFO] [stdout]   |                     ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `AliasValue`, `FIELD_ALL`, `FIELD_NUMBER`, `FIELD_SONG_LEVELS`, `FuzzySearchConfig`, and `IndexEntry`
[INFO] [stdout]  --> src/fuzzy_search/mod.rs:7:5
[INFO] [stdout]   |
[INFO] [stdout] 7 |     FuzzySearchConfig, FuzzySearchResult, AliasValue, ValueType, IndexEntry,
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^                     ^^^^^^^^^^             ^^^^^^^^^^
[INFO] [stdout] 8 |     FIELD_NUMBER, FIELD_RELATION, FIELD_ALL, FIELD_SONG_LEVELS,
[INFO] [stdout]   |     ^^^^^^^^^^^^                  ^^^^^^^^^  ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `extract_keywords`, `is_integer`, and `parse_query`
[INFO] [stdout]   --> src/fuzzy_search/mod.rs:10:18
[INFO] [stdout]    |
[INFO] [stdout] 10 | pub use parser::{extract_keywords, parse_query, is_integer};
[INFO] [stdout]    |                  ^^^^^^^^^^^^^^^^  ^^^^^^^^^^^  ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `serde_json::Value as JsonValue`
[INFO] [stdout]   --> src/fuzzy_search/mod.rs:15:9
[INFO] [stdout]    |
[INFO] [stdout] 15 | pub use serde_json::Value as JsonValue;
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `bytes::Bytes`
[INFO] [stdout]    --> src/models/server.rs:175:17
[INFO] [stdout]     |
[INFO] [stdout] 175 |             use bytes::Bytes;
[INFO] [stdout]     |                 ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Serialize`
[INFO] [stdout]  --> src/routes/search.rs:2:26
[INFO] [stdout]   |
[INFO] [stdout] 2 | use serde::{Deserialize, Serialize};
[INFO] [stdout]   |                          ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `attribute::Attribute`
[INFO] [stdout]   --> src/types/mod.rs:13:9
[INFO] [stdout]    |
[INFO] [stdout] 13 | pub use attribute::Attribute;
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `BandId` and `Band`
[INFO] [stdout]   --> src/types/mod.rs:14:16
[INFO] [stdout]    |
[INFO] [stdout] 14 | pub use band::{Band, BandId};
[INFO] [stdout]    |                ^^^^  ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `CharacterId`, `CharacterProfile`, and `Character`
[INFO] [stdout]   --> src/types/mod.rs:15:21
[INFO] [stdout]    |
[INFO] [stdout] 15 | pub use character::{Character, CharacterId, CharacterProfile};
[INFO] [stdout]    |                     ^^^^^^^^^  ^^^^^^^^^^^  ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `SkillEffectType` and `SkillId`
[INFO] [stdout]   --> src/types/mod.rs:16:24
[INFO] [stdout]    |
[INFO] [stdout] 16 | pub use skill::{Skill, SkillId, SkillEffectType};
[INFO] [stdout]    |                        ^^^^^^^  ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `CardId`, `CardStat`, `CardType`, and `Rarity`
[INFO] [stdout]   --> src/types/mod.rs:17:22
[INFO] [stdout]    |
[INFO] [stdout] 17 | pub use card::{Card, CardId, CardStat, CardType, Rarity};
[INFO] [stdout]    |                      ^^^^^^  ^^^^^^^^  ^^^^^^^^  ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `CostumeId`
[INFO] [stdout]   --> src/types/mod.rs:18:28
[INFO] [stdout]    |
[INFO] [stdout] 18 | pub use costume::{Costume, CostumeId};
[INFO] [stdout]    |                            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `DifficultyId`, `SongId`, `SongTag`, and `Song`
[INFO] [stdout]   --> src/types/mod.rs:19:16
[INFO] [stdout]    |
[INFO] [stdout] 19 | pub use song::{Song, SongId, DifficultyId, SongTag};
[INFO] [stdout]    |                ^^^^  ^^^^^^  ^^^^^^^^^^^^  ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `AttributeBonus`, `CharacterBonus`, `DoubleBonus`, `EventId`, `EventType`, and `Event`
[INFO] [stdout]   --> src/types/mod.rs:20:17
[INFO] [stdout]    |
[INFO] [stdout] 20 | pub use event::{Event, EventId, EventType, AttributeBonus, CharacterBonus, DoubleBonus};
[INFO] [stdout]    |                 ^^^^^  ^^^^^^^  ^^^^^^^^^  ^^^^^^^^^^^^^^  ^^^^^^^^^^^^^^  ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `crate::models::Server`
[INFO] [stdout]   --> src/types/mod.rs:22:5
[INFO] [stdout]    |
[INFO] [stdout] 22 | use crate::models::Server;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `serde_json::Value`
[INFO] [stdout]  --> src/view/song_chart.rs:1:5
[INFO] [stdout]   |
[INFO] [stdout] 1 | use serde_json::Value;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `crate::drawing::chart::ChartRenderer`
[INFO] [stdout]  --> src/view/song_chart.rs:5:5
[INFO] [stdout]   |
[INFO] [stdout] 5 | use crate::drawing::chart::ChartRenderer;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `crate::types::chart::ChartData`
[INFO] [stdout]  --> src/view/song_chart.rs:8:5
[INFO] [stdout]   |
[INFO] [stdout] 8 | use crate::types::chart::ChartData;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `crate::drawing::canvas::Canvas`
[INFO] [stdout]  --> src/view/song_list.rs:4:5
[INFO] [stdout]   |
[INFO] [stdout] 4 | use crate::drawing::canvas::Canvas;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `stack_image_horizontal`
[INFO] [stdout]  --> src/view/song_list.rs:6:54
[INFO] [stdout]   |
[INFO] [stdout] 6 | use crate::drawing::components::utils::{stack_image, stack_image_horizontal};
[INFO] [stdout]   |                                                      ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `song_detail::draw_song_detail`
[INFO] [stdout]   --> src/view/mod.rs:10:9
[INFO] [stdout]    |
[INFO] [stdout] 10 | pub use song_detail::draw_song_detail;
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `song_list::draw_song_list`
[INFO] [stdout]   --> src/view/mod.rs:11:9
[INFO] [stdout]    |
[INFO] [stdout] 11 | pub use song_list::draw_song_list;
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:37:9
[INFO] [stdout]    |
[INFO] [stdout] 37 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(deprecated)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:42:9
[INFO] [stdout]    |
[INFO] [stdout] 42 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:47:9
[INFO] [stdout]    |
[INFO] [stdout] 47 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:52:9
[INFO] [stdout]    |
[INFO] [stdout] 52 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:58:9
[INFO] [stdout]    |
[INFO] [stdout] 58 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:63:9
[INFO] [stdout]    |
[INFO] [stdout] 63 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:69:9
[INFO] [stdout]    |
[INFO] [stdout] 69 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:75:9
[INFO] [stdout]    |
[INFO] [stdout] 75 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:80:9
[INFO] [stdout]    |
[INFO] [stdout] 80 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:85:9
[INFO] [stdout]    |
[INFO] [stdout] 85 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:91:9
[INFO] [stdout]    |
[INFO] [stdout] 91 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:31:20
[INFO] [stdout]    |
[INFO] [stdout] 31 |     use image::io::Reader as ImageReader;
[INFO] [stdout]    |                    ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]  --> src/drawing/components/title.rs:2:16
[INFO] [stdout]   |
[INFO] [stdout] 2 | use image::io::Reader as ImageReader;
[INFO] [stdout]   |                ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/components/title.rs:14:19
[INFO] [stdout]    |
[INFO] [stdout] 14 |         let img = ImageReader::new(Cursor::new(data))
[INFO] [stdout]    |                   ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:37:9
[INFO] [stdout]    |
[INFO] [stdout] 37 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(deprecated)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:42:9
[INFO] [stdout]    |
[INFO] [stdout] 42 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:47:9
[INFO] [stdout]    |
[INFO] [stdout] 47 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:52:9
[INFO] [stdout]    |
[INFO] [stdout] 52 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:58:9
[INFO] [stdout]    |
[INFO] [stdout] 58 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:63:9
[INFO] [stdout]    |
[INFO] [stdout] 63 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:69:9
[INFO] [stdout]    |
[INFO] [stdout] 69 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:75:9
[INFO] [stdout]    |
[INFO] [stdout] 75 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:80:9
[INFO] [stdout]    |
[INFO] [stdout] 80 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:85:9
[INFO] [stdout]    |
[INFO] [stdout] 85 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:91:9
[INFO] [stdout]    |
[INFO] [stdout] 91 |         ImageReader::new(Cursor::new(data)).with_guessed_format().unwrap().decode().unwrap()
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/card.rs:31:20
[INFO] [stdout]    |
[INFO] [stdout] 31 |     use image::io::Reader as ImageReader;
[INFO] [stdout]    |                    ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]  --> src/drawing/components/title.rs:2:16
[INFO] [stdout]   |
[INFO] [stdout] 2 | use image::io::Reader as ImageReader;
[INFO] [stdout]   |                ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated type alias `image::io::Reader`: this type has been moved and renamed to image::ImageReader
[INFO] [stdout]   --> src/drawing/components/title.rs:14:19
[INFO] [stdout]    |
[INFO] [stdout] 14 |         let img = ImageReader::new(Cursor::new(data))
[INFO] [stdout]    |                   ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `event_id`
[INFO] [stdout]    --> src/downloader/service.rs:233:9
[INFO] [stdout]     |
[INFO] [stdout] 233 |         event_id: u32,
[INFO] [stdout]     |         ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_event_id`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `glyph`
[INFO] [stdout]    --> src/drawing/text.rs:223:13
[INFO] [stdout]     |
[INFO] [stdout] 223 |         let glyph = glyph_id.with_scale(scale.x);
[INFO] [stdout]     |             ^^^^^ help: if this is intentional, prefix it with an underscore: `_glyph`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/drawing/text.rs:439:9
[INFO] [stdout]     |
[INFO] [stdout] 439 |     let mut new_line = || {
[INFO] [stdout]     |         ----^^^^^^^^
[INFO] [stdout]     |         |
[INFO] [stdout]     |         help: remove this `mut`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `new_line`
[INFO] [stdout]    --> src/drawing/text.rs:439:9
[INFO] [stdout]     |
[INFO] [stdout] 439 |     let mut new_line = || {
[INFO] [stdout]     |         ^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_new_line`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `event_id`
[INFO] [stdout]    --> src/downloader/service.rs:233:9
[INFO] [stdout]     |
[INFO] [stdout] 233 |         event_id: u32,
[INFO] [stdout]     |         ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_event_id`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `glyph`
[INFO] [stdout]    --> src/drawing/text.rs:223:13
[INFO] [stdout]     |
[INFO] [stdout] 223 |         let glyph = glyph_id.with_scale(scale.x);
[INFO] [stdout]     |             ^^^^^ help: if this is intentional, prefix it with an underscore: `_glyph`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/drawing/text.rs:439:9
[INFO] [stdout]     |
[INFO] [stdout] 439 |     let mut new_line = || {
[INFO] [stdout]     |         ----^^^^^^^^
[INFO] [stdout]     |         |
[INFO] [stdout]     |         help: remove this `mut`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `new_line`
[INFO] [stdout]    --> src/drawing/text.rs:439:9
[INFO] [stdout]     |
[INFO] [stdout] 439 |     let mut new_line = || {
[INFO] [stdout]     |         ^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_new_line`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `key`
[INFO] [stdout]   --> src/drawing/components/stat.rs:35:5
[INFO] [stdout]    |
[INFO] [stdout] 35 |     key: &str,
[INFO] [stdout]    |     ^^^ help: if this is intentional, prefix it with an underscore: `_key`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `server`
[INFO] [stdout]   --> src/drawing/chart.rs:65:9
[INFO] [stdout]    |
[INFO] [stdout] 65 |         server: Server,
[INFO] [stdout]    |         ^^^^^^ help: if this is intentional, prefix it with an underscore: `_server`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `song_id`
[INFO] [stdout]    --> src/drawing/chart.rs:195:9
[INFO] [stdout]     |
[INFO] [stdout] 195 |         song_id: u32,
[INFO] [stdout]     |         ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_song_id`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `title`
[INFO] [stdout]    --> src/drawing/chart.rs:196:9
[INFO] [stdout]     |
[INFO] [stdout] 196 |         title: &str,
[INFO] [stdout]     |         ^^^^^ help: if this is intentional, prefix it with an underscore: `_title`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `level`
[INFO] [stdout]    --> src/drawing/chart.rs:198:9
[INFO] [stdout]     |
[INFO] [stdout] 198 |         level: u32,
[INFO] [stdout]     |         ^^^^^ help: if this is intentional, prefix it with an underscore: `_level`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `canvas`
[INFO] [stdout]    --> src/drawing/chart.rs:386:9
[INFO] [stdout]     |
[INFO] [stdout] 386 |         canvas: &mut RgbaImage,
[INFO] [stdout]     |         ^^^^^^ help: if this is intentional, prefix it with an underscore: `_canvas`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `x`
[INFO] [stdout]    --> src/drawing/chart.rs:415:17
[INFO] [stdout]     |
[INFO] [stdout] 415 |             let x = self.config.info_area_width + draw_col * original_width + self.config.block_distance;
[INFO] [stdout]     |                 ^ help: if this is intentional, prefix it with an underscore: `_x`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `y`
[INFO] [stdout]    --> src/drawing/chart.rs:416:17
[INFO] [stdout]     |
[INFO] [stdout] 416 |             let y = height as f32 - (i as f32 * self.config.height_per_second as f32) % height as f32;
[INFO] [stdout]     |                 ^ help: if this is intentional, prefix it with an underscore: `_y`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `original_width`
[INFO] [stdout]    --> src/drawing/chart.rs:432:13
[INFO] [stdout]     |
[INFO] [stdout] 432 |         let original_width = self.config.block_distance * 2 + self.config.lane_width * 7;
[INFO] [stdout]     |             ^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_original_width`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `key`
[INFO] [stdout]   --> src/drawing/components/stat.rs:35:5
[INFO] [stdout]    |
[INFO] [stdout] 35 |     key: &str,
[INFO] [stdout]    |     ^^^ help: if this is intentional, prefix it with an underscore: `_key`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `server`
[INFO] [stdout]   --> src/drawing/chart.rs:65:9
[INFO] [stdout]    |
[INFO] [stdout] 65 |         server: Server,
[INFO] [stdout]    |         ^^^^^^ help: if this is intentional, prefix it with an underscore: `_server`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `song_id`
[INFO] [stdout]    --> src/drawing/chart.rs:195:9
[INFO] [stdout]     |
[INFO] [stdout] 195 |         song_id: u32,
[INFO] [stdout]     |         ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_song_id`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `title`
[INFO] [stdout]    --> src/drawing/chart.rs:196:9
[INFO] [stdout]     |
[INFO] [stdout] 196 |         title: &str,
[INFO] [stdout]     |         ^^^^^ help: if this is intentional, prefix it with an underscore: `_title`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `level`
[INFO] [stdout]    --> src/drawing/chart.rs:198:9
[INFO] [stdout]     |
[INFO] [stdout] 198 |         level: u32,
[INFO] [stdout]     |         ^^^^^ help: if this is intentional, prefix it with an underscore: `_level`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `canvas`
[INFO] [stdout]    --> src/drawing/chart.rs:386:9
[INFO] [stdout]     |
[INFO] [stdout] 386 |         canvas: &mut RgbaImage,
[INFO] [stdout]     |         ^^^^^^ help: if this is intentional, prefix it with an underscore: `_canvas`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `x`
[INFO] [stdout]    --> src/drawing/chart.rs:415:17
[INFO] [stdout]     |
[INFO] [stdout] 415 |             let x = self.config.info_area_width + draw_col * original_width + self.config.block_distance;
[INFO] [stdout]     |                 ^ help: if this is intentional, prefix it with an underscore: `_x`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `y`
[INFO] [stdout]    --> src/drawing/chart.rs:416:17
[INFO] [stdout]     |
[INFO] [stdout] 416 |             let y = height as f32 - (i as f32 * self.config.height_per_second as f32) % height as f32;
[INFO] [stdout]     |                 ^ help: if this is intentional, prefix it with an underscore: `_y`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `original_width`
[INFO] [stdout]    --> src/drawing/chart.rs:432:13
[INFO] [stdout]     |
[INFO] [stdout] 432 |         let original_width = self.config.block_distance * 2 + self.config.lane_width * 7;
[INFO] [stdout]     |             ^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_original_width`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `compress`
[INFO] [stdout]    --> src/view/card_list.rs:214:5
[INFO] [stdout]     |
[INFO] [stdout] 214 |     compress: bool,
[INFO] [stdout]     |     ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_compress`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `req`
[INFO] [stdout]    --> src/routes/search.rs:194:27
[INFO] [stdout]     |
[INFO] [stdout] 194 | pub async fn search_gacha(req: web::Json<SearchGachaRequest>) -> Result<HttpResponse> {
[INFO] [stdout]     |                           ^^^ help: if this is intentional, prefix it with an underscore: `_req`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `req`
[INFO] [stdout]    --> src/routes/search.rs:240:28
[INFO] [stdout]     |
[INFO] [stdout] 240 | pub async fn search_player(req: web::Json<SearchPlayerRequest>) -> Result<HttpResponse> {
[INFO] [stdout]     |                            ^^^ help: if this is intentional, prefix it with an underscore: `_req`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `compress`
[INFO] [stdout]    --> src/view/card_list.rs:214:5
[INFO] [stdout]     |
[INFO] [stdout] 214 |     compress: bool,
[INFO] [stdout]     |     ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_compress`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `req`
[INFO] [stdout]    --> src/routes/search.rs:194:27
[INFO] [stdout]     |
[INFO] [stdout] 194 | pub async fn search_gacha(req: web::Json<SearchGachaRequest>) -> Result<HttpResponse> {
[INFO] [stdout]     |                           ^^^ help: if this is intentional, prefix it with an underscore: `_req`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `req`
[INFO] [stdout]    --> src/routes/search.rs:240:28
[INFO] [stdout]     |
[INFO] [stdout] 240 | pub async fn search_player(req: web::Json<SearchPlayerRequest>) -> Result<HttpResponse> {
[INFO] [stdout]     |                            ^^^ help: if this is intentional, prefix it with an underscore: `_req`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `compress`
[INFO] [stdout]   --> src/view/song_detail.rs:24:5
[INFO] [stdout]    |
[INFO] [stdout] 24 |     compress: bool,
[INFO] [stdout]    |     ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_compress`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `song_id`
[INFO] [stdout]   --> src/view/song_list.rs:82:10
[INFO] [stdout]    |
[INFO] [stdout] 82 |     for (song_id, song) in &temp_song_list {
[INFO] [stdout]    |          ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_song_id`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `Config` is never constructed
[INFO] [stdout]  --> src/config.rs:3:12
[INFO] [stdout]   |
[INFO] [stdout] 3 | pub struct Config {
[INFO] [stdout]   |            ^^^^^^
[INFO] [stdout]   |
[INFO] [stdout]   = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `from_env` is never used
[INFO] [stdout]   --> src/config.rs:14:12
[INFO] [stdout]    |
[INFO] [stdout] 13 | impl Config {
[INFO] [stdout]    | ----------- associated function in this implementation
[INFO] [stdout] 14 |     pub fn from_env() -> Self {
[INFO] [stdout]    |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `stroke_width` is never read
[INFO] [stdout]   --> src/drawing/rect.rs:16:9
[INFO] [stdout]    |
[INFO] [stdout]  9 | pub struct RoundedRectOptions {
[INFO] [stdout]    |            ------------------ field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 16 |     pub stroke_width: u32,
[INFO] [stdout]    |         ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `stroke` is never used
[INFO] [stdout]   --> src/drawing/rect.rs:62:12
[INFO] [stdout]    |
[INFO] [stdout] 33 | impl RoundedRectOptions {
[INFO] [stdout]    | ----------------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 62 |     pub fn stroke(mut self, color: &str, width: u32) -> Self {
[INFO] [stdout]    |            ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variants `Left`, `Right`, `Start`, and `End` are never constructed
[INFO] [stdout]    --> src/drawing/rect.rs:225:5
[INFO] [stdout]     |
[INFO] [stdout] 224 | pub enum TextAlign {
[INFO] [stdout]     |          --------- variants in this enum
[INFO] [stdout] 225 |     Left,
[INFO] [stdout]     |     ^^^^
[INFO] [stdout] 226 |     Right,
[INFO] [stdout]     |     ^^^^^
[INFO] [stdout] 227 |     Center,
[INFO] [stdout] 228 |     Start,
[INFO] [stdout]     |     ^^^^^
[INFO] [stdout] 229 |     End,
[INFO] [stdout]     |     ^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `TextAlign` has a derived impl for the trait `Clone`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `text_color`, `color`, `opacity`, and `text_align` are never used
[INFO] [stdout]    --> src/drawing/rect.rs:260:12
[INFO] [stdout]     |
[INFO] [stdout] 251 | impl RoundedRectWithTextOptions {
[INFO] [stdout]     | ------------------------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 260 |     pub fn text_color(mut self, color: &str) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 265 |     pub fn color(mut self, color: &str) -> Self {
[INFO] [stdout]     |            ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 270 |     pub fn opacity(mut self, opacity: f32) -> Self {
[INFO] [stdout]     |            ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 275 |     pub fn text_align(mut self, align: TextAlign) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `load_image_from_bytes` is never used
[INFO] [stdout]   --> src/drawing/utils.rs:17:8
[INFO] [stdout]    |
[INFO] [stdout] 17 | pub fn load_image_from_bytes(bytes: &[u8]) -> Result<DynamicImage, String> {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `resize_to_fit` is never used
[INFO] [stdout]   --> src/drawing/utils.rs:34:8
[INFO] [stdout]    |
[INFO] [stdout] 34 | pub fn resize_to_fit(img: &DynamicImage, max_width: u32, max_height: u32) -> DynamicImage {
[INFO] [stdout]    |        ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `resize_exact` is never used
[INFO] [stdout]   --> src/drawing/utils.rs:47:8
[INFO] [stdout]    |
[INFO] [stdout] 47 | pub fn resize_exact(img: &DynamicImage, width: u32, height: u32) -> DynamicImage {
[INFO] [stdout]    |        ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `apply_opacity` is never used
[INFO] [stdout]    --> src/drawing/utils.rs:134:8
[INFO] [stdout]     |
[INFO] [stdout] 134 | pub fn apply_opacity(color: image::Rgba<u8>, opacity: f32) -> image::Rgba<u8> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `resize_to_fit` is never used
[INFO] [stdout]  --> src/drawing/image_ops.rs:6:8
[INFO] [stdout]   |
[INFO] [stdout] 6 | pub fn resize_to_fit(img: &DynamicImage, max_width: u32, max_height: u32) -> DynamicImage {
[INFO] [stdout]   |        ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `resize_exact` is never used
[INFO] [stdout]   --> src/drawing/image_ops.rs:24:8
[INFO] [stdout]    |
[INFO] [stdout] 24 | pub fn resize_exact(img: &DynamicImage, width: u32, height: u32) -> DynamicImage {
[INFO] [stdout]    |        ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `scale` is never used
[INFO] [stdout]   --> src/drawing/image_ops.rs:29:8
[INFO] [stdout]    |
[INFO] [stdout] 29 | pub fn scale(img: &DynamicImage, scale: f32) -> DynamicImage {
[INFO] [stdout]    |        ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `crop` is never used
[INFO] [stdout]   --> src/drawing/image_ops.rs:37:8
[INFO] [stdout]    |
[INFO] [stdout] 37 | pub fn crop(img: &DynamicImage, x: u32, y: u32, width: u32, height: u32) -> DynamicImage {
[INFO] [stdout]    |        ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `to_canvas` is never used
[INFO] [stdout]   --> src/drawing/image_ops.rs:42:8
[INFO] [stdout]    |
[INFO] [stdout] 42 | pub fn to_canvas(img: &DynamicImage) -> Canvas {
[INFO] [stdout]    |        ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `background`, `top_left_text`, and `opacity` are never used
[INFO] [stdout]   --> src/drawing/components/datablock.rs:30:12
[INFO] [stdout]    |
[INFO] [stdout] 22 | impl DataBlockOptions {
[INFO] [stdout]    | --------------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 30 |     pub fn background(mut self, bg: bool) -> Self {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 35 |     pub fn top_left_text(mut self, text: &str) -> Self {
[INFO] [stdout]    |            ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 40 |     pub fn opacity(mut self, opacity: f32) -> Self {
[INFO] [stdout]    |            ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `background` and `top_left_text` are never used
[INFO] [stdout]    --> src/drawing/components/datablock.rs:178:12
[INFO] [stdout]     |
[INFO] [stdout] 170 | impl DataBlockHorizontalOptions {
[INFO] [stdout]     | ------------------------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 178 |     pub fn background(mut self, bg: bool) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 183 |     pub fn top_left_text(mut self, text: &str) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: static `DIFFICULTY_COLOR_LIST` is never used
[INFO] [stdout]   --> src/drawing/components/difficulty.rs:10:8
[INFO] [stdout]    |
[INFO] [stdout] 10 | static DIFFICULTY_COLOR_LIST: [&str; 6] = [
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `draw_difficulty` is never used
[INFO] [stdout]   --> src/drawing/components/difficulty.rs:20:8
[INFO] [stdout]    |
[INFO] [stdout] 20 | pub fn draw_difficulty(difficulty_id: DifficultyId, level: u32, height: u32) -> Canvas {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `draw_difficulty_list` is never used
[INFO] [stdout]   --> src/drawing/components/difficulty.rs:67:8
[INFO] [stdout]    |
[INFO] [stdout] 67 | pub fn draw_difficulty_list(song: &Song, height: u32, gap: u32) -> Canvas {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `draw_difficulty_with_meta` is never used
[INFO] [stdout]   --> src/drawing/components/difficulty.rs:92:8
[INFO] [stdout]    |
[INFO] [stdout] 92 | pub fn draw_difficulty_with_meta(
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `color` is never used
[INFO] [stdout]   --> src/drawing/components/list.rs:81:12
[INFO] [stdout]    |
[INFO] [stdout] 46 | impl ListOptions {
[INFO] [stdout]    | ---------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 81 |     pub fn color(mut self, color: &str) -> Self {
[INFO] [stdout]    |            ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `content` and `text_size` are never used
[INFO] [stdout]    --> src/drawing/components/list.rs:312:12
[INFO] [stdout]     |
[INFO] [stdout] 296 | impl TipsInListOptions {
[INFO] [stdout]     | ---------------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 312 |     pub fn content(mut self, content: Vec<ContentItem>) -> Self {
[INFO] [stdout]     |            ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 317 |     pub fn text_size(mut self, size: f32) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `start_with_space` and `use_easy_bg` are never used
[INFO] [stdout]   --> src/drawing/components/output.rs:20:12
[INFO] [stdout]    |
[INFO] [stdout] 11 | impl OutputFinalOptions {
[INFO] [stdout]    | ----------------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 20 |     pub fn start_with_space(mut self, value: bool) -> Self {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 25 |     pub fn use_easy_bg(mut self, value: bool) -> Self {
[INFO] [stdout]    |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `draw_song_in_list` is never used
[INFO] [stdout]   --> src/drawing/components/song.rs:16:14
[INFO] [stdout]    |
[INFO] [stdout] 16 | pub async fn draw_song_in_list(
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `draw_song_data_block` is never used
[INFO] [stdout]   --> src/drawing/components/song.rs:95:14
[INFO] [stdout]    |
[INFO] [stdout] 95 | pub async fn draw_song_data_block(
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `SongInRank` is never constructed
[INFO] [stdout]   --> src/drawing/components/song_meta.rs:15:12
[INFO] [stdout]    |
[INFO] [stdout] 15 | pub struct SongInRank {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_meta_ranking` is never used
[INFO] [stdout]   --> src/drawing/components/song_meta.rs:23:10
[INFO] [stdout]    |
[INFO] [stdout] 23 | async fn get_meta_ranking(
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `draw_song_meta_list_datablock` is never used
[INFO] [stdout]   --> src/drawing/components/song_meta.rs:93:14
[INFO] [stdout]    |
[INFO] [stdout] 93 | pub async fn draw_song_meta_list_datablock(
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `calc_meta_simple` is never used
[INFO] [stdout]    --> src/drawing/components/song_meta.rs:198:12
[INFO] [stdout]     |
[INFO] [stdout] 195 | impl Song {
[INFO] [stdout]     | --------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 198 |     pub fn calc_meta_simple(&self, with_fever: bool, difficulty_id: u8) -> f64 {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `JAPAN_TIMEZONE_OFFSET_HOURS` is never used
[INFO] [stdout]  --> src/drawing/components/time.rs:8:7
[INFO] [stdout]   |
[INFO] [stdout] 8 | const JAPAN_TIMEZONE_OFFSET_HOURS: i32 = 9; // 日本时区UTC+9
[INFO] [stdout]   |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `format_timestamp_month_day` is never used
[INFO] [stdout]   --> src/drawing/components/time.rs:45:8
[INFO] [stdout]    |
[INFO] [stdout] 45 | pub fn format_timestamp_month_day(timestamp_ms: i64) -> String {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `format_seconds` is never used
[INFO] [stdout]   --> src/drawing/components/time.rs:64:8
[INFO] [stdout]    |
[INFO] [stdout] 64 | pub fn format_seconds(seconds: f64) -> String {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ChartRenderConfig` is never constructed
[INFO] [stdout]   --> src/drawing/chart.rs:15:8
[INFO] [stdout]    |
[INFO] [stdout] 15 | struct ChartRenderConfig {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ChartRenderer` is never constructed
[INFO] [stdout]   --> src/drawing/chart.rs:47:12
[INFO] [stdout]    |
[INFO] [stdout] 47 | pub struct ChartRenderer {
[INFO] [stdout]    |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> src/drawing/chart.rs:53:12
[INFO] [stdout]     |
[INFO] [stdout]  51 | impl ChartRenderer {
[INFO] [stdout]     | ------------------ associated items in this implementation
[INFO] [stdout]  52 |     /// 创建新的渲染器
[INFO] [stdout]  53 |     pub fn new() -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout]  60 |     pub async fn render_chart(
[INFO] [stdout]     |                  ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 132 |     fn calculate_canvas_size(&self, chart_data: &ChartData) -> (u32, u32, u32, f32) {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 184 |     fn fill_background(&self, canvas: &mut RgbaImage) {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 191 |     fn draw_info_area(
[INFO] [stdout]     |        ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 247 |     fn get_difficulty_color(&self, difficulty_name: &str) -> Rgba<u8> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 266 |     fn draw_lanes(&self, canvas: &mut RgbaImage, col_count: u32, height: u32) {
[INFO] [stdout]     |        ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 302 |     fn draw_beat_lines(
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 384 |     fn draw_timeline(
[INFO] [stdout]     |        ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 424 |     fn draw_notes(
[INFO] [stdout]     |        ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 552 |     fn draw_single_note(
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 604 |     fn draw_directional_note(
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 648 |     fn draw_tick_note(
[INFO] [stdout]     |        ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 685 |     fn draw_bar(
[INFO] [stdout]     |        ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 728 |     fn draw_sim(
[INFO] [stdout]     |        ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `match_song` is never used
[INFO] [stdout]    --> src/fuzzy_search/matcher.rs:165:8
[INFO] [stdout]     |
[INFO] [stdout] 165 | pub fn match_song(song: &Song, conditions: &FuzzySearchResult) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `match_card` is never used
[INFO] [stdout]    --> src/fuzzy_search/matcher.rs:244:8
[INFO] [stdout]     |
[INFO] [stdout] 244 | pub fn match_card(card: &Card, conditions: &FuzzySearchResult) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `failed` is never used
[INFO] [stdout]   --> src/models/response.rs:17:12
[INFO] [stdout]    |
[INFO] [stdout]  9 | impl<T> ApiResponse<T> {
[INFO] [stdout]    | ---------------------- associated function in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 17 |     pub fn failed(message: String) -> ApiResponse<String> {
[INFO] [stdout]    |            ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `base64` is never used
[INFO] [stdout]   --> src/models/response.rs:38:12
[INFO] [stdout]    |
[INFO] [stdout] 33 | impl ResponseData {
[INFO] [stdout]    | ----------------- associated function in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 38 |     pub fn base64(s: impl Into<String>) -> Self {
[INFO] [stdout]    |            ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `use_easy_bg` is never read
[INFO] [stdout]   --> src/routes/search.rs:21:9
[INFO] [stdout]    |
[INFO] [stdout] 15 | pub struct SearchCardRequest {
[INFO] [stdout]    |            ----------------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 21 |     pub use_easy_bg: bool,
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `SearchCardRequest` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `draw_single_card` is never used
[INFO] [stdout]    --> src/routes/search.rs:106:10
[INFO] [stdout]     |
[INFO] [stdout] 106 | async fn draw_single_card(state: &AppState, card_id: u32) -> Result<String, String> {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `displayed_server_list`, `use_easy_bg`, and `compress` are never read
[INFO] [stdout]    --> src/routes/search.rs:156:9
[INFO] [stdout]     |
[INFO] [stdout] 155 | pub struct SearchEventRequest {
[INFO] [stdout]     |            ------------------ fields in this struct
[INFO] [stdout] 156 |     pub displayed_server_list: Vec<Server>,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 161 |     pub use_easy_bg: bool,
[INFO] [stdout]     |         ^^^^^^^^^^^
[INFO] [stdout] 162 |     #[serde(default)]
[INFO] [stdout] 163 |     pub compress: Option<bool>,
[INFO] [stdout]     |         ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `SearchEventRequest` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `displayed_server_list`, `gacha_id`, `use_easy_bg`, and `compress` are never read
[INFO] [stdout]    --> src/routes/search.rs:187:9
[INFO] [stdout]     |
[INFO] [stdout] 186 | pub struct SearchGachaRequest {
[INFO] [stdout]     |            ------------------ fields in this struct
[INFO] [stdout] 187 |     pub displayed_server_list: Vec<Server>,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 188 |     pub gacha_id: i32,
[INFO] [stdout]     |         ^^^^^^^^
[INFO] [stdout] 189 |     pub use_easy_bg: bool,
[INFO] [stdout]     |         ^^^^^^^^^^^
[INFO] [stdout] 190 |     #[serde(default)]
[INFO] [stdout] 191 |     pub compress: Option<bool>,
[INFO] [stdout]     |         ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `SearchGachaRequest` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `displayed_server_list` and `compress` are never read
[INFO] [stdout]    --> src/routes/search.rs:203:9
[INFO] [stdout]     |
[INFO] [stdout] 202 | pub struct SearchSongRequest {
[INFO] [stdout]     |            ----------------- fields in this struct
[INFO] [stdout] 203 |     pub displayed_server_list: Vec<Server>,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 209 |     pub compress: Option<bool>,
[INFO] [stdout]     |         ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `SearchSongRequest` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `player_id`, `main_server`, `use_easy_bg`, and `compress` are never read
[INFO] [stdout]    --> src/routes/search.rs:233:9
[INFO] [stdout]     |
[INFO] [stdout] 232 | pub struct SearchPlayerRequest {
[INFO] [stdout]     |            ------------------- fields in this struct
[INFO] [stdout] 233 |     pub player_id: i64,
[INFO] [stdout]     |         ^^^^^^^^^
[INFO] [stdout] 234 |     pub main_server: Server,
[INFO] [stdout]     |         ^^^^^^^^^^^
[INFO] [stdout] 235 |     pub use_easy_bg: bool,
[INFO] [stdout]     |         ^^^^^^^^^^^
[INFO] [stdout] 236 |     #[serde(default)]
[INFO] [stdout] 237 |     pub compress: Option<bool>,
[INFO] [stdout]     |         ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `SearchPlayerRequest` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `displayed_server_list` and `compress` are never read
[INFO] [stdout]    --> src/routes/search.rs:249:9
[INFO] [stdout]     |
[INFO] [stdout] 248 | pub struct SearchCharacterRequest {
[INFO] [stdout]     |            ---------------------- fields in this struct
[INFO] [stdout] 249 |     pub displayed_server_list: Vec<Server>,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 255 |     pub compress: Option<bool>,
[INFO] [stdout]     |         ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `SearchCharacterRequest` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `all` and `color` are never used
[INFO] [stdout]   --> src/types/attribute.rs:23:12
[INFO] [stdout]    |
[INFO] [stdout] 21 | impl Attribute {
[INFO] [stdout]    | -------------- associated items in this implementation
[INFO] [stdout] 22 |     /// Get all attributes
[INFO] [stdout] 23 |     pub fn all() -> Vec<Attribute> {
[INFO] [stdout]    |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 33 |     pub fn color(&self) -> &'static str {
[INFO] [stdout]    |            ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `from_api`, `from_main_api`, `from_value`, and `get_name` are never used
[INFO] [stdout]   --> src/types/band.rs:29:12
[INFO] [stdout]    |
[INFO] [stdout] 27 | impl Band {
[INFO] [stdout]    | --------- associated items in this implementation
[INFO] [stdout] 28 |     /// 从mainAPI创建Band
[INFO] [stdout] 29 |     pub fn from_api(band_id: BandId, main_api: &Arc<super::MainAPI>) -> Option<Self> {
[INFO] [stdout]    |            ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 51 |     pub fn from_main_api(band_id: BandId, main_api: &MainAPI) -> Option<Self> {
[INFO] [stdout]    |            ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 73 |     pub fn from_value(band_id: BandId, value: &Value, has_icon: bool) -> Option<Self> {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 97 |     pub fn get_name(&self, server: Server) -> Option<&str> {
[INFO] [stdout]    |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `POPPIN_PARTY` is never used
[INFO] [stdout]    --> src/types/band.rs:147:15
[INFO] [stdout]     |
[INFO] [stdout] 147 |     pub const POPPIN_PARTY: BandId = 1;
[INFO] [stdout]     |               ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `AFTERGLOW` is never used
[INFO] [stdout]    --> src/types/band.rs:148:15
[INFO] [stdout]     |
[INFO] [stdout] 148 |     pub const AFTERGLOW: BandId = 2;
[INFO] [stdout]     |               ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `PASTEL_PALETTES` is never used
[INFO] [stdout]    --> src/types/band.rs:149:15
[INFO] [stdout]     |
[INFO] [stdout] 149 |     pub const PASTEL_PALETTES: BandId = 3;
[INFO] [stdout]     |               ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `ROSELIA` is never used
[INFO] [stdout]    --> src/types/band.rs:150:15
[INFO] [stdout]     |
[INFO] [stdout] 150 |     pub const ROSELIA: BandId = 4;
[INFO] [stdout]     |               ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `HELLO_HAPPY_WORLD` is never used
[INFO] [stdout]    --> src/types/band.rs:151:15
[INFO] [stdout]     |
[INFO] [stdout] 151 |     pub const HELLO_HAPPY_WORLD: BandId = 5;
[INFO] [stdout]     |               ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MORFONICA` is never used
[INFO] [stdout]    --> src/types/band.rs:152:15
[INFO] [stdout]     |
[INFO] [stdout] 152 |     pub const MORFONICA: BandId = 18;
[INFO] [stdout]     |               ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `RAISE_A_SUILEN` is never used
[INFO] [stdout]    --> src/types/band.rs:153:15
[INFO] [stdout]     |
[INFO] [stdout] 153 |     pub const RAISE_A_SUILEN: BandId = 21;
[INFO] [stdout]     |               ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MYGO` is never used
[INFO] [stdout]    --> src/types/band.rs:154:15
[INFO] [stdout]     |
[INFO] [stdout] 154 |     pub const MYGO: BandId = 37;
[INFO] [stdout]     |               ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `get_name`, `get_character_name`, `illustration_url`, `name_banner_url`, `get_illustration`, and `get_name_banner` are never used
[INFO] [stdout]    --> src/types/character.rs:94:12
[INFO] [stdout]     |
[INFO] [stdout]  74 | impl Character {
[INFO] [stdout]     | -------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout]  94 |     pub fn get_name(&self, server: usize) -> Option<&str> {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 101 |     pub fn get_character_name(&self, server: usize) -> String {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 125 |     pub fn illustration_url(&self) -> String {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 133 |     pub fn name_banner_url(&self) -> String {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 150 |     pub async fn get_illustration(
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 162 |     pub async fn get_name_banner(
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `SkillEffectType` is never used
[INFO] [stdout]   --> src/types/skill.rs:13:10
[INFO] [stdout]    |
[INFO] [stdout] 13 | pub enum SkillEffectType {
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple methods are never used
[INFO] [stdout]    --> src/types/skill.rs:117:12
[INFO] [stdout]     |
[INFO] [stdout]  69 | impl Skill {
[INFO] [stdout]     | ---------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 117 |     pub fn initialize_computed_fields(&mut self) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 188 |     pub fn get_skill_description(&self, server: usize) -> Option<String> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 195 |     pub fn get_description(&self, server: usize) -> Option<&str> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 202 |     pub fn get_simple_description(&self, server: usize) -> Option<&str> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 310 |     pub fn get_duration(&self, level: usize) -> Option<f32> {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 315 |     pub fn is_score_up(&self) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 322 |     pub fn is_heal(&self) -> bool {
[INFO] [stdout]     |            ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 327 |     pub fn is_judge(&self) -> bool {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `SKILL_TYPE_LIST` is never used
[INFO] [stdout]    --> src/types/skill.rs:333:11
[INFO] [stdout]     |
[INFO] [stdout] 333 | pub const SKILL_TYPE_LIST: &[&str] = &[
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `CardType` is never used
[INFO] [stdout]   --> src/types/card.rs:44:10
[INFO] [stdout]    |
[INFO] [stdout] 44 | pub enum CardType {
[INFO] [stdout]    |          ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `total` is never used
[INFO] [stdout]   --> src/types/card.rs:73:12
[INFO] [stdout]    |
[INFO] [stdout] 64 | impl CardStat {
[INFO] [stdout]    | ------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 73 |     pub fn total(&self) -> u32 {
[INFO] [stdout]    |            ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `get_prefix`, `is_released`, `calc_stat`, `calc_max_stat`, and `calc_actual_stat` are never used
[INFO] [stdout]    --> src/types/card.rs:255:12
[INFO] [stdout]     |
[INFO] [stdout] 253 | impl Card {
[INFO] [stdout]     | --------- associated items in this implementation
[INFO] [stdout] 254 |     /// 创建新的卡牌实例
[INFO] [stdout] 255 |     pub fn new(card_id: CardId) -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 316 |     pub fn get_prefix(&self, server: usize) -> Option<&str> {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 326 |     pub fn is_released(&self, server: usize) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 404 |     pub async fn calc_stat(
[INFO] [stdout]     |                  ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 428 |     fn calc_max_stat(&self, stat_data: &CardStatData) -> Result<CardStat, ApiError> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 456 |     fn calc_actual_stat(
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `deserialize_string_or_number` is never used
[INFO] [stdout]   --> src/types/song.rs:21:4
[INFO] [stdout]    |
[INFO] [stdout] 21 | fn deserialize_string_or_number<'de, D>(deserializer: D) -> Result<Option<i64>, D::Error>
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `deserialize_string_or_number_array` is never used
[INFO] [stdout]   --> src/types/song.rs:81:4
[INFO] [stdout]    |
[INFO] [stdout] 81 | fn deserialize_string_or_number_array<'de, D>(deserializer: D) -> Result<Vec<Option<i64>>, D::Error>
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `SongTag` is never used
[INFO] [stdout]    --> src/types/song.rs:114:10
[INFO] [stdout]     |
[INFO] [stdout] 114 | pub enum SongTag {
[INFO] [stdout]     |          ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `get_name` is never used
[INFO] [stdout]    --> src/types/song.rs:123:12
[INFO] [stdout]     |
[INFO] [stdout] 121 | impl SongTag {
[INFO] [stdout]     | ------------ method in this implementation
[INFO] [stdout] 122 |     /// 获取标签的中文名称
[INFO] [stdout] 123 |     pub fn get_name(&self) -> &str {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `DifficultyInfo` is never constructed
[INFO] [stdout]    --> src/types/song.rs:135:12
[INFO] [stdout]     |
[INFO] [stdout] 135 | pub struct DifficultyInfo {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `MetaCoefficients` is never constructed
[INFO] [stdout]    --> src/types/song.rs:157:12
[INFO] [stdout]     |
[INFO] [stdout] 157 | pub struct MetaCoefficients(pub f64, pub f64, pub f64, pub f64);
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `from_value_array` is never used
[INFO] [stdout]    --> src/types/song.rs:161:12
[INFO] [stdout]     |
[INFO] [stdout] 159 | impl MetaCoefficients {
[INFO] [stdout]     | --------------------- associated function in this implementation
[INFO] [stdout] 160 |     /// 从Value数组转换
[INFO] [stdout] 161 |     pub fn from_value_array(arr: &[Value]) -> Result<Self, ApiError> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: type alias `MetaData` is never used
[INFO] [stdout]    --> src/types/song.rs:184:10
[INFO] [stdout]     |
[INFO] [stdout] 184 | pub type MetaData = HashMap<String, HashMap<String, MetaCoefficients>>;
[INFO] [stdout]     |          ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `BpmInfo` is never constructed
[INFO] [stdout]    --> src/types/song.rs:188:12
[INFO] [stdout]     |
[INFO] [stdout] 188 | pub struct BpmInfo {
[INFO] [stdout]     |            ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `Song` is never constructed
[INFO] [stdout]    --> src/types/song.rs:197:12
[INFO] [stdout]     |
[INFO] [stdout] 197 | pub struct Song {
[INFO] [stdout]     |            ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> src/types/song.rs:256:12
[INFO] [stdout]     |
[INFO] [stdout] 254 | impl Song {
[INFO] [stdout]     | --------- associated items in this implementation
[INFO] [stdout] 255 |     /// 从mainAPI创建Song (暂时使用模拟数据)
[INFO] [stdout] 256 |     pub fn from_main_api(song_id: SongId) -> Option<Self> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 300 |     pub fn new(song_id: SongId) -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 331 |     pub fn from_api(song_id: SongId, main_api: &Arc<super::MainAPI>) -> Result<Self, ApiError> {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 351 |     pub fn load_meta_data(&mut self, main_api: &Arc<super::MainAPI>) -> Result<(), ApiError> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 397 |     pub async fn from_api_async(
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 411 |     pub async fn init_full(&mut self, downloader: &DownloadService) -> Result<(), ApiError> {
[INFO] [stdout]     |                  ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 462 |     pub fn get_title(&self, server: Server) -> Option<&str> {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 469 |     pub fn get_published_at(&self, server: Server) -> Option<i64> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 474 |     pub fn get_tag_name(&self) -> &str {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 484 |     pub fn get_bpm_range(&self) -> String {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 509 |     pub async fn get_song_jacket(
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 524 |     pub fn get_difficulty_level(&self, difficulty_id: DifficultyId) -> Option<u32> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 531 |     pub fn get_all_difficulty_levels(&self) -> Vec<u32> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 539 |     pub fn get_song_levels(&self) -> Vec<u32> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 544 |     pub fn get_note_count(&self, difficulty_id: DifficultyId) -> Option<u32> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 549 |     pub fn get_difficulty_info(&self, difficulty_id: DifficultyId) -> Option<&DifficultyInfo> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 562 |     pub fn calc_meta(
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DIFFICULTY_NAMES` is never used
[INFO] [stdout]    --> src/types/song.rs:619:11
[INFO] [stdout]     |
[INFO] [stdout] 619 | pub const DIFFICULTY_NAMES: &[&str] = &["easy", "normal", "hard", "expert", "special"];
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DIFFICULTY_COLORS` is never used
[INFO] [stdout]    --> src/types/song.rs:622:11
[INFO] [stdout]     |
[INFO] [stdout] 622 | pub const DIFFICULTY_COLORS: &[&str] = &[
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `get_song_chart` is never used
[INFO] [stdout]    --> src/types/song.rs:632:18
[INFO] [stdout]     |
[INFO] [stdout] 630 | impl Song {
[INFO] [stdout]     | --------- method in this implementation
[INFO] [stdout] 631 |     /// 获取谱面数据（从Bestdori API）
[INFO] [stdout] 632 |     pub async fn get_song_chart(
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `BESTDORI_URL` is never used
[INFO] [stdout]   --> src/types/event.rs:15:7
[INFO] [stdout]    |
[INFO] [stdout] 15 | const BESTDORI_URL: &str = "https://bestdori.com";
[INFO] [stdout]    |       ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: type alias `EventId` is never used
[INFO] [stdout]   --> src/types/event.rs:18:10
[INFO] [stdout]    |
[INFO] [stdout] 18 | pub type EventId = u32;
[INFO] [stdout]    |          ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `EventType` is never used
[INFO] [stdout]   --> src/types/event.rs:23:10
[INFO] [stdout]    |
[INFO] [stdout] 23 | pub enum EventType {
[INFO] [stdout]    |          ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `AttributeBonus` is never constructed
[INFO] [stdout]   --> src/types/event.rs:35:12
[INFO] [stdout]    |
[INFO] [stdout] 35 | pub struct AttributeBonus {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `CharacterBonus` is never constructed
[INFO] [stdout]   --> src/types/event.rs:43:12
[INFO] [stdout]    |
[INFO] [stdout] 43 | pub struct CharacterBonus {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `DoubleBonus` is never constructed
[INFO] [stdout]   --> src/types/event.rs:51:12
[INFO] [stdout]    |
[INFO] [stdout] 51 | pub struct DoubleBonus {
[INFO] [stdout]    |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `CharacterParameterBonus` is never constructed
[INFO] [stdout]   --> src/types/event.rs:58:12
[INFO] [stdout]    |
[INFO] [stdout] 58 | pub struct CharacterParameterBonus {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `MusicRankingReward` is never constructed
[INFO] [stdout]   --> src/types/event.rs:67:12
[INFO] [stdout]    |
[INFO] [stdout] 67 | pub struct MusicRankingReward {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `EventMusic` is never constructed
[INFO] [stdout]   --> src/types/event.rs:78:12
[INFO] [stdout]    |
[INFO] [stdout] 78 | pub struct EventMusic {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `PointReward` is never constructed
[INFO] [stdout]   --> src/types/event.rs:87:12
[INFO] [stdout]    |
[INFO] [stdout] 87 | pub struct PointReward {
[INFO] [stdout]    |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `RankingReward` is never constructed
[INFO] [stdout]    --> src/types/event.rs:101:12
[INFO] [stdout]     |
[INFO] [stdout] 101 | pub struct RankingReward {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `deserialize_string_or_number` is never used
[INFO] [stdout]    --> src/types/event.rs:115:4
[INFO] [stdout]     |
[INFO] [stdout] 115 | fn deserialize_string_or_number<'de, D>(deserializer: D) -> Result<u32, D::Error>
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `deserialize_option_string_or_number` is never used
[INFO] [stdout]    --> src/types/event.rs:157:4
[INFO] [stdout]     |
[INFO] [stdout] 157 | fn deserialize_option_string_or_number<'de, D>(deserializer: D) -> Result<Option<u32>, D::Error>
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `Event` is never constructed
[INFO] [stdout]    --> src/types/event.rs:222:12
[INFO] [stdout]     |
[INFO] [stdout] 222 | pub struct Event {
[INFO] [stdout]     |            ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> src/types/event.rs:268:12
[INFO] [stdout]     |
[INFO] [stdout] 266 | impl Event {
[INFO] [stdout]     | ---------- associated items in this implementation
[INFO] [stdout] 267 |     /// Create a new Event（创建新活动对象）
[INFO] [stdout] 268 |     pub fn new(event_id: EventId) -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 294 |     pub fn from_api(event_id: EventId, main_api: &Arc<super::MainAPI>) -> Result<Self, ApiError> {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 314 |     pub fn get_name(&self, server: usize) -> Option<&str> {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 319 |     fn parse_timestamp(ts: &Option<String>) -> Option<i64> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 324 |     pub fn get_start_at(&self, server: usize) -> Option<i64> {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 329 |     pub fn get_end_at(&self, server: usize) -> Option<i64> {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 334 |     pub fn get_public_start_at(&self, server: usize) -> Option<i64> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 341 |     pub fn get_public_end_at(&self, server: usize) -> Option<i64> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 348 |     pub fn is_running(&self, server: usize, current_time: i64) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 357 |     pub async fn init_full(
[INFO] [stdout]     |                  ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 404 |     pub fn banner_url(&self, _server: Server) -> String {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 409 |     pub async fn get_banner(
[INFO] [stdout]     |                  ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 431 |     pub fn get_attribute_list(&self) -> HashMap<u32, Vec<Attribute>> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 442 |     pub fn get_character_list(&self) -> HashMap<u32, Vec<CharacterId>> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 453 |     pub fn has_character_bonus(&self, character_id: CharacterId) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 460 |     pub fn has_attribute_bonus(&self, attribute: Attribute) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 465 |     pub fn get_character_bonus(&self, character_id: CharacterId) -> Option<u32> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 473 |     pub fn get_attribute_bonus(&self, attribute: Attribute) -> Option<u32> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_present_event` is never used
[INFO] [stdout]    --> src/types/event.rs:482:8
[INFO] [stdout]     |
[INFO] [stdout] 482 | pub fn get_present_event(_server: Server, _start: u64, _end: u64) -> Option<Event> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `ChartNote` is never used
[INFO] [stdout]  --> src/types/chart.rs:7:10
[INFO] [stdout]   |
[INFO] [stdout] 7 | pub enum ChartNote {
[INFO] [stdout]   |          ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `Direction` is never used
[INFO] [stdout]   --> src/types/chart.rs:49:10
[INFO] [stdout]    |
[INFO] [stdout] 49 | pub enum Direction {
[INFO] [stdout]    |          ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `Connection` is never constructed
[INFO] [stdout]   --> src/types/chart.rs:56:12
[INFO] [stdout]    |
[INFO] [stdout] 56 | pub struct Connection {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `ProcessedNote` is never used
[INFO] [stdout]   --> src/types/chart.rs:73:10
[INFO] [stdout]    |
[INFO] [stdout] 73 | pub enum ProcessedNote {
[INFO] [stdout]    |          ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `SingleNoteType` is never used
[INFO] [stdout]    --> src/types/chart.rs:121:10
[INFO] [stdout]     |
[INFO] [stdout] 121 | pub enum SingleNoteType {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ChartData` is never constructed
[INFO] [stdout]    --> src/types/chart.rs:130:12
[INFO] [stdout]     |
[INFO] [stdout] 130 | pub struct ChartData {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `from_json` and `process_notes` are never used
[INFO] [stdout]    --> src/types/chart.rs:139:12
[INFO] [stdout]     |
[INFO] [stdout] 137 | impl ChartData {
[INFO] [stdout]     | -------------- associated items in this implementation
[INFO] [stdout] 138 |     /// 从JSON解析谱面数据
[INFO] [stdout] 139 |     pub fn from_json(data: &Value) -> Result<Self, serde_json::Error> {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 152 |     pub fn process_notes(&mut self) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `draw_song_detail` is never used
[INFO] [stdout]   --> src/view/song_detail.rs:19:14
[INFO] [stdout]    |
[INFO] [stdout] 19 | pub async fn draw_song_detail(
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MAX_HEIGHT` is never used
[INFO] [stdout]   --> src/view/song_list.rs:21:7
[INFO] [stdout]    |
[INFO] [stdout] 21 | const MAX_HEIGHT: u32 = 6000;
[INFO] [stdout]    |       ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `draw_song_list` is never used
[INFO] [stdout]   --> src/view/song_list.rs:24:14
[INFO] [stdout]    |
[INFO] [stdout] 24 | pub async fn draw_song_list(
[INFO] [stdout]    |              ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `match_song_list` is never used
[INFO] [stdout]    --> src/view/song_list.rs:174:4
[INFO] [stdout]     |
[INFO] [stdout] 174 | fn match_song_list(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `compress`
[INFO] [stdout]   --> src/view/song_detail.rs:24:5
[INFO] [stdout]    |
[INFO] [stdout] 24 |     compress: bool,
[INFO] [stdout]    |     ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_compress`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `song_id`
[INFO] [stdout]   --> src/view/song_list.rs:82:10
[INFO] [stdout]    |
[INFO] [stdout] 82 |     for (song_id, song) in &temp_song_list {
[INFO] [stdout]    |          ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_song_id`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `Config` is never constructed
[INFO] [stdout]  --> src/config.rs:3:12
[INFO] [stdout]   |
[INFO] [stdout] 3 | pub struct Config {
[INFO] [stdout]   |            ^^^^^^
[INFO] [stdout]   |
[INFO] [stdout]   = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `from_env` is never used
[INFO] [stdout]   --> src/config.rs:14:12
[INFO] [stdout]    |
[INFO] [stdout] 13 | impl Config {
[INFO] [stdout]    | ----------- associated function in this implementation
[INFO] [stdout] 14 |     pub fn from_env() -> Self {
[INFO] [stdout]    |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `stroke_width` is never read
[INFO] [stdout]   --> src/drawing/rect.rs:16:9
[INFO] [stdout]    |
[INFO] [stdout]  9 | pub struct RoundedRectOptions {
[INFO] [stdout]    |            ------------------ field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 16 |     pub stroke_width: u32,
[INFO] [stdout]    |         ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `stroke` is never used
[INFO] [stdout]   --> src/drawing/rect.rs:62:12
[INFO] [stdout]    |
[INFO] [stdout] 33 | impl RoundedRectOptions {
[INFO] [stdout]    | ----------------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 62 |     pub fn stroke(mut self, color: &str, width: u32) -> Self {
[INFO] [stdout]    |            ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variants `Left`, `Right`, `Start`, and `End` are never constructed
[INFO] [stdout]    --> src/drawing/rect.rs:225:5
[INFO] [stdout]     |
[INFO] [stdout] 224 | pub enum TextAlign {
[INFO] [stdout]     |          --------- variants in this enum
[INFO] [stdout] 225 |     Left,
[INFO] [stdout]     |     ^^^^
[INFO] [stdout] 226 |     Right,
[INFO] [stdout]     |     ^^^^^
[INFO] [stdout] 227 |     Center,
[INFO] [stdout] 228 |     Start,
[INFO] [stdout]     |     ^^^^^
[INFO] [stdout] 229 |     End,
[INFO] [stdout]     |     ^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `TextAlign` has a derived impl for the trait `Clone`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `text_color`, `color`, `opacity`, and `text_align` are never used
[INFO] [stdout]    --> src/drawing/rect.rs:260:12
[INFO] [stdout]     |
[INFO] [stdout] 251 | impl RoundedRectWithTextOptions {
[INFO] [stdout]     | ------------------------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 260 |     pub fn text_color(mut self, color: &str) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 265 |     pub fn color(mut self, color: &str) -> Self {
[INFO] [stdout]     |            ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 270 |     pub fn opacity(mut self, opacity: f32) -> Self {
[INFO] [stdout]     |            ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 275 |     pub fn text_align(mut self, align: TextAlign) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `load_image_from_bytes` is never used
[INFO] [stdout]   --> src/drawing/utils.rs:17:8
[INFO] [stdout]    |
[INFO] [stdout] 17 | pub fn load_image_from_bytes(bytes: &[u8]) -> Result<DynamicImage, String> {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `resize_to_fit` is never used
[INFO] [stdout]   --> src/drawing/utils.rs:34:8
[INFO] [stdout]    |
[INFO] [stdout] 34 | pub fn resize_to_fit(img: &DynamicImage, max_width: u32, max_height: u32) -> DynamicImage {
[INFO] [stdout]    |        ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `resize_exact` is never used
[INFO] [stdout]   --> src/drawing/utils.rs:47:8
[INFO] [stdout]    |
[INFO] [stdout] 47 | pub fn resize_exact(img: &DynamicImage, width: u32, height: u32) -> DynamicImage {
[INFO] [stdout]    |        ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `apply_opacity` is never used
[INFO] [stdout]    --> src/drawing/utils.rs:134:8
[INFO] [stdout]     |
[INFO] [stdout] 134 | pub fn apply_opacity(color: image::Rgba<u8>, opacity: f32) -> image::Rgba<u8> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `resize_to_fit` is never used
[INFO] [stdout]  --> src/drawing/image_ops.rs:6:8
[INFO] [stdout]   |
[INFO] [stdout] 6 | pub fn resize_to_fit(img: &DynamicImage, max_width: u32, max_height: u32) -> DynamicImage {
[INFO] [stdout]   |        ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `resize_exact` is never used
[INFO] [stdout]   --> src/drawing/image_ops.rs:24:8
[INFO] [stdout]    |
[INFO] [stdout] 24 | pub fn resize_exact(img: &DynamicImage, width: u32, height: u32) -> DynamicImage {
[INFO] [stdout]    |        ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `scale` is never used
[INFO] [stdout]   --> src/drawing/image_ops.rs:29:8
[INFO] [stdout]    |
[INFO] [stdout] 29 | pub fn scale(img: &DynamicImage, scale: f32) -> DynamicImage {
[INFO] [stdout]    |        ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `crop` is never used
[INFO] [stdout]   --> src/drawing/image_ops.rs:37:8
[INFO] [stdout]    |
[INFO] [stdout] 37 | pub fn crop(img: &DynamicImage, x: u32, y: u32, width: u32, height: u32) -> DynamicImage {
[INFO] [stdout]    |        ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `to_canvas` is never used
[INFO] [stdout]   --> src/drawing/image_ops.rs:42:8
[INFO] [stdout]    |
[INFO] [stdout] 42 | pub fn to_canvas(img: &DynamicImage) -> Canvas {
[INFO] [stdout]    |        ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `background`, `top_left_text`, and `opacity` are never used
[INFO] [stdout]   --> src/drawing/components/datablock.rs:30:12
[INFO] [stdout]    |
[INFO] [stdout] 22 | impl DataBlockOptions {
[INFO] [stdout]    | --------------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 30 |     pub fn background(mut self, bg: bool) -> Self {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 35 |     pub fn top_left_text(mut self, text: &str) -> Self {
[INFO] [stdout]    |            ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 40 |     pub fn opacity(mut self, opacity: f32) -> Self {
[INFO] [stdout]    |            ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `background` and `top_left_text` are never used
[INFO] [stdout]    --> src/drawing/components/datablock.rs:178:12
[INFO] [stdout]     |
[INFO] [stdout] 170 | impl DataBlockHorizontalOptions {
[INFO] [stdout]     | ------------------------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 178 |     pub fn background(mut self, bg: bool) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 183 |     pub fn top_left_text(mut self, text: &str) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: static `DIFFICULTY_COLOR_LIST` is never used
[INFO] [stdout]   --> src/drawing/components/difficulty.rs:10:8
[INFO] [stdout]    |
[INFO] [stdout] 10 | static DIFFICULTY_COLOR_LIST: [&str; 6] = [
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `draw_difficulty` is never used
[INFO] [stdout]   --> src/drawing/components/difficulty.rs:20:8
[INFO] [stdout]    |
[INFO] [stdout] 20 | pub fn draw_difficulty(difficulty_id: DifficultyId, level: u32, height: u32) -> Canvas {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `draw_difficulty_list` is never used
[INFO] [stdout]   --> src/drawing/components/difficulty.rs:67:8
[INFO] [stdout]    |
[INFO] [stdout] 67 | pub fn draw_difficulty_list(song: &Song, height: u32, gap: u32) -> Canvas {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `draw_difficulty_with_meta` is never used
[INFO] [stdout]   --> src/drawing/components/difficulty.rs:92:8
[INFO] [stdout]    |
[INFO] [stdout] 92 | pub fn draw_difficulty_with_meta(
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `color` is never used
[INFO] [stdout]   --> src/drawing/components/list.rs:81:12
[INFO] [stdout]    |
[INFO] [stdout] 46 | impl ListOptions {
[INFO] [stdout]    | ---------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 81 |     pub fn color(mut self, color: &str) -> Self {
[INFO] [stdout]    |            ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `content` and `text_size` are never used
[INFO] [stdout]    --> src/drawing/components/list.rs:312:12
[INFO] [stdout]     |
[INFO] [stdout] 296 | impl TipsInListOptions {
[INFO] [stdout]     | ---------------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 312 |     pub fn content(mut self, content: Vec<ContentItem>) -> Self {
[INFO] [stdout]     |            ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 317 |     pub fn text_size(mut self, size: f32) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `start_with_space` and `use_easy_bg` are never used
[INFO] [stdout]   --> src/drawing/components/output.rs:20:12
[INFO] [stdout]    |
[INFO] [stdout] 11 | impl OutputFinalOptions {
[INFO] [stdout]    | ----------------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 20 |     pub fn start_with_space(mut self, value: bool) -> Self {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 25 |     pub fn use_easy_bg(mut self, value: bool) -> Self {
[INFO] [stdout]    |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `draw_song_in_list` is never used
[INFO] [stdout]   --> src/drawing/components/song.rs:16:14
[INFO] [stdout]    |
[INFO] [stdout] 16 | pub async fn draw_song_in_list(
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `draw_song_data_block` is never used
[INFO] [stdout]   --> src/drawing/components/song.rs:95:14
[INFO] [stdout]    |
[INFO] [stdout] 95 | pub async fn draw_song_data_block(
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `SongInRank` is never constructed
[INFO] [stdout]   --> src/drawing/components/song_meta.rs:15:12
[INFO] [stdout]    |
[INFO] [stdout] 15 | pub struct SongInRank {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_meta_ranking` is never used
[INFO] [stdout]   --> src/drawing/components/song_meta.rs:23:10
[INFO] [stdout]    |
[INFO] [stdout] 23 | async fn get_meta_ranking(
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `draw_song_meta_list_datablock` is never used
[INFO] [stdout]   --> src/drawing/components/song_meta.rs:93:14
[INFO] [stdout]    |
[INFO] [stdout] 93 | pub async fn draw_song_meta_list_datablock(
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `calc_meta_simple` is never used
[INFO] [stdout]    --> src/drawing/components/song_meta.rs:198:12
[INFO] [stdout]     |
[INFO] [stdout] 195 | impl Song {
[INFO] [stdout]     | --------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 198 |     pub fn calc_meta_simple(&self, with_fever: bool, difficulty_id: u8) -> f64 {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `format_seconds` is never used
[INFO] [stdout]   --> src/drawing/components/time.rs:64:8
[INFO] [stdout]    |
[INFO] [stdout] 64 | pub fn format_seconds(seconds: f64) -> String {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ChartRenderConfig` is never constructed
[INFO] [stdout]   --> src/drawing/chart.rs:15:8
[INFO] [stdout]    |
[INFO] [stdout] 15 | struct ChartRenderConfig {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ChartRenderer` is never constructed
[INFO] [stdout]   --> src/drawing/chart.rs:47:12
[INFO] [stdout]    |
[INFO] [stdout] 47 | pub struct ChartRenderer {
[INFO] [stdout]    |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> src/drawing/chart.rs:53:12
[INFO] [stdout]     |
[INFO] [stdout]  51 | impl ChartRenderer {
[INFO] [stdout]     | ------------------ associated items in this implementation
[INFO] [stdout]  52 |     /// 创建新的渲染器
[INFO] [stdout]  53 |     pub fn new() -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout]  60 |     pub async fn render_chart(
[INFO] [stdout]     |                  ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 132 |     fn calculate_canvas_size(&self, chart_data: &ChartData) -> (u32, u32, u32, f32) {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 184 |     fn fill_background(&self, canvas: &mut RgbaImage) {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 191 |     fn draw_info_area(
[INFO] [stdout]     |        ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 247 |     fn get_difficulty_color(&self, difficulty_name: &str) -> Rgba<u8> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 266 |     fn draw_lanes(&self, canvas: &mut RgbaImage, col_count: u32, height: u32) {
[INFO] [stdout]     |        ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 302 |     fn draw_beat_lines(
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 384 |     fn draw_timeline(
[INFO] [stdout]     |        ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 424 |     fn draw_notes(
[INFO] [stdout]     |        ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 552 |     fn draw_single_note(
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 604 |     fn draw_directional_note(
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 648 |     fn draw_tick_note(
[INFO] [stdout]     |        ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 685 |     fn draw_bar(
[INFO] [stdout]     |        ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 728 |     fn draw_sim(
[INFO] [stdout]     |        ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `match_song` is never used
[INFO] [stdout]    --> src/fuzzy_search/matcher.rs:165:8
[INFO] [stdout]     |
[INFO] [stdout] 165 | pub fn match_song(song: &Song, conditions: &FuzzySearchResult) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `match_card` is never used
[INFO] [stdout]    --> src/fuzzy_search/matcher.rs:244:8
[INFO] [stdout]     |
[INFO] [stdout] 244 | pub fn match_card(card: &Card, conditions: &FuzzySearchResult) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `failed` is never used
[INFO] [stdout]   --> src/models/response.rs:17:12
[INFO] [stdout]    |
[INFO] [stdout]  9 | impl<T> ApiResponse<T> {
[INFO] [stdout]    | ---------------------- associated function in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 17 |     pub fn failed(message: String) -> ApiResponse<String> {
[INFO] [stdout]    |            ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `base64` is never used
[INFO] [stdout]   --> src/models/response.rs:38:12
[INFO] [stdout]    |
[INFO] [stdout] 33 | impl ResponseData {
[INFO] [stdout]    | ----------------- associated function in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 38 |     pub fn base64(s: impl Into<String>) -> Self {
[INFO] [stdout]    |            ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `use_easy_bg` is never read
[INFO] [stdout]   --> src/routes/search.rs:21:9
[INFO] [stdout]    |
[INFO] [stdout] 15 | pub struct SearchCardRequest {
[INFO] [stdout]    |            ----------------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 21 |     pub use_easy_bg: bool,
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `SearchCardRequest` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `draw_single_card` is never used
[INFO] [stdout]    --> src/routes/search.rs:106:10
[INFO] [stdout]     |
[INFO] [stdout] 106 | async fn draw_single_card(state: &AppState, card_id: u32) -> Result<String, String> {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `displayed_server_list`, `use_easy_bg`, and `compress` are never read
[INFO] [stdout]    --> src/routes/search.rs:156:9
[INFO] [stdout]     |
[INFO] [stdout] 155 | pub struct SearchEventRequest {
[INFO] [stdout]     |            ------------------ fields in this struct
[INFO] [stdout] 156 |     pub displayed_server_list: Vec<Server>,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 161 |     pub use_easy_bg: bool,
[INFO] [stdout]     |         ^^^^^^^^^^^
[INFO] [stdout] 162 |     #[serde(default)]
[INFO] [stdout] 163 |     pub compress: Option<bool>,
[INFO] [stdout]     |         ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `SearchEventRequest` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `displayed_server_list`, `gacha_id`, `use_easy_bg`, and `compress` are never read
[INFO] [stdout]    --> src/routes/search.rs:187:9
[INFO] [stdout]     |
[INFO] [stdout] 186 | pub struct SearchGachaRequest {
[INFO] [stdout]     |            ------------------ fields in this struct
[INFO] [stdout] 187 |     pub displayed_server_list: Vec<Server>,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 188 |     pub gacha_id: i32,
[INFO] [stdout]     |         ^^^^^^^^
[INFO] [stdout] 189 |     pub use_easy_bg: bool,
[INFO] [stdout]     |         ^^^^^^^^^^^
[INFO] [stdout] 190 |     #[serde(default)]
[INFO] [stdout] 191 |     pub compress: Option<bool>,
[INFO] [stdout]     |         ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `SearchGachaRequest` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `displayed_server_list` and `compress` are never read
[INFO] [stdout]    --> src/routes/search.rs:203:9
[INFO] [stdout]     |
[INFO] [stdout] 202 | pub struct SearchSongRequest {
[INFO] [stdout]     |            ----------------- fields in this struct
[INFO] [stdout] 203 |     pub displayed_server_list: Vec<Server>,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 209 |     pub compress: Option<bool>,
[INFO] [stdout]     |         ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `SearchSongRequest` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `player_id`, `main_server`, `use_easy_bg`, and `compress` are never read
[INFO] [stdout]    --> src/routes/search.rs:233:9
[INFO] [stdout]     |
[INFO] [stdout] 232 | pub struct SearchPlayerRequest {
[INFO] [stdout]     |            ------------------- fields in this struct
[INFO] [stdout] 233 |     pub player_id: i64,
[INFO] [stdout]     |         ^^^^^^^^^
[INFO] [stdout] 234 |     pub main_server: Server,
[INFO] [stdout]     |         ^^^^^^^^^^^
[INFO] [stdout] 235 |     pub use_easy_bg: bool,
[INFO] [stdout]     |         ^^^^^^^^^^^
[INFO] [stdout] 236 |     #[serde(default)]
[INFO] [stdout] 237 |     pub compress: Option<bool>,
[INFO] [stdout]     |         ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `SearchPlayerRequest` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `displayed_server_list` and `compress` are never read
[INFO] [stdout]    --> src/routes/search.rs:249:9
[INFO] [stdout]     |
[INFO] [stdout] 248 | pub struct SearchCharacterRequest {
[INFO] [stdout]     |            ---------------------- fields in this struct
[INFO] [stdout] 249 |     pub displayed_server_list: Vec<Server>,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 255 |     pub compress: Option<bool>,
[INFO] [stdout]     |         ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `SearchCharacterRequest` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `all` is never used
[INFO] [stdout]   --> src/types/attribute.rs:23:12
[INFO] [stdout]    |
[INFO] [stdout] 21 | impl Attribute {
[INFO] [stdout]    | -------------- associated function in this implementation
[INFO] [stdout] 22 |     /// Get all attributes
[INFO] [stdout] 23 |     pub fn all() -> Vec<Attribute> {
[INFO] [stdout]    |            ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `from_api`, `from_main_api`, `from_value`, and `get_name` are never used
[INFO] [stdout]   --> src/types/band.rs:29:12
[INFO] [stdout]    |
[INFO] [stdout] 27 | impl Band {
[INFO] [stdout]    | --------- associated items in this implementation
[INFO] [stdout] 28 |     /// 从mainAPI创建Band
[INFO] [stdout] 29 |     pub fn from_api(band_id: BandId, main_api: &Arc<super::MainAPI>) -> Option<Self> {
[INFO] [stdout]    |            ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 51 |     pub fn from_main_api(band_id: BandId, main_api: &MainAPI) -> Option<Self> {
[INFO] [stdout]    |            ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 73 |     pub fn from_value(band_id: BandId, value: &Value, has_icon: bool) -> Option<Self> {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 97 |     pub fn get_name(&self, server: Server) -> Option<&str> {
[INFO] [stdout]    |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `POPPIN_PARTY` is never used
[INFO] [stdout]    --> src/types/band.rs:147:15
[INFO] [stdout]     |
[INFO] [stdout] 147 |     pub const POPPIN_PARTY: BandId = 1;
[INFO] [stdout]     |               ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `AFTERGLOW` is never used
[INFO] [stdout]    --> src/types/band.rs:148:15
[INFO] [stdout]     |
[INFO] [stdout] 148 |     pub const AFTERGLOW: BandId = 2;
[INFO] [stdout]     |               ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `PASTEL_PALETTES` is never used
[INFO] [stdout]    --> src/types/band.rs:149:15
[INFO] [stdout]     |
[INFO] [stdout] 149 |     pub const PASTEL_PALETTES: BandId = 3;
[INFO] [stdout]     |               ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `ROSELIA` is never used
[INFO] [stdout]    --> src/types/band.rs:150:15
[INFO] [stdout]     |
[INFO] [stdout] 150 |     pub const ROSELIA: BandId = 4;
[INFO] [stdout]     |               ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `HELLO_HAPPY_WORLD` is never used
[INFO] [stdout]    --> src/types/band.rs:151:15
[INFO] [stdout]     |
[INFO] [stdout] 151 |     pub const HELLO_HAPPY_WORLD: BandId = 5;
[INFO] [stdout]     |               ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MORFONICA` is never used
[INFO] [stdout]    --> src/types/band.rs:152:15
[INFO] [stdout]     |
[INFO] [stdout] 152 |     pub const MORFONICA: BandId = 18;
[INFO] [stdout]     |               ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `RAISE_A_SUILEN` is never used
[INFO] [stdout]    --> src/types/band.rs:153:15
[INFO] [stdout]     |
[INFO] [stdout] 153 |     pub const RAISE_A_SUILEN: BandId = 21;
[INFO] [stdout]     |               ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MYGO` is never used
[INFO] [stdout]    --> src/types/band.rs:154:15
[INFO] [stdout]     |
[INFO] [stdout] 154 |     pub const MYGO: BandId = 37;
[INFO] [stdout]     |               ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `get_name`, `get_character_name`, `illustration_url`, `name_banner_url`, `get_illustration`, and `get_name_banner` are never used
[INFO] [stdout]    --> src/types/character.rs:94:12
[INFO] [stdout]     |
[INFO] [stdout]  74 | impl Character {
[INFO] [stdout]     | -------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout]  94 |     pub fn get_name(&self, server: usize) -> Option<&str> {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 101 |     pub fn get_character_name(&self, server: usize) -> String {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 125 |     pub fn illustration_url(&self) -> String {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 133 |     pub fn name_banner_url(&self) -> String {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 150 |     pub async fn get_illustration(
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 162 |     pub async fn get_name_banner(
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `SkillEffectType` is never used
[INFO] [stdout]   --> src/types/skill.rs:13:10
[INFO] [stdout]    |
[INFO] [stdout] 13 | pub enum SkillEffectType {
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple methods are never used
[INFO] [stdout]    --> src/types/skill.rs:117:12
[INFO] [stdout]     |
[INFO] [stdout]  69 | impl Skill {
[INFO] [stdout]     | ---------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 117 |     pub fn initialize_computed_fields(&mut self) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 188 |     pub fn get_skill_description(&self, server: usize) -> Option<String> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 195 |     pub fn get_description(&self, server: usize) -> Option<&str> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 202 |     pub fn get_simple_description(&self, server: usize) -> Option<&str> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 310 |     pub fn get_duration(&self, level: usize) -> Option<f32> {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 315 |     pub fn is_score_up(&self) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 322 |     pub fn is_heal(&self) -> bool {
[INFO] [stdout]     |            ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 327 |     pub fn is_judge(&self) -> bool {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `SKILL_TYPE_LIST` is never used
[INFO] [stdout]    --> src/types/skill.rs:333:11
[INFO] [stdout]     |
[INFO] [stdout] 333 | pub const SKILL_TYPE_LIST: &[&str] = &[
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `CardType` is never used
[INFO] [stdout]   --> src/types/card.rs:44:10
[INFO] [stdout]    |
[INFO] [stdout] 44 | pub enum CardType {
[INFO] [stdout]    |          ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `total` is never used
[INFO] [stdout]   --> src/types/card.rs:73:12
[INFO] [stdout]    |
[INFO] [stdout] 64 | impl CardStat {
[INFO] [stdout]    | ------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 73 |     pub fn total(&self) -> u32 {
[INFO] [stdout]    |            ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `get_prefix`, `is_released`, `calc_stat`, `calc_max_stat`, and `calc_actual_stat` are never used
[INFO] [stdout]    --> src/types/card.rs:255:12
[INFO] [stdout]     |
[INFO] [stdout] 253 | impl Card {
[INFO] [stdout]     | --------- associated items in this implementation
[INFO] [stdout] 254 |     /// 创建新的卡牌实例
[INFO] [stdout] 255 |     pub fn new(card_id: CardId) -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 316 |     pub fn get_prefix(&self, server: usize) -> Option<&str> {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 326 |     pub fn is_released(&self, server: usize) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 404 |     pub async fn calc_stat(
[INFO] [stdout]     |                  ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 428 |     fn calc_max_stat(&self, stat_data: &CardStatData) -> Result<CardStat, ApiError> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 456 |     fn calc_actual_stat(
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `deserialize_string_or_number` is never used
[INFO] [stdout]   --> src/types/song.rs:21:4
[INFO] [stdout]    |
[INFO] [stdout] 21 | fn deserialize_string_or_number<'de, D>(deserializer: D) -> Result<Option<i64>, D::Error>
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `deserialize_string_or_number_array` is never used
[INFO] [stdout]   --> src/types/song.rs:81:4
[INFO] [stdout]    |
[INFO] [stdout] 81 | fn deserialize_string_or_number_array<'de, D>(deserializer: D) -> Result<Vec<Option<i64>>, D::Error>
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `SongTag` is never used
[INFO] [stdout]    --> src/types/song.rs:114:10
[INFO] [stdout]     |
[INFO] [stdout] 114 | pub enum SongTag {
[INFO] [stdout]     |          ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `get_name` is never used
[INFO] [stdout]    --> src/types/song.rs:123:12
[INFO] [stdout]     |
[INFO] [stdout] 121 | impl SongTag {
[INFO] [stdout]     | ------------ method in this implementation
[INFO] [stdout] 122 |     /// 获取标签的中文名称
[INFO] [stdout] 123 |     pub fn get_name(&self) -> &str {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `DifficultyInfo` is never constructed
[INFO] [stdout]    --> src/types/song.rs:135:12
[INFO] [stdout]     |
[INFO] [stdout] 135 | pub struct DifficultyInfo {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `MetaCoefficients` is never constructed
[INFO] [stdout]    --> src/types/song.rs:157:12
[INFO] [stdout]     |
[INFO] [stdout] 157 | pub struct MetaCoefficients(pub f64, pub f64, pub f64, pub f64);
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `from_value_array` is never used
[INFO] [stdout]    --> src/types/song.rs:161:12
[INFO] [stdout]     |
[INFO] [stdout] 159 | impl MetaCoefficients {
[INFO] [stdout]     | --------------------- associated function in this implementation
[INFO] [stdout] 160 |     /// 从Value数组转换
[INFO] [stdout] 161 |     pub fn from_value_array(arr: &[Value]) -> Result<Self, ApiError> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: type alias `MetaData` is never used
[INFO] [stdout]    --> src/types/song.rs:184:10
[INFO] [stdout]     |
[INFO] [stdout] 184 | pub type MetaData = HashMap<String, HashMap<String, MetaCoefficients>>;
[INFO] [stdout]     |          ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `BpmInfo` is never constructed
[INFO] [stdout]    --> src/types/song.rs:188:12
[INFO] [stdout]     |
[INFO] [stdout] 188 | pub struct BpmInfo {
[INFO] [stdout]     |            ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `Song` is never constructed
[INFO] [stdout]    --> src/types/song.rs:197:12
[INFO] [stdout]     |
[INFO] [stdout] 197 | pub struct Song {
[INFO] [stdout]     |            ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> src/types/song.rs:256:12
[INFO] [stdout]     |
[INFO] [stdout] 254 | impl Song {
[INFO] [stdout]     | --------- associated items in this implementation
[INFO] [stdout] 255 |     /// 从mainAPI创建Song (暂时使用模拟数据)
[INFO] [stdout] 256 |     pub fn from_main_api(song_id: SongId) -> Option<Self> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 300 |     pub fn new(song_id: SongId) -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 331 |     pub fn from_api(song_id: SongId, main_api: &Arc<super::MainAPI>) -> Result<Self, ApiError> {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 351 |     pub fn load_meta_data(&mut self, main_api: &Arc<super::MainAPI>) -> Result<(), ApiError> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 397 |     pub async fn from_api_async(
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 411 |     pub async fn init_full(&mut self, downloader: &DownloadService) -> Result<(), ApiError> {
[INFO] [stdout]     |                  ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 462 |     pub fn get_title(&self, server: Server) -> Option<&str> {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 469 |     pub fn get_published_at(&self, server: Server) -> Option<i64> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 474 |     pub fn get_tag_name(&self) -> &str {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 484 |     pub fn get_bpm_range(&self) -> String {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 509 |     pub async fn get_song_jacket(
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 524 |     pub fn get_difficulty_level(&self, difficulty_id: DifficultyId) -> Option<u32> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 531 |     pub fn get_all_difficulty_levels(&self) -> Vec<u32> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 539 |     pub fn get_song_levels(&self) -> Vec<u32> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 544 |     pub fn get_note_count(&self, difficulty_id: DifficultyId) -> Option<u32> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 549 |     pub fn get_difficulty_info(&self, difficulty_id: DifficultyId) -> Option<&DifficultyInfo> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 562 |     pub fn calc_meta(
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DIFFICULTY_NAMES` is never used
[INFO] [stdout]    --> src/types/song.rs:619:11
[INFO] [stdout]     |
[INFO] [stdout] 619 | pub const DIFFICULTY_NAMES: &[&str] = &["easy", "normal", "hard", "expert", "special"];
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DIFFICULTY_COLORS` is never used
[INFO] [stdout]    --> src/types/song.rs:622:11
[INFO] [stdout]     |
[INFO] [stdout] 622 | pub const DIFFICULTY_COLORS: &[&str] = &[
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `get_song_chart` is never used
[INFO] [stdout]    --> src/types/song.rs:632:18
[INFO] [stdout]     |
[INFO] [stdout] 630 | impl Song {
[INFO] [stdout]     | --------- method in this implementation
[INFO] [stdout] 631 |     /// 获取谱面数据（从Bestdori API）
[INFO] [stdout] 632 |     pub async fn get_song_chart(
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `BESTDORI_URL` is never used
[INFO] [stdout]   --> src/types/event.rs:15:7
[INFO] [stdout]    |
[INFO] [stdout] 15 | const BESTDORI_URL: &str = "https://bestdori.com";
[INFO] [stdout]    |       ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: type alias `EventId` is never used
[INFO] [stdout]   --> src/types/event.rs:18:10
[INFO] [stdout]    |
[INFO] [stdout] 18 | pub type EventId = u32;
[INFO] [stdout]    |          ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `EventType` is never used
[INFO] [stdout]   --> src/types/event.rs:23:10
[INFO] [stdout]    |
[INFO] [stdout] 23 | pub enum EventType {
[INFO] [stdout]    |          ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `AttributeBonus` is never constructed
[INFO] [stdout]   --> src/types/event.rs:35:12
[INFO] [stdout]    |
[INFO] [stdout] 35 | pub struct AttributeBonus {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `CharacterBonus` is never constructed
[INFO] [stdout]   --> src/types/event.rs:43:12
[INFO] [stdout]    |
[INFO] [stdout] 43 | pub struct CharacterBonus {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `DoubleBonus` is never constructed
[INFO] [stdout]   --> src/types/event.rs:51:12
[INFO] [stdout]    |
[INFO] [stdout] 51 | pub struct DoubleBonus {
[INFO] [stdout]    |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `CharacterParameterBonus` is never constructed
[INFO] [stdout]   --> src/types/event.rs:58:12
[INFO] [stdout]    |
[INFO] [stdout] 58 | pub struct CharacterParameterBonus {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `MusicRankingReward` is never constructed
[INFO] [stdout]   --> src/types/event.rs:67:12
[INFO] [stdout]    |
[INFO] [stdout] 67 | pub struct MusicRankingReward {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `EventMusic` is never constructed
[INFO] [stdout]   --> src/types/event.rs:78:12
[INFO] [stdout]    |
[INFO] [stdout] 78 | pub struct EventMusic {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `PointReward` is never constructed
[INFO] [stdout]   --> src/types/event.rs:87:12
[INFO] [stdout]    |
[INFO] [stdout] 87 | pub struct PointReward {
[INFO] [stdout]    |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `RankingReward` is never constructed
[INFO] [stdout]    --> src/types/event.rs:101:12
[INFO] [stdout]     |
[INFO] [stdout] 101 | pub struct RankingReward {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `deserialize_string_or_number` is never used
[INFO] [stdout]    --> src/types/event.rs:115:4
[INFO] [stdout]     |
[INFO] [stdout] 115 | fn deserialize_string_or_number<'de, D>(deserializer: D) -> Result<u32, D::Error>
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `deserialize_option_string_or_number` is never used
[INFO] [stdout]    --> src/types/event.rs:157:4
[INFO] [stdout]     |
[INFO] [stdout] 157 | fn deserialize_option_string_or_number<'de, D>(deserializer: D) -> Result<Option<u32>, D::Error>
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `Event` is never constructed
[INFO] [stdout]    --> src/types/event.rs:222:12
[INFO] [stdout]     |
[INFO] [stdout] 222 | pub struct Event {
[INFO] [stdout]     |            ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> src/types/event.rs:268:12
[INFO] [stdout]     |
[INFO] [stdout] 266 | impl Event {
[INFO] [stdout]     | ---------- associated items in this implementation
[INFO] [stdout] 267 |     /// Create a new Event（创建新活动对象）
[INFO] [stdout] 268 |     pub fn new(event_id: EventId) -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 294 |     pub fn from_api(event_id: EventId, main_api: &Arc<super::MainAPI>) -> Result<Self, ApiError> {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 314 |     pub fn get_name(&self, server: usize) -> Option<&str> {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 319 |     fn parse_timestamp(ts: &Option<String>) -> Option<i64> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 324 |     pub fn get_start_at(&self, server: usize) -> Option<i64> {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 329 |     pub fn get_end_at(&self, server: usize) -> Option<i64> {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 334 |     pub fn get_public_start_at(&self, server: usize) -> Option<i64> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 341 |     pub fn get_public_end_at(&self, server: usize) -> Option<i64> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 348 |     pub fn is_running(&self, server: usize, current_time: i64) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 357 |     pub async fn init_full(
[INFO] [stdout]     |                  ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 404 |     pub fn banner_url(&self, _server: Server) -> String {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 409 |     pub async fn get_banner(
[INFO] [stdout]     |                  ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 431 |     pub fn get_attribute_list(&self) -> HashMap<u32, Vec<Attribute>> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 442 |     pub fn get_character_list(&self) -> HashMap<u32, Vec<CharacterId>> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 453 |     pub fn has_character_bonus(&self, character_id: CharacterId) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 460 |     pub fn has_attribute_bonus(&self, attribute: Attribute) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 465 |     pub fn get_character_bonus(&self, character_id: CharacterId) -> Option<u32> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 473 |     pub fn get_attribute_bonus(&self, attribute: Attribute) -> Option<u32> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_present_event` is never used
[INFO] [stdout]    --> src/types/event.rs:482:8
[INFO] [stdout]     |
[INFO] [stdout] 482 | pub fn get_present_event(_server: Server, _start: u64, _end: u64) -> Option<Event> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `ChartNote` is never used
[INFO] [stdout]  --> src/types/chart.rs:7:10
[INFO] [stdout]   |
[INFO] [stdout] 7 | pub enum ChartNote {
[INFO] [stdout]   |          ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `Direction` is never used
[INFO] [stdout]   --> src/types/chart.rs:49:10
[INFO] [stdout]    |
[INFO] [stdout] 49 | pub enum Direction {
[INFO] [stdout]    |          ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `Connection` is never constructed
[INFO] [stdout]   --> src/types/chart.rs:56:12
[INFO] [stdout]    |
[INFO] [stdout] 56 | pub struct Connection {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `ProcessedNote` is never used
[INFO] [stdout]   --> src/types/chart.rs:73:10
[INFO] [stdout]    |
[INFO] [stdout] 73 | pub enum ProcessedNote {
[INFO] [stdout]    |          ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `SingleNoteType` is never used
[INFO] [stdout]    --> src/types/chart.rs:121:10
[INFO] [stdout]     |
[INFO] [stdout] 121 | pub enum SingleNoteType {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ChartData` is never constructed
[INFO] [stdout]    --> src/types/chart.rs:130:12
[INFO] [stdout]     |
[INFO] [stdout] 130 | pub struct ChartData {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `from_json` and `process_notes` are never used
[INFO] [stdout]    --> src/types/chart.rs:139:12
[INFO] [stdout]     |
[INFO] [stdout] 137 | impl ChartData {
[INFO] [stdout]     | -------------- associated items in this implementation
[INFO] [stdout] 138 |     /// 从JSON解析谱面数据
[INFO] [stdout] 139 |     pub fn from_json(data: &Value) -> Result<Self, serde_json::Error> {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 152 |     pub fn process_notes(&mut self) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `draw_song_detail` is never used
[INFO] [stdout]   --> src/view/song_detail.rs:19:14
[INFO] [stdout]    |
[INFO] [stdout] 19 | pub async fn draw_song_detail(
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MAX_HEIGHT` is never used
[INFO] [stdout]   --> src/view/song_list.rs:21:7
[INFO] [stdout]    |
[INFO] [stdout] 21 | const MAX_HEIGHT: u32 = 6000;
[INFO] [stdout]    |       ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `draw_song_list` is never used
[INFO] [stdout]   --> src/view/song_list.rs:24:14
[INFO] [stdout]    |
[INFO] [stdout] 24 | pub async fn draw_song_list(
[INFO] [stdout]    |              ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `match_song_list` is never used
[INFO] [stdout]    --> src/view/song_list.rs:174:4
[INFO] [stdout]     |
[INFO] [stdout] 174 | fn match_song_list(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr]     Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 52s
[INFO] running `Command { std: "docker" "inspect" "2b0c576bb91a1034b0e9f5250cc6cdb6dd5b31788699d40547aec59dd2890b48", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "2b0c576bb91a1034b0e9f5250cc6cdb6dd5b31788699d40547aec59dd2890b48", kill_on_drop: false }`
[INFO] [stdout] 2b0c576bb91a1034b0e9f5250cc6cdb6dd5b31788699d40547aec59dd2890b48
