[INFO] fetching crate legion-server 0.1.0...
[INFO] checking legion-server-0.1.0 against master#683dd08db5808c41baceef49368fc82a6c4767bb for pr-149137
[INFO] extracting crate legion-server 0.1.0 into /workspace/builds/worker-3-tc1/source
[INFO] started tweaking crates.io crate legion-server 0.1.0
[INFO] finished tweaking crates.io crate legion-server 0.1.0
[INFO] tweaked toml for crates.io crate legion-server 0.1.0 written to /workspace/builds/worker-3-tc1/source/Cargo.toml
[INFO] validating manifest of crates.io crate legion-server 0.1.0 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 crates.io crate legion-server 0.1.0 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]     Updating crates.io index
[INFO] [stderr]  Downloading crates ...
[INFO] [stderr]   Downloaded config v0.14.1
[INFO] [stderr]   Downloaded rust-ini v0.20.0
[INFO] [stderr]   Downloaded phalanx-crypto v0.1.0
[INFO] [stderr]   Downloaded argon2 v0.5.3
[INFO] [stderr]   Downloaded legion-protocol v0.1.0
[INFO] [stderr]   Downloaded cc v1.2.31
[INFO] [stderr]   Downloaded yaml-rust2 v0.8.1
[INFO] [stderr]   Downloaded governor v0.8.1
[INFO] [stderr]   Downloaded aws-lc-rs v1.13.3
[INFO] [stderr]   Downloaded aws-lc-sys v0.30.0
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:94a0c148923f5b2b52a63ef0eeb1882ad339ab61bce784c8077cbe41c61feb6c" "/opt/rustwide/cargo-home/bin/cargo" "+683dd08db5808c41baceef49368fc82a6c4767bb" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] [stdout] 4d22775faf8d149d54424a17fa230bc744c3db8126c479684a965ce22eb664e0
[INFO] running `Command { std: "docker" "start" "-a" "4d22775faf8d149d54424a17fa230bc744c3db8126c479684a965ce22eb664e0", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "4d22775faf8d149d54424a17fa230bc744c3db8126c479684a965ce22eb664e0", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "4d22775faf8d149d54424a17fa230bc744c3db8126c479684a965ce22eb664e0", kill_on_drop: false }`
[INFO] [stdout] 4d22775faf8d149d54424a17fa230bc744c3db8126c479684a965ce22eb664e0
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:94a0c148923f5b2b52a63ef0eeb1882ad339ab61bce784c8077cbe41c61feb6c" "/opt/rustwide/cargo-home/bin/cargo" "+683dd08db5808c41baceef49368fc82a6c4767bb" "check" "--frozen" "--all" "--all-targets" "--message-format=json", kill_on_drop: false }`
[INFO] [stdout] 2fc0ccb168ae5271f390d3fb32e0517a1f4766e0b79d3e37e4b2273010e8ebbc
[INFO] running `Command { std: "docker" "start" "-a" "2fc0ccb168ae5271f390d3fb32e0517a1f4766e0b79d3e37e4b2273010e8ebbc", kill_on_drop: false }`
[INFO] [stderr]    Compiling syn v2.0.104
[INFO] [stderr]    Compiling serde v1.0.219
[INFO] [stderr]    Compiling zerocopy v0.8.26
[INFO] [stderr]    Compiling cfg-if v1.0.1
[INFO] [stderr]    Compiling libc v0.2.174
[INFO] [stderr]    Compiling stable_deref_trait v1.2.0
[INFO] [stderr]     Checking getrandom v0.2.16
[INFO] [stderr]    Compiling serde_json v1.0.142
[INFO] [stderr]    Compiling memchr v2.7.5
[INFO] [stderr]    Compiling getrandom v0.3.3
[INFO] [stderr]    Compiling typenum v1.18.0
[INFO] [stderr]    Compiling litemap v0.8.0
[INFO] [stderr]    Compiling writeable v0.6.1
[INFO] [stderr]    Compiling pin-project-lite v0.2.16
[INFO] [stderr]    Compiling subtle v2.6.1
[INFO] [stderr]    Compiling futures-core v0.3.31
[INFO] [stderr]    Compiling zeroize v1.8.1
[INFO] [stderr]     Checking log v0.4.27
[INFO] [stderr]    Compiling crossbeam-utils v0.8.21
[INFO] [stderr]    Compiling lock_api v0.4.13
[INFO] [stderr]    Compiling icu_normalizer_data v2.0.0
[INFO] [stderr]     Checking rand_core v0.6.4
[INFO] [stderr]    Compiling rustls-pki-types v1.12.0
[INFO] [stderr]    Compiling icu_properties_data v2.0.1
[INFO] [stderr]    Compiling futures-sink v0.3.31
[INFO] [stderr]    Compiling aws-lc-rs v1.13.3
[INFO] [stderr]     Checking hashbrown v0.15.4
[INFO] [stderr]    Compiling num-traits v0.2.19
[INFO] [stderr]     Checking socket2 v0.6.0
[INFO] [stderr]     Checking mio v1.0.4
[INFO] [stderr]     Checking signal-hook-registry v1.4.5
[INFO] [stderr]    Compiling untrusted v0.9.0
[INFO] [stderr]    Compiling percent-encoding v2.3.1
[INFO] [stderr]     Checking crypto-common v0.1.6
[INFO] [stderr]    Compiling jobserver v0.1.33
[INFO] [stderr]    Compiling form_urlencoded v1.2.1
[INFO] [stderr]     Checking futures-channel v0.3.31
[INFO] [stderr]    Compiling generic-array v0.14.7
[INFO] [stderr]    Compiling rustls v0.23.31
[INFO] [stderr]    Compiling cc v1.2.31
[INFO] [stderr]    Compiling futures-io v0.3.31
[INFO] [stderr]     Checking digest v0.10.7
[INFO] [stderr]    Compiling futures-task v0.3.31
[INFO] [stderr]    Compiling bytes v1.10.1
[INFO] [stderr]    Compiling utf8_iter v1.0.4
[INFO] [stderr]    Compiling pin-utils v0.1.0
[INFO] [stderr]    Compiling slab v0.4.10
[INFO] [stderr]    Compiling concurrent-queue v2.5.0
[INFO] [stderr]    Compiling webpki-roots v1.0.2
[INFO] [stderr]     Checking sha2 v0.10.9
[INFO] [stderr]    Compiling tracing-core v0.1.34
[INFO] [stderr]    Compiling crc-catalog v2.4.0
[INFO] [stderr]    Compiling parking v2.2.1
[INFO] [stderr]     Checking indexmap v2.10.0
[INFO] [stderr]    Compiling tinyvec_macros v0.1.1
[INFO] [stderr]    Compiling chrono v0.4.41
[INFO] [stderr]    Compiling crc v3.3.0
[INFO] [stderr]    Compiling webpki-roots v0.26.11
[INFO] [stderr]    Compiling event-listener v5.4.0
[INFO] [stderr]    Compiling futures-util v0.3.31
[INFO] [stderr]    Compiling tinyvec v1.9.0
[INFO] [stderr]    Compiling hashlink v0.10.0
[INFO] [stderr]    Compiling block-buffer v0.10.4
[INFO] [stderr]     Checking hmac v0.12.1
[INFO] [stderr]    Compiling cmake v0.1.54
[INFO] [stderr]    Compiling crossbeam-queue v0.3.12
[INFO] [stderr]    Compiling base64 v0.22.1
[INFO] [stderr]    Compiling ucd-trie v0.1.7
[INFO] [stderr]    Compiling uuid v1.17.0
[INFO] [stderr]    Compiling curve25519-dalek v4.1.3
[INFO] [stderr]    Compiling tokio v1.47.1
[INFO] [stderr]    Compiling const-random-macro v0.1.16
[INFO] [stderr]    Compiling atoi v2.0.0
[INFO] [stderr]     Checking rand_core v0.9.3
[INFO] [stderr]    Compiling spin v0.9.8
[INFO] [stderr]    Compiling unicode-normalization v0.1.24
[INFO] [stderr]    Compiling unicode-properties v0.1.3
[INFO] [stderr]    Compiling unicode-bidi v0.3.18
[INFO] [stderr]     Checking ppv-lite86 v0.2.21
[INFO] [stderr]     Checking ahash v0.8.12
[INFO] [stderr]    Compiling ring v0.17.14
[INFO] [stderr]    Compiling aws-lc-sys v0.30.0
[INFO] [stderr]    Compiling libsqlite3-sys v0.30.1
[INFO] [stderr]    Compiling flume v0.11.1
[INFO] [stderr]     Checking hashbrown v0.14.5
[INFO] [stderr]     Checking const-random v0.1.18
[INFO] [stderr]     Checking regex-automata v0.4.9
[INFO] [stderr]     Checking rand_chacha v0.3.1
[INFO] [stderr]    Compiling hkdf v0.12.4
[INFO] [stderr]     Checking rand v0.8.5
[INFO] [stderr]    Compiling stringprep v0.1.5
[INFO] [stderr]    Compiling md-5 v0.10.6
[INFO] [stderr]     Checking inout v0.1.4
[INFO] [stderr]    Compiling rustix v1.0.8
[INFO] [stderr]    Compiling hex v0.4.3
[INFO] [stderr]    Compiling home v0.5.11
[INFO] [stderr]    Compiling dotenvy v0.15.7
[INFO] [stderr]    Compiling bitflags v2.9.1
[INFO] [stderr]    Compiling whoami v1.6.0
[INFO] [stderr]    Compiling byteorder v1.5.0
[INFO] [stderr]     Checking rand_chacha v0.9.0
[INFO] [stderr]     Checking dlv-list v0.5.2
[INFO] [stderr]    Compiling blake3 v1.8.2
[INFO] [stderr]     Checking universal-hash v0.5.1
[INFO] [stderr]    Compiling portable-atomic v1.11.1
[INFO] [stderr]     Checking winnow v0.7.12
[INFO] [stderr]     Checking signature v2.2.0
[INFO] [stderr]     Checking poly1305 v0.8.0
[INFO] [stderr]     Checking ordered-multimap v0.7.3
[INFO] [stderr]     Checking hashlink v0.8.4
[INFO] [stderr]     Checking rand v0.9.2
[INFO] [stderr]     Checking aead v0.5.2
[INFO] [stderr]     Checking encoding_rs v0.8.35
[INFO] [stderr]     Checking half v2.6.0
[INFO] [stderr]     Checking arraydeque v0.5.1
[INFO] [stderr]     Checking base64ct v1.8.0
[INFO] [stderr]    Compiling mockall_derive v0.13.1
[INFO] [stderr]    Compiling futures-executor v0.3.31
[INFO] [stderr]    Compiling rustls v0.22.4
[INFO] [stderr]     Checking convert_case v0.6.0
[INFO] [stderr]     Checking ciborium-ll v0.2.2
[INFO] [stderr]     Checking clap_builder v4.5.42
[INFO] [stderr]     Checking rust-ini v0.20.0
[INFO] [stderr]     Checking pbkdf2 v0.12.2
[INFO] [stderr]     Checking blake2 v0.10.6
[INFO] [stderr]     Checking tracing-log v0.2.0
[INFO] [stderr]     Checking password-hash v0.5.0
[INFO] [stderr]     Checking spinning_top v0.3.0
[INFO] [stderr]     Checking wait-timeout v0.2.1
[INFO] [stderr]    Compiling synstructure v0.13.2
[INFO] [stderr]     Checking nonzero_ext v0.3.0
[INFO] [stderr]     Checking bit-vec v0.8.0
[INFO] [stderr]     Checking web-time v1.1.0
[INFO] [stderr]     Checking quick-error v1.2.3
[INFO] [stderr]     Checking no-std-compat v0.4.1
[INFO] [stderr]     Checking predicates v3.1.3
[INFO] [stderr]     Checking rand_xorshift v0.4.0
[INFO] [stderr]     Checking crossbeam-channel v0.5.15
[INFO] [stderr]     Checking is-terminal v0.4.16
[INFO] [stderr]     Checking num_cpus v1.17.0
[INFO] [stderr]     Checking bit-set v0.8.0
[INFO] [stderr]     Checking argon2 v0.5.3
[INFO] [stderr]     Checking unarray v0.1.4
[INFO] [stderr]     Checking downcast v0.11.0
[INFO] [stderr]     Checking fragile v2.0.1
[INFO] [stderr]     Checking regex v1.11.1
[INFO] [stderr]     Checking yaml-rust2 v0.8.1
[INFO] [stderr]    Compiling serde_derive v1.0.219
[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 zeroize_derive v1.4.2
[INFO] [stderr]    Compiling thiserror-impl v2.0.12
[INFO] [stderr]    Compiling tracing-attributes v0.1.30
[INFO] [stderr]    Compiling tokio-macros v2.5.0
[INFO] [stderr]    Compiling futures-macro v0.3.31
[INFO] [stderr]    Compiling tokio-stream v0.1.17
[INFO] [stderr]    Compiling curve25519-dalek-derive v0.1.1
[INFO] [stderr]     Checking cipher v0.4.4
[INFO] [stderr]    Compiling async-trait v0.1.88
[INFO] [stderr]    Compiling zerofrom v0.1.6
[INFO] [stderr]     Checking rustls-webpki v0.102.8
[INFO] [stderr]     Checking chacha20 v0.9.1
[INFO] [stderr]    Compiling yoke v0.8.0
[INFO] [stderr]    Compiling pin-project-internal v1.1.10
[INFO] [stderr]     Checking rustls-pemfile v2.2.0
[INFO] [stderr]     Checking chacha20poly1305 v0.10.1
[INFO] [stderr]     Checking zerovec v0.11.2
[INFO] [stderr]     Checking zerotrie v0.2.2
[INFO] [stderr]    Compiling rustls-webpki v0.103.4
[INFO] [stderr]     Checking clap v4.5.42
[INFO] [stderr]    Compiling thiserror v2.0.12
[INFO] [stderr]     Checking tracing v0.1.41
[INFO] [stderr]    Compiling pest v2.8.1
[INFO] [stderr]     Checking pin-project v1.1.10
[INFO] [stderr]     Checking tinystr v0.8.1
[INFO] [stderr]     Checking potential_utf v0.1.2
[INFO] [stderr]     Checking icu_locale_core v2.0.0
[INFO] [stderr]     Checking icu_collections v2.0.0
[INFO] [stderr]     Checking icu_provider v2.0.0
[INFO] [stderr]    Compiling pest_meta v2.8.1
[INFO] [stderr]     Checking icu_properties v2.0.1
[INFO] [stderr]    Compiling pest_generator v2.8.1
[INFO] [stderr]     Checking mockall v0.13.1
[INFO] [stderr]     Checking futures v0.3.31
[INFO] [stderr]    Compiling pest_derive v2.8.1
[INFO] [stderr]     Checking smallvec v1.15.1
[INFO] [stderr]     Checking parking_lot_core v0.9.11
[INFO] [stderr]     Checking either v1.15.0
[INFO] [stderr]     Checking icu_normalizer v2.0.0
[INFO] [stderr]     Checking parking_lot v0.12.4
[INFO] [stderr]     Checking serde_spanned v0.6.9
[INFO] [stderr]     Checking futures-intrusive v0.5.0
[INFO] [stderr]     Checking idna_adapter v1.2.1
[INFO] [stderr]     Checking toml_datetime v0.6.11
[INFO] [stderr]     Checking idna v1.0.3
[INFO] [stderr]     Checking url v2.5.4
[INFO] [stderr]    Compiling serde_urlencoded v0.7.1
[INFO] [stderr]     Checking toml_edit v0.22.27
[INFO] [stderr]     Checking raw-cpuid v11.5.0
[INFO] [stderr]     Checking ed25519 v2.2.3
[INFO] [stderr]     Checking itertools v0.10.5
[INFO] [stderr]     Checking dashmap v6.1.0
[INFO] [stderr]     Checking ron v0.8.1
[INFO] [stderr]     Checking bincode v1.3.3
[INFO] [stderr]     Checking json5 v0.4.1
[INFO] [stderr]     Checking legion-protocol v0.1.0
[INFO] [stderr]     Checking ed25519-dalek v2.2.0
[INFO] [stderr]     Checking x25519-dalek v2.0.1
[INFO] [stderr]     Checking tinytemplate v1.2.1
[INFO] [stderr]     Checking rayon v1.10.0
[INFO] [stderr]     Checking tracing-subscriber v0.3.19
[INFO] [stderr]     Checking ciborium v0.2.2
[INFO] [stderr]     Checking tempfile v3.20.0
[INFO] [stderr]     Checking rusty-fork v0.3.0
[INFO] [stderr]     Checking criterion-plot v0.5.0
[INFO] [stderr]     Checking proptest v1.7.0
[INFO] [stderr]     Checking toml v0.8.23
[INFO] [stderr]    Compiling sqlx-core v0.8.6
[INFO] [stderr]     Checking quanta v0.12.6
[INFO] [stderr]     Checking governor v0.8.1
[INFO] [stderr]     Checking config v0.14.1
[INFO] [stderr]     Checking criterion v0.5.1
[INFO] [stderr]     Checking tokio-util v0.7.15
[INFO] [stderr]     Checking phalanx-crypto v0.1.0
[INFO] [stderr]    Compiling sqlx-sqlite v0.8.6
[INFO] [stderr]    Compiling sqlx-postgres v0.8.6
[INFO] [stderr]     Checking tokio-rustls v0.26.2
[INFO] [stderr]    Compiling sqlx-macros-core v0.8.6
[INFO] [stderr]    Compiling sqlx-macros v0.8.6
[INFO] [stderr]     Checking sqlx v0.8.6
[INFO] [stderr]     Checking legion-server v0.1.0 (/opt/rustwide/workdir)
[INFO] [stdout] warning: unused import: `bytes::BytesMut`
[INFO] [stdout]  --> src/actors/connection.rs:6:5
[INFO] [stdout]   |
[INFO] [stdout] 6 | use bytes::BytesMut;
[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: `timeout`
[INFO] [stdout]   --> src/actors/connection.rs:10:29
[INFO] [stdout]    |
[INFO] [stdout] 10 | use tokio::time::{interval, timeout};
[INFO] [stdout]    |                             ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `trace` and `warn`
[INFO] [stdout]   --> src/actors/connection.rs:13:35
[INFO] [stdout]    |
[INFO] [stdout] 13 | use tracing::{debug, error, info, warn, trace};
[INFO] [stdout]    |                                   ^^^^  ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `std::collections::HashMap`
[INFO] [stdout]  --> src/actors/channel.rs:1:5
[INFO] [stdout]   |
[INFO] [stdout] 1 | use std::collections::HashMap;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `warn`
[INFO] [stdout]  --> src/actors/channel.rs:6:28
[INFO] [stdout]   |
[INFO] [stdout] 6 | use tracing::{debug, info, warn};
[INFO] [stdout]   |                            ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `ChannelMember`
[INFO] [stdout]  --> src/actors/channel.rs:9:29
[INFO] [stdout]   |
[INFO] [stdout] 9 | use crate::state::{Channel, ChannelMember, ServerState};
[INFO] [stdout]   |                             ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `self::channel::ChannelActor`
[INFO] [stdout]  --> src/actors/mod.rs:6:9
[INFO] [stdout]   |
[INFO] [stdout] 6 | pub use self::channel::ChannelActor;
[INFO] [stdout]   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `info`
[INFO] [stdout]  --> src/commands/mod.rs:4:22
[INFO] [stdout]   |
[INFO] [stdout] 4 | use tracing::{debug, info};
[INFO] [stdout]   |                      ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Reply`
[INFO] [stdout]  --> src/commands/handlers/notice.rs:3:32
[INFO] [stdout]   |
[INFO] [stdout] 3 | use crate::protocol::{Message, Reply};
[INFO] [stdout]   |                                ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Reply`
[INFO] [stdout]  --> src/commands/handlers/list.rs:3:32
[INFO] [stdout]   |
[INFO] [stdout] 3 | use crate::protocol::{Message, Reply};
[INFO] [stdout]   |                                ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Reply`
[INFO] [stdout]  --> src/commands/handlers/nick.rs:4:32
[INFO] [stdout]   |
[INFO] [stdout] 4 | use crate::protocol::{Message, Reply};
[INFO] [stdout]   |                                ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `HistoryItem` and `MessageType`
[INFO] [stdout]  --> src/commands/handlers/chathistory.rs:5:22
[INFO] [stdout]   |
[INFO] [stdout] 5 | use crate::history::{HistoryItem, HistoryQuery, QueryResult, MessageType};
[INFO] [stdout]   |                      ^^^^^^^^^^^                             ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `StandardReply`
[INFO] [stdout]  --> src/commands/handlers/chathistory.rs:6:41
[INFO] [stdout]   |
[INFO] [stdout] 6 | use crate::commands::standard_replies::{StandardReply, common};
[INFO] [stdout]   |                                         ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unnecessary parentheses around block return value
[INFO] [stdout]   --> src/commands/handlers/query.rs:17:13
[INFO] [stdout]    |
[INFO] [stdout] 17 |             (conn.nickname.clone().unwrap_or_else(|| "*".to_string()))
[INFO] [stdout]    |             ^                                                        ^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(unused_parens)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] help: remove these parentheses
[INFO] [stdout]    |
[INFO] [stdout] 17 -             (conn.nickname.clone().unwrap_or_else(|| "*".to_string()))
[INFO] [stdout] 17 +             conn.nickname.clone().unwrap_or_else(|| "*".to_string()) 
[INFO] [stdout]    |
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `VecDeque`
[INFO] [stdout]  --> src/history/mod.rs:2:34
[INFO] [stdout]   |
[INFO] [stdout] 2 | use std::collections::{BTreeMap, VecDeque};
[INFO] [stdout]   |                                  ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `std::sync::RwLock`
[INFO] [stdout]  --> src/history/mod.rs:3:5
[INFO] [stdout]   |
[INFO] [stdout] 3 | use std::sync::RwLock;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `format_timestamp`
[INFO] [stdout]  --> src/history/storage.rs:1:39
[INFO] [stdout]   |
[INFO] [stdout] 1 | use super::{HistoryItem, MessageType, format_timestamp};
[INFO] [stdout]   |                                       ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `HistoryConfig`
[INFO] [stdout]   --> src/history/mod.rs:10:35
[INFO] [stdout]    |
[INFO] [stdout] 10 | pub use storage::{HistoryStorage, HistoryConfig};
[INFO] [stdout]    |                                   ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `is_legion_encrypted_channel`
[INFO] [stdout]  --> src/legion/channels.rs:6:30
[INFO] [stdout]   |
[INFO] [stdout] 6 | use legion_protocol::utils::{is_legion_encrypted_channel, ChannelType, get_channel_type};
[INFO] [stdout]   |                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Identity`
[INFO] [stdout]  --> src/legion/keys.rs:6:22
[INFO] [stdout]   |
[INFO] [stdout] 6 | use phalanx_crypto::{Identity, protocol::KeyRotationMessage};
[INFO] [stdout]   |                      ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Identity`
[INFO] [stdout]  --> src/legion/federation.rs:6:22
[INFO] [stdout]   |
[INFO] [stdout] 6 | use phalanx_crypto::{Identity, PublicKey};
[INFO] [stdout]   |                      ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `PublicKey`
[INFO] [stdout]  --> src/legion/channel_manager.rs:9:32
[INFO] [stdout]   |
[INFO] [stdout] 9 | use phalanx_crypto::{Identity, PublicKey};
[INFO] [stdout]   |                                ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `debug`, `error`, and `warn`
[INFO] [stdout]   --> src/legion/channel_manager.rs:14:15
[INFO] [stdout]    |
[INFO] [stdout] 14 | use tracing::{debug, info, warn, error};
[INFO] [stdout]    |               ^^^^^        ^^^^  ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `IronSession` and `IronVersion`
[INFO] [stdout]   --> src/legion/mod.rs:14:23
[INFO] [stdout]    |
[INFO] [stdout] 14 | use legion_protocol::{IronSession, IronVersion, Capability};
[INFO] [stdout]    |                       ^^^^^^^^^^^  ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `PhalanxGroup`
[INFO] [stdout]   --> src/legion/mod.rs:15:32
[INFO] [stdout]    |
[INFO] [stdout] 15 | use phalanx_crypto::{Identity, PhalanxGroup, AsyncPhalanxGroup};
[INFO] [stdout]    |                                ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Command as ProtocolCommand`
[INFO] [stdout]  --> src/protocol/mod.rs:2:35
[INFO] [stdout]   |
[INFO] [stdout] 2 | use legion_protocol::{IrcMessage, Command as ProtocolCommand, IronError};
[INFO] [stdout]   |                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `std::collections::HashMap`
[INFO] [stdout]  --> src/protocol/mod.rs:3:5
[INFO] [stdout]   |
[INFO] [stdout] 3 | use std::collections::HashMap;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `thiserror::Error`
[INFO] [stdout]  --> src/protocol/mod.rs:4:5
[INFO] [stdout]   |
[INFO] [stdout] 4 | use thiserror::Error;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Buf`
[INFO] [stdout]  --> src/protocol/codec.rs:1:13
[INFO] [stdout]   |
[INFO] [stdout] 1 | use bytes::{Buf, BufMut, BytesMut};
[INFO] [stdout]   |             ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `std::str::FromStr`
[INFO] [stdout]  --> src/protocol/commands.rs:1:5
[INFO] [stdout]   |
[INFO] [stdout] 1 | use std::str::FromStr;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `CapabilityHandler`, `CapabilitySet`, `Capability`, `constants`, and `utils`
[INFO] [stdout]   --> src/protocol/mod.rs:23:5
[INFO] [stdout]    |
[INFO] [stdout] 23 |     Capability, CapabilitySet, CapabilityHandler,
[INFO] [stdout]    |     ^^^^^^^^^^  ^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 24 |     constants, utils, Reply
[INFO] [stdout]    |     ^^^^^^^^^  ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `SaslAuth` and `SaslMechanism`
[INFO] [stdout]   --> src/protocol/mod.rs:27:33
[INFO] [stdout]    |
[INFO] [stdout] 27 | pub use legion_protocol::sasl::{SaslAuth, SaslMechanism};
[INFO] [stdout]    |                                 ^^^^^^^^  ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `legion_protocol::bleeding_edge`
[INFO] [stdout]   --> src/protocol/mod.rs:30:9
[INFO] [stdout]    |
[INFO] [stdout] 30 | pub use legion_protocol::bleeding_edge;
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `Argon2` and `PasswordHash`
[INFO] [stdout]  --> src/security/auth.rs:1:14
[INFO] [stdout]   |
[INFO] [stdout] 1 | use argon2::{Argon2, PasswordHash};
[INFO] [stdout]   |              ^^^^^^  ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `PasswordHasher as ArgonPasswordHasher`, `SaltString`, and `rand_core::OsRng`
[INFO] [stdout]  --> src/security/auth.rs:2:29
[INFO] [stdout]   |
[INFO] [stdout] 2 | use argon2::password_hash::{rand_core::OsRng, SaltString, PasswordHasher as ArgonPasswordHasher};
[INFO] [stdout]   |                             ^^^^^^^^^^^^^^^^  ^^^^^^^^^^  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `AuthMethod`, `SaslMechanism`, and `authenticate`
[INFO] [stdout]   --> src/security/mod.rs:14:22
[INFO] [stdout]    |
[INFO] [stdout] 14 | pub use self::auth::{AuthMethod, SaslMechanism, authenticate};
[INFO] [stdout]    |                      ^^^^^^^^^^  ^^^^^^^^^^^^^  ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `validate_message` and `validate_nickname`
[INFO] [stdout]   --> src/security/mod.rs:15:28
[INFO] [stdout]    |
[INFO] [stdout] 15 | pub use self::validation::{validate_nickname, validate_channel_name, validate_message};
[INFO] [stdout]    |                            ^^^^^^^^^^^^^^^^^                         ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated unit variant `legion_protocol::Capability::IronProtocolV1`: Use LegionProtocolV1 instead
[INFO] [stdout]   --> src/legion/session.rs:45:70
[INFO] [stdout]    |
[INFO] [stdout] 45 |             matches!(cap, Capability::LegionProtocolV1 | Capability::IronProtocolV1)
[INFO] [stdout]    |                                                                      ^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(deprecated)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated unit variant `legion_protocol::Capability::IronProtocolV1`: Use LegionProtocolV1 instead
[INFO] [stdout]   --> src/legion/session.rs:52:58
[INFO] [stdout]    |
[INFO] [stdout] 52 |             } else if capabilities.contains(&Capability::IronProtocolV1) {
[INFO] [stdout]    |                                                          ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated unit variant `legion_protocol::Capability::IronProtocolV1`: Use LegionProtocolV1 instead
[INFO] [stdout]   --> src/legion/session.rs:74:49
[INFO] [stdout]    |
[INFO] [stdout] 74 |         self.capabilities.contains(&Capability::IronProtocolV1)
[INFO] [stdout]    |                                                 ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `bytes::BytesMut`
[INFO] [stdout]  --> src/actors/connection.rs:6:5
[INFO] [stdout]   |
[INFO] [stdout] 6 | use bytes::BytesMut;
[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: `timeout`
[INFO] [stdout]   --> src/actors/connection.rs:10:29
[INFO] [stdout]    |
[INFO] [stdout] 10 | use tokio::time::{interval, timeout};
[INFO] [stdout]    |                             ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `trace` and `warn`
[INFO] [stdout]   --> src/actors/connection.rs:13:35
[INFO] [stdout]    |
[INFO] [stdout] 13 | use tracing::{debug, error, info, warn, trace};
[INFO] [stdout]    |                                   ^^^^  ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `std::collections::HashMap`
[INFO] [stdout]  --> src/actors/channel.rs:1:5
[INFO] [stdout]   |
[INFO] [stdout] 1 | use std::collections::HashMap;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `warn`
[INFO] [stdout]  --> src/actors/channel.rs:6:28
[INFO] [stdout]   |
[INFO] [stdout] 6 | use tracing::{debug, info, warn};
[INFO] [stdout]   |                            ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `ChannelMember`
[INFO] [stdout]  --> src/actors/channel.rs:9:29
[INFO] [stdout]   |
[INFO] [stdout] 9 | use crate::state::{Channel, ChannelMember, ServerState};
[INFO] [stdout]   |                             ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `self::channel::ChannelActor`
[INFO] [stdout]  --> src/actors/mod.rs:6:9
[INFO] [stdout]   |
[INFO] [stdout] 6 | pub use self::channel::ChannelActor;
[INFO] [stdout]   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `info`
[INFO] [stdout]  --> src/commands/mod.rs:4:22
[INFO] [stdout]   |
[INFO] [stdout] 4 | use tracing::{debug, info};
[INFO] [stdout]   |                      ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Reply`
[INFO] [stdout]  --> src/commands/handlers/notice.rs:3:32
[INFO] [stdout]   |
[INFO] [stdout] 3 | use crate::protocol::{Message, Reply};
[INFO] [stdout]   |                                ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `Message` and `Reply`
[INFO] [stdout]  --> src/commands/handlers/who_test.rs:3:23
[INFO] [stdout]   |
[INFO] [stdout] 3 | use crate::protocol::{Message, Reply};
[INFO] [stdout]   |                       ^^^^^^^  ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `Message` and `Reply`
[INFO] [stdout]  --> src/commands/handlers/topic_test.rs:3:23
[INFO] [stdout]   |
[INFO] [stdout] 3 | use crate::protocol::{Message, Reply};
[INFO] [stdout]   |                       ^^^^^^^  ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `Message` and `Reply`
[INFO] [stdout]  --> src/commands/handlers/mode_test.rs:3:23
[INFO] [stdout]   |
[INFO] [stdout] 3 | use crate::protocol::{Message, Reply};
[INFO] [stdout]   |                       ^^^^^^^  ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `Message` and `Reply`
[INFO] [stdout]  --> src/commands/handlers/kick_test.rs:3:23
[INFO] [stdout]   |
[INFO] [stdout] 3 | use crate::protocol::{Message, Reply};
[INFO] [stdout]   |                       ^^^^^^^  ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Reply`
[INFO] [stdout]  --> src/commands/handlers/list.rs:3:32
[INFO] [stdout]   |
[INFO] [stdout] 3 | use crate::protocol::{Message, Reply};
[INFO] [stdout]   |                                ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `Message` and `Reply`
[INFO] [stdout]  --> src/commands/handlers/list_test.rs:3:23
[INFO] [stdout]   |
[INFO] [stdout] 3 | use crate::protocol::{Message, Reply};
[INFO] [stdout]   |                       ^^^^^^^  ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Reply`
[INFO] [stdout]  --> src/commands/handlers/nick.rs:4:32
[INFO] [stdout]   |
[INFO] [stdout] 4 | use crate::protocol::{Message, Reply};
[INFO] [stdout]   |                                ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `HistoryItem` and `MessageType`
[INFO] [stdout]  --> src/commands/handlers/chathistory.rs:5:22
[INFO] [stdout]   |
[INFO] [stdout] 5 | use crate::history::{HistoryItem, HistoryQuery, QueryResult, MessageType};
[INFO] [stdout]   |                      ^^^^^^^^^^^                             ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `StandardReply`
[INFO] [stdout]  --> src/commands/handlers/chathistory.rs:6:41
[INFO] [stdout]   |
[INFO] [stdout] 6 | use crate::commands::standard_replies::{StandardReply, common};
[INFO] [stdout]   |                                         ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unnecessary parentheses around block return value
[INFO] [stdout]   --> src/commands/handlers/query.rs:17:13
[INFO] [stdout]    |
[INFO] [stdout] 17 |             (conn.nickname.clone().unwrap_or_else(|| "*".to_string()))
[INFO] [stdout]    |             ^                                                        ^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(unused_parens)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] help: remove these parentheses
[INFO] [stdout]    |
[INFO] [stdout] 17 -             (conn.nickname.clone().unwrap_or_else(|| "*".to_string()))
[INFO] [stdout] 17 +             conn.nickname.clone().unwrap_or_else(|| "*".to_string()) 
[INFO] [stdout]    |
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `VecDeque`
[INFO] [stdout]  --> src/history/mod.rs:2:34
[INFO] [stdout]   |
[INFO] [stdout] 2 | use std::collections::{BTreeMap, VecDeque};
[INFO] [stdout]   |                                  ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `std::sync::RwLock`
[INFO] [stdout]  --> src/history/mod.rs:3:5
[INFO] [stdout]   |
[INFO] [stdout] 3 | use std::sync::RwLock;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `format_timestamp`
[INFO] [stdout]  --> src/history/storage.rs:1:39
[INFO] [stdout]   |
[INFO] [stdout] 1 | use super::{HistoryItem, MessageType, format_timestamp};
[INFO] [stdout]   |                                       ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `HistoryConfig`
[INFO] [stdout]   --> src/history/mod.rs:10:35
[INFO] [stdout]    |
[INFO] [stdout] 10 | pub use storage::{HistoryStorage, HistoryConfig};
[INFO] [stdout]    |                                   ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `is_legion_encrypted_channel`
[INFO] [stdout]  --> src/legion/channels.rs:6:30
[INFO] [stdout]   |
[INFO] [stdout] 6 | use legion_protocol::utils::{is_legion_encrypted_channel, ChannelType, get_channel_type};
[INFO] [stdout]   |                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Identity`
[INFO] [stdout]  --> src/legion/keys.rs:6:22
[INFO] [stdout]   |
[INFO] [stdout] 6 | use phalanx_crypto::{Identity, protocol::KeyRotationMessage};
[INFO] [stdout]   |                      ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `Identity` and `protocol::KeyRotationMessage`
[INFO] [stdout]    --> src/legion/keys.rs:412:26
[INFO] [stdout]     |
[INFO] [stdout] 412 |     use phalanx_crypto::{Identity, protocol::KeyRotationMessage};
[INFO] [stdout]     |                          ^^^^^^^^  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Identity`
[INFO] [stdout]  --> src/legion/federation.rs:6:22
[INFO] [stdout]   |
[INFO] [stdout] 6 | use phalanx_crypto::{Identity, PublicKey};
[INFO] [stdout]   |                      ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `PublicKey`
[INFO] [stdout]  --> src/legion/channel_manager.rs:9:32
[INFO] [stdout]   |
[INFO] [stdout] 9 | use phalanx_crypto::{Identity, PublicKey};
[INFO] [stdout]   |                                ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `debug`, `error`, and `warn`
[INFO] [stdout]   --> src/legion/channel_manager.rs:14:15
[INFO] [stdout]    |
[INFO] [stdout] 14 | use tracing::{debug, info, warn, error};
[INFO] [stdout]    |               ^^^^^        ^^^^  ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `IronSession` and `IronVersion`
[INFO] [stdout]   --> src/legion/mod.rs:14:23
[INFO] [stdout]    |
[INFO] [stdout] 14 | use legion_protocol::{IronSession, IronVersion, Capability};
[INFO] [stdout]    |                       ^^^^^^^^^^^  ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `PhalanxGroup`
[INFO] [stdout]   --> src/legion/mod.rs:15:32
[INFO] [stdout]    |
[INFO] [stdout] 15 | use phalanx_crypto::{Identity, PhalanxGroup, AsyncPhalanxGroup};
[INFO] [stdout]    |                                ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Command as ProtocolCommand`
[INFO] [stdout]  --> src/protocol/mod.rs:2:35
[INFO] [stdout]   |
[INFO] [stdout] 2 | use legion_protocol::{IrcMessage, Command as ProtocolCommand, IronError};
[INFO] [stdout]   |                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `std::collections::HashMap`
[INFO] [stdout]  --> src/protocol/mod.rs:3:5
[INFO] [stdout]   |
[INFO] [stdout] 3 | use std::collections::HashMap;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `thiserror::Error`
[INFO] [stdout]  --> src/protocol/mod.rs:4:5
[INFO] [stdout]   |
[INFO] [stdout] 4 | use thiserror::Error;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Buf`
[INFO] [stdout]  --> src/protocol/codec.rs:1:13
[INFO] [stdout]   |
[INFO] [stdout] 1 | use bytes::{Buf, BufMut, BytesMut};
[INFO] [stdout]   |             ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `std::str::FromStr`
[INFO] [stdout]  --> src/protocol/commands.rs:1:5
[INFO] [stdout]   |
[INFO] [stdout] 1 | use std::str::FromStr;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `CapabilityHandler`, `CapabilitySet`, `Capability`, `constants`, and `utils`
[INFO] [stdout]   --> src/protocol/mod.rs:23:5
[INFO] [stdout]    |
[INFO] [stdout] 23 |     Capability, CapabilitySet, CapabilityHandler,
[INFO] [stdout]    |     ^^^^^^^^^^  ^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 24 |     constants, utils, Reply
[INFO] [stdout]    |     ^^^^^^^^^  ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `SaslAuth` and `SaslMechanism`
[INFO] [stdout]   --> src/protocol/mod.rs:27:33
[INFO] [stdout]    |
[INFO] [stdout] 27 | pub use legion_protocol::sasl::{SaslAuth, SaslMechanism};
[INFO] [stdout]    |                                 ^^^^^^^^  ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `legion_protocol::bleeding_edge`
[INFO] [stdout]   --> src/protocol/mod.rs:30:9
[INFO] [stdout]    |
[INFO] [stdout] 30 | pub use legion_protocol::bleeding_edge;
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `Argon2` and `PasswordHash`
[INFO] [stdout]  --> src/security/auth.rs:1:14
[INFO] [stdout]   |
[INFO] [stdout] 1 | use argon2::{Argon2, PasswordHash};
[INFO] [stdout]   |              ^^^^^^  ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `PasswordHasher as ArgonPasswordHasher`, `SaltString`, and `rand_core::OsRng`
[INFO] [stdout]  --> src/security/auth.rs:2:29
[INFO] [stdout]   |
[INFO] [stdout] 2 | use argon2::password_hash::{rand_core::OsRng, SaltString, PasswordHasher as ArgonPasswordHasher};
[INFO] [stdout]   |                             ^^^^^^^^^^^^^^^^  ^^^^^^^^^^  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `AuthMethod`, `SaslMechanism`, and `authenticate`
[INFO] [stdout]   --> src/security/mod.rs:14:22
[INFO] [stdout]    |
[INFO] [stdout] 14 | pub use self::auth::{AuthMethod, SaslMechanism, authenticate};
[INFO] [stdout]    |                      ^^^^^^^^^^  ^^^^^^^^^^^^^  ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `validate_message` and `validate_nickname`
[INFO] [stdout]   --> src/security/mod.rs:15:28
[INFO] [stdout]    |
[INFO] [stdout] 15 | pub use self::validation::{validate_nickname, validate_channel_name, validate_message};
[INFO] [stdout]    |                            ^^^^^^^^^^^^^^^^^                         ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]   --> src/actors/connection.rs:49:17
[INFO] [stdout]    |
[INFO] [stdout] 49 |             let mut state = server_state.write().await;
[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: use of deprecated unit variant `legion_protocol::Capability::IronProtocolV1`: Use LegionProtocolV1 instead
[INFO] [stdout]   --> src/legion/session.rs:45:70
[INFO] [stdout]    |
[INFO] [stdout] 45 |             matches!(cap, Capability::LegionProtocolV1 | Capability::IronProtocolV1)
[INFO] [stdout]    |                                                                      ^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(deprecated)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated unit variant `legion_protocol::Capability::IronProtocolV1`: Use LegionProtocolV1 instead
[INFO] [stdout]   --> src/legion/session.rs:52:58
[INFO] [stdout]    |
[INFO] [stdout] 52 |             } else if capabilities.contains(&Capability::IronProtocolV1) {
[INFO] [stdout]    |                                                          ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated unit variant `legion_protocol::Capability::IronProtocolV1`: Use LegionProtocolV1 instead
[INFO] [stdout]   --> src/legion/session.rs:74:49
[INFO] [stdout]    |
[INFO] [stdout] 74 |         self.capabilities.contains(&Capability::IronProtocolV1)
[INFO] [stdout]    |                                                 ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/actors/connection.rs:128:17
[INFO] [stdout]     |
[INFO] [stdout] 128 |             let mut state = self.server_state.write().await;
[INFO] [stdout]     |                 ----^^^^^
[INFO] [stdout]     |                 |
[INFO] [stdout]     |                 help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/actors/connection.rs:244:33
[INFO] [stdout]     |
[INFO] [stdout] 244 | ...                   let mut state = self.server_state.write().await;
[INFO] [stdout]     |                           ----^^^^^
[INFO] [stdout]     |                           |
[INFO] [stdout]     |                           help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/actors/connection.rs:299:17
[INFO] [stdout]     |
[INFO] [stdout] 299 |             let mut state = self.server_state.write().await;
[INFO] [stdout]     |                 ----^^^^^
[INFO] [stdout]     |                 |
[INFO] [stdout]     |                 help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/actors/connection.rs:349:17
[INFO] [stdout]     |
[INFO] [stdout] 349 |             let mut state = self.server_state.write().await;
[INFO] [stdout]     |                 ----^^^^^
[INFO] [stdout]     |                 |
[INFO] [stdout]     |                 help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]   --> src/actors/connection.rs:49:17
[INFO] [stdout]    |
[INFO] [stdout] 49 |             let mut state = server_state.write().await;
[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: variable does not need to be mutable
[INFO] [stdout]    --> src/actors/connection.rs:128:17
[INFO] [stdout]     |
[INFO] [stdout] 128 |             let mut state = self.server_state.write().await;
[INFO] [stdout]     |                 ----^^^^^
[INFO] [stdout]     |                 |
[INFO] [stdout]     |                 help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/actors/connection.rs:244:33
[INFO] [stdout]     |
[INFO] [stdout] 244 | ...                   let mut state = self.server_state.write().await;
[INFO] [stdout]     |                           ----^^^^^
[INFO] [stdout]     |                           |
[INFO] [stdout]     |                           help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/actors/connection.rs:299:17
[INFO] [stdout]     |
[INFO] [stdout] 299 |             let mut state = self.server_state.write().await;
[INFO] [stdout]     |                 ----^^^^^
[INFO] [stdout]     |                 |
[INFO] [stdout]     |                 help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/actors/connection.rs:349:17
[INFO] [stdout]     |
[INFO] [stdout] 349 |             let mut state = self.server_state.write().await;
[INFO] [stdout]     |                 ----^^^^^
[INFO] [stdout]     |                 |
[INFO] [stdout]     |                 help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]   --> src/commands/handlers/join.rs:14:9
[INFO] [stdout]    |
[INFO] [stdout] 14 |     let mut state = server_state.write().await;
[INFO] [stdout]    |         ----^^^^^
[INFO] [stdout]    |         |
[INFO] [stdout]    |         help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]   --> src/commands/handlers/part.rs:13:9
[INFO] [stdout]    |
[INFO] [stdout] 13 |     let mut state = server_state.write().await;
[INFO] [stdout]    |         ----^^^^^
[INFO] [stdout]    |         |
[INFO] [stdout]    |         help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]   --> src/commands/handlers/topic.rs:20:9
[INFO] [stdout]    |
[INFO] [stdout] 20 |     let mut state = server_state.write().await;
[INFO] [stdout]    |         ----^^^^^
[INFO] [stdout]    |         |
[INFO] [stdout]    |         help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]   --> src/commands/handlers/mode.rs:82:9
[INFO] [stdout]    |
[INFO] [stdout] 82 |     let mut mode_args = mode_params[1..].to_vec();
[INFO] [stdout]    |         ----^^^^^^^^^
[INFO] [stdout]    |         |
[INFO] [stdout]    |         help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]   --> src/commands/handlers/kick.rs:25:9
[INFO] [stdout]    |
[INFO] [stdout] 25 |     let mut state = server_state.write().await;
[INFO] [stdout]    |         ----^^^^^
[INFO] [stdout]    |         |
[INFO] [stdout]    |         help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]   --> src/commands/handlers/nick.rs:16:9
[INFO] [stdout]    |
[INFO] [stdout] 16 |     let mut state = server_state.write().await;
[INFO] [stdout]    |         ----^^^^^
[INFO] [stdout]    |         |
[INFO] [stdout]    |         help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]   --> src/commands/handlers/join.rs:14:9
[INFO] [stdout]    |
[INFO] [stdout] 14 |     let mut state = server_state.write().await;
[INFO] [stdout]    |         ----^^^^^
[INFO] [stdout]    |         |
[INFO] [stdout]    |         help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]   --> src/commands/handlers/part.rs:13:9
[INFO] [stdout]    |
[INFO] [stdout] 13 |     let mut state = server_state.write().await;
[INFO] [stdout]    |         ----^^^^^
[INFO] [stdout]    |         |
[INFO] [stdout]    |         help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]   --> src/commands/handlers/who_test.rs:21:9
[INFO] [stdout]    |
[INFO] [stdout] 21 |     let mut state_guard = state.write().await;
[INFO] [stdout]    |         ----^^^^^^^^^^^
[INFO] [stdout]    |         |
[INFO] [stdout]    |         help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]   --> src/commands/handlers/topic.rs:20:9
[INFO] [stdout]    |
[INFO] [stdout] 20 |     let mut state = server_state.write().await;
[INFO] [stdout]    |         ----^^^^^
[INFO] [stdout]    |         |
[INFO] [stdout]    |         help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]   --> src/commands/handlers/topic_test.rs:19:9
[INFO] [stdout]    |
[INFO] [stdout] 19 |     let mut state_guard = state.write().await;
[INFO] [stdout]    |         ----^^^^^^^^^^^
[INFO] [stdout]    |         |
[INFO] [stdout]    |         help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]   --> src/commands/handlers/mode.rs:82:9
[INFO] [stdout]    |
[INFO] [stdout] 82 |     let mut mode_args = mode_params[1..].to_vec();
[INFO] [stdout]    |         ----^^^^^^^^^
[INFO] [stdout]    |         |
[INFO] [stdout]    |         help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]   --> src/commands/handlers/mode_test.rs:21:9
[INFO] [stdout]    |
[INFO] [stdout] 21 |     let mut state_guard = state.write().await;
[INFO] [stdout]    |         ----^^^^^^^^^^^
[INFO] [stdout]    |         |
[INFO] [stdout]    |         help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]   --> src/commands/handlers/mode_test.rs:49:9
[INFO] [stdout]    |
[INFO] [stdout] 49 |     let mut channel = Channel::new("#test".to_string());
[INFO] [stdout]    |         ----^^^^^^^
[INFO] [stdout]    |         |
[INFO] [stdout]    |         help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]   --> src/commands/handlers/kick.rs:25:9
[INFO] [stdout]    |
[INFO] [stdout] 25 |     let mut state = server_state.write().await;
[INFO] [stdout]    |         ----^^^^^
[INFO] [stdout]    |         |
[INFO] [stdout]    |         help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]   --> src/commands/handlers/kick_test.rs:22:13
[INFO] [stdout]    |
[INFO] [stdout] 22 |         let mut state_guard = state.write().await;
[INFO] [stdout]    |             ----^^^^^^^^^^^
[INFO] [stdout]    |             |
[INFO] [stdout]    |             help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]   --> src/commands/handlers/list_test.rs:19:9
[INFO] [stdout]    |
[INFO] [stdout] 19 |     let mut state_guard = state.write().await;
[INFO] [stdout]    |         ----^^^^^^^^^^^
[INFO] [stdout]    |         |
[INFO] [stdout]    |         help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]   --> src/commands/handlers/list_test.rs:57:9
[INFO] [stdout]    |
[INFO] [stdout] 57 |     let mut empty_channel = Channel::new("#empty".to_string());
[INFO] [stdout]    |         ----^^^^^^^^^^^^^
[INFO] [stdout]    |         |
[INFO] [stdout]    |         help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]   --> src/commands/handlers/list_test.rs:60:9
[INFO] [stdout]    |
[INFO] [stdout] 60 |     let mut no_topic_channel = Channel::new("#notopic".to_string());
[INFO] [stdout]    |         ----^^^^^^^^^^^^^^^^
[INFO] [stdout]    |         |
[INFO] [stdout]    |         help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]   --> src/commands/handlers/nick.rs:16:9
[INFO] [stdout]    |
[INFO] [stdout] 16 |     let mut state = server_state.write().await;
[INFO] [stdout]    |         ----^^^^^
[INFO] [stdout]    |         |
[INFO] [stdout]    |         help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `cap_version`
[INFO] [stdout]    --> src/actors/connection.rs:183:21
[INFO] [stdout]     |
[INFO] [stdout] 183 |                 let cap_version = if !params.is_empty() {
[INFO] [stdout]     |                     ^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_cap_version`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `user`
[INFO] [stdout]   --> src/commands/handlers/privmsg.rs:15:16
[INFO] [stdout]    |
[INFO] [stdout] 15 |     let (nick, user, host, has_echo_message, msg_id, privmsg) = {
[INFO] [stdout]    |                ^^^^ help: if this is intentional, prefix it with an underscore: `_user`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `host`
[INFO] [stdout]   --> src/commands/handlers/privmsg.rs:15:22
[INFO] [stdout]    |
[INFO] [stdout] 15 |     let (nick, user, host, has_echo_message, msg_id, privmsg) = {
[INFO] [stdout]    |                      ^^^^ help: if this is intentional, prefix it with an underscore: `_host`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `member_nick`
[INFO] [stdout]   --> src/commands/handlers/who.rs:37:37
[INFO] [stdout]    |
[INFO] [stdout] 37 |                         if let Some(member_nick) = &member_conn.nickname {
[INFO] [stdout]    |                                     ^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_member_nick`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `target_conn`
[INFO] [stdout]   --> src/commands/handlers/who.rs:66:25
[INFO] [stdout]    |
[INFO] [stdout] 66 |             if let Some(target_conn) = state.connections.get(&target_id) {
[INFO] [stdout]    |                         ^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_target_conn`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `cap_version`
[INFO] [stdout]    --> src/actors/connection.rs:183:21
[INFO] [stdout]     |
[INFO] [stdout] 183 |                 let cap_version = if !params.is_empty() {
[INFO] [stdout]     |                     ^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_cap_version`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `user`
[INFO] [stdout]   --> src/commands/handlers/privmsg.rs:15:16
[INFO] [stdout]    |
[INFO] [stdout] 15 |     let (nick, user, host, has_echo_message, msg_id, privmsg) = {
[INFO] [stdout]    |                ^^^^ help: if this is intentional, prefix it with an underscore: `_user`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `host`
[INFO] [stdout]   --> src/commands/handlers/privmsg.rs:15:22
[INFO] [stdout]    |
[INFO] [stdout] 15 |     let (nick, user, host, has_echo_message, msg_id, privmsg) = {
[INFO] [stdout]    |                      ^^^^ help: if this is intentional, prefix it with an underscore: `_host`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `user`
[INFO] [stdout]   --> src/commands/handlers/notice.rs:21:16
[INFO] [stdout]    |
[INFO] [stdout] 21 |     let (nick, user, host, has_echo_message, msg_id, notice_msg) = {
[INFO] [stdout]    |                ^^^^ help: if this is intentional, prefix it with an underscore: `_user`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `host`
[INFO] [stdout]   --> src/commands/handlers/notice.rs:21:22
[INFO] [stdout]    |
[INFO] [stdout] 21 |     let (nick, user, host, has_echo_message, msg_id, notice_msg) = {
[INFO] [stdout]    |                      ^^^^ help: if this is intentional, prefix it with an underscore: `_host`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `member_nick`
[INFO] [stdout]   --> src/commands/handlers/who.rs:37:37
[INFO] [stdout]    |
[INFO] [stdout] 37 |                         if let Some(member_nick) = &member_conn.nickname {
[INFO] [stdout]    |                                     ^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_member_nick`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `target_conn`
[INFO] [stdout]   --> src/commands/handlers/who.rs:66:25
[INFO] [stdout]    |
[INFO] [stdout] 66 |             if let Some(target_conn) = state.connections.get(&target_id) {
[INFO] [stdout]    |                         ^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_target_conn`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `user`
[INFO] [stdout]   --> src/commands/handlers/notice.rs:21:16
[INFO] [stdout]    |
[INFO] [stdout] 21 |     let (nick, user, host, has_echo_message, msg_id, notice_msg) = {
[INFO] [stdout]    |                ^^^^ help: if this is intentional, prefix it with an underscore: `_user`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `host`
[INFO] [stdout]   --> src/commands/handlers/notice.rs:21:22
[INFO] [stdout]    |
[INFO] [stdout] 21 |     let (nick, user, host, has_echo_message, msg_id, notice_msg) = {
[INFO] [stdout]    |                      ^^^^ help: if this is intentional, prefix it with an underscore: `_host`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/commands/handlers/who_test.rs:271:13
[INFO] [stdout]     |
[INFO] [stdout] 271 |         let mut state_guard = state.write().await;
[INFO] [stdout]     |             ----^^^^^^^^^^^
[INFO] [stdout]     |             |
[INFO] [stdout]     |             help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `user_id`
[INFO] [stdout]    --> src/commands/handlers/topic_test.rs:124:17
[INFO] [stdout]     |
[INFO] [stdout] 124 |     let (state, user_id, member_id) = setup_test_state().await;
[INFO] [stdout]     |                 ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_user_id`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/commands/handlers/topic_test.rs:180:13
[INFO] [stdout]     |
[INFO] [stdout] 180 |         let mut channel = state_guard.channels.get_mut("#test").unwrap();
[INFO] [stdout]     |             ----^^^^^^^
[INFO] [stdout]     |             |
[INFO] [stdout]     |             help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `channel`
[INFO] [stdout]    --> src/legion/mod.rs:229:13
[INFO] [stdout]     |
[INFO] [stdout] 229 |         let channel = self.channels.get(&channel_name)
[INFO] [stdout]     |             ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_channel`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/commands/handlers/kick_test.rs:126:17
[INFO] [stdout]     |
[INFO] [stdout] 126 |             let mut state_guard = state.write().await;
[INFO] [stdout]     |                 ----^^^^^^^^^^^
[INFO] [stdout]     |                 |
[INFO] [stdout]     |                 help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/commands/handlers/list_test.rs:343:13
[INFO] [stdout]     |
[INFO] [stdout] 343 |         let mut state_guard = state.write().await;
[INFO] [stdout]     |             ----^^^^^^^^^^^
[INFO] [stdout]     |             |
[INFO] [stdout]     |             help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `policy`
[INFO] [stdout]    --> src/legion/keys.rs:259:17
[INFO] [stdout]     |
[INFO] [stdout] 259 |             let policy = drop(keys);
[INFO] [stdout]     |                 ^^^^^^ help: if this is intentional, prefix it with an underscore: `_policy`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `channel`
[INFO] [stdout]    --> src/legion/keys.rs:339:18
[INFO] [stdout]     |
[INFO] [stdout] 339 |             for (channel, channel_keys) in keys.iter_mut() {
[INFO] [stdout]     |                  ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_channel`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `message`
[INFO] [stdout]    --> src/legion/federation.rs:298:84
[INFO] [stdout]     |
[INFO] [stdout] 298 |     pub async fn send_federated_message(&self, target_server: &str, channel: &str, message: Vec<u8>) -> LegionResult<()> {
[INFO] [stdout]     |                                                                                    ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_message`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `message`
[INFO] [stdout]    --> src/legion/federation.rs:319:87
[INFO] [stdout]     |
[INFO] [stdout] 319 |     pub async fn process_federated_message(&self, source_server: &str, channel: &str, message: Vec<u8>) -> LegionResult<()> {
[INFO] [stdout]     |                                                                                       ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_message`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: value assigned to `cleaned_servers` is never read
[INFO] [stdout]    --> src/legion/federation.rs:361:35
[INFO] [stdout]     |
[INFO] [stdout] 361 |         let mut cleaned_servers = 0;
[INFO] [stdout]     |                                   ^
[INFO] [stdout]     |
[INFO] [stdout]     = help: maybe it is overwritten before being read?
[INFO] [stdout]     = note: `#[warn(unused_assignments)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `channel`
[INFO] [stdout]    --> src/legion/mod.rs:229:13
[INFO] [stdout]     |
[INFO] [stdout] 229 |         let channel = self.channels.get(&channel_name)
[INFO] [stdout]     |             ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_channel`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `member`
[INFO] [stdout]    --> src/legion/channel_manager.rs:525:33
[INFO] [stdout]     |
[INFO] [stdout] 525 |                     if let Some(member) = channel.members.remove(target_user) {
[INFO] [stdout]     |                                 ^^^^^^ help: if this is intentional, prefix it with an underscore: `_member`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `operator_identity`
[INFO] [stdout]    --> src/legion/channel_manager.rs:753:9
[INFO] [stdout]     |
[INFO] [stdout] 753 |         operator_identity: &Identity,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_operator_identity`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `policy`
[INFO] [stdout]    --> src/legion/keys.rs:259:17
[INFO] [stdout]     |
[INFO] [stdout] 259 |             let policy = drop(keys);
[INFO] [stdout]     |                 ^^^^^^ help: if this is intentional, prefix it with an underscore: `_policy`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `channel`
[INFO] [stdout]    --> src/legion/keys.rs:339:18
[INFO] [stdout]     |
[INFO] [stdout] 339 |             for (channel, channel_keys) in keys.iter_mut() {
[INFO] [stdout]     |                  ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_channel`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `message`
[INFO] [stdout]    --> src/legion/federation.rs:298:84
[INFO] [stdout]     |
[INFO] [stdout] 298 |     pub async fn send_federated_message(&self, target_server: &str, channel: &str, message: Vec<u8>) -> LegionResult<()> {
[INFO] [stdout]     |                                                                                    ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_message`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `message`
[INFO] [stdout]    --> src/legion/federation.rs:319:87
[INFO] [stdout]     |
[INFO] [stdout] 319 |     pub async fn process_federated_message(&self, source_server: &str, channel: &str, message: Vec<u8>) -> LegionResult<()> {
[INFO] [stdout]     |                                                                                       ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_message`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: value assigned to `cleaned_servers` is never read
[INFO] [stdout]    --> src/legion/federation.rs:361:35
[INFO] [stdout]     |
[INFO] [stdout] 361 |         let mut cleaned_servers = 0;
[INFO] [stdout]     |                                   ^
[INFO] [stdout]     |
[INFO] [stdout]     = help: maybe it is overwritten before being read?
[INFO] [stdout]     = note: `#[warn(unused_assignments)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: type `members::ChannelSettings` is more private than the item `members::ChannelStats::settings`
[INFO] [stdout]    --> src/legion/members.rs:635:5
[INFO] [stdout]     |
[INFO] [stdout] 635 |     pub settings: ChannelSettings,
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ field `members::ChannelStats::settings` is reachable at visibility `pub(crate)`
[INFO] [stdout]     |
[INFO] [stdout] note: but type `members::ChannelSettings` is only usable at visibility `pub(self)`
[INFO] [stdout]    --> src/legion/members.rs:145:1
[INFO] [stdout]     |
[INFO] [stdout] 145 | struct ChannelSettings {
[INFO] [stdout]     | ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     = note: `#[warn(private_interfaces)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: type `TrustLevel` is more private than the item `FederationManager::add_federated_server`
[INFO] [stdout]    --> src/legion/federation.rs:185:5
[INFO] [stdout]     |
[INFO] [stdout] 185 |     pub async fn add_federated_server(&self, hostname: String, public_key: PublicKey, trust_level: TrustLevel) -> LegionResult<()> {
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ method `FederationManager::add_federated_server` is reachable at visibility `pub(crate)`
[INFO] [stdout]     |
[INFO] [stdout] note: but type `TrustLevel` is only usable at visibility `pub(self)`
[INFO] [stdout]    --> src/legion/federation.rs:51:1
[INFO] [stdout]     |
[INFO] [stdout]  51 | enum TrustLevel {
[INFO] [stdout]     | ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: type `FederationStatus` is more private than the item `FederationManager::update_server_status`
[INFO] [stdout]    --> src/legion/federation.rs:227:5
[INFO] [stdout]     |
[INFO] [stdout] 227 |     pub async fn update_server_status(&self, hostname: &str, status: FederationStatus) -> LegionResult<()> {
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ method `FederationManager::update_server_status` is reachable at visibility `pub(crate)`
[INFO] [stdout]     |
[INFO] [stdout] note: but type `FederationStatus` is only usable at visibility `pub(self)`
[INFO] [stdout]    --> src/legion/federation.rs:42:1
[INFO] [stdout]     |
[INFO] [stdout]  42 | enum FederationStatus {
[INFO] [stdout]     | ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: type `ActivityEntry` is more private than the item `ExtendedChannelInfo::recent_activity`
[INFO] [stdout]    --> src/legion/channel_manager.rs:166:5
[INFO] [stdout]     |
[INFO] [stdout] 166 |     pub recent_activity: Vec<ActivityEntry>,
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ field `ExtendedChannelInfo::recent_activity` is reachable at visibility `pub(crate)`
[INFO] [stdout]     |
[INFO] [stdout] note: but type `ActivityEntry` is only usable at visibility `pub(self)`
[INFO] [stdout]    --> src/legion/channel_manager.rs:124:1
[INFO] [stdout]     |
[INFO] [stdout] 124 | struct ActivityEntry {
[INFO] [stdout]     | ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `PING_TIMEOUT` is never used
[INFO] [stdout]   --> src/actors/connection.rs:20:7
[INFO] [stdout]    |
[INFO] [stdout] 20 | const PING_TIMEOUT: Duration = Duration::from_secs(60);
[INFO] [stdout]    |       ^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `tx` is never read
[INFO] [stdout]   --> src/actors/connection.rs:29:5
[INFO] [stdout]    |
[INFO] [stdout] 23 | pub struct ConnectionActor {
[INFO] [stdout]    |            --------------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 29 |     tx: mpsc::Sender<Message>,
[INFO] [stdout]    |     ^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `tx` is never read
[INFO] [stdout]   --> src/actors/channel.rs:16:5
[INFO] [stdout]    |
[INFO] [stdout] 11 | pub struct ChannelActor {
[INFO] [stdout]    |            ------------ field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 16 |     tx: mpsc::Sender<ChannelMessage>,
[INFO] [stdout]    |     ^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variant `Invite` is never constructed
[INFO] [stdout]   --> src/actors/channel.rs:47:5
[INFO] [stdout]    |
[INFO] [stdout] 20 | pub enum ChannelMessage {
[INFO] [stdout]    |          -------------- variant in this enum
[INFO] [stdout] ...
[INFO] [stdout] 47 |     Invite {
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `ChannelMessage` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `tx` is never read
[INFO] [stdout]   --> src/actors/server.rs:15:5
[INFO] [stdout]    |
[INFO] [stdout] 11 | pub struct ServerActor {
[INFO] [stdout]    |            ----------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 15 |     tx: mpsc::Sender<ServerMessage>,
[INFO] [stdout]    |     ^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variants `ConnectionCommand`, `CreateChannel`, `RemoveChannel`, `BroadcastMessage`, and `ServerNotice` are never constructed
[INFO] [stdout]   --> src/actors/server.rs:20:5
[INFO] [stdout]    |
[INFO] [stdout] 19 | pub enum ServerMessage {
[INFO] [stdout]    |          ------------- variants in this enum
[INFO] [stdout] 20 |     ConnectionCommand {
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 24 |     CreateChannel {
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 28 |     RemoveChannel {
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 31 |     BroadcastMessage {
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 35 |     ServerNotice {
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `ServerMessage` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `CommandProcessor` is never constructed
[INFO] [stdout]   --> src/commands/mod.rs:12:12
[INFO] [stdout]    |
[INFO] [stdout] 12 | pub struct CommandProcessor {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new` and `process` are never used
[INFO] [stdout]   --> src/commands/mod.rs:17:12
[INFO] [stdout]    |
[INFO] [stdout] 16 | impl CommandProcessor {
[INFO] [stdout]    | --------------------- associated items in this implementation
[INFO] [stdout] 17 |     pub fn new(server_state: Arc<RwLock<ServerState>>) -> Self {
[INFO] [stdout]    |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 21 |     pub async fn process(
[INFO] [stdout]    |                  ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `handle_notice` is never used
[INFO] [stdout]  --> src/commands/handlers/notice.rs:8:14
[INFO] [stdout]   |
[INFO] [stdout] 8 | pub async fn handle_notice(
[INFO] [stdout]   |              ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `handle_oper` is never used
[INFO] [stdout]  --> src/commands/handlers/oper.rs:6:14
[INFO] [stdout]   |
[INFO] [stdout] 6 | pub async fn handle_oper(
[INFO] [stdout]   |              ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `handle_nick` is never used
[INFO] [stdout]  --> src/commands/handlers/nick.rs:9:14
[INFO] [stdout]   |
[INFO] [stdout] 9 | pub async fn handle_nick(
[INFO] [stdout]   |              ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variants `Warn` and `Note` are never constructed
[INFO] [stdout]   --> src/commands/standard_replies.rs:12:5
[INFO] [stdout]    |
[INFO] [stdout]  8 | pub enum StandardReplyType {
[INFO] [stdout]    |          ----------------- variants in this enum
[INFO] [stdout] ...
[INFO] [stdout] 12 |     Warn,
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] 13 |     /// NOTE - Provides informational messages
[INFO] [stdout] 14 |     Note,
[INFO] [stdout]    |     ^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `StandardReplyType` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple variants are never constructed
[INFO] [stdout]   --> src/commands/standard_replies.rs:32:5
[INFO] [stdout]    |
[INFO] [stdout] 29 | pub enum StandardReplyCode {
[INFO] [stdout]    |          ----------------- variants in this enum
[INFO] [stdout] ...
[INFO] [stdout] 32 |     AccountRequiredToConnect,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 38 |     NeedMoreParams,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^
[INFO] [stdout] 39 |     /// Message could not be retrieved
[INFO] [stdout] 40 |     MessageError,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout] 41 |     /// Unknown error occurred
[INFO] [stdout] 42 |     UnknownError,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 46 |     CannotSendToChan,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^
[INFO] [stdout] 47 |     /// No such channel exists
[INFO] [stdout] 48 |     NoSuchChannel,
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout] 49 |     /// Not on channel
[INFO] [stdout] 50 |     NotOnChannel,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout] 51 |     /// Channel is invite-only
[INFO] [stdout] 52 |     InviteOnlyChan,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^
[INFO] [stdout] 53 |     /// Channel key required
[INFO] [stdout] 54 |     BadChannelKey,
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout] 55 |     /// Channel is full
[INFO] [stdout] 56 |     ChannelIsFull,
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout] 57 |     /// Banned from channel
[INFO] [stdout] 58 |     BannedFromChan,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 62 |     NoSuchNick,
[INFO] [stdout]    |     ^^^^^^^^^^
[INFO] [stdout] 63 |     /// Nickname in use
[INFO] [stdout] 64 |     NicknameInUse,
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout] 65 |     /// Invalid nickname
[INFO] [stdout] 66 |     InvalidNickname,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 70 |     SaslFail,
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] 71 |     /// Invalid credentials provided
[INFO] [stdout] 72 |     InvalidCredentials,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 73 |     /// Registration failed
[INFO] [stdout] 74 |     RegFail,
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout] 75 |     /// Account registration callback invalid
[INFO] [stdout] 76 |     RegInvalidCallback,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 77 |     /// Account already registered
[INFO] [stdout] 78 |     AlreadyRegistered,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 82 |     UnknownCommand,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^
[INFO] [stdout] 83 |     /// Command disabled
[INFO] [stdout] 84 |     CommandDisabled,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 88 |     RateLimitExceeded,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 89 |     /// Resource limit exceeded
[INFO] [stdout] 90 |     ResourceLimit,
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 93 |     Custom(String),
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `StandardReplyCode` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `warn`, `note`, and `with_context` are never used
[INFO] [stdout]    --> src/commands/standard_replies.rs:157:12
[INFO] [stdout]     |
[INFO] [stdout] 144 | impl StandardReply {
[INFO] [stdout]     | ------------------ associated items in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 157 |     pub fn warn(command: &str, code: StandardReplyCode, description: &str) -> Self {
[INFO] [stdout]     |            ^^^^
[INFO] [stdout] ...
[INFO] [stdout] 168 |     pub fn note(command: &str, code: StandardReplyCode, description: &str) -> Self {
[INFO] [stdout]     |            ^^^^
[INFO] [stdout] ...
[INFO] [stdout] 179 |     pub fn with_context(mut self, context: Vec<String>) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `no_such_channel` is never used
[INFO] [stdout]    --> src/commands/standard_replies.rs:225:12
[INFO] [stdout]     |
[INFO] [stdout] 225 |     pub fn no_such_channel(command: &str, channel: &str) -> StandardReply {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `no_such_nick` is never used
[INFO] [stdout]    --> src/commands/standard_replies.rs:231:12
[INFO] [stdout]     |
[INFO] [stdout] 231 |     pub fn no_such_nick(command: &str, nick: &str) -> StandardReply {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `not_on_channel` is never used
[INFO] [stdout]    --> src/commands/standard_replies.rs:237:12
[INFO] [stdout]     |
[INFO] [stdout] 237 |     pub fn not_on_channel(command: &str, channel: &str) -> StandardReply {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `cannot_send_to_chan` is never used
[INFO] [stdout]    --> src/commands/standard_replies.rs:243:12
[INFO] [stdout]     |
[INFO] [stdout] 243 |     pub fn cannot_send_to_chan(command: &str, channel: &str, reason: &str) -> StandardReply {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `nickname_in_use` is never used
[INFO] [stdout]    --> src/commands/standard_replies.rs:249:12
[INFO] [stdout]     |
[INFO] [stdout] 249 |     pub fn nickname_in_use(command: &str, nick: &str) -> StandardReply {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `invalid_nickname` is never used
[INFO] [stdout]    --> src/commands/standard_replies.rs:255:12
[INFO] [stdout]     |
[INFO] [stdout] 255 |     pub fn invalid_nickname(command: &str, nick: &str) -> StandardReply {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `unknown_command` is never used
[INFO] [stdout]    --> src/commands/standard_replies.rs:261:12
[INFO] [stdout]     |
[INFO] [stdout] 261 |     pub fn unknown_command(command: &str) -> StandardReply {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `rate_limit_exceeded` is never used
[INFO] [stdout]    --> src/commands/standard_replies.rs:267:12
[INFO] [stdout]     |
[INFO] [stdout] 267 |     pub fn rate_limit_exceeded(command: &str) -> StandardReply {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `deprecated_command` is never used
[INFO] [stdout]    --> src/commands/standard_replies.rs:272:12
[INFO] [stdout]     |
[INFO] [stdout] 272 |     pub fn deprecated_command(command: &str, alternative: &str) -> StandardReply {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `info_note` is never used
[INFO] [stdout]    --> src/commands/standard_replies.rs:278:12
[INFO] [stdout]     |
[INFO] [stdout] 278 |     pub fn info_note(command: &str, message: &str) -> StandardReply {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `DatabaseError` is never used
[INFO] [stdout]   --> src/db/mod.rs:12:10
[INFO] [stdout]    |
[INFO] [stdout] 12 | pub enum DatabaseError {
[INFO] [stdout]    |          ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `Database` is never used
[INFO] [stdout]   --> src/db/mod.rs:30:10
[INFO] [stdout]    |
[INFO] [stdout] 30 | pub enum Database {
[INFO] [stdout]    |          ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> src/db/mod.rs:36:18
[INFO] [stdout]     |
[INFO] [stdout]  35 | impl Database {
[INFO] [stdout]     | ------------- associated items in this implementation
[INFO] [stdout]  36 |     pub async fn connect_postgres(url: &str) -> Result<Self, DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  41 |     pub async fn connect_sqlite(url: &str) -> Result<Self, DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  46 |     pub async fn run_migrations(&self) -> Result<(), DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  52 |     pub async fn create_user(&self, user: &User) -> Result<User, DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  56 |     pub async fn get_user_by_nickname(&self, nickname: &str) -> Result<Option<User>, DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  60 |     pub async fn get_user_by_id(&self, id: &str) -> Result<Option<User>, DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  64 |     pub async fn update_user(&self, user: &User) -> Result<(), DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  68 |     pub async fn authenticate_user(&self, nickname: &str, password: &str) -> Result<User, DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  73 |     pub async fn create_channel(&self, channel: &Channel) -> Result<Channel, DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  77 |     pub async fn get_channel(&self, name: &str) -> Result<Option<Channel>, DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  81 |     pub async fn update_channel(&self, channel: &Channel) -> Result<(), DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  85 |     pub async fn delete_channel(&self, name: &str) -> Result<(), DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  89 |     pub async fn list_channels(&self) -> Result<Vec<Channel>, DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  94 |     pub async fn add_channel_member(&self, member: &ChannelMember) -> Result<(), DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  98 |     pub async fn remove_channel_member(&self, channel: &str, user_id: &str) -> Result<(), DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 102 |     pub async fn get_channel_members(&self, channel: &str) -> Result<Vec<ChannelMember>, DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 106 |     pub async fn get_user_channels(&self, user_id: &str) -> Result<Vec<String>, DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 111 |     pub async fn add_ban(&self, ban: &BanEntry) -> Result<(), DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 115 |     pub async fn remove_ban(&self, channel: &str, mask: &str) -> Result<(), DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 119 |     pub async fn get_channel_bans(&self, channel: &str) -> Result<Vec<BanEntry>, DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 123 |     pub async fn is_banned(&self, channel: &str, user_mask: &str) -> Result<bool, DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 128 |     pub async fn get_server_config(&self) -> Result<ServerConfig, DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 132 |     pub async fn update_server_config(&self, config: &ServerConfig) -> Result<(), DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `User` is never constructed
[INFO] [stdout]  --> src/db/models.rs:6:12
[INFO] [stdout]   |
[INFO] [stdout] 6 | pub struct User {
[INFO] [stdout]   |            ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `new` is never used
[INFO] [stdout]   --> src/db/models.rs:25:12
[INFO] [stdout]    |
[INFO] [stdout] 24 | impl User {
[INFO] [stdout]    | --------- associated function in this implementation
[INFO] [stdout] 25 |     pub fn new(nickname: String, username: String, realname: String, password_hash: String) -> Self {
[INFO] [stdout]    |            ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `Channel` is never constructed
[INFO] [stdout]   --> src/db/models.rs:47:12
[INFO] [stdout]    |
[INFO] [stdout] 47 | pub struct Channel {
[INFO] [stdout]    |            ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `new` is never used
[INFO] [stdout]   --> src/db/models.rs:66:12
[INFO] [stdout]    |
[INFO] [stdout] 65 | impl Channel {
[INFO] [stdout]    | ------------ associated function in this implementation
[INFO] [stdout] 66 |     pub fn new(name: String, founder: Option<String>) -> Self {
[INFO] [stdout]    |            ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ChannelMember` is never constructed
[INFO] [stdout]   --> src/db/models.rs:88:12
[INFO] [stdout]    |
[INFO] [stdout] 88 | pub struct ChannelMember {
[INFO] [stdout]    |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `BanEntry` is never constructed
[INFO] [stdout]   --> src/db/models.rs:97:12
[INFO] [stdout]    |
[INFO] [stdout] 97 | pub struct BanEntry {
[INFO] [stdout]    |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ServerConfig` is never constructed
[INFO] [stdout]    --> src/db/models.rs:107:12
[INFO] [stdout]     |
[INFO] [stdout] 107 | pub struct ServerConfig {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `MessageLog` is never constructed
[INFO] [stdout]    --> src/db/models.rs:164:12
[INFO] [stdout]     |
[INFO] [stdout] 164 | pub struct MessageLog {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `OperatorCredential` is never constructed
[INFO] [stdout]    --> src/db/models.rs:175:12
[INFO] [stdout]     |
[INFO] [stdout] 175 | pub struct OperatorCredential {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `create_user` is never used
[INFO] [stdout]  --> src/db/queries/users.rs:3:14
[INFO] [stdout]   |
[INFO] [stdout] 3 | pub async fn create_user(_db: &Database, user: &User) -> Result<User, DatabaseError> {
[INFO] [stdout]   |              ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_user_by_nickname` is never used
[INFO] [stdout]  --> src/db/queries/users.rs:8:14
[INFO] [stdout]   |
[INFO] [stdout] 8 | pub async fn get_user_by_nickname(
[INFO] [stdout]   |              ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_user_by_id` is never used
[INFO] [stdout]   --> src/db/queries/users.rs:16:14
[INFO] [stdout]    |
[INFO] [stdout] 16 | pub async fn get_user_by_id(_db: &Database, _id: &str) -> Result<Option<User>, DatabaseError> {
[INFO] [stdout]    |              ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `update_user` is never used
[INFO] [stdout]   --> src/db/queries/users.rs:21:14
[INFO] [stdout]    |
[INFO] [stdout] 21 | pub async fn update_user(_db: &Database, _user: &User) -> Result<(), DatabaseError> {
[INFO] [stdout]    |              ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `authenticate_user` is never used
[INFO] [stdout]   --> src/db/queries/users.rs:26:14
[INFO] [stdout]    |
[INFO] [stdout] 26 | pub async fn authenticate_user(
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `create_channel` is never used
[INFO] [stdout]  --> src/db/queries/channels.rs:3:14
[INFO] [stdout]   |
[INFO] [stdout] 3 | pub async fn create_channel(_db: &Database, channel: &Channel) -> Result<Channel, DatabaseError> {
[INFO] [stdout]   |              ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_channel` is never used
[INFO] [stdout]  --> src/db/queries/channels.rs:8:14
[INFO] [stdout]   |
[INFO] [stdout] 8 | pub async fn get_channel(_db: &Database, _name: &str) -> Result<Option<Channel>, DatabaseError> {
[INFO] [stdout]   |              ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `update_channel` is never used
[INFO] [stdout]   --> src/db/queries/channels.rs:13:14
[INFO] [stdout]    |
[INFO] [stdout] 13 | pub async fn update_channel(_db: &Database, _channel: &Channel) -> Result<(), DatabaseError> {
[INFO] [stdout]    |              ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `delete_channel` is never used
[INFO] [stdout]   --> src/db/queries/channels.rs:18:14
[INFO] [stdout]    |
[INFO] [stdout] 18 | pub async fn delete_channel(_db: &Database, _name: &str) -> Result<(), DatabaseError> {
[INFO] [stdout]    |              ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `list_channels` is never used
[INFO] [stdout]   --> src/db/queries/channels.rs:23:14
[INFO] [stdout]    |
[INFO] [stdout] 23 | pub async fn list_channels(_db: &Database) -> Result<Vec<Channel>, DatabaseError> {
[INFO] [stdout]    |              ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `add_channel_member` is never used
[INFO] [stdout]   --> src/db/queries/channels.rs:28:14
[INFO] [stdout]    |
[INFO] [stdout] 28 | pub async fn add_channel_member(_db: &Database, _member: &ChannelMember) -> Result<(), DatabaseError> {
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `remove_channel_member` is never used
[INFO] [stdout]   --> src/db/queries/channels.rs:33:14
[INFO] [stdout]    |
[INFO] [stdout] 33 | pub async fn remove_channel_member(_db: &Database, _channel: &str, _user_id: &str) -> Result<(), DatabaseError> {
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_channel_members` is never used
[INFO] [stdout]   --> src/db/queries/channels.rs:38:14
[INFO] [stdout]    |
[INFO] [stdout] 38 | pub async fn get_channel_members(_db: &Database, _channel: &str) -> Result<Vec<ChannelMember>, DatabaseError> {
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_user_channels` is never used
[INFO] [stdout]   --> src/db/queries/channels.rs:43:14
[INFO] [stdout]    |
[INFO] [stdout] 43 | pub async fn get_user_channels(_db: &Database, _user_id: &str) -> Result<Vec<String>, DatabaseError> {
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `add_ban` is never used
[INFO] [stdout]  --> src/db/queries/bans.rs:3:14
[INFO] [stdout]   |
[INFO] [stdout] 3 | pub async fn add_ban(_db: &Database, _ban: &BanEntry) -> Result<(), DatabaseError> {
[INFO] [stdout]   |              ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `remove_ban` is never used
[INFO] [stdout]  --> src/db/queries/bans.rs:8:14
[INFO] [stdout]   |
[INFO] [stdout] 8 | pub async fn remove_ban(_db: &Database, _channel: &str, _mask: &str) -> Result<(), DatabaseError> {
[INFO] [stdout]   |              ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_channel_bans` is never used
[INFO] [stdout]   --> src/db/queries/bans.rs:13:14
[INFO] [stdout]    |
[INFO] [stdout] 13 | pub async fn get_channel_bans(_db: &Database, _channel: &str) -> Result<Vec<BanEntry>, DatabaseError> {
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `is_banned` is never used
[INFO] [stdout]   --> src/db/queries/bans.rs:18:14
[INFO] [stdout]    |
[INFO] [stdout] 18 | pub async fn is_banned(_db: &Database, _channel: &str, _user_mask: &str) -> Result<bool, DatabaseError> {
[INFO] [stdout]    |              ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_server_config` is never used
[INFO] [stdout]  --> src/db/queries/config.rs:3:14
[INFO] [stdout]   |
[INFO] [stdout] 3 | pub async fn get_server_config(_db: &Database) -> Result<ServerConfig, DatabaseError> {
[INFO] [stdout]   |              ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `update_server_config` is never used
[INFO] [stdout]  --> src/db/queries/config.rs:8:14
[INFO] [stdout]   |
[INFO] [stdout] 8 | pub async fn update_server_config(_db: &Database, _config: &ServerConfig) -> Result<(), DatabaseError> {
[INFO] [stdout]   |              ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `create_schema_sql` is never used
[INFO] [stdout]  --> src/db/migrations.rs:3:8
[INFO] [stdout]   |
[INFO] [stdout] 3 | pub fn create_schema_sql() -> &'static str {
[INFO] [stdout]   |        ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variant `Config` is never constructed
[INFO] [stdout]   --> src/error.rs:22:5
[INFO] [stdout]    |
[INFO] [stdout]  7 | pub enum CenturionError {
[INFO] [stdout]    |          -------------- variant in this enum
[INFO] [stdout] ...
[INFO] [stdout] 22 |     Config(String),
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `CenturionError` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `has_msgid` and `timestamp_secs` are never used
[INFO] [stdout]   --> src/history/mod.rs:81:12
[INFO] [stdout]    |
[INFO] [stdout] 56 | impl HistoryItem {
[INFO] [stdout]    | ---------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 81 |     pub fn has_msgid(&self, msgid: &str) -> bool {
[INFO] [stdout]    |            ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 86 |     pub fn timestamp_secs(&self) -> u64 {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `cleanup_old_messages` is never used
[INFO] [stdout]    --> src/history/storage.rs:286:12
[INFO] [stdout]     |
[INFO] [stdout] 195 | impl HistoryStorage {
[INFO] [stdout]     | ------------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 286 |     pub fn cleanup_old_messages(&self) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `is_empty` is never used
[INFO] [stdout]   --> src/history/queries.rs:33:12
[INFO] [stdout]    |
[INFO] [stdout] 11 | impl HistorySelector {
[INFO] [stdout]    | -------------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 33 |     pub fn is_empty(&self) -> bool {
[INFO] [stdout]    |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `start` and `end` are never read
[INFO] [stdout]   --> src/history/queries.rs:74:9
[INFO] [stdout]    |
[INFO] [stdout] 73 |     Targets {
[INFO] [stdout]    |     ------- fields in this variant
[INFO] [stdout] 74 |         start: Option<HistorySelector>,
[INFO] [stdout]    |         ^^^^^
[INFO] [stdout] 75 |         end: Option<HistorySelector>,
[INFO] [stdout]    |         ^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `HistoryQuery` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variants `Channel`, `Member`, `Key`, `Session`, and `Federation` are never constructed
[INFO] [stdout]   --> src/legion/mod.rs:36:5
[INFO] [stdout]    |
[INFO] [stdout] 25 | pub enum LegionError {
[INFO] [stdout]    |          ----------- variants in this enum
[INFO] [stdout] ...
[INFO] [stdout] 36 |     Channel(String),
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 40 |     Member(String),
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 44 |     Key(String),
[INFO] [stdout]    |     ^^^
[INFO] [stdout] ...
[INFO] [stdout] 48 |     Session(String),
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 52 |     Federation(String),
[INFO] [stdout]    |     ^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `LegionError` 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 `server_identity`, `channels`, `sessions`, `key_manager`, `member_manager`, and `federation_manager` are never read
[INFO] [stdout]   --> src/legion/mod.rs:63:5
[INFO] [stdout]    |
[INFO] [stdout] 61 | pub struct LegionManager {
[INFO] [stdout]    |            ------------- fields in this struct
[INFO] [stdout] 62 |     /// Server identity for Legion operations
[INFO] [stdout] 63 |     server_identity: Arc<RwLock<Identity>>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^
[INFO] [stdout] 64 |     /// Active Legion channels
[INFO] [stdout] 65 |     channels: Arc<DashMap<String, AsyncPhalanxGroup>>,
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] 66 |     /// Client sessions with Legion capabilities
[INFO] [stdout] 67 |     sessions: Arc<DashMap<String, session::LegionSession>>,
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] 68 |     /// Key manager for rotation and storage
[INFO] [stdout] 69 |     key_manager: Arc<keys::KeyManager>,
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout] 70 |     /// Member manager for authentication and authorization
[INFO] [stdout] 71 |     member_manager: Arc<members::MemberManager>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^
[INFO] [stdout] 72 |     /// Federation manager for cross-server communication
[INFO] [stdout] 73 |     federation_manager: Arc<federation::FederationManager>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `LegionManager` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple methods are never used
[INFO] [stdout]    --> src/legion/mod.rs:95:18
[INFO] [stdout]     |
[INFO] [stdout]  76 | impl LegionManager {
[INFO] [stdout]     | ------------------ methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout]  95 |     pub async fn server_identity(&self) -> Identity {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 100 |     pub async fn supports_legion(&self, client_id: &str) -> bool {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 109 |     pub async fn create_session(&self, client_id: String, capabilities: Vec<Capability>) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 116 |     pub async fn remove_session(&self, client_id: &str) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 122 |     pub async fn create_channel(&self, channel_name: String, creator_id: String) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 160 |     pub async fn join_channel(&self, channel_name: String, client_id: String) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 200 |     pub async fn leave_channel(&self, channel_name: String, client_id: String) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 222 |     pub async fn send_message(
[INFO] [stdout]     |                  ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 246 |     pub async fn receive_message(
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 277 |     pub async fn channel_stats(&self, channel_name: &str) -> LegionResult<phalanx_crypto::group::GroupStats> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 285 |     pub async fn list_channels(&self) -> Vec<String> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 290 |     pub async fn rotate_channel_keys(&self, channel_name: String, admin_id: String) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 312 |     pub async fn cleanup(&self) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `ChannelOperation` is never used
[INFO] [stdout]   --> src/legion/channels.rs:13:10
[INFO] [stdout]    |
[INFO] [stdout] 13 | pub enum ChannelOperation {
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ChannelEvent` is never constructed
[INFO] [stdout]   --> src/legion/channels.rs:29:12
[INFO] [stdout]    |
[INFO] [stdout] 29 | pub struct ChannelEvent {
[INFO] [stdout]    |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> src/legion/channels.rs:41:12
[INFO] [stdout]     |
[INFO] [stdout]  39 | impl LegionManager {
[INFO] [stdout]     | ------------------ associated items in this implementation
[INFO] [stdout]  40 |     /// Validate channel name for Legion Protocol
[INFO] [stdout]  41 |     pub fn validate_channel_name(channel_name: &str) -> LegionResult<ChannelType> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  60 |     pub async fn handle_create_channel(&self, channel_name: String, creator_id: String) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  88 |     pub async fn handle_join_channel(&self, channel_name: String, client_id: String) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 114 |     pub async fn handle_leave_channel(&self, channel_name: String, client_id: String) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 135 |     pub async fn handle_send_message(&self, channel_name: String, sender_id: String, message: String) -> LegionResult<Vec<u8>> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 164 |     pub async fn handle_receive_message(&self, channel_name: String, recipient_id: String, encrypted_data: Vec<u8>) -> LegionResult...
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 175 |     pub async fn handle_key_rotation(&self, channel_name: String, admin_id: String) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 201 |     pub async fn get_channel_info(&self, channel_name: &str, requester_id: &str) -> LegionResult<ChannelInfo> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 231 |     pub async fn list_user_channels(&self, user_id: &str) -> LegionResult<Vec<ChannelSummary>> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 252 |     async fn log_channel_event(&self, event: ChannelEvent) -> LegionResult<()> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ChannelInfo` is never constructed
[INFO] [stdout]    --> src/legion/channels.rs:261:12
[INFO] [stdout]     |
[INFO] [stdout] 261 | pub struct ChannelInfo {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ChannelSummary` is never constructed
[INFO] [stdout]    --> src/legion/channels.rs:271:12
[INFO] [stdout]     |
[INFO] [stdout] 271 | pub struct ChannelSummary {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MAX_OLD_KEYS` is never used
[INFO] [stdout]   --> src/legion/keys.rs:18:7
[INFO] [stdout]    |
[INFO] [stdout] 18 | const MAX_OLD_KEYS: usize = 10;
[INFO] [stdout]    |       ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `channel_keys`, `rotation_policies`, `kdf_context`, and `backup_handler` are never read
[INFO] [stdout]   --> src/legion/keys.rs:24:5
[INFO] [stdout]    |
[INFO] [stdout] 22 | pub struct KeyManager {
[INFO] [stdout]    |            ---------- fields in this struct
[INFO] [stdout] 23 |     /// Channel key storage
[INFO] [stdout] 24 |     channel_keys: RwLock<HashMap<String, ChannelKeys>>,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout] 25 |     /// Key rotation policies
[INFO] [stdout] 26 |     rotation_policies: RwLock<HashMap<String, RotationPolicy>>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 27 |     /// Key derivation context
[INFO] [stdout] 28 |     kdf_context: Vec<u8>,
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout] 29 |     /// Backup storage handler
[INFO] [stdout] 30 |     backup_handler: Option<Box<dyn BackupHandler>>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `KeyManager` 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 `current_rotation`, `old_rotations`, `created_at`, `last_rotation`, and `next_rotation` are never read
[INFO] [stdout]   --> src/legion/keys.rs:37:5
[INFO] [stdout]    |
[INFO] [stdout] 35 | struct ChannelKeys {
[INFO] [stdout]    |        ----------- fields in this struct
[INFO] [stdout] 36 |     /// Current active key rotation info
[INFO] [stdout] 37 |     current_rotation: KeyRotationInfo,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^
[INFO] [stdout] 38 |     /// Previous keys for backward compatibility
[INFO] [stdout] 39 |     old_rotations: Vec<KeyRotationInfo>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout] 40 |     /// Channel creation timestamp
[INFO] [stdout] 41 |     created_at: SystemTime,
[INFO] [stdout]    |     ^^^^^^^^^^
[INFO] [stdout] 42 |     /// Last rotation timestamp  
[INFO] [stdout] 43 |     last_rotation: SystemTime,
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout] 44 |     /// Next scheduled rotation
[INFO] [stdout] 45 |     next_rotation: SystemTime,
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `ChannelKeys` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `store_backup`, `retrieve_backup`, `list_backups`, and `cleanup_backups` are never used
[INFO] [stdout]    --> src/legion/keys.rs:106:14
[INFO] [stdout]     |
[INFO] [stdout] 104 | pub trait BackupHandler: Send + Sync + std::fmt::Debug {
[INFO] [stdout]     |           ------------- methods in this trait
[INFO] [stdout] 105 |     /// Store a key rotation backup
[INFO] [stdout] 106 |     async fn store_backup(&self, channel: &str, rotation: &KeyRotationInfo) -> LegionResult<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 109 |     async fn retrieve_backup(&self, channel: &str, sequence: u64) -> LegionResult<Option<KeyRotationInfo>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 112 |     async fn list_backups(&self, channel: &str) -> LegionResult<Vec<u64>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 115 |     async fn cleanup_backups(&self, channel: &str, keep_count: usize) -> LegionResult<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple methods are never used
[INFO] [stdout]    --> src/legion/keys.rs:146:18
[INFO] [stdout]     |
[INFO] [stdout] 130 | impl KeyManager {
[INFO] [stdout]     | --------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 146 |     pub async fn set_backup_handler(&mut self, handler: Box<dyn BackupHandler>) {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 151 |     pub async fn set_rotation_policy(&self, channel: String, policy: RotationPolicy) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 160 |     pub async fn get_rotation_policy(&self, channel: &str) -> RotationPolicy {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 166 |     pub async fn store_key_rotation(&self, channel: &str, rotation_msg: &KeyRotationMessage) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 215 |     pub async fn get_current_rotation(&self, channel: &str) -> LegionResult<Option<KeyRotationInfo>> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 221 |     pub async fn get_rotation_by_sequence(&self, channel: &str, sequence: u64) -> LegionResult<Option<KeyRotationInfo>> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 247 |     pub async fn needs_rotation(&self, channel: &str) -> bool {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 275 |     pub async fn schedule_rotation(&self, channel: &str, when: SystemTime) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 288 |     pub async fn on_member_change(&self, channel: &str) -> LegionResult<bool> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 302 |     pub async fn channel_stats(&self, channel: &str) -> LegionResult<ChannelKeyStats> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 326 |     pub async fn list_channels(&self) -> Vec<String> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 332 |     pub async fn cleanup(&self) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 365 |     fn compute_key_fingerprint(&self, rotation_msg: &KeyRotationMessage) -> [u8; 32] {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ChannelKeyStats` is never constructed
[INFO] [stdout]    --> src/legion/keys.rs:382:12
[INFO] [stdout]     |
[INFO] [stdout] 382 | pub struct ChannelKeyStats {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `to_json` is never used
[INFO] [stdout]    --> src/legion/keys.rs:395:12
[INFO] [stdout]     |
[INFO] [stdout] 393 | impl ChannelKeyStats {
[INFO] [stdout]     | -------------------- method in this implementation
[INFO] [stdout] 394 |     /// Convert to JSON-friendly format
[INFO] [stdout] 395 |     pub fn to_json(&self) -> serde_json::Value {
[INFO] [stdout]     |            ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MEMBER_INACTIVITY_TIMEOUT` is never used
[INFO] [stdout]   --> src/legion/members.rs:16:7
[INFO] [stdout]    |
[INFO] [stdout] 16 | const MEMBER_INACTIVITY_TIMEOUT: Duration = Duration::from_secs(7 * 24 * 60 * 60);
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `channel_members`, `member_registry`, `permission_policies`, and `invitations` are never read
[INFO] [stdout]   --> src/legion/members.rs:22:5
[INFO] [stdout]    |
[INFO] [stdout] 20 | pub struct MemberManager {
[INFO] [stdout]    |            ------------- fields in this struct
[INFO] [stdout] 21 |     /// Channel membership data
[INFO] [stdout] 22 |     channel_members: RwLock<HashMap<String, ChannelMembership>>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^
[INFO] [stdout] 23 |     /// Global member registry
[INFO] [stdout] 24 |     member_registry: RwLock<HashMap<String, MemberInfo>>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^
[INFO] [stdout] 25 |     /// Permission policies
[INFO] [stdout] 26 |     permission_policies: RwLock<HashMap<String, PermissionPolicy>>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 27 |     /// Invitation system
[INFO] [stdout] 28 |     invitations: RwLock<HashMap<String, Vec<Invitation>>>,
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `MemberManager` 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 `channel_name`, `owner`, `members`, `created_at`, `settings`, and `pending_invitations` are never read
[INFO] [stdout]   --> src/legion/members.rs:35:5
[INFO] [stdout]    |
[INFO] [stdout] 33 | struct ChannelMembership {
[INFO] [stdout]    |        ----------------- fields in this struct
[INFO] [stdout] 34 |     /// Channel name
[INFO] [stdout] 35 |     channel_name: String,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout] 36 |     /// Channel owner
[INFO] [stdout] 37 |     owner: String,
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout] 38 |     /// Channel members with roles
[INFO] [stdout] 39 |     members: HashMap<String, ChannelMember>,
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout] 40 |     /// Channel creation time
[INFO] [stdout] 41 |     created_at: SystemTime,
[INFO] [stdout]    |     ^^^^^^^^^^
[INFO] [stdout] 42 |     /// Channel settings
[INFO] [stdout] 43 |     settings: ChannelSettings,
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] 44 |     /// Active invitations for this channel
[INFO] [stdout] 45 |     pending_invitations: HashSet<String>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `ChannelMembership` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `member_id`, `identity`, `channels`, `registered_at`, `last_seen`, and `metadata` are never read
[INFO] [stdout]   --> src/legion/members.rs:69:5
[INFO] [stdout]    |
[INFO] [stdout] 67 | struct MemberInfo {
[INFO] [stdout]    |        ---------- fields in this struct
[INFO] [stdout] 68 |     /// Member ID
[INFO] [stdout] 69 |     member_id: String,
[INFO] [stdout]    |     ^^^^^^^^^
[INFO] [stdout] 70 |     /// Member's current identity
[INFO] [stdout] 71 |     identity: phalanx_crypto::Identity,
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] 72 |     /// Channels this member is in
[INFO] [stdout] 73 |     channels: HashSet<String>,
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] 74 |     /// Member registration time
[INFO] [stdout] 75 |     registered_at: SystemTime,
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout] 76 |     /// Last global activity
[INFO] [stdout] 77 |     last_seen: SystemTime,
[INFO] [stdout]    |     ^^^^^^^^^
[INFO] [stdout] 78 |     /// Member metadata
[INFO] [stdout] 79 |     metadata: HashMap<String, String>,
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `MemberInfo` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple methods are never used
[INFO] [stdout]    --> src/legion/members.rs:274:18
[INFO] [stdout]     |
[INFO] [stdout] 262 | impl MemberManager {
[INFO] [stdout]     | ------------------ methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 274 |     pub async fn register_member(&self, member_id: String, identity: phalanx_crypto::Identity) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 292 |     pub async fn create_channel(&self, channel_name: String, owner_id: String, owner_identity: phalanx_crypto::Identity) -> LegionR...
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 338 |     pub async fn add_channel_member(&self, channel_name: &str, member_id: &str, role: MemberRole) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 380 |     pub async fn remove_channel_member(&self, channel_name: &str, member_id: &str) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 407 |     pub async fn can_join_channel(&self, channel_name: &str, member_id: &str) -> LegionResult<bool> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 441 |     pub async fn is_channel_member(&self, channel_name: &str, member_id: &str) -> LegionResult<bool> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 451 |     pub async fn is_channel_admin(&self, channel_name: &str, member_id: &str) -> LegionResult<bool> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 465 |     pub async fn has_permission(&self, channel_name: &str, member_id: &str, permission: Permission) -> LegionResult<bool> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 491 |     pub async fn set_permission_policy(&self, channel_name: String, mut policy: PermissionPolicy) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 502 |     pub async fn create_invitation(&self, channel_name: String, inviter_id: String, invitee_id: String, expires_in: Duration) -> Le...
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 531 |     pub async fn use_invitation(&self, invitation_id: &str) -> LegionResult<(String, String)> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 553 |     pub async fn is_member_registered(&self, member_id: &str) -> bool {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 559 |     pub async fn channel_member_count(&self, channel_name: &str) -> usize {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 567 |     pub async fn channel_stats(&self, channel_name: &str) -> LegionResult<ChannelStats> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 596 |     pub async fn cleanup(&self) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 616 |     pub async fn get_user_channels(&self, user_id: &str) -> LegionResult<Vec<String>> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ChannelStats` is never constructed
[INFO] [stdout]    --> src/legion/members.rs:628:12
[INFO] [stdout]     |
[INFO] [stdout] 628 | pub struct ChannelStats {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MAX_IDLE_TIME` is never used
[INFO] [stdout]   --> src/legion/session.rs:14:7
[INFO] [stdout]    |
[INFO] [stdout] 14 | const MAX_IDLE_TIME: Duration = Duration::from_secs(30 * 60);
[INFO] [stdout]    |       ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple fields are never read
[INFO] [stdout]   --> src/legion/session.rs:20:5
[INFO] [stdout]    |
[INFO] [stdout] 18 | pub struct LegionSession {
[INFO] [stdout]    |            ------------- fields in this struct
[INFO] [stdout] 19 |     /// Client identifier
[INFO] [stdout] 20 |     client_id: String,
[INFO] [stdout]    |     ^^^^^^^^^
[INFO] [stdout] 21 |     /// Client's identity for encryption
[INFO] [stdout] 22 |     identity: RwLock<Identity>,
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] 23 |     /// Legion Protocol session state
[INFO] [stdout] 24 |     legion_session: RwLock<IronSession>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^
[INFO] [stdout] 25 |     /// Client capabilities
[INFO] [stdout] 26 |     capabilities: HashSet<Capability>,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout] 27 |     /// Session creation time
[INFO] [stdout] 28 |     created_at: SystemTime,
[INFO] [stdout]    |     ^^^^^^^^^^
[INFO] [stdout] 29 |     /// Last activity timestamp
[INFO] [stdout] 30 |     last_activity: RwLock<SystemTime>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout] 31 |     /// Channels this client is in
[INFO] [stdout] 32 |     joined_channels: RwLock<HashSet<String>>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^
[INFO] [stdout] 33 |     /// Whether Legion Protocol is fully negotiated
[INFO] [stdout] 34 |     legion_active: RwLock<bool>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `LegionSession` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> src/legion/session.rs:39:18
[INFO] [stdout]     |
[INFO] [stdout]  37 | impl LegionSession {
[INFO] [stdout]     | ------------------ associated items in this implementation
[INFO] [stdout]  38 |     /// Create a new Legion session
[INFO] [stdout]  39 |     pub async fn new(client_id: String, capabilities: Vec<Capability>) -> LegionResult<Self> {
[INFO] [stdout]     |                  ^^^
[INFO] [stdout] ...
[INFO] [stdout]  72 |     pub fn supports_legion(&self) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  78 |     pub async fn is_legion_active(&self) -> bool {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  83 |     pub async fn activate_legion(&self) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 101 |     pub async fn identity(&self) -> LegionResult<Identity> {
[INFO] [stdout]     |                  ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 106 |     pub async fn public_key(&self) -> LegionResult<PublicKey> {
[INFO] [stdout]     |                  ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 112 |     pub async fn update_activity(&self) {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 117 |     pub fn is_inactive(&self) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 127 |     pub fn age(&self) -> Duration {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 132 |     pub async fn join_channel(&self, channel_name: String) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 151 |     pub async fn leave_channel(&self, channel_name: &str) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 166 |     pub async fn joined_channels(&self) -> HashSet<String> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 171 |     pub async fn is_in_channel(&self, channel_name: &str) -> bool {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 176 |     pub fn capabilities(&self) -> &HashSet<Capability> {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 181 |     pub fn client_id(&self) -> &str {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 186 |     pub async fn stats(&self) -> SessionStats {
[INFO] [stdout]     |                  ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 204 |     pub async fn create_handshake(&self, group_id: [u8; 32]) -> LegionResult<phalanx_crypto::protocol::HandshakeMessage> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 223 |     pub async fn process_handshake(
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `SessionStats` is never constructed
[INFO] [stdout]    --> src/legion/session.rs:234:12
[INFO] [stdout]     |
[INFO] [stdout] 234 | pub struct SessionStats {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `to_json` is never used
[INFO] [stdout]    --> src/legion/session.rs:247:12
[INFO] [stdout]     |
[INFO] [stdout] 245 | impl SessionStats {
[INFO] [stdout]     | ----------------- method in this implementation
[INFO] [stdout] 246 |     /// Convert to JSON-friendly format
[INFO] [stdout] 247 |     pub fn to_json(&self) -> serde_json::Value {
[INFO] [stdout]     |            ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `federated_servers`, `bridge_configs`, and `policies` are never read
[INFO] [stdout]   --> src/legion/federation.rs:16:5
[INFO] [stdout]    |
[INFO] [stdout] 14 | pub struct FederationManager {
[INFO] [stdout]    |            ----------------- fields in this struct
[INFO] [stdout] 15 |     /// Connected servers
[INFO] [stdout] 16 |     federated_servers: RwLock<HashMap<String, FederatedServer>>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 17 |     /// Bridge configurations
[INFO] [stdout] 18 |     bridge_configs: RwLock<HashMap<String, BridgeConfig>>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^
[INFO] [stdout] 19 |     /// Federation policies
[INFO] [stdout] 20 |     policies: RwLock<FederationPolicy>,
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `FederationManager` 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 `hostname`, `public_key`, `status`, `last_seen`, `capabilities`, and `trust_level` are never read
[INFO] [stdout]   --> src/legion/federation.rs:27:5
[INFO] [stdout]    |
[INFO] [stdout] 25 | struct FederatedServer {
[INFO] [stdout]    |        --------------- fields in this struct
[INFO] [stdout] 26 |     /// Server hostname
[INFO] [stdout] 27 |     hostname: String,
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] 28 |     /// Server public key
[INFO] [stdout] 29 |     public_key: PublicKey,
[INFO] [stdout]    |     ^^^^^^^^^^
[INFO] [stdout] 30 |     /// Connection status
[INFO] [stdout] 31 |     status: FederationStatus,
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout] 32 |     /// Last communication
[INFO] [stdout] 33 |     last_seen: SystemTime,
[INFO] [stdout]    |     ^^^^^^^^^
[INFO] [stdout] 34 |     /// Supported capabilities
[INFO] [stdout] 35 |     capabilities: Vec<String>,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout] 36 |     /// Trust level
[INFO] [stdout] 37 |     trust_level: TrustLevel,
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `FederatedServer` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variants `Connected`, `Connecting`, `Disconnected`, and `Error` are never constructed
[INFO] [stdout]   --> src/legion/federation.rs:43:5
[INFO] [stdout]    |
[INFO] [stdout] 42 | enum FederationStatus {
[INFO] [stdout]    |      ---------------- variants in this enum
[INFO] [stdout] 43 |     Connected,
[INFO] [stdout]    |     ^^^^^^^^^
[INFO] [stdout] 44 |     Connecting,
[INFO] [stdout]    |     ^^^^^^^^^^
[INFO] [stdout] 45 |     Disconnected,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout] 46 |     Error(String),
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `FederationStatus` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple methods are never used
[INFO] [stdout]    --> src/legion/federation.rs:170:18
[INFO] [stdout]     |
[INFO] [stdout] 159 | impl FederationManager {
[INFO] [stdout]     | ---------------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 170 |     pub async fn set_federation_enabled(&self, enabled: bool) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 179 |     pub async fn is_federation_enabled(&self) -> bool {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 185 |     pub async fn add_federated_server(&self, hostname: String, public_key: PublicKey, trust_level: TrustLevel) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 216 |     pub async fn remove_federated_server(&self, hostname: &str) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 227 |     pub async fn update_server_status(&self, hostname: &str, status: FederationStatus) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 239 |     pub async fn get_server_info(&self, hostname: &str) -> LegionResult<FederatedServerInfo> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 255 |     pub async fn list_federated_servers(&self) -> Vec<FederatedServerInfo> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 267 |     pub async fn configure_bridge(&self, config: BridgeConfig) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 287 |     pub async fn remove_bridge(&self, bridge_name: &str) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 298 |     pub async fn send_federated_message(&self, target_server: &str, channel: &str, message: Vec<u8>) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 319 |     pub async fn process_federated_message(&self, source_server: &str, channel: &str, message: Vec<u8>) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 336 |     pub async fn federation_stats(&self) -> FederationStats {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 360 |     pub async fn cleanup(&self) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `FederatedServerInfo` is never constructed
[INFO] [stdout]    --> src/legion/federation.rs:386:12
[INFO] [stdout]     |
[INFO] [stdout] 386 | pub struct FederatedServerInfo {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `FederationStats` is never constructed
[INFO] [stdout]    --> src/legion/federation.rs:396:12
[INFO] [stdout]     |
[INFO] [stdout] 396 | pub struct FederationStats {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `AdvancedChannelManager` is never constructed
[INFO] [stdout]   --> src/legion/channel_manager.rs:17:12
[INFO] [stdout]    |
[INFO] [stdout] 17 | pub struct AdvancedChannelManager {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ManagedChannel` is never constructed
[INFO] [stdout]   --> src/legion/channel_manager.rs:32:8
[INFO] [stdout]    |
[INFO] [stdout] 32 | struct ManagedChannel {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ServerChannelSettings` is never constructed
[INFO] [stdout]   --> src/legion/channel_manager.rs:53:12
[INFO] [stdout]    |
[INFO] [stdout] 53 | pub struct ServerChannelSettings {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ChannelOperation` is never constructed
[INFO] [stdout]   --> src/legion/channel_manager.rs:72:8
[INFO] [stdout]    |
[INFO] [stdout] 72 | struct ChannelOperation {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ScheduledOperation` is never constructed
[INFO] [stdout]   --> src/legion/channel_manager.rs:89:8
[INFO] [stdout]    |
[INFO] [stdout] 89 | struct ScheduledOperation {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `Priority` is never used
[INFO] [stdout]    --> src/legion/channel_manager.rs:104:6
[INFO] [stdout]     |
[INFO] [stdout] 104 | enum Priority {
[INFO] [stdout]     |      ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `RateState` is never constructed
[INFO] [stdout]    --> src/legion/channel_manager.rs:113:8
[INFO] [stdout]     |
[INFO] [stdout] 113 | struct RateState {
[INFO] [stdout]     |        ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ActivityEntry` is never constructed
[INFO] [stdout]    --> src/legion/channel_manager.rs:124:8
[INFO] [stdout]     |
[INFO] [stdout] 124 | struct ActivityEntry {
[INFO] [stdout]     |        ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `ActivityType` is never used
[INFO] [stdout]    --> src/legion/channel_manager.rs:137:6
[INFO] [stdout]     |
[INFO] [stdout] 137 | enum ActivityType {
[INFO] [stdout]     |      ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ExtendedChannelInfo` is never constructed
[INFO] [stdout]    --> src/legion/channel_manager.rs:160:12
[INFO] [stdout]     |
[INFO] [stdout] 160 | pub struct ExtendedChannelInfo {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ChannelHealth` is never constructed
[INFO] [stdout]    --> src/legion/channel_manager.rs:175:12
[INFO] [stdout]     |
[INFO] [stdout] 175 | pub struct ChannelHealth {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `HealthIssue` is never used
[INFO] [stdout]    --> src/legion/channel_manager.rs:186:10
[INFO] [stdout]     |
[INFO] [stdout] 186 | pub enum HealthIssue {
[INFO] [stdout]     |          ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `PerformanceMetrics` is never constructed
[INFO] [stdout]    --> src/legion/channel_manager.rs:201:12
[INFO] [stdout]     |
[INFO] [stdout] 201 | pub struct PerformanceMetrics {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `SecurityStatus` is never constructed
[INFO] [stdout]    --> src/legion/channel_manager.rs:214:12
[INFO] [stdout]     |
[INFO] [stdout] 214 | pub struct SecurityStatus {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `SecurityEvent` is never used
[INFO] [stdout]    --> src/legion/channel_manager.rs:227:10
[INFO] [stdout]     |
[INFO] [stdout] 227 | pub enum SecurityEvent {
[INFO] [stdout]     |          ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> src/legion/channel_manager.rs:254:18
[INFO] [stdout]     |
[INFO] [stdout] 252 | impl AdvancedChannelManager {
[INFO] [stdout]     | --------------------------- associated items in this implementation
[INFO] [stdout] 253 |     /// Create a new advanced channel manager
[INFO] [stdout] 254 |     pub async fn new(server_settings: ServerChannelSettings) -> LegionResult<Self> {
[INFO] [stdout]     |                  ^^^
[INFO] [stdout] ...
[INFO] [stdout] 265 |     pub async fn execute_admin_operation(
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 344 |     async fn create_channel(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 425 |     async fn set_channel_topic(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 465 |     async fn set_channel_mode(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 513 |     async fn execute_member_operation(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 619 |     async fn execute_ban_operation(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 749 |     async fn execute_key_operation(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 808 |     pub async fn get_extended_channel_info(&self, channel_name: &str) -> LegionResult<ExtendedChannelInfo> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 833 |     async fn calculate_channel_health(&self, channel: &ManagedChannel) -> ChannelHealth {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 873 |     async fn assess_security_status(&self, channel: &ManagedChannel) -> SecurityStatus {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 886 |     async fn log_operation(
[INFO] [stdout]     |              ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 911 |     async fn log_activity(
[INFO] [stdout]     |              ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 935 |     async fn get_user_role(&self, channel_name: &str, user_id: &str) -> LegionResult<MemberRole> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 949 |     async fn get_user_permissions(&self, channel_name: &str, user_id: &str) -> LegionResult<HashSet<Permission>> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 963 |     async fn get_channel_settings(&self, channel_name: &str) -> LegionResult<ChannelSettings> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 973 |     pub async fn process_scheduled_operations(&self) -> LegionResult<usize> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: type alias `ProtocolError` is never used
[INFO] [stdout]   --> src/protocol/mod.rs:36:10
[INFO] [stdout]    |
[INFO] [stdout] 36 | pub type ProtocolError = IronError;
[INFO] [stdout]    |          ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple variants are never constructed
[INFO] [stdout]   --> src/protocol/commands.rs:16:5
[INFO] [stdout]    |
[INFO] [stdout]  4 | pub enum Command {
[INFO] [stdout]    |          ------- variants in this enum
[INFO] [stdout] ...
[INFO] [stdout] 16 |     Topic { channel: String, topic: Option<String> },
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout] 17 |     Names(Vec<String>),
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout] 18 |     List(Option<Vec<String>>),
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] ...
[INFO] [stdout] 25 |     Who(Option<String>),
[INFO] [stdout]    |     ^^^
[INFO] [stdout] 26 |     Whois(Vec<String>),
[INFO] [stdout] 27 |     Whowas(String, Option<i32>),
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 31 |     Kick { channel: String, user: String, reason: Option<String> },
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] 32 |     Mode { target: String, modes: Option<String>, params: Vec<String> },
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] 33 |     Invite { nick: String, channel: String },
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 36 |     Motd(Option<String>),
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] 37 |     Version(Option<String>),
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout] 38 |     Stats(Option<String>, Option<String>),
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout] 39 |     Time(Option<String>),
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] 40 |     Info(Option<String>),
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] ...
[INFO] [stdout] 45 |     Account(String),
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout] 46 |     Monitor { subcommand: String, targets: Vec<String> },
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout] 47 |     Metadata { target: String, subcommand: String, params: Vec<String> },
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] 48 |     TagMsg { target: String },
[INFO] [stdout] 49 |     Batch { reference: String, batch_type: Option<String>, params: Vec<String> },
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 58 |     Oper { name: String, password: String },
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] 59 |     Kill { nick: String, reason: String },
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] 60 |     Rehash,
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout] 61 |     Restart,
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout] 62 |     Die,
[INFO] [stdout]    |     ^^^
[INFO] [stdout] ...
[INFO] [stdout] 65 |     CtcpRequest { target: String, command: String, params: String },
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout] 66 |     CtcpResponse { target: String, command: String, params: String },
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `Command` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `MessageExtensions` is never constructed
[INFO] [stdout]  --> src/protocol/extensions.rs:5:12
[INFO] [stdout]   |
[INFO] [stdout] 5 | pub struct MessageExtensions {
[INFO] [stdout]   |            ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `TypingState` is never used
[INFO] [stdout]   --> src/protocol/extensions.rs:18:10
[INFO] [stdout]    |
[INFO] [stdout] 18 | pub enum TypingState {
[INFO] [stdout]    |          ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `from_tags`, and `to_tags` are never used
[INFO] [stdout]   --> src/protocol/extensions.rs:25:12
[INFO] [stdout]    |
[INFO] [stdout] 24 | impl MessageExtensions {
[INFO] [stdout]    | ---------------------- associated items in this implementation
[INFO] [stdout] 25 |     pub fn new() -> Self {
[INFO] [stdout]    |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 39 |     pub fn from_tags(tags: &HashMap<String, Option<String>>) -> Self {
[INFO] [stdout]    |            ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 74 |     pub fn to_tags(&self) -> HashMap<String, Option<String>> {
[INFO] [stdout]    |            ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `Batch` is never constructed
[INFO] [stdout]    --> src/protocol/extensions.rs:127:12
[INFO] [stdout]     |
[INFO] [stdout] 127 | pub struct Batch {
[INFO] [stdout]     |            ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new` and `add_message` are never used
[INFO] [stdout]    --> src/protocol/extensions.rs:136:12
[INFO] [stdout]     |
[INFO] [stdout] 135 | impl Batch {
[INFO] [stdout]     | ---------- associated items in this implementation
[INFO] [stdout] 136 |     pub fn new(reference: String, batch_type: String, params: Vec<String>) -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 146 |     pub fn add_message(&mut self, msg: crate::protocol::Message) {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `SecurityError` is never used
[INFO] [stdout]   --> src/security/mod.rs:18:10
[INFO] [stdout]    |
[INFO] [stdout] 18 | pub enum SecurityError {
[INFO] [stdout]    |          ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `quota` is never read
[INFO] [stdout]   --> src/security/mod.rs:39:5
[INFO] [stdout]    |
[INFO] [stdout] 38 | pub struct RateLimiter {
[INFO] [stdout]    |            ----------- field in this struct
[INFO] [stdout] 39 |     quota: Quota,
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `check_key` is never used
[INFO] [stdout]   --> src/security/mod.rs:59:18
[INFO] [stdout]    |
[INFO] [stdout] 43 | impl RateLimiter {
[INFO] [stdout]    | ---------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 59 |     pub async fn check_key(&self, _key: &str) -> bool {
[INFO] [stdout]    |                  ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ConnectionLimiter` is never constructed
[INFO] [stdout]   --> src/security/mod.rs:64:12
[INFO] [stdout]    |
[INFO] [stdout] 64 | pub struct ConnectionLimiter {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ConnectionLimits` is never constructed
[INFO] [stdout]   --> src/security/mod.rs:68:8
[INFO] [stdout]    |
[INFO] [stdout] 68 | struct ConnectionLimits {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `check_and_add`, and `remove` are never used
[INFO] [stdout]    --> src/security/mod.rs:76:12
[INFO] [stdout]     |
[INFO] [stdout]  75 | impl ConnectionLimiter {
[INFO] [stdout]     | ---------------------- associated items in this implementation
[INFO] [stdout]  76 |     pub fn new(max_per_ip: usize, max_global: usize) -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout]  87 |     pub fn check_and_add(&self, addr: SocketAddr) -> Result<(), SecurityError> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 108 |     pub fn remove(&self, addr: SocketAddr) {
[INFO] [stdout]     |            ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `FloodProtection` is never constructed
[INFO] [stdout]    --> src/security/mod.rs:123:12
[INFO] [stdout]     |
[INFO] [stdout] 123 | pub struct FloodProtection {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `check_flood`, and `clear` are never used
[INFO] [stdout]    --> src/security/mod.rs:130:12
[INFO] [stdout]     |
[INFO] [stdout] 129 | impl FloodProtection {
[INFO] [stdout]     | -------------------- associated items in this implementation
[INFO] [stdout] 130 |     pub fn new(max_messages: usize, time_window: Duration) -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 138 |     pub fn check_flood(&self, connection_id: u64) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 155 |     pub fn clear(&self, connection_id: u64) {
[INFO] [stdout]     |            ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `BanManager` is never constructed
[INFO] [stdout]    --> src/security/mod.rs:160:12
[INFO] [stdout]     |
[INFO] [stdout] 160 | pub struct BanManager {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `BanEntry` is never constructed
[INFO] [stdout]    --> src/security/mod.rs:165:12
[INFO] [stdout]     |
[INFO] [stdout] 165 | pub struct BanEntry {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `add_ban`, `remove_ban`, `is_banned`, and `get_bans` are never used
[INFO] [stdout]    --> src/security/mod.rs:173:12
[INFO] [stdout]     |
[INFO] [stdout] 172 | impl BanManager {
[INFO] [stdout]     | --------------- associated items in this implementation
[INFO] [stdout] 173 |     pub fn new() -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 179 |     pub fn add_ban(&self, channel: &str, ban: BanEntry) {
[INFO] [stdout]     |            ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 186 |     pub fn remove_ban(&self, channel: &str, mask: &str) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 196 |     pub fn is_banned(&self, channel: &str, user_mask: &str) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 214 |     pub fn get_bans(&self, channel: &str) -> Vec<BanEntry> {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `mask_matches` is never used
[INFO] [stdout]    --> src/security/mod.rs:222:4
[INFO] [stdout]     |
[INFO] [stdout] 222 | fn mask_matches(pattern: &str, text: &str) -> bool {
[INFO] [stdout]     |    ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `AuthError` is never used
[INFO] [stdout]   --> src/security/auth.rs:10:10
[INFO] [stdout]    |
[INFO] [stdout] 10 | pub enum AuthError {
[INFO] [stdout]    |          ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `SaslMechanism` is never used
[INFO] [stdout]   --> src/security/auth.rs:25:10
[INFO] [stdout]    |
[INFO] [stdout] 25 | pub enum SaslMechanism {
[INFO] [stdout]    |          ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `from_str` and `as_str` are never used
[INFO] [stdout]   --> src/security/auth.rs:32:12
[INFO] [stdout]    |
[INFO] [stdout] 31 | impl SaslMechanism {
[INFO] [stdout]    | ------------------ associated items in this implementation
[INFO] [stdout] 32 |     pub fn from_str(s: &str) -> Option<Self> {
[INFO] [stdout]    |            ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 41 |     pub fn as_str(&self) -> &'static str {
[INFO] [stdout]    |            ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `AuthMethod` is never used
[INFO] [stdout]   --> src/security/auth.rs:51:10
[INFO] [stdout]    |
[INFO] [stdout] 51 | pub enum AuthMethod {
[INFO] [stdout]    |          ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `LocalPasswordHasher` is never constructed
[INFO] [stdout]   --> src/security/auth.rs:62:12
[INFO] [stdout]    |
[INFO] [stdout] 62 | pub struct LocalPasswordHasher;
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated functions `hash_password` and `verify_password` are never used
[INFO] [stdout]   --> src/security/auth.rs:65:12
[INFO] [stdout]    |
[INFO] [stdout] 64 | impl LocalPasswordHasher {
[INFO] [stdout]    | ------------------------ associated functions in this implementation
[INFO] [stdout] 65 |     pub fn hash_password(password: &str) -> Result<String, AuthError> {
[INFO] [stdout]    |            ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 70 |     pub fn verify_password(password: &str, hash: &str) -> Result<bool, AuthError> {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `SaslAuthenticator` is never constructed
[INFO] [stdout]   --> src/security/auth.rs:76:12
[INFO] [stdout]    |
[INFO] [stdout] 76 | pub struct SaslAuthenticator {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ScramServerState` is never constructed
[INFO] [stdout]   --> src/security/auth.rs:80:8
[INFO] [stdout]    |
[INFO] [stdout] 80 | struct ScramServerState {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `authenticate_plain`, `start_scram_sha256`, and `verify_scram_sha256` are never used
[INFO] [stdout]    --> src/security/auth.rs:89:12
[INFO] [stdout]     |
[INFO] [stdout]  88 | impl SaslAuthenticator {
[INFO] [stdout]     | ---------------------- associated items in this implementation
[INFO] [stdout]  89 |     pub fn new() -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout]  95 |     pub fn authenticate_plain(&self, auth_data: &[u8]) -> Result<(String, String), AuthError> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 115 |     pub fn start_scram_sha256(&mut self, client_first: &str) -> Result<String, AuthError> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 152 |     pub fn verify_scram_sha256(
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `authenticate` is never used
[INFO] [stdout]    --> src/security/auth.rs:193:14
[INFO] [stdout]     |
[INFO] [stdout] 193 | pub async fn authenticate(
[INFO] [stdout]     |              ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `generate_nonce` is never used
[INFO] [stdout]    --> src/security/auth.rs:218:4
[INFO] [stdout]     |
[INFO] [stdout] 218 | fn generate_nonce() -> String {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `generate_salt` is never used
[INFO] [stdout]    --> src/security/auth.rs:225:4
[INFO] [stdout]     |
[INFO] [stdout] 225 | fn generate_salt() -> Vec<u8> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `derive_salted_password` is never used
[INFO] [stdout]    --> src/security/auth.rs:231:4
[INFO] [stdout]     |
[INFO] [stdout] 231 | fn derive_salted_password(password: &[u8], salt: &[u8], iterations: u32) -> Vec<u8> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `hmac_sha256` is never used
[INFO] [stdout]    --> src/security/auth.rs:237:4
[INFO] [stdout]     |
[INFO] [stdout] 237 | fn hmac_sha256(key: &[u8], data: &[u8]) -> Vec<u8> {
[INFO] [stdout]     |    ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `create_tls_acceptor` is never used
[INFO] [stdout]  --> src/security/tls.rs:4:14
[INFO] [stdout]   |
[INFO] [stdout] 4 | pub async fn create_tls_acceptor(_cert_path: &Path, _key_path: &Path) -> io::Result<()> {
[INFO] [stdout]   |              ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: static `NICKNAME_REGEX` is never used
[INFO] [stdout]  --> src/security/validation.rs:4:8
[INFO] [stdout]   |
[INFO] [stdout] 4 | static NICKNAME_REGEX: Lazy<Regex> = Lazy::new(|| {
[INFO] [stdout]   |        ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: static `VALID_USER_REGEX` is never used
[INFO] [stdout]   --> src/security/validation.rs:12:8
[INFO] [stdout]    |
[INFO] [stdout] 12 | static VALID_USER_REGEX: Lazy<Regex> = Lazy::new(|| {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `validate_nickname` is never used
[INFO] [stdout]   --> src/security/validation.rs:16:8
[INFO] [stdout]    |
[INFO] [stdout] 16 | pub fn validate_nickname(nick: &str) -> bool {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `validate_username` is never used
[INFO] [stdout]   --> src/security/validation.rs:32:8
[INFO] [stdout]    |
[INFO] [stdout] 32 | pub fn validate_username(username: &str) -> bool {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `validate_realname` is never used
[INFO] [stdout]   --> src/security/validation.rs:40:8
[INFO] [stdout]    |
[INFO] [stdout] 40 | pub fn validate_realname(realname: &str) -> bool {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `validate_message` is never used
[INFO] [stdout]   --> src/security/validation.rs:49:8
[INFO] [stdout]    |
[INFO] [stdout] 49 | pub fn validate_message(message: &str) -> bool {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `validate_topic` is never used
[INFO] [stdout]   --> src/security/validation.rs:58:8
[INFO] [stdout]    |
[INFO] [stdout] 58 | pub fn validate_topic(topic: &str) -> bool {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `validate_away_message` is never used
[INFO] [stdout]   --> src/security/validation.rs:67:8
[INFO] [stdout]    |
[INFO] [stdout] 67 | pub fn validate_away_message(message: &str) -> bool {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `validate_kick_reason` is never used
[INFO] [stdout]   --> src/security/validation.rs:76:8
[INFO] [stdout]    |
[INFO] [stdout] 76 | pub fn validate_kick_reason(reason: &str) -> bool {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `validate_quit_message` is never used
[INFO] [stdout]   --> src/security/validation.rs:85:8
[INFO] [stdout]    |
[INFO] [stdout] 85 | pub fn validate_quit_message(message: &str) -> bool {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `validate_channel_key` is never used
[INFO] [stdout]   --> src/security/validation.rs:94:8
[INFO] [stdout]    |
[INFO] [stdout] 94 | pub fn validate_channel_key(key: &str) -> bool {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `sanitize_message` is never used
[INFO] [stdout]    --> src/security/validation.rs:103:8
[INFO] [stdout]     |
[INFO] [stdout] 103 | pub fn sanitize_message(message: &str) -> String {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `is_valid_host_mask` is never used
[INFO] [stdout]    --> src/security/validation.rs:111:8
[INFO] [stdout]     |
[INFO] [stdout] 111 | pub fn is_valid_host_mask(mask: &str) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `has_legion` and `legion` are never used
[INFO] [stdout]   --> src/state/mod.rs:52:12
[INFO] [stdout]    |
[INFO] [stdout] 23 | impl ServerState {
[INFO] [stdout]    | ---------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 52 |     pub fn has_legion(&self) -> bool {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 57 |     pub fn legion(&self) -> Option<&LegionManager> {
[INFO] [stdout]    |            ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `connection_id` and `joined_at` are never read
[INFO] [stdout]  --> src/state/channel.rs:6:9
[INFO] [stdout]   |
[INFO] [stdout] 5 | pub struct ChannelMember {
[INFO] [stdout]   |            ------------- fields in this struct
[INFO] [stdout] 6 |     pub connection_id: u64,
[INFO] [stdout]   |         ^^^^^^^^^^^^^
[INFO] [stdout] 7 |     pub modes: Vec<char>,
[INFO] [stdout] 8 |     pub joined_at: DateTime<Utc>,
[INFO] [stdout]   |         ^^^^^^^^^
[INFO] [stdout]   |
[INFO] [stdout]   = note: `ChannelMember` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `name` and `created_at` are never read
[INFO] [stdout]   --> src/state/channel.rs:13:9
[INFO] [stdout]    |
[INFO] [stdout] 12 | pub struct Channel {
[INFO] [stdout]    |            ------- fields in this struct
[INFO] [stdout] 13 |     pub name: String,
[INFO] [stdout]    |         ^^^^
[INFO] [stdout] ...
[INFO] [stdout] 19 |     pub created_at: DateTime<Utc>,
[INFO] [stdout]    |         ^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `Channel` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `id`, `addr`, and `created_at` are never read
[INFO] [stdout]   --> src/state/connection.rs:9:9
[INFO] [stdout]    |
[INFO] [stdout]  8 | pub struct Connection {
[INFO] [stdout]    |            ---------- fields in this struct
[INFO] [stdout]  9 |     pub id: u64,
[INFO] [stdout]    |         ^^
[INFO] [stdout] 10 |     pub addr: SocketAddr,
[INFO] [stdout]    |         ^^^^
[INFO] [stdout] ...
[INFO] [stdout] 17 |     pub created_at: DateTime<Utc>,
[INFO] [stdout]    |         ^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `Connection` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `mask_ip` is never used
[INFO] [stdout]   --> src/utils/mod.rs:13:8
[INFO] [stdout]    |
[INFO] [stdout] 13 | pub fn mask_ip(ip: IpAddr) -> String {
[INFO] [stdout]    |        ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `parse_mode_string` is never used
[INFO] [stdout]   --> src/utils/mod.rs:34:8
[INFO] [stdout]    |
[INFO] [stdout] 34 | pub fn parse_mode_string(modes: &str) -> (Vec<char>, Vec<char>) {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `format_duration` is never used
[INFO] [stdout]   --> src/utils/mod.rs:56:8
[INFO] [stdout]    |
[INFO] [stdout] 56 | pub fn format_duration(seconds: u64) -> String {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `normalize_channel_name` is never used
[INFO] [stdout]   --> src/utils/mod.rs:77:8
[INFO] [stdout]    |
[INFO] [stdout] 77 | pub fn normalize_channel_name(name: &str) -> String {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `normalize_nickname` is never used
[INFO] [stdout]   --> src/utils/mod.rs:81:8
[INFO] [stdout]    |
[INFO] [stdout] 81 | pub fn normalize_nickname(nick: &str) -> String {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `load_with_defaults` is never used
[INFO] [stdout]    --> src/utils/config.rs:157:12
[INFO] [stdout]     |
[INFO] [stdout] 148 | impl ServerConfig {
[INFO] [stdout]     | ----------------- associated function in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 157 |     pub fn load_with_defaults(path: Option<impl AsRef<Path>>) -> Result<Self, ConfigError> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `member`
[INFO] [stdout]    --> src/legion/channel_manager.rs:525:33
[INFO] [stdout]     |
[INFO] [stdout] 525 |                     if let Some(member) = channel.members.remove(target_user) {
[INFO] [stdout]     |                                 ^^^^^^ help: if this is intentional, prefix it with an underscore: `_member`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `operator_identity`
[INFO] [stdout]    --> src/legion/channel_manager.rs:753:9
[INFO] [stdout]     |
[INFO] [stdout] 753 |         operator_identity: &Identity,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_operator_identity`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: type `members::ChannelSettings` is more private than the item `members::ChannelStats::settings`
[INFO] [stdout]    --> src/legion/members.rs:635:5
[INFO] [stdout]     |
[INFO] [stdout] 635 |     pub settings: ChannelSettings,
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ field `members::ChannelStats::settings` is reachable at visibility `pub(crate)`
[INFO] [stdout]     |
[INFO] [stdout] note: but type `members::ChannelSettings` is only usable at visibility `pub(self)`
[INFO] [stdout]    --> src/legion/members.rs:145:1
[INFO] [stdout]     |
[INFO] [stdout] 145 | struct ChannelSettings {
[INFO] [stdout]     | ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     = note: `#[warn(private_interfaces)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: type `federation::TrustLevel` is more private than the item `federation::FederationManager::add_federated_server`
[INFO] [stdout]    --> src/legion/federation.rs:185:5
[INFO] [stdout]     |
[INFO] [stdout] 185 |     pub async fn add_federated_server(&self, hostname: String, public_key: PublicKey, trust_level: TrustLevel) -> LegionResult<()> {
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ method `federation::FederationManager::add_federated_server` is reachable at visibility `pub(crate)`
[INFO] [stdout]     |
[INFO] [stdout] note: but type `federation::TrustLevel` is only usable at visibility `pub(self)`
[INFO] [stdout]    --> src/legion/federation.rs:51:1
[INFO] [stdout]     |
[INFO] [stdout]  51 | enum TrustLevel {
[INFO] [stdout]     | ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: type `FederationStatus` is more private than the item `federation::FederationManager::update_server_status`
[INFO] [stdout]    --> src/legion/federation.rs:227:5
[INFO] [stdout]     |
[INFO] [stdout] 227 |     pub async fn update_server_status(&self, hostname: &str, status: FederationStatus) -> LegionResult<()> {
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ method `federation::FederationManager::update_server_status` is reachable at visibility `pub(crate)`
[INFO] [stdout]     |
[INFO] [stdout] note: but type `FederationStatus` is only usable at visibility `pub(self)`
[INFO] [stdout]    --> src/legion/federation.rs:42:1
[INFO] [stdout]     |
[INFO] [stdout]  42 | enum FederationStatus {
[INFO] [stdout]     | ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: type `ActivityEntry` is more private than the item `ExtendedChannelInfo::recent_activity`
[INFO] [stdout]    --> src/legion/channel_manager.rs:166:5
[INFO] [stdout]     |
[INFO] [stdout] 166 |     pub recent_activity: Vec<ActivityEntry>,
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ field `ExtendedChannelInfo::recent_activity` is reachable at visibility `pub(crate)`
[INFO] [stdout]     |
[INFO] [stdout] note: but type `ActivityEntry` is only usable at visibility `pub(self)`
[INFO] [stdout]    --> src/legion/channel_manager.rs:124:1
[INFO] [stdout]     |
[INFO] [stdout] 124 | struct ActivityEntry {
[INFO] [stdout]     | ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `PING_TIMEOUT` is never used
[INFO] [stdout]   --> src/actors/connection.rs:20:7
[INFO] [stdout]    |
[INFO] [stdout] 20 | const PING_TIMEOUT: Duration = Duration::from_secs(60);
[INFO] [stdout]    |       ^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `tx` is never read
[INFO] [stdout]   --> src/actors/connection.rs:29:5
[INFO] [stdout]    |
[INFO] [stdout] 23 | pub struct ConnectionActor {
[INFO] [stdout]    |            --------------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 29 |     tx: mpsc::Sender<Message>,
[INFO] [stdout]    |     ^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `tx` is never read
[INFO] [stdout]   --> src/actors/channel.rs:16:5
[INFO] [stdout]    |
[INFO] [stdout] 11 | pub struct ChannelActor {
[INFO] [stdout]    |            ------------ field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 16 |     tx: mpsc::Sender<ChannelMessage>,
[INFO] [stdout]    |     ^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variant `Invite` is never constructed
[INFO] [stdout]   --> src/actors/channel.rs:47:5
[INFO] [stdout]    |
[INFO] [stdout] 20 | pub enum ChannelMessage {
[INFO] [stdout]    |          -------------- variant in this enum
[INFO] [stdout] ...
[INFO] [stdout] 47 |     Invite {
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `ChannelMessage` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `tx` is never read
[INFO] [stdout]   --> src/actors/server.rs:15:5
[INFO] [stdout]    |
[INFO] [stdout] 11 | pub struct ServerActor {
[INFO] [stdout]    |            ----------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 15 |     tx: mpsc::Sender<ServerMessage>,
[INFO] [stdout]    |     ^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variants `ConnectionCommand`, `CreateChannel`, `RemoveChannel`, `BroadcastMessage`, and `ServerNotice` are never constructed
[INFO] [stdout]   --> src/actors/server.rs:20:5
[INFO] [stdout]    |
[INFO] [stdout] 19 | pub enum ServerMessage {
[INFO] [stdout]    |          ------------- variants in this enum
[INFO] [stdout] 20 |     ConnectionCommand {
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 24 |     CreateChannel {
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 28 |     RemoveChannel {
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 31 |     BroadcastMessage {
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 35 |     ServerNotice {
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `ServerMessage` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `CommandProcessor` is never constructed
[INFO] [stdout]   --> src/commands/mod.rs:12:12
[INFO] [stdout]    |
[INFO] [stdout] 12 | pub struct CommandProcessor {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new` and `process` are never used
[INFO] [stdout]   --> src/commands/mod.rs:17:12
[INFO] [stdout]    |
[INFO] [stdout] 16 | impl CommandProcessor {
[INFO] [stdout]    | --------------------- associated items in this implementation
[INFO] [stdout] 17 |     pub fn new(server_state: Arc<RwLock<ServerState>>) -> Self {
[INFO] [stdout]    |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 21 |     pub async fn process(
[INFO] [stdout]    |                  ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `handle_notice` is never used
[INFO] [stdout]  --> src/commands/handlers/notice.rs:8:14
[INFO] [stdout]   |
[INFO] [stdout] 8 | pub async fn handle_notice(
[INFO] [stdout]   |              ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `handle_oper` is never used
[INFO] [stdout]  --> src/commands/handlers/oper.rs:6:14
[INFO] [stdout]   |
[INFO] [stdout] 6 | pub async fn handle_oper(
[INFO] [stdout]   |              ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `handle_nick` is never used
[INFO] [stdout]  --> src/commands/handlers/nick.rs:9:14
[INFO] [stdout]   |
[INFO] [stdout] 9 | pub async fn handle_nick(
[INFO] [stdout]   |              ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variants `Warn` and `Note` are never constructed
[INFO] [stdout]   --> src/commands/standard_replies.rs:12:5
[INFO] [stdout]    |
[INFO] [stdout]  8 | pub enum StandardReplyType {
[INFO] [stdout]    |          ----------------- variants in this enum
[INFO] [stdout] ...
[INFO] [stdout] 12 |     Warn,
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] 13 |     /// NOTE - Provides informational messages
[INFO] [stdout] 14 |     Note,
[INFO] [stdout]    |     ^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `StandardReplyType` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple variants are never constructed
[INFO] [stdout]   --> src/commands/standard_replies.rs:32:5
[INFO] [stdout]    |
[INFO] [stdout] 29 | pub enum StandardReplyCode {
[INFO] [stdout]    |          ----------------- variants in this enum
[INFO] [stdout] ...
[INFO] [stdout] 32 |     AccountRequiredToConnect,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 38 |     NeedMoreParams,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^
[INFO] [stdout] 39 |     /// Message could not be retrieved
[INFO] [stdout] 40 |     MessageError,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout] 41 |     /// Unknown error occurred
[INFO] [stdout] 42 |     UnknownError,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 46 |     CannotSendToChan,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 50 |     NotOnChannel,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout] 51 |     /// Channel is invite-only
[INFO] [stdout] 52 |     InviteOnlyChan,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^
[INFO] [stdout] 53 |     /// Channel key required
[INFO] [stdout] 54 |     BadChannelKey,
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout] 55 |     /// Channel is full
[INFO] [stdout] 56 |     ChannelIsFull,
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout] 57 |     /// Banned from channel
[INFO] [stdout] 58 |     BannedFromChan,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 62 |     NoSuchNick,
[INFO] [stdout]    |     ^^^^^^^^^^
[INFO] [stdout] 63 |     /// Nickname in use
[INFO] [stdout] 64 |     NicknameInUse,
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout] 65 |     /// Invalid nickname
[INFO] [stdout] 66 |     InvalidNickname,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 70 |     SaslFail,
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] 71 |     /// Invalid credentials provided
[INFO] [stdout] 72 |     InvalidCredentials,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 73 |     /// Registration failed
[INFO] [stdout] 74 |     RegFail,
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout] 75 |     /// Account registration callback invalid
[INFO] [stdout] 76 |     RegInvalidCallback,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 77 |     /// Account already registered
[INFO] [stdout] 78 |     AlreadyRegistered,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 82 |     UnknownCommand,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^
[INFO] [stdout] 83 |     /// Command disabled
[INFO] [stdout] 84 |     CommandDisabled,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 88 |     RateLimitExceeded,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 89 |     /// Resource limit exceeded
[INFO] [stdout] 90 |     ResourceLimit,
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 93 |     Custom(String),
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `StandardReplyCode` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `warn`, `note`, and `with_context` are never used
[INFO] [stdout]    --> src/commands/standard_replies.rs:157:12
[INFO] [stdout]     |
[INFO] [stdout] 144 | impl StandardReply {
[INFO] [stdout]     | ------------------ associated items in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 157 |     pub fn warn(command: &str, code: StandardReplyCode, description: &str) -> Self {
[INFO] [stdout]     |            ^^^^
[INFO] [stdout] ...
[INFO] [stdout] 168 |     pub fn note(command: &str, code: StandardReplyCode, description: &str) -> Self {
[INFO] [stdout]     |            ^^^^
[INFO] [stdout] ...
[INFO] [stdout] 179 |     pub fn with_context(mut self, context: Vec<String>) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `no_such_channel` is never used
[INFO] [stdout]    --> src/commands/standard_replies.rs:225:12
[INFO] [stdout]     |
[INFO] [stdout] 225 |     pub fn no_such_channel(command: &str, channel: &str) -> StandardReply {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `no_such_nick` is never used
[INFO] [stdout]    --> src/commands/standard_replies.rs:231:12
[INFO] [stdout]     |
[INFO] [stdout] 231 |     pub fn no_such_nick(command: &str, nick: &str) -> StandardReply {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `not_on_channel` is never used
[INFO] [stdout]    --> src/commands/standard_replies.rs:237:12
[INFO] [stdout]     |
[INFO] [stdout] 237 |     pub fn not_on_channel(command: &str, channel: &str) -> StandardReply {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `cannot_send_to_chan` is never used
[INFO] [stdout]    --> src/commands/standard_replies.rs:243:12
[INFO] [stdout]     |
[INFO] [stdout] 243 |     pub fn cannot_send_to_chan(command: &str, channel: &str, reason: &str) -> StandardReply {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `nickname_in_use` is never used
[INFO] [stdout]    --> src/commands/standard_replies.rs:249:12
[INFO] [stdout]     |
[INFO] [stdout] 249 |     pub fn nickname_in_use(command: &str, nick: &str) -> StandardReply {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `invalid_nickname` is never used
[INFO] [stdout]    --> src/commands/standard_replies.rs:255:12
[INFO] [stdout]     |
[INFO] [stdout] 255 |     pub fn invalid_nickname(command: &str, nick: &str) -> StandardReply {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `unknown_command` is never used
[INFO] [stdout]    --> src/commands/standard_replies.rs:261:12
[INFO] [stdout]     |
[INFO] [stdout] 261 |     pub fn unknown_command(command: &str) -> StandardReply {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `rate_limit_exceeded` is never used
[INFO] [stdout]    --> src/commands/standard_replies.rs:267:12
[INFO] [stdout]     |
[INFO] [stdout] 267 |     pub fn rate_limit_exceeded(command: &str) -> StandardReply {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `deprecated_command` is never used
[INFO] [stdout]    --> src/commands/standard_replies.rs:272:12
[INFO] [stdout]     |
[INFO] [stdout] 272 |     pub fn deprecated_command(command: &str, alternative: &str) -> StandardReply {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `info_note` is never used
[INFO] [stdout]    --> src/commands/standard_replies.rs:278:12
[INFO] [stdout]     |
[INFO] [stdout] 278 |     pub fn info_note(command: &str, message: &str) -> StandardReply {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `DatabaseError` is never used
[INFO] [stdout]   --> src/db/mod.rs:12:10
[INFO] [stdout]    |
[INFO] [stdout] 12 | pub enum DatabaseError {
[INFO] [stdout]    |          ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `Database` is never used
[INFO] [stdout]   --> src/db/mod.rs:30:10
[INFO] [stdout]    |
[INFO] [stdout] 30 | pub enum Database {
[INFO] [stdout]    |          ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> src/db/mod.rs:36:18
[INFO] [stdout]     |
[INFO] [stdout]  35 | impl Database {
[INFO] [stdout]     | ------------- associated items in this implementation
[INFO] [stdout]  36 |     pub async fn connect_postgres(url: &str) -> Result<Self, DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  41 |     pub async fn connect_sqlite(url: &str) -> Result<Self, DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  46 |     pub async fn run_migrations(&self) -> Result<(), DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  52 |     pub async fn create_user(&self, user: &User) -> Result<User, DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  56 |     pub async fn get_user_by_nickname(&self, nickname: &str) -> Result<Option<User>, DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  60 |     pub async fn get_user_by_id(&self, id: &str) -> Result<Option<User>, DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  64 |     pub async fn update_user(&self, user: &User) -> Result<(), DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  68 |     pub async fn authenticate_user(&self, nickname: &str, password: &str) -> Result<User, DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  73 |     pub async fn create_channel(&self, channel: &Channel) -> Result<Channel, DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  77 |     pub async fn get_channel(&self, name: &str) -> Result<Option<Channel>, DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  81 |     pub async fn update_channel(&self, channel: &Channel) -> Result<(), DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  85 |     pub async fn delete_channel(&self, name: &str) -> Result<(), DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  89 |     pub async fn list_channels(&self) -> Result<Vec<Channel>, DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  94 |     pub async fn add_channel_member(&self, member: &ChannelMember) -> Result<(), DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  98 |     pub async fn remove_channel_member(&self, channel: &str, user_id: &str) -> Result<(), DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 102 |     pub async fn get_channel_members(&self, channel: &str) -> Result<Vec<ChannelMember>, DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 106 |     pub async fn get_user_channels(&self, user_id: &str) -> Result<Vec<String>, DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 111 |     pub async fn add_ban(&self, ban: &BanEntry) -> Result<(), DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 115 |     pub async fn remove_ban(&self, channel: &str, mask: &str) -> Result<(), DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 119 |     pub async fn get_channel_bans(&self, channel: &str) -> Result<Vec<BanEntry>, DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 123 |     pub async fn is_banned(&self, channel: &str, user_mask: &str) -> Result<bool, DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 128 |     pub async fn get_server_config(&self) -> Result<ServerConfig, DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 132 |     pub async fn update_server_config(&self, config: &ServerConfig) -> Result<(), DatabaseError> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `User` is never constructed
[INFO] [stdout]  --> src/db/models.rs:6:12
[INFO] [stdout]   |
[INFO] [stdout] 6 | pub struct User {
[INFO] [stdout]   |            ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `new` is never used
[INFO] [stdout]   --> src/db/models.rs:25:12
[INFO] [stdout]    |
[INFO] [stdout] 24 | impl User {
[INFO] [stdout]    | --------- associated function in this implementation
[INFO] [stdout] 25 |     pub fn new(nickname: String, username: String, realname: String, password_hash: String) -> Self {
[INFO] [stdout]    |            ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `Channel` is never constructed
[INFO] [stdout]   --> src/db/models.rs:47:12
[INFO] [stdout]    |
[INFO] [stdout] 47 | pub struct Channel {
[INFO] [stdout]    |            ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `new` is never used
[INFO] [stdout]   --> src/db/models.rs:66:12
[INFO] [stdout]    |
[INFO] [stdout] 65 | impl Channel {
[INFO] [stdout]    | ------------ associated function in this implementation
[INFO] [stdout] 66 |     pub fn new(name: String, founder: Option<String>) -> Self {
[INFO] [stdout]    |            ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ChannelMember` is never constructed
[INFO] [stdout]   --> src/db/models.rs:88:12
[INFO] [stdout]    |
[INFO] [stdout] 88 | pub struct ChannelMember {
[INFO] [stdout]    |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `BanEntry` is never constructed
[INFO] [stdout]   --> src/db/models.rs:97:12
[INFO] [stdout]    |
[INFO] [stdout] 97 | pub struct BanEntry {
[INFO] [stdout]    |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ServerConfig` is never constructed
[INFO] [stdout]    --> src/db/models.rs:107:12
[INFO] [stdout]     |
[INFO] [stdout] 107 | pub struct ServerConfig {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `MessageLog` is never constructed
[INFO] [stdout]    --> src/db/models.rs:164:12
[INFO] [stdout]     |
[INFO] [stdout] 164 | pub struct MessageLog {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `OperatorCredential` is never constructed
[INFO] [stdout]    --> src/db/models.rs:175:12
[INFO] [stdout]     |
[INFO] [stdout] 175 | pub struct OperatorCredential {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `create_user` is never used
[INFO] [stdout]  --> src/db/queries/users.rs:3:14
[INFO] [stdout]   |
[INFO] [stdout] 3 | pub async fn create_user(_db: &Database, user: &User) -> Result<User, DatabaseError> {
[INFO] [stdout]   |              ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_user_by_nickname` is never used
[INFO] [stdout]  --> src/db/queries/users.rs:8:14
[INFO] [stdout]   |
[INFO] [stdout] 8 | pub async fn get_user_by_nickname(
[INFO] [stdout]   |              ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_user_by_id` is never used
[INFO] [stdout]   --> src/db/queries/users.rs:16:14
[INFO] [stdout]    |
[INFO] [stdout] 16 | pub async fn get_user_by_id(_db: &Database, _id: &str) -> Result<Option<User>, DatabaseError> {
[INFO] [stdout]    |              ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `update_user` is never used
[INFO] [stdout]   --> src/db/queries/users.rs:21:14
[INFO] [stdout]    |
[INFO] [stdout] 21 | pub async fn update_user(_db: &Database, _user: &User) -> Result<(), DatabaseError> {
[INFO] [stdout]    |              ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `authenticate_user` is never used
[INFO] [stdout]   --> src/db/queries/users.rs:26:14
[INFO] [stdout]    |
[INFO] [stdout] 26 | pub async fn authenticate_user(
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `create_channel` is never used
[INFO] [stdout]  --> src/db/queries/channels.rs:3:14
[INFO] [stdout]   |
[INFO] [stdout] 3 | pub async fn create_channel(_db: &Database, channel: &Channel) -> Result<Channel, DatabaseError> {
[INFO] [stdout]   |              ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_channel` is never used
[INFO] [stdout]  --> src/db/queries/channels.rs:8:14
[INFO] [stdout]   |
[INFO] [stdout] 8 | pub async fn get_channel(_db: &Database, _name: &str) -> Result<Option<Channel>, DatabaseError> {
[INFO] [stdout]   |              ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `update_channel` is never used
[INFO] [stdout]   --> src/db/queries/channels.rs:13:14
[INFO] [stdout]    |
[INFO] [stdout] 13 | pub async fn update_channel(_db: &Database, _channel: &Channel) -> Result<(), DatabaseError> {
[INFO] [stdout]    |              ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `delete_channel` is never used
[INFO] [stdout]   --> src/db/queries/channels.rs:18:14
[INFO] [stdout]    |
[INFO] [stdout] 18 | pub async fn delete_channel(_db: &Database, _name: &str) -> Result<(), DatabaseError> {
[INFO] [stdout]    |              ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `list_channels` is never used
[INFO] [stdout]   --> src/db/queries/channels.rs:23:14
[INFO] [stdout]    |
[INFO] [stdout] 23 | pub async fn list_channels(_db: &Database) -> Result<Vec<Channel>, DatabaseError> {
[INFO] [stdout]    |              ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `add_channel_member` is never used
[INFO] [stdout]   --> src/db/queries/channels.rs:28:14
[INFO] [stdout]    |
[INFO] [stdout] 28 | pub async fn add_channel_member(_db: &Database, _member: &ChannelMember) -> Result<(), DatabaseError> {
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `remove_channel_member` is never used
[INFO] [stdout]   --> src/db/queries/channels.rs:33:14
[INFO] [stdout]    |
[INFO] [stdout] 33 | pub async fn remove_channel_member(_db: &Database, _channel: &str, _user_id: &str) -> Result<(), DatabaseError> {
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_channel_members` is never used
[INFO] [stdout]   --> src/db/queries/channels.rs:38:14
[INFO] [stdout]    |
[INFO] [stdout] 38 | pub async fn get_channel_members(_db: &Database, _channel: &str) -> Result<Vec<ChannelMember>, DatabaseError> {
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_user_channels` is never used
[INFO] [stdout]   --> src/db/queries/channels.rs:43:14
[INFO] [stdout]    |
[INFO] [stdout] 43 | pub async fn get_user_channels(_db: &Database, _user_id: &str) -> Result<Vec<String>, DatabaseError> {
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `add_ban` is never used
[INFO] [stdout]  --> src/db/queries/bans.rs:3:14
[INFO] [stdout]   |
[INFO] [stdout] 3 | pub async fn add_ban(_db: &Database, _ban: &BanEntry) -> Result<(), DatabaseError> {
[INFO] [stdout]   |              ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `remove_ban` is never used
[INFO] [stdout]  --> src/db/queries/bans.rs:8:14
[INFO] [stdout]   |
[INFO] [stdout] 8 | pub async fn remove_ban(_db: &Database, _channel: &str, _mask: &str) -> Result<(), DatabaseError> {
[INFO] [stdout]   |              ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_channel_bans` is never used
[INFO] [stdout]   --> src/db/queries/bans.rs:13:14
[INFO] [stdout]    |
[INFO] [stdout] 13 | pub async fn get_channel_bans(_db: &Database, _channel: &str) -> Result<Vec<BanEntry>, DatabaseError> {
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `is_banned` is never used
[INFO] [stdout]   --> src/db/queries/bans.rs:18:14
[INFO] [stdout]    |
[INFO] [stdout] 18 | pub async fn is_banned(_db: &Database, _channel: &str, _user_mask: &str) -> Result<bool, DatabaseError> {
[INFO] [stdout]    |              ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_server_config` is never used
[INFO] [stdout]  --> src/db/queries/config.rs:3:14
[INFO] [stdout]   |
[INFO] [stdout] 3 | pub async fn get_server_config(_db: &Database) -> Result<ServerConfig, DatabaseError> {
[INFO] [stdout]   |              ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `update_server_config` is never used
[INFO] [stdout]  --> src/db/queries/config.rs:8:14
[INFO] [stdout]   |
[INFO] [stdout] 8 | pub async fn update_server_config(_db: &Database, _config: &ServerConfig) -> Result<(), DatabaseError> {
[INFO] [stdout]   |              ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `create_schema_sql` is never used
[INFO] [stdout]  --> src/db/migrations.rs:3:8
[INFO] [stdout]   |
[INFO] [stdout] 3 | pub fn create_schema_sql() -> &'static str {
[INFO] [stdout]   |        ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variant `Config` is never constructed
[INFO] [stdout]   --> src/error.rs:22:5
[INFO] [stdout]    |
[INFO] [stdout]  7 | pub enum CenturionError {
[INFO] [stdout]    |          -------------- variant in this enum
[INFO] [stdout] ...
[INFO] [stdout] 22 |     Config(String),
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `CenturionError` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `has_msgid` and `timestamp_secs` are never used
[INFO] [stdout]   --> src/history/mod.rs:81:12
[INFO] [stdout]    |
[INFO] [stdout] 56 | impl HistoryItem {
[INFO] [stdout]    | ---------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 81 |     pub fn has_msgid(&self, msgid: &str) -> bool {
[INFO] [stdout]    |            ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 86 |     pub fn timestamp_secs(&self) -> u64 {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `cleanup_old_messages` is never used
[INFO] [stdout]    --> src/history/storage.rs:286:12
[INFO] [stdout]     |
[INFO] [stdout] 195 | impl HistoryStorage {
[INFO] [stdout]     | ------------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 286 |     pub fn cleanup_old_messages(&self) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `is_empty` is never used
[INFO] [stdout]   --> src/history/queries.rs:33:12
[INFO] [stdout]    |
[INFO] [stdout] 11 | impl HistorySelector {
[INFO] [stdout]    | -------------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 33 |     pub fn is_empty(&self) -> bool {
[INFO] [stdout]    |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `start` and `end` are never read
[INFO] [stdout]   --> src/history/queries.rs:74:9
[INFO] [stdout]    |
[INFO] [stdout] 73 |     Targets {
[INFO] [stdout]    |     ------- fields in this variant
[INFO] [stdout] 74 |         start: Option<HistorySelector>,
[INFO] [stdout]    |         ^^^^^
[INFO] [stdout] 75 |         end: Option<HistorySelector>,
[INFO] [stdout]    |         ^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `HistoryQuery` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variant `Key` is never constructed
[INFO] [stdout]   --> src/legion/mod.rs:44:5
[INFO] [stdout]    |
[INFO] [stdout] 25 | pub enum LegionError {
[INFO] [stdout]    |          ----------- variant in this enum
[INFO] [stdout] ...
[INFO] [stdout] 44 |     Key(String),
[INFO] [stdout]    |     ^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `LegionError` 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 `server_identity`, `channels`, `sessions`, `key_manager`, `member_manager`, and `federation_manager` are never read
[INFO] [stdout]   --> src/legion/mod.rs:63:5
[INFO] [stdout]    |
[INFO] [stdout] 61 | pub struct LegionManager {
[INFO] [stdout]    |            ------------- fields in this struct
[INFO] [stdout] 62 |     /// Server identity for Legion operations
[INFO] [stdout] 63 |     server_identity: Arc<RwLock<Identity>>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^
[INFO] [stdout] 64 |     /// Active Legion channels
[INFO] [stdout] 65 |     channels: Arc<DashMap<String, AsyncPhalanxGroup>>,
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] 66 |     /// Client sessions with Legion capabilities
[INFO] [stdout] 67 |     sessions: Arc<DashMap<String, session::LegionSession>>,
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] 68 |     /// Key manager for rotation and storage
[INFO] [stdout] 69 |     key_manager: Arc<keys::KeyManager>,
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout] 70 |     /// Member manager for authentication and authorization
[INFO] [stdout] 71 |     member_manager: Arc<members::MemberManager>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^
[INFO] [stdout] 72 |     /// Federation manager for cross-server communication
[INFO] [stdout] 73 |     federation_manager: Arc<federation::FederationManager>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `LegionManager` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple methods are never used
[INFO] [stdout]    --> src/legion/mod.rs:95:18
[INFO] [stdout]     |
[INFO] [stdout]  76 | impl LegionManager {
[INFO] [stdout]     | ------------------ methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout]  95 |     pub async fn server_identity(&self) -> Identity {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 100 |     pub async fn supports_legion(&self, client_id: &str) -> bool {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 109 |     pub async fn create_session(&self, client_id: String, capabilities: Vec<Capability>) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 116 |     pub async fn remove_session(&self, client_id: &str) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 122 |     pub async fn create_channel(&self, channel_name: String, creator_id: String) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 160 |     pub async fn join_channel(&self, channel_name: String, client_id: String) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 200 |     pub async fn leave_channel(&self, channel_name: String, client_id: String) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 222 |     pub async fn send_message(
[INFO] [stdout]     |                  ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 246 |     pub async fn receive_message(
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 277 |     pub async fn channel_stats(&self, channel_name: &str) -> LegionResult<phalanx_crypto::group::GroupStats> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 285 |     pub async fn list_channels(&self) -> Vec<String> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 290 |     pub async fn rotate_channel_keys(&self, channel_name: String, admin_id: String) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 312 |     pub async fn cleanup(&self) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `ChannelOperation` is never used
[INFO] [stdout]   --> src/legion/channels.rs:13:10
[INFO] [stdout]    |
[INFO] [stdout] 13 | pub enum ChannelOperation {
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ChannelEvent` is never constructed
[INFO] [stdout]   --> src/legion/channels.rs:29:12
[INFO] [stdout]    |
[INFO] [stdout] 29 | pub struct ChannelEvent {
[INFO] [stdout]    |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple methods are never used
[INFO] [stdout]    --> src/legion/channels.rs:60:18
[INFO] [stdout]     |
[INFO] [stdout]  39 | impl LegionManager {
[INFO] [stdout]     | ------------------ methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout]  60 |     pub async fn handle_create_channel(&self, channel_name: String, creator_id: String) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  88 |     pub async fn handle_join_channel(&self, channel_name: String, client_id: String) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 114 |     pub async fn handle_leave_channel(&self, channel_name: String, client_id: String) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 135 |     pub async fn handle_send_message(&self, channel_name: String, sender_id: String, message: String) -> LegionResult<Vec<u8>> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 164 |     pub async fn handle_receive_message(&self, channel_name: String, recipient_id: String, encrypted_data: Vec<u8>) -> LegionResult...
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 175 |     pub async fn handle_key_rotation(&self, channel_name: String, admin_id: String) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 201 |     pub async fn get_channel_info(&self, channel_name: &str, requester_id: &str) -> LegionResult<ChannelInfo> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 231 |     pub async fn list_user_channels(&self, user_id: &str) -> LegionResult<Vec<ChannelSummary>> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 252 |     async fn log_channel_event(&self, event: ChannelEvent) -> LegionResult<()> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ChannelInfo` is never constructed
[INFO] [stdout]    --> src/legion/channels.rs:261:12
[INFO] [stdout]     |
[INFO] [stdout] 261 | pub struct ChannelInfo {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ChannelSummary` is never constructed
[INFO] [stdout]    --> src/legion/channels.rs:271:12
[INFO] [stdout]     |
[INFO] [stdout] 271 | pub struct ChannelSummary {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MAX_OLD_KEYS` is never used
[INFO] [stdout]   --> src/legion/keys.rs:18:7
[INFO] [stdout]    |
[INFO] [stdout] 18 | const MAX_OLD_KEYS: usize = 10;
[INFO] [stdout]    |       ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `kdf_context` and `backup_handler` are never read
[INFO] [stdout]   --> src/legion/keys.rs:28:5
[INFO] [stdout]    |
[INFO] [stdout] 22 | pub struct KeyManager {
[INFO] [stdout]    |            ---------- fields in this struct
[INFO] [stdout] ...
[INFO] [stdout] 28 |     kdf_context: Vec<u8>,
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout] 29 |     /// Backup storage handler
[INFO] [stdout] 30 |     backup_handler: Option<Box<dyn BackupHandler>>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `KeyManager` 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 `current_rotation`, `old_rotations`, `created_at`, `last_rotation`, and `next_rotation` are never read
[INFO] [stdout]   --> src/legion/keys.rs:37:5
[INFO] [stdout]    |
[INFO] [stdout] 35 | struct ChannelKeys {
[INFO] [stdout]    |        ----------- fields in this struct
[INFO] [stdout] 36 |     /// Current active key rotation info
[INFO] [stdout] 37 |     current_rotation: KeyRotationInfo,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^
[INFO] [stdout] 38 |     /// Previous keys for backward compatibility
[INFO] [stdout] 39 |     old_rotations: Vec<KeyRotationInfo>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout] 40 |     /// Channel creation timestamp
[INFO] [stdout] 41 |     created_at: SystemTime,
[INFO] [stdout]    |     ^^^^^^^^^^
[INFO] [stdout] 42 |     /// Last rotation timestamp  
[INFO] [stdout] 43 |     last_rotation: SystemTime,
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout] 44 |     /// Next scheduled rotation
[INFO] [stdout] 45 |     next_rotation: SystemTime,
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `ChannelKeys` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `store_backup`, `retrieve_backup`, `list_backups`, and `cleanup_backups` are never used
[INFO] [stdout]    --> src/legion/keys.rs:106:14
[INFO] [stdout]     |
[INFO] [stdout] 104 | pub trait BackupHandler: Send + Sync + std::fmt::Debug {
[INFO] [stdout]     |           ------------- methods in this trait
[INFO] [stdout] 105 |     /// Store a key rotation backup
[INFO] [stdout] 106 |     async fn store_backup(&self, channel: &str, rotation: &KeyRotationInfo) -> LegionResult<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 109 |     async fn retrieve_backup(&self, channel: &str, sequence: u64) -> LegionResult<Option<KeyRotationInfo>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 112 |     async fn list_backups(&self, channel: &str) -> LegionResult<Vec<u64>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 115 |     async fn cleanup_backups(&self, channel: &str, keep_count: usize) -> LegionResult<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple methods are never used
[INFO] [stdout]    --> src/legion/keys.rs:146:18
[INFO] [stdout]     |
[INFO] [stdout] 130 | impl KeyManager {
[INFO] [stdout]     | --------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 146 |     pub async fn set_backup_handler(&mut self, handler: Box<dyn BackupHandler>) {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 166 |     pub async fn store_key_rotation(&self, channel: &str, rotation_msg: &KeyRotationMessage) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 215 |     pub async fn get_current_rotation(&self, channel: &str) -> LegionResult<Option<KeyRotationInfo>> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 221 |     pub async fn get_rotation_by_sequence(&self, channel: &str, sequence: u64) -> LegionResult<Option<KeyRotationInfo>> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 247 |     pub async fn needs_rotation(&self, channel: &str) -> bool {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 275 |     pub async fn schedule_rotation(&self, channel: &str, when: SystemTime) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 288 |     pub async fn on_member_change(&self, channel: &str) -> LegionResult<bool> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 302 |     pub async fn channel_stats(&self, channel: &str) -> LegionResult<ChannelKeyStats> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 332 |     pub async fn cleanup(&self) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 365 |     fn compute_key_fingerprint(&self, rotation_msg: &KeyRotationMessage) -> [u8; 32] {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ChannelKeyStats` is never constructed
[INFO] [stdout]    --> src/legion/keys.rs:382:12
[INFO] [stdout]     |
[INFO] [stdout] 382 | pub struct ChannelKeyStats {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `to_json` is never used
[INFO] [stdout]    --> src/legion/keys.rs:395:12
[INFO] [stdout]     |
[INFO] [stdout] 393 | impl ChannelKeyStats {
[INFO] [stdout]     | -------------------- method in this implementation
[INFO] [stdout] 394 |     /// Convert to JSON-friendly format
[INFO] [stdout] 395 |     pub fn to_json(&self) -> serde_json::Value {
[INFO] [stdout]     |            ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MEMBER_INACTIVITY_TIMEOUT` is never used
[INFO] [stdout]   --> src/legion/members.rs:16:7
[INFO] [stdout]    |
[INFO] [stdout] 16 | const MEMBER_INACTIVITY_TIMEOUT: Duration = Duration::from_secs(7 * 24 * 60 * 60);
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `invitations` is never read
[INFO] [stdout]   --> src/legion/members.rs:28:5
[INFO] [stdout]    |
[INFO] [stdout] 20 | pub struct MemberManager {
[INFO] [stdout]    |            ------------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 28 |     invitations: RwLock<HashMap<String, Vec<Invitation>>>,
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `MemberManager` 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 `channel_name`, `owner`, `created_at`, `settings`, and `pending_invitations` are never read
[INFO] [stdout]   --> src/legion/members.rs:35:5
[INFO] [stdout]    |
[INFO] [stdout] 33 | struct ChannelMembership {
[INFO] [stdout]    |        ----------------- fields in this struct
[INFO] [stdout] 34 |     /// Channel name
[INFO] [stdout] 35 |     channel_name: String,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout] 36 |     /// Channel owner
[INFO] [stdout] 37 |     owner: String,
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 41 |     created_at: SystemTime,
[INFO] [stdout]    |     ^^^^^^^^^^
[INFO] [stdout] 42 |     /// Channel settings
[INFO] [stdout] 43 |     settings: ChannelSettings,
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] 44 |     /// Active invitations for this channel
[INFO] [stdout] 45 |     pending_invitations: HashSet<String>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `ChannelMembership` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `member_id`, `identity`, `registered_at`, `last_seen`, and `metadata` are never read
[INFO] [stdout]   --> src/legion/members.rs:69:5
[INFO] [stdout]    |
[INFO] [stdout] 67 | struct MemberInfo {
[INFO] [stdout]    |        ---------- fields in this struct
[INFO] [stdout] 68 |     /// Member ID
[INFO] [stdout] 69 |     member_id: String,
[INFO] [stdout]    |     ^^^^^^^^^
[INFO] [stdout] 70 |     /// Member's current identity
[INFO] [stdout] 71 |     identity: phalanx_crypto::Identity,
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 75 |     registered_at: SystemTime,
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout] 76 |     /// Last global activity
[INFO] [stdout] 77 |     last_seen: SystemTime,
[INFO] [stdout]    |     ^^^^^^^^^
[INFO] [stdout] 78 |     /// Member metadata
[INFO] [stdout] 79 |     metadata: HashMap<String, String>,
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `MemberInfo` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple methods are never used
[INFO] [stdout]    --> src/legion/members.rs:338:18
[INFO] [stdout]     |
[INFO] [stdout] 262 | impl MemberManager {
[INFO] [stdout]     | ------------------ methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 338 |     pub async fn add_channel_member(&self, channel_name: &str, member_id: &str, role: MemberRole) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 380 |     pub async fn remove_channel_member(&self, channel_name: &str, member_id: &str) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 407 |     pub async fn can_join_channel(&self, channel_name: &str, member_id: &str) -> LegionResult<bool> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 502 |     pub async fn create_invitation(&self, channel_name: String, inviter_id: String, invitee_id: String, expires_in: Duration) -> Le...
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 531 |     pub async fn use_invitation(&self, invitation_id: &str) -> LegionResult<(String, String)> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 567 |     pub async fn channel_stats(&self, channel_name: &str) -> LegionResult<ChannelStats> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 596 |     pub async fn cleanup(&self) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 616 |     pub async fn get_user_channels(&self, user_id: &str) -> LegionResult<Vec<String>> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ChannelStats` is never constructed
[INFO] [stdout]    --> src/legion/members.rs:628:12
[INFO] [stdout]     |
[INFO] [stdout] 628 | pub struct ChannelStats {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `identity` and `created_at` are never read
[INFO] [stdout]   --> src/legion/session.rs:22:5
[INFO] [stdout]    |
[INFO] [stdout] 18 | pub struct LegionSession {
[INFO] [stdout]    |            ------------- fields in this struct
[INFO] [stdout] ...
[INFO] [stdout] 22 |     identity: RwLock<Identity>,
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 28 |     created_at: SystemTime,
[INFO] [stdout]    |     ^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `LegionSession` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple methods are never used
[INFO] [stdout]    --> src/legion/session.rs:101:18
[INFO] [stdout]     |
[INFO] [stdout]  37 | impl LegionSession {
[INFO] [stdout]     | ------------------ methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 101 |     pub async fn identity(&self) -> LegionResult<Identity> {
[INFO] [stdout]     |                  ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 106 |     pub async fn public_key(&self) -> LegionResult<PublicKey> {
[INFO] [stdout]     |                  ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 127 |     pub fn age(&self) -> Duration {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 176 |     pub fn capabilities(&self) -> &HashSet<Capability> {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 186 |     pub async fn stats(&self) -> SessionStats {
[INFO] [stdout]     |                  ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 204 |     pub async fn create_handshake(&self, group_id: [u8; 32]) -> LegionResult<phalanx_crypto::protocol::HandshakeMessage> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 223 |     pub async fn process_handshake(
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `SessionStats` is never constructed
[INFO] [stdout]    --> src/legion/session.rs:234:12
[INFO] [stdout]     |
[INFO] [stdout] 234 | pub struct SessionStats {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `to_json` is never used
[INFO] [stdout]    --> src/legion/session.rs:247:12
[INFO] [stdout]     |
[INFO] [stdout] 245 | impl SessionStats {
[INFO] [stdout]     | ----------------- method in this implementation
[INFO] [stdout] 246 |     /// Convert to JSON-friendly format
[INFO] [stdout] 247 |     pub fn to_json(&self) -> serde_json::Value {
[INFO] [stdout]     |            ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `bridge_configs` is never read
[INFO] [stdout]   --> src/legion/federation.rs:18:5
[INFO] [stdout]    |
[INFO] [stdout] 14 | pub struct FederationManager {
[INFO] [stdout]    |            ----------------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 18 |     bridge_configs: RwLock<HashMap<String, BridgeConfig>>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `FederationManager` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `public_key` is never read
[INFO] [stdout]   --> src/legion/federation.rs:29:5
[INFO] [stdout]    |
[INFO] [stdout] 25 | struct FederatedServer {
[INFO] [stdout]    |        --------------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 29 |     public_key: PublicKey,
[INFO] [stdout]    |     ^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `FederatedServer` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variants `Connected`, `Disconnected`, and `Error` are never constructed
[INFO] [stdout]   --> src/legion/federation.rs:43:5
[INFO] [stdout]    |
[INFO] [stdout] 42 | enum FederationStatus {
[INFO] [stdout]    |      ---------------- variants in this enum
[INFO] [stdout] 43 |     Connected,
[INFO] [stdout]    |     ^^^^^^^^^
[INFO] [stdout] 44 |     Connecting,
[INFO] [stdout] 45 |     Disconnected,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout] 46 |     Error(String),
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `FederationStatus` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple methods are never used
[INFO] [stdout]    --> src/legion/federation.rs:227:18
[INFO] [stdout]     |
[INFO] [stdout] 159 | impl FederationManager {
[INFO] [stdout]     | ---------------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 227 |     pub async fn update_server_status(&self, hostname: &str, status: FederationStatus) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 267 |     pub async fn configure_bridge(&self, config: BridgeConfig) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 287 |     pub async fn remove_bridge(&self, bridge_name: &str) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 298 |     pub async fn send_federated_message(&self, target_server: &str, channel: &str, message: Vec<u8>) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 319 |     pub async fn process_federated_message(&self, source_server: &str, channel: &str, message: Vec<u8>) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 336 |     pub async fn federation_stats(&self) -> FederationStats {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 360 |     pub async fn cleanup(&self) -> LegionResult<()> {
[INFO] [stdout]     |                  ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `FederationStats` is never constructed
[INFO] [stdout]    --> src/legion/federation.rs:396:12
[INFO] [stdout]     |
[INFO] [stdout] 396 | pub struct FederationStats {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `scheduled_operations` is never read
[INFO] [stdout]   --> src/legion/channel_manager.rs:27:5
[INFO] [stdout]    |
[INFO] [stdout] 17 | pub struct AdvancedChannelManager {
[INFO] [stdout]    |            ---------------------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 27 |     scheduled_operations: RwLock<Vec<ScheduledOperation>>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `stats` and `rate_limits` are never read
[INFO] [stdout]   --> src/legion/channel_manager.rs:42:5
[INFO] [stdout]    |
[INFO] [stdout] 32 | struct ManagedChannel {
[INFO] [stdout]    |        -------------- fields in this struct
[INFO] [stdout] ...
[INFO] [stdout] 42 |     stats: ChannelStats,
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 46 |     rate_limits: HashMap<String, RateState>,
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `ManagedChannel` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `message_count`, `window_start`, and `burst_remaining` are never read
[INFO] [stdout]    --> src/legion/channel_manager.rs:115:5
[INFO] [stdout]     |
[INFO] [stdout] 113 | struct RateState {
[INFO] [stdout]     |        --------- fields in this struct
[INFO] [stdout] 114 |     /// Message count in current window
[INFO] [stdout] 115 |     message_count: u32,
[INFO] [stdout]     |     ^^^^^^^^^^^^^
[INFO] [stdout] 116 |     /// Current window start time
[INFO] [stdout] 117 |     window_start: SystemTime,
[INFO] [stdout]     |     ^^^^^^^^^^^^
[INFO] [stdout] 118 |     /// Burst allowance remaining
[INFO] [stdout] 119 |     burst_remaining: u32,
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `RateState` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ExtendedChannelInfo` is never constructed
[INFO] [stdout]    --> src/legion/channel_manager.rs:160:12
[INFO] [stdout]     |
[INFO] [stdout] 160 | pub struct ExtendedChannelInfo {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ChannelHealth` is never constructed
[INFO] [stdout]    --> src/legion/channel_manager.rs:175:12
[INFO] [stdout]     |
[INFO] [stdout] 175 | pub struct ChannelHealth {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `HealthIssue` is never used
[INFO] [stdout]    --> src/legion/channel_manager.rs:186:10
[INFO] [stdout]     |
[INFO] [stdout] 186 | pub enum HealthIssue {
[INFO] [stdout]     |          ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `PerformanceMetrics` is never constructed
[INFO] [stdout]    --> src/legion/channel_manager.rs:201:12
[INFO] [stdout]     |
[INFO] [stdout] 201 | pub struct PerformanceMetrics {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `SecurityStatus` is never constructed
[INFO] [stdout]    --> src/legion/channel_manager.rs:214:12
[INFO] [stdout]     |
[INFO] [stdout] 214 | pub struct SecurityStatus {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `SecurityEvent` is never used
[INFO] [stdout]    --> src/legion/channel_manager.rs:227:10
[INFO] [stdout]     |
[INFO] [stdout] 227 | pub enum SecurityEvent {
[INFO] [stdout]     |          ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `get_extended_channel_info`, `calculate_channel_health`, `assess_security_status`, and `process_scheduled_operations` are never used
[INFO] [stdout]    --> src/legion/channel_manager.rs:808:18
[INFO] [stdout]     |
[INFO] [stdout] 252 | impl AdvancedChannelManager {
[INFO] [stdout]     | --------------------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 808 |     pub async fn get_extended_channel_info(&self, channel_name: &str) -> LegionResult<ExtendedChannelInfo> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 833 |     async fn calculate_channel_health(&self, channel: &ManagedChannel) -> ChannelHealth {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 873 |     async fn assess_security_status(&self, channel: &ManagedChannel) -> SecurityStatus {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 973 |     pub async fn process_scheduled_operations(&self) -> LegionResult<usize> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: type alias `ProtocolError` is never used
[INFO] [stdout]   --> src/protocol/mod.rs:36:10
[INFO] [stdout]    |
[INFO] [stdout] 36 | pub type ProtocolError = IronError;
[INFO] [stdout]    |          ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple variants are never constructed
[INFO] [stdout]   --> src/protocol/commands.rs:16:5
[INFO] [stdout]    |
[INFO] [stdout]  4 | pub enum Command {
[INFO] [stdout]    |          ------- variants in this enum
[INFO] [stdout] ...
[INFO] [stdout] 16 |     Topic { channel: String, topic: Option<String> },
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout] 17 |     Names(Vec<String>),
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout] 18 |     List(Option<Vec<String>>),
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] ...
[INFO] [stdout] 25 |     Who(Option<String>),
[INFO] [stdout]    |     ^^^
[INFO] [stdout] 26 |     Whois(Vec<String>),
[INFO] [stdout] 27 |     Whowas(String, Option<i32>),
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 31 |     Kick { channel: String, user: String, reason: Option<String> },
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] 32 |     Mode { target: String, modes: Option<String>, params: Vec<String> },
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] 33 |     Invite { nick: String, channel: String },
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 36 |     Motd(Option<String>),
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] 37 |     Version(Option<String>),
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout] 38 |     Stats(Option<String>, Option<String>),
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout] 39 |     Time(Option<String>),
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] 40 |     Info(Option<String>),
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] ...
[INFO] [stdout] 45 |     Account(String),
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout] 46 |     Monitor { subcommand: String, targets: Vec<String> },
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout] 47 |     Metadata { target: String, subcommand: String, params: Vec<String> },
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] 48 |     TagMsg { target: String },
[INFO] [stdout] 49 |     Batch { reference: String, batch_type: Option<String>, params: Vec<String> },
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 58 |     Oper { name: String, password: String },
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] 59 |     Kill { nick: String, reason: String },
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] 60 |     Rehash,
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout] 61 |     Restart,
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout] 62 |     Die,
[INFO] [stdout]    |     ^^^
[INFO] [stdout] ...
[INFO] [stdout] 65 |     CtcpRequest { target: String, command: String, params: String },
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout] 66 |     CtcpResponse { target: String, command: String, params: String },
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `Command` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `MessageExtensions` is never constructed
[INFO] [stdout]  --> src/protocol/extensions.rs:5:12
[INFO] [stdout]   |
[INFO] [stdout] 5 | pub struct MessageExtensions {
[INFO] [stdout]   |            ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `TypingState` is never used
[INFO] [stdout]   --> src/protocol/extensions.rs:18:10
[INFO] [stdout]    |
[INFO] [stdout] 18 | pub enum TypingState {
[INFO] [stdout]    |          ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `from_tags`, and `to_tags` are never used
[INFO] [stdout]   --> src/protocol/extensions.rs:25:12
[INFO] [stdout]    |
[INFO] [stdout] 24 | impl MessageExtensions {
[INFO] [stdout]    | ---------------------- associated items in this implementation
[INFO] [stdout] 25 |     pub fn new() -> Self {
[INFO] [stdout]    |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 39 |     pub fn from_tags(tags: &HashMap<String, Option<String>>) -> Self {
[INFO] [stdout]    |            ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 74 |     pub fn to_tags(&self) -> HashMap<String, Option<String>> {
[INFO] [stdout]    |            ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `Batch` is never constructed
[INFO] [stdout]    --> src/protocol/extensions.rs:127:12
[INFO] [stdout]     |
[INFO] [stdout] 127 | pub struct Batch {
[INFO] [stdout]     |            ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new` and `add_message` are never used
[INFO] [stdout]    --> src/protocol/extensions.rs:136:12
[INFO] [stdout]     |
[INFO] [stdout] 135 | impl Batch {
[INFO] [stdout]     | ---------- associated items in this implementation
[INFO] [stdout] 136 |     pub fn new(reference: String, batch_type: String, params: Vec<String>) -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 146 |     pub fn add_message(&mut self, msg: crate::protocol::Message) {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `SecurityError` is never used
[INFO] [stdout]   --> src/security/mod.rs:18:10
[INFO] [stdout]    |
[INFO] [stdout] 18 | pub enum SecurityError {
[INFO] [stdout]    |          ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `quota` is never read
[INFO] [stdout]   --> src/security/mod.rs:39:5
[INFO] [stdout]    |
[INFO] [stdout] 38 | pub struct RateLimiter {
[INFO] [stdout]    |            ----------- field in this struct
[INFO] [stdout] 39 |     quota: Quota,
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `check_key` is never used
[INFO] [stdout]   --> src/security/mod.rs:59:18
[INFO] [stdout]    |
[INFO] [stdout] 43 | impl RateLimiter {
[INFO] [stdout]    | ---------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 59 |     pub async fn check_key(&self, _key: &str) -> bool {
[INFO] [stdout]    |                  ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ConnectionLimiter` is never constructed
[INFO] [stdout]   --> src/security/mod.rs:64:12
[INFO] [stdout]    |
[INFO] [stdout] 64 | pub struct ConnectionLimiter {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ConnectionLimits` is never constructed
[INFO] [stdout]   --> src/security/mod.rs:68:8
[INFO] [stdout]    |
[INFO] [stdout] 68 | struct ConnectionLimits {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `check_and_add`, and `remove` are never used
[INFO] [stdout]    --> src/security/mod.rs:76:12
[INFO] [stdout]     |
[INFO] [stdout]  75 | impl ConnectionLimiter {
[INFO] [stdout]     | ---------------------- associated items in this implementation
[INFO] [stdout]  76 |     pub fn new(max_per_ip: usize, max_global: usize) -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout]  87 |     pub fn check_and_add(&self, addr: SocketAddr) -> Result<(), SecurityError> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 108 |     pub fn remove(&self, addr: SocketAddr) {
[INFO] [stdout]     |            ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `FloodProtection` is never constructed
[INFO] [stdout]    --> src/security/mod.rs:123:12
[INFO] [stdout]     |
[INFO] [stdout] 123 | pub struct FloodProtection {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `check_flood`, and `clear` are never used
[INFO] [stdout]    --> src/security/mod.rs:130:12
[INFO] [stdout]     |
[INFO] [stdout] 129 | impl FloodProtection {
[INFO] [stdout]     | -------------------- associated items in this implementation
[INFO] [stdout] 130 |     pub fn new(max_messages: usize, time_window: Duration) -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 138 |     pub fn check_flood(&self, connection_id: u64) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 155 |     pub fn clear(&self, connection_id: u64) {
[INFO] [stdout]     |            ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `BanManager` is never constructed
[INFO] [stdout]    --> src/security/mod.rs:160:12
[INFO] [stdout]     |
[INFO] [stdout] 160 | pub struct BanManager {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `BanEntry` is never constructed
[INFO] [stdout]    --> src/security/mod.rs:165:12
[INFO] [stdout]     |
[INFO] [stdout] 165 | pub struct BanEntry {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `add_ban`, `remove_ban`, `is_banned`, and `get_bans` are never used
[INFO] [stdout]    --> src/security/mod.rs:173:12
[INFO] [stdout]     |
[INFO] [stdout] 172 | impl BanManager {
[INFO] [stdout]     | --------------- associated items in this implementation
[INFO] [stdout] 173 |     pub fn new() -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 179 |     pub fn add_ban(&self, channel: &str, ban: BanEntry) {
[INFO] [stdout]     |            ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 186 |     pub fn remove_ban(&self, channel: &str, mask: &str) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 196 |     pub fn is_banned(&self, channel: &str, user_mask: &str) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 214 |     pub fn get_bans(&self, channel: &str) -> Vec<BanEntry> {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `mask_matches` is never used
[INFO] [stdout]    --> src/security/mod.rs:222:4
[INFO] [stdout]     |
[INFO] [stdout] 222 | fn mask_matches(pattern: &str, text: &str) -> bool {
[INFO] [stdout]     |    ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `AuthError` is never used
[INFO] [stdout]   --> src/security/auth.rs:10:10
[INFO] [stdout]    |
[INFO] [stdout] 10 | pub enum AuthError {
[INFO] [stdout]    |          ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `SaslMechanism` is never used
[INFO] [stdout]   --> src/security/auth.rs:25:10
[INFO] [stdout]    |
[INFO] [stdout] 25 | pub enum SaslMechanism {
[INFO] [stdout]    |          ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `from_str` and `as_str` are never used
[INFO] [stdout]   --> src/security/auth.rs:32:12
[INFO] [stdout]    |
[INFO] [stdout] 31 | impl SaslMechanism {
[INFO] [stdout]    | ------------------ associated items in this implementation
[INFO] [stdout] 32 |     pub fn from_str(s: &str) -> Option<Self> {
[INFO] [stdout]    |            ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 41 |     pub fn as_str(&self) -> &'static str {
[INFO] [stdout]    |            ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `AuthMethod` is never used
[INFO] [stdout]   --> src/security/auth.rs:51:10
[INFO] [stdout]    |
[INFO] [stdout] 51 | pub enum AuthMethod {
[INFO] [stdout]    |          ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `LocalPasswordHasher` is never constructed
[INFO] [stdout]   --> src/security/auth.rs:62:12
[INFO] [stdout]    |
[INFO] [stdout] 62 | pub struct LocalPasswordHasher;
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated functions `hash_password` and `verify_password` are never used
[INFO] [stdout]   --> src/security/auth.rs:65:12
[INFO] [stdout]    |
[INFO] [stdout] 64 | impl LocalPasswordHasher {
[INFO] [stdout]    | ------------------------ associated functions in this implementation
[INFO] [stdout] 65 |     pub fn hash_password(password: &str) -> Result<String, AuthError> {
[INFO] [stdout]    |            ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 70 |     pub fn verify_password(password: &str, hash: &str) -> Result<bool, AuthError> {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `SaslAuthenticator` is never constructed
[INFO] [stdout]   --> src/security/auth.rs:76:12
[INFO] [stdout]    |
[INFO] [stdout] 76 | pub struct SaslAuthenticator {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ScramServerState` is never constructed
[INFO] [stdout]   --> src/security/auth.rs:80:8
[INFO] [stdout]    |
[INFO] [stdout] 80 | struct ScramServerState {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `authenticate_plain`, `start_scram_sha256`, and `verify_scram_sha256` are never used
[INFO] [stdout]    --> src/security/auth.rs:89:12
[INFO] [stdout]     |
[INFO] [stdout]  88 | impl SaslAuthenticator {
[INFO] [stdout]     | ---------------------- associated items in this implementation
[INFO] [stdout]  89 |     pub fn new() -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout]  95 |     pub fn authenticate_plain(&self, auth_data: &[u8]) -> Result<(String, String), AuthError> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 115 |     pub fn start_scram_sha256(&mut self, client_first: &str) -> Result<String, AuthError> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 152 |     pub fn verify_scram_sha256(
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `authenticate` is never used
[INFO] [stdout]    --> src/security/auth.rs:193:14
[INFO] [stdout]     |
[INFO] [stdout] 193 | pub async fn authenticate(
[INFO] [stdout]     |              ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `generate_nonce` is never used
[INFO] [stdout]    --> src/security/auth.rs:218:4
[INFO] [stdout]     |
[INFO] [stdout] 218 | fn generate_nonce() -> String {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `generate_salt` is never used
[INFO] [stdout]    --> src/security/auth.rs:225:4
[INFO] [stdout]     |
[INFO] [stdout] 225 | fn generate_salt() -> Vec<u8> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `derive_salted_password` is never used
[INFO] [stdout]    --> src/security/auth.rs:231:4
[INFO] [stdout]     |
[INFO] [stdout] 231 | fn derive_salted_password(password: &[u8], salt: &[u8], iterations: u32) -> Vec<u8> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `hmac_sha256` is never used
[INFO] [stdout]    --> src/security/auth.rs:237:4
[INFO] [stdout]     |
[INFO] [stdout] 237 | fn hmac_sha256(key: &[u8], data: &[u8]) -> Vec<u8> {
[INFO] [stdout]     |    ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `create_tls_acceptor` is never used
[INFO] [stdout]  --> src/security/tls.rs:4:14
[INFO] [stdout]   |
[INFO] [stdout] 4 | pub async fn create_tls_acceptor(_cert_path: &Path, _key_path: &Path) -> io::Result<()> {
[INFO] [stdout]   |              ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: static `VALID_USER_REGEX` is never used
[INFO] [stdout]   --> src/security/validation.rs:12:8
[INFO] [stdout]    |
[INFO] [stdout] 12 | static VALID_USER_REGEX: Lazy<Regex> = Lazy::new(|| {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `validate_username` is never used
[INFO] [stdout]   --> src/security/validation.rs:32:8
[INFO] [stdout]    |
[INFO] [stdout] 32 | pub fn validate_username(username: &str) -> bool {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `validate_realname` is never used
[INFO] [stdout]   --> src/security/validation.rs:40:8
[INFO] [stdout]    |
[INFO] [stdout] 40 | pub fn validate_realname(realname: &str) -> bool {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `validate_topic` is never used
[INFO] [stdout]   --> src/security/validation.rs:58:8
[INFO] [stdout]    |
[INFO] [stdout] 58 | pub fn validate_topic(topic: &str) -> bool {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `validate_away_message` is never used
[INFO] [stdout]   --> src/security/validation.rs:67:8
[INFO] [stdout]    |
[INFO] [stdout] 67 | pub fn validate_away_message(message: &str) -> bool {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `validate_kick_reason` is never used
[INFO] [stdout]   --> src/security/validation.rs:76:8
[INFO] [stdout]    |
[INFO] [stdout] 76 | pub fn validate_kick_reason(reason: &str) -> bool {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `validate_quit_message` is never used
[INFO] [stdout]   --> src/security/validation.rs:85:8
[INFO] [stdout]    |
[INFO] [stdout] 85 | pub fn validate_quit_message(message: &str) -> bool {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `validate_channel_key` is never used
[INFO] [stdout]   --> src/security/validation.rs:94:8
[INFO] [stdout]    |
[INFO] [stdout] 94 | pub fn validate_channel_key(key: &str) -> bool {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `sanitize_message` is never used
[INFO] [stdout]    --> src/security/validation.rs:103:8
[INFO] [stdout]     |
[INFO] [stdout] 103 | pub fn sanitize_message(message: &str) -> String {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `is_valid_host_mask` is never used
[INFO] [stdout]    --> src/security/validation.rs:111:8
[INFO] [stdout]     |
[INFO] [stdout] 111 | pub fn is_valid_host_mask(mask: &str) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `has_legion` and `legion` are never used
[INFO] [stdout]   --> src/state/mod.rs:52:12
[INFO] [stdout]    |
[INFO] [stdout] 23 | impl ServerState {
[INFO] [stdout]    | ---------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 52 |     pub fn has_legion(&self) -> bool {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 57 |     pub fn legion(&self) -> Option<&LegionManager> {
[INFO] [stdout]    |            ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `connection_id` and `joined_at` are never read
[INFO] [stdout]  --> src/state/channel.rs:6:9
[INFO] [stdout]   |
[INFO] [stdout] 5 | pub struct ChannelMember {
[INFO] [stdout]   |            ------------- fields in this struct
[INFO] [stdout] 6 |     pub connection_id: u64,
[INFO] [stdout]   |         ^^^^^^^^^^^^^
[INFO] [stdout] 7 |     pub modes: Vec<char>,
[INFO] [stdout] 8 |     pub joined_at: DateTime<Utc>,
[INFO] [stdout]   |         ^^^^^^^^^
[INFO] [stdout]   |
[INFO] [stdout]   = note: `ChannelMember` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `name` and `created_at` are never read
[INFO] [stdout]   --> src/state/channel.rs:13:9
[INFO] [stdout]    |
[INFO] [stdout] 12 | pub struct Channel {
[INFO] [stdout]    |            ------- fields in this struct
[INFO] [stdout] 13 |     pub name: String,
[INFO] [stdout]    |         ^^^^
[INFO] [stdout] ...
[INFO] [stdout] 19 |     pub created_at: DateTime<Utc>,
[INFO] [stdout]    |         ^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `Channel` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `id`, `addr`, and `created_at` are never read
[INFO] [stdout]   --> src/state/connection.rs:9:9
[INFO] [stdout]    |
[INFO] [stdout]  8 | pub struct Connection {
[INFO] [stdout]    |            ---------- fields in this struct
[INFO] [stdout]  9 |     pub id: u64,
[INFO] [stdout]    |         ^^
[INFO] [stdout] 10 |     pub addr: SocketAddr,
[INFO] [stdout]    |         ^^^^
[INFO] [stdout] ...
[INFO] [stdout] 17 |     pub created_at: DateTime<Utc>,
[INFO] [stdout]    |         ^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `Connection` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `mask_ip` is never used
[INFO] [stdout]   --> src/utils/mod.rs:13:8
[INFO] [stdout]    |
[INFO] [stdout] 13 | pub fn mask_ip(ip: IpAddr) -> String {
[INFO] [stdout]    |        ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `parse_mode_string` is never used
[INFO] [stdout]   --> src/utils/mod.rs:34:8
[INFO] [stdout]    |
[INFO] [stdout] 34 | pub fn parse_mode_string(modes: &str) -> (Vec<char>, Vec<char>) {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `format_duration` is never used
[INFO] [stdout]   --> src/utils/mod.rs:56:8
[INFO] [stdout]    |
[INFO] [stdout] 56 | pub fn format_duration(seconds: u64) -> String {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `normalize_channel_name` is never used
[INFO] [stdout]   --> src/utils/mod.rs:77:8
[INFO] [stdout]    |
[INFO] [stdout] 77 | pub fn normalize_channel_name(name: &str) -> String {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `normalize_nickname` is never used
[INFO] [stdout]   --> src/utils/mod.rs:81:8
[INFO] [stdout]    |
[INFO] [stdout] 81 | pub fn normalize_nickname(nick: &str) -> String {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `load_with_defaults` is never used
[INFO] [stdout]    --> src/utils/config.rs:157:12
[INFO] [stdout]     |
[INFO] [stdout] 148 | impl ServerConfig {
[INFO] [stdout]     | ----------------- associated function in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 157 |     pub fn load_with_defaults(path: Option<impl AsRef<Path>>) -> Result<Self, ConfigError> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr]     Finished `dev` profile [unoptimized + debuginfo] target(s) in 2m 28s
[INFO] running `Command { std: "docker" "inspect" "2fc0ccb168ae5271f390d3fb32e0517a1f4766e0b79d3e37e4b2273010e8ebbc", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "2fc0ccb168ae5271f390d3fb32e0517a1f4766e0b79d3e37e4b2273010e8ebbc", kill_on_drop: false }`
[INFO] [stdout] 2fc0ccb168ae5271f390d3fb32e0517a1f4766e0b79d3e37e4b2273010e8ebbc
