[INFO] cloning repository https://github.com/Cyarun/cctv-sentinel
[INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/Cyarun/cctv-sentinel" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FCyarun%2Fcctv-sentinel", kill_on_drop: false }`
[INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FCyarun%2Fcctv-sentinel'...
[INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }`
[INFO] [stdout] d5d521459b289eec470b873d9ebf7abb9ccd0e46
[INFO] checking Cyarun/cctv-sentinel against a5689b034ad287112f709693384a37f1377eb9cc for pr-129249-3
[INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FCyarun%2Fcctv-sentinel" "/workspace/builds/worker-7-tc2/source", kill_on_drop: false }`
[INFO] [stderr] Cloning into '/workspace/builds/worker-7-tc2/source'...
[INFO] [stderr] done.
[INFO] started tweaking git repo https://github.com/Cyarun/cctv-sentinel
[INFO] finished tweaking git repo https://github.com/Cyarun/cctv-sentinel
[INFO] tweaked toml for git repo https://github.com/Cyarun/cctv-sentinel written to /workspace/builds/worker-7-tc2/source/Cargo.toml
[INFO] validating manifest of git repo https://github.com/Cyarun/cctv-sentinel on toolchain a5689b034ad287112f709693384a37f1377eb9cc
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+a5689b034ad287112f709693384a37f1377eb9cc" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate git repo https://github.com/Cyarun/cctv-sentinel 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" "+a5689b034ad287112f709693384a37f1377eb9cc" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] [stderr]     Blocking waiting for file lock on package cache
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-7-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-7-tc2/target:/opt/rustwide/target:rw,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" "-m" "1610612736" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:77db811e55d90add9212f6832c23229e3de5f1c1f9905e8cb07319ea15df73ac" "sleep" "infinity", kill_on_drop: false }`
[INFO] [stdout] 61668475b6c2b97cb3dc4b9548b2e6a3fce26dacf2b20e654f869e8614d8a522
[INFO] running `Command { std: "docker" "start" "61668475b6c2b97cb3dc4b9548b2e6a3fce26dacf2b20e654f869e8614d8a522", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "61668475b6c2b97cb3dc4b9548b2e6a3fce26dacf2b20e654f869e8614d8a522", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-w" "/opt/rustwide/workdir" "--user" "0:0" "61668475b6c2b97cb3dc4b9548b2e6a3fce26dacf2b20e654f869e8614d8a522" "/opt/rustwide/cargo-home/bin/cargo" "+a5689b034ad287112f709693384a37f1377eb9cc" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "61668475b6c2b97cb3dc4b9548b2e6a3fce26dacf2b20e654f869e8614d8a522", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-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" "-w" "/opt/rustwide/workdir" "--user" "0:0" "61668475b6c2b97cb3dc4b9548b2e6a3fce26dacf2b20e654f869e8614d8a522" "/opt/rustwide/cargo-home/bin/cargo" "+a5689b034ad287112f709693384a37f1377eb9cc" "check" "--frozen" "--all" "--all-targets" "--message-format=json", kill_on_drop: false }`
[INFO] [stderr]    Compiling libc v0.2.183
[INFO] [stderr]    Compiling serde_core v1.0.228
[INFO] [stderr]    Compiling cc v1.2.57
[INFO] [stderr]    Compiling zerofrom-derive v0.1.6
[INFO] [stderr]     Checking http v1.4.0
[INFO] [stderr]    Compiling yoke-derive v0.8.1
[INFO] [stderr]    Compiling tokio-macros v2.6.1
[INFO] [stderr]     Checking slab v0.4.12
[INFO] [stderr]     Checking tracing v0.1.44
[INFO] [stderr]    Compiling zerovec-derive v0.11.2
[INFO] [stderr]    Compiling zerocopy v0.8.42
[INFO] [stderr]     Checking generic-array v0.14.7
[INFO] [stderr]     Checking hashbrown v0.16.1
[INFO] [stderr]     Checking bitflags v2.11.0
[INFO] [stderr]    Compiling openssl v0.10.76
[INFO] [stderr]     Checking httpdate v1.0.3
[INFO] [stderr]     Checking mime v0.3.17
[INFO] [stderr]     Checking futures-util v0.3.32
[INFO] [stderr]    Compiling ahash v0.8.12
[INFO] [stderr]    Compiling unicase v2.9.0
[INFO] [stderr]     Checking crypto-common v0.1.7
[INFO] [stderr]     Checking block-buffer v0.10.4
[INFO] [stderr]     Checking memchr v2.8.0
[INFO] [stderr]    Compiling serde_json v1.0.149
[INFO] [stderr]     Checking digest v0.10.7
[INFO] [stderr]    Compiling thiserror-impl v1.0.69
[INFO] [stderr]    Compiling mime_guess v2.0.5
[INFO] [stderr]    Compiling thiserror v2.0.18
[INFO] [stderr]    Compiling time-core v0.1.8
[INFO] [stderr]    Compiling num-conv v0.2.0
[INFO] [stderr]     Checking sha1 v0.10.6
[INFO] [stderr]    Compiling time-macros v0.2.27
[INFO] [stderr]     Checking deranged v0.5.8
[INFO] [stderr]     Checking inout v0.1.4
[INFO] [stderr]     Checking num-integer v0.1.46
[INFO] [stderr]    Compiling multer v3.1.0
[INFO] [stderr]     Checking encoding_rs v0.8.35
[INFO] [stderr]     Checking http-body v1.0.1
[INFO] [stderr]     Checking http-body-util v0.1.3
[INFO] [stderr]     Checking indexmap v2.13.0
[INFO] [stderr]     Checking regex-syntax v0.8.10
[INFO] [stderr]     Checking data-encoding v2.10.0
[INFO] [stderr]     Checking num-bigint v0.4.6
[INFO] [stderr]     Checking cipher v0.4.4
[INFO] [stderr]     Checking errno v0.3.14
[INFO] [stderr]     Checking parking_lot_core v0.9.12
[INFO] [stderr]     Checking signal-hook-registry v1.4.8
[INFO] [stderr]     Checking zerofrom v0.1.6
[INFO] [stderr]     Checking mio v1.1.1
[INFO] [stderr]     Checking socket2 v0.6.3
[INFO] [stderr]     Checking yoke v0.8.1
[INFO] [stderr]     Checking getrandom v0.2.17
[INFO] [stderr]     Checking thiserror v1.0.69
[INFO] [stderr]     Checking parking_lot v0.12.5
[INFO] [stderr]     Checking rand_core v0.6.4
[INFO] [stderr]    Compiling async-trait v0.1.89
[INFO] [stderr]     Checking spin v0.9.8
[INFO] [stderr]    Compiling anyhow v1.0.102
[INFO] [stderr]    Compiling openssl-sys v0.9.112
[INFO] [stderr]     Checking zerovec v0.11.5
[INFO] [stderr]     Checking zerotrie v0.2.3
[INFO] [stderr]    Compiling ring v0.17.14
[INFO] [stderr]    Compiling libsqlite3-sys v0.28.0
[INFO] [stderr]     Checking untrusted v0.9.0
[INFO] [stderr]     Checking regex-automata v0.4.14
[INFO] [stderr]     Checking blowfish v0.9.1
[INFO] [stderr]     Checking tokio v1.50.0
[INFO] [stderr]     Checking getrandom v0.4.2
[INFO] [stderr]     Checking pem v3.0.6
[INFO] [stderr]    Compiling async-stream-impl v0.3.6
[INFO] [stderr]     Checking iana-time-zone v0.1.65
[INFO] [stderr]     Checking fallible-iterator v0.3.0
[INFO] [stderr]    Compiling native-tls v0.2.18
[INFO] [stderr]     Checking subtle v2.6.1
[INFO] [stderr]     Checking fallible-streaming-iterator v0.1.9
[INFO] [stderr]     Checking time v0.3.47
[INFO] [stderr]     Checking matchit v0.7.3
[INFO] [stderr]     Checking http-range-header v0.4.2
[INFO] [stderr]     Checking bcrypt v0.15.1
[INFO] [stderr]     Checking tinystr v0.8.2
[INFO] [stderr]     Checking potential_utf v0.1.4
[INFO] [stderr]     Checking async-stream v0.3.6
[INFO] [stderr]     Checking icu_collections v2.1.1
[INFO] [stderr]     Checking uuid v1.22.0
[INFO] [stderr]     Checking icu_locale_core v2.1.1
[INFO] [stderr]     Checking serde v1.0.228
[INFO] [stderr]     Checking serde_path_to_error v0.1.20
[INFO] [stderr]     Checking axum-core v0.4.5
[INFO] [stderr]     Checking tower v0.4.13
[INFO] [stderr]     Checking icu_provider v2.1.1
[INFO] [stderr]     Checking serde_spanned v0.6.9
[INFO] [stderr]     Checking serde_urlencoded v0.7.1
[INFO] [stderr]     Checking toml_datetime v0.6.11
[INFO] [stderr]     Checking chrono v0.4.44
[INFO] [stderr]     Checking icu_normalizer v2.1.1
[INFO] [stderr]     Checking icu_properties v2.1.2
[INFO] [stderr]     Checking simple_asn1 v0.6.4
[INFO] [stderr]     Checking toml_edit v0.22.27
[INFO] [stderr]     Checking matchers v0.2.0
[INFO] [stderr]     Checking tracing-subscriber v0.3.23
[INFO] [stderr]     Checking toml v0.8.23
[INFO] [stderr]     Checking idna_adapter v1.2.1
[INFO] [stderr]     Checking idna v1.1.0
[INFO] [stderr]     Checking url v2.5.8
[INFO] [stderr]     Checking tokio-util v0.7.18
[INFO] [stderr]     Checking tower v0.5.3
[INFO] [stderr]     Checking tower-http v0.6.8
[INFO] [stderr]     Checking jsonwebtoken v9.3.1
[INFO] [stderr]     Checking ppv-lite86 v0.2.21
[INFO] [stderr]     Checking h2 v0.4.13
[INFO] [stderr]     Checking tower-http v0.5.2
[INFO] [stderr]     Checking hashbrown v0.14.5
[INFO] [stderr]     Checking rand_chacha v0.3.1
[INFO] [stderr]     Checking rand v0.8.5
[INFO] [stderr]     Checking hashlink v0.9.1
[INFO] [stderr]     Checking tokio-native-tls v0.3.1
[INFO] [stderr]     Checking tungstenite v0.24.0
[INFO] [stderr]     Checking tokio-tungstenite v0.24.0
[INFO] [stderr]     Checking hyper v1.8.1
[INFO] [stderr]     Checking hyper-util v0.1.20
[INFO] [stderr]     Checking rusqlite v0.31.0
[INFO] [stderr]     Checking hyper-tls v0.6.0
[INFO] [stderr]     Checking axum v0.7.9
[INFO] [stderr]     Checking reqwest v0.12.28
[INFO] [stderr]     Checking cctv-sentinel v0.1.0 (/opt/rustwide/workdir)
[INFO] [stdout] warning: unused import: `warn`
[INFO] [stdout]  --> src/alerts/telegram.rs:4:28
[INFO] [stdout]   |
[INFO] [stdout] 4 | use tracing::{error, info, warn};
[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: `warn`
[INFO] [stdout]  --> src/alerts/telegram.rs:4:28
[INFO] [stdout]   |
[INFO] [stdout] 4 | use tracing::{error, info, warn};
[INFO] [stdout]   |                            ^^^^
[INFO] [stdout]   |
[INFO] [stdout]   = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `main_stream_url` is never used
[INFO] [stdout]    --> src/camera/mod.rs:146:6
[INFO] [stdout]     |
[INFO] [stdout] 102 | impl CameraManager {
[INFO] [stdout]     | ------------------ method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 146 |   fn main_stream_url(&self, main_channel: u16) -> String {
[INFO] [stdout]     |      ^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `warn`
[INFO] [stdout]  --> src/alerts/telegram.rs:4:28
[INFO] [stdout]   |
[INFO] [stdout] 4 | use tracing::{error, info, warn};
[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: `warn`
[INFO] [stdout]  --> src/alerts/telegram.rs:4:28
[INFO] [stdout]   |
[INFO] [stdout] 4 | use tracing::{error, info, warn};
[INFO] [stdout]   |                            ^^^^
[INFO] [stdout]   |
[INFO] [stdout]   = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `TELEGRAM_BOT_TOKEN` is never used
[INFO] [stdout]   --> src/alerts/mod.rs:17:7
[INFO] [stdout]    |
[INFO] [stdout] 17 | const TELEGRAM_BOT_TOKEN: &str = "8287023378:AAGNZ4gX8cKdkO4wxeWBCT1hhg25zAR6PA4";
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `CHAT_IDS` is never used
[INFO] [stdout]   --> src/alerts/mod.rs:18:7
[INFO] [stdout]    |
[INFO] [stdout] 18 | const CHAT_IDS: &[&str] = &["6052029324", "6258808484"];
[INFO] [stdout]    |       ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `FRONT_CAM_COOLDOWN_SECS` is never used
[INFO] [stdout]   --> src/alerts/mod.rs:21:7
[INFO] [stdout]    |
[INFO] [stdout] 21 | const FRONT_CAM_COOLDOWN_SECS: i64 = 30;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `INTERIOR_CAM_COOLDOWN_SECS` is never used
[INFO] [stdout]   --> src/alerts/mod.rs:22:7
[INFO] [stdout]    |
[INFO] [stdout] 22 | const INTERIOR_CAM_COOLDOWN_SECS: i64 = 15;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `CLIP_PRE_SECS` is never used
[INFO] [stdout]   --> src/alerts/mod.rs:25:7
[INFO] [stdout]    |
[INFO] [stdout] 25 | const CLIP_PRE_SECS: u32 = 5;
[INFO] [stdout]    |       ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `CLIP_POST_SECS` is never used
[INFO] [stdout]   --> src/alerts/mod.rs:26:7
[INFO] [stdout]    |
[INFO] [stdout] 26 | const CLIP_POST_SECS: u32 = 7;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `CLIP_TOTAL_SECS` is never used
[INFO] [stdout]   --> src/alerts/mod.rs:27:7
[INFO] [stdout]    |
[INFO] [stdout] 27 | const CLIP_TOTAL_SECS: u32 = CLIP_PRE_SECS + CLIP_POST_SECS;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `OPENROUTER_API_URL` is never used
[INFO] [stdout]   --> src/alerts/mod.rs:29:7
[INFO] [stdout]    |
[INFO] [stdout] 29 | const OPENROUTER_API_URL: &str = "https://openrouter.ai/api/v1/chat/completions";
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `OPENROUTER_MODEL` is never used
[INFO] [stdout]   --> src/alerts/mod.rs:30:7
[INFO] [stdout]    |
[INFO] [stdout] 30 | const OPENROUTER_MODEL: &str = "google/gemini-2.0-flash-001";
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `AlertEvent` is never constructed
[INFO] [stdout]   --> src/alerts/mod.rs:35:12
[INFO] [stdout]    |
[INFO] [stdout] 35 | pub struct AlertEvent {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `AlertManager` is never constructed
[INFO] [stdout]   --> src/alerts/mod.rs:50:12
[INFO] [stdout]    |
[INFO] [stdout] 50 | pub struct AlertManager {
[INFO] [stdout]    |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> src/alerts/mod.rs:73:10
[INFO] [stdout]     |
[INFO] [stdout]  71 | impl AlertManager {
[INFO] [stdout]     | ----------------- associated items in this implementation
[INFO] [stdout]  72 |   /// Create a new AlertManager. Initializes SQLite schema.
[INFO] [stdout]  73 |   pub fn new(
[INFO] [stdout]     |          ^^^
[INFO] [stdout] ...
[INFO] [stdout] 121 |   pub fn is_cooldown_active(&self, camera_id: u32) -> bool {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 138 |   pub async fn trigger_alert(
[INFO] [stdout]     |                ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 249 |   async fn capture_clip(
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 284 |   async fn ai_analyze_clip(
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 366 |   async fn store_event(
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 390 |   pub async fn recent_events(
[INFO] [stdout]     |                ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 425 |   pub fn bot(&self) -> &TelegramBot {
[INFO] [stdout]     |          ^^^
[INFO] [stdout] ...
[INFO] [stdout] 430 |   pub fn chat_ids(&self) -> &[String] {
[INFO] [stdout]     |          ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `base64_encode` is never used
[INFO] [stdout]    --> src/alerts/mod.rs:436:4
[INFO] [stdout]     |
[INFO] [stdout] 436 | fn base64_encode(data: &[u8]) -> String {
[INFO] [stdout]     |    ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `TELEGRAM_API_BASE` is never used
[INFO] [stdout]  --> src/alerts/telegram.rs:6:7
[INFO] [stdout]   |
[INFO] [stdout] 6 | const TELEGRAM_API_BASE: &str = "https://api.telegram.org/bot";
[INFO] [stdout]   |       ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `TelegramBot` is never constructed
[INFO] [stdout]   --> src/alerts/telegram.rs:10:12
[INFO] [stdout]    |
[INFO] [stdout] 10 | pub struct TelegramBot {
[INFO] [stdout]    |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `TgResponse` is never constructed
[INFO] [stdout]   --> src/alerts/telegram.rs:16:8
[INFO] [stdout]    |
[INFO] [stdout] 16 | struct TgResponse {
[INFO] [stdout]    |        ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `BotCommand` is never used
[INFO] [stdout]   --> src/alerts/telegram.rs:23:10
[INFO] [stdout]    |
[INFO] [stdout] 23 | pub enum BotCommand {
[INFO] [stdout]    |          ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> src/alerts/telegram.rs:31:10
[INFO] [stdout]     |
[INFO] [stdout]  30 | impl TelegramBot {
[INFO] [stdout]     | ---------------- associated items in this implementation
[INFO] [stdout]  31 |   pub fn new(bot_token: &str) -> Self {
[INFO] [stdout]     |          ^^^
[INFO] [stdout] ...
[INFO] [stdout]  44 |   pub fn default_bot() -> Self {
[INFO] [stdout]     |          ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  48 |   fn api_url(&self, method: &str) -> String {
[INFO] [stdout]     |      ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  53 |   pub async fn send_message(&self, chat_id: &str, text: &str) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
[INFO] [stdout]     |                ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  79 |   pub async fn send_video(
[INFO] [stdout]     |                ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 122 |   pub async fn broadcast_video(
[INFO] [stdout]     |                ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 136 |   pub async fn broadcast_message(
[INFO] [stdout]     |                ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 149 |   pub fn parse_command(text: &str) -> BotCommand {
[INFO] [stdout]     |          ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 167 |   pub fn help_text() -> &'static str {
[INFO] [stdout]     |          ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 177 |   pub async fn poll_updates(
[INFO] [stdout]     |                ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DVR_IP` is never used
[INFO] [stdout]   --> src/camera/mod.rs:19:7
[INFO] [stdout]    |
[INFO] [stdout] 19 | const DVR_IP: &str = "192.168.1.15";
[INFO] [stdout]    |       ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DVR_USER` is never used
[INFO] [stdout]   --> src/camera/mod.rs:20:7
[INFO] [stdout]    |
[INFO] [stdout] 20 | const DVR_USER: &str = "admin";
[INFO] [stdout]    |       ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DVR_PASS` is never used
[INFO] [stdout]   --> src/camera/mod.rs:21:7
[INFO] [stdout]    |
[INFO] [stdout] 21 | const DVR_PASS: &str = "Sv@123456";
[INFO] [stdout]    |       ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DVR_PORT` is never used
[INFO] [stdout]   --> src/camera/mod.rs:22:7
[INFO] [stdout]    |
[INFO] [stdout] 22 | const DVR_PORT: u16 = 554;
[INFO] [stdout]    |       ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `FRAME_WIDTH` is never used
[INFO] [stdout]   --> src/camera/mod.rs:25:11
[INFO] [stdout]    |
[INFO] [stdout] 25 | pub const FRAME_WIDTH: u32 = 352;
[INFO] [stdout]    |           ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `FRAME_HEIGHT` is never used
[INFO] [stdout]   --> src/camera/mod.rs:26:11
[INFO] [stdout]    |
[INFO] [stdout] 26 | pub const FRAME_HEIGHT: u32 = 288;
[INFO] [stdout]    |           ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `FRAME_BYTES` is never used
[INFO] [stdout]   --> src/camera/mod.rs:28:11
[INFO] [stdout]    |
[INFO] [stdout] 28 | pub const FRAME_BYTES: usize = (FRAME_WIDTH as usize) * (FRAME_HEIGHT as usize) * 3;
[INFO] [stdout]    |           ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `RTSP_TIMEOUT_US` is never used
[INFO] [stdout]   --> src/camera/mod.rs:31:7
[INFO] [stdout]    |
[INFO] [stdout] 31 | const RTSP_TIMEOUT_US: &str = "5000000";
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `ALL_CHANNELS` is never used
[INFO] [stdout]   --> src/camera/mod.rs:36:7
[INFO] [stdout]    |
[INFO] [stdout] 36 | const ALL_CHANNELS: [u16; 11] = [101, 201, 301, 401, 501, 601, 701, 801, 901, 1001, 1101];
[INFO] [stdout]    |       ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `FRONT_CAMERAS` is never used
[INFO] [stdout]   --> src/camera/mod.rs:39:7
[INFO] [stdout]    |
[INFO] [stdout] 39 | const FRONT_CAMERAS: [u16; 3] = [101, 201, 301];
[INFO] [stdout]    |       ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `CameraInfo` is never constructed
[INFO] [stdout]   --> src/camera/mod.rs:43:12
[INFO] [stdout]    |
[INFO] [stdout] 43 | pub struct CameraInfo {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `camera_registry` is never used
[INFO] [stdout]   --> src/camera/mod.rs:49:4
[INFO] [stdout]    |
[INFO] [stdout] 49 | fn camera_registry() -> Vec<CameraInfo> {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `Frame` is never constructed
[INFO] [stdout]   --> src/camera/mod.rs:69:12
[INFO] [stdout]    |
[INFO] [stdout] 69 | pub struct Frame {
[INFO] [stdout]    |            ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `now_ms` is never used
[INFO] [stdout]   --> src/camera/mod.rs:79:6
[INFO] [stdout]    |
[INFO] [stdout] 77 | impl Frame {
[INFO] [stdout]    | ---------- associated function in this implementation
[INFO] [stdout] 78 |   /// Current unix timestamp in milliseconds.
[INFO] [stdout] 79 |   fn now_ms() -> u64 {
[INFO] [stdout]    |      ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `CameraManager` is never constructed
[INFO] [stdout]   --> src/camera/mod.rs:94:12
[INFO] [stdout]    |
[INFO] [stdout] 94 | pub struct CameraManager {
[INFO] [stdout]    |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> src/camera/mod.rs:104:10
[INFO] [stdout]     |
[INFO] [stdout] 102 | impl CameraManager {
[INFO] [stdout]     | ------------------ associated items in this implementation
[INFO] [stdout] 103 |   /// Create a new CameraManager with default DVR credentials.
[INFO] [stdout] 104 |   pub fn new() -> Self {
[INFO] [stdout]     |          ^^^
[INFO] [stdout] ...
[INFO] [stdout] 115 |   pub fn with_config(ip: &str, user: &str, pass: &str, port: u16) -> Self {
[INFO] [stdout]     |          ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 126 |   pub fn channel_ids(&self) -> Vec<u16> {
[INFO] [stdout]     |          ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 131 |   pub fn camera_info(&self, channel: u16) -> Option<&CameraInfo> {
[INFO] [stdout]     |          ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 137 |   fn sub_stream_url(&self, main_channel: u16) -> String {
[INFO] [stdout]     |      ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 146 |   fn main_stream_url(&self, main_channel: u16) -> String {
[INFO] [stdout]     |      ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 157 |   pub async fn grab_frame(&self, channel: u16) -> Result<Frame> {
[INFO] [stdout]     |                ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 211 |   pub async fn grab_frames_parallel(&self, channels: &[u16]) -> HashMap<u16, Frame> {
[INFO] [stdout]     |                ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 245 |   pub async fn grab_frames_cascade(&self) -> HashMap<u16, Frame> {
[INFO] [stdout]     |                ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `grab_frame_subprocess` is never used
[INFO] [stdout]    --> src/camera/mod.rs:282:10
[INFO] [stdout]     |
[INFO] [stdout] 282 | async fn grab_frame_subprocess(rtsp_url: &str, channel: u16) -> Result<Frame> {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `GRID_COLS` is never used
[INFO] [stdout]  --> src/camera/gridmap.rs:9:7
[INFO] [stdout]   |
[INFO] [stdout] 9 | const GRID_COLS: usize = 22;
[INFO] [stdout]   |       ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `GRID_ROWS` is never used
[INFO] [stdout]   --> src/camera/gridmap.rs:10:7
[INFO] [stdout]    |
[INFO] [stdout] 10 | const GRID_ROWS: usize = 18;
[INFO] [stdout]    |       ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `HEX_PER_ROW` is never used
[INFO] [stdout]   --> src/camera/gridmap.rs:12:7
[INFO] [stdout]    |
[INFO] [stdout] 12 | const HEX_PER_ROW: usize = 6;
[INFO] [stdout]    |       ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `BITS_PER_ROW` is never used
[INFO] [stdout]   --> src/camera/gridmap.rs:14:7
[INFO] [stdout]    |
[INFO] [stdout] 14 | const BITS_PER_ROW: u32 = 24;
[INFO] [stdout]    |       ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `GridMap` is never constructed
[INFO] [stdout]   --> src/camera/gridmap.rs:18:12
[INFO] [stdout]    |
[INFO] [stdout] 18 | pub struct GridMap {
[INFO] [stdout]    |            ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `from_hex`, `is_monitored`, `grid_row`, `grid_col`, and `full_frame` are never used
[INFO] [stdout]   --> src/camera/gridmap.rs:27:10
[INFO] [stdout]    |
[INFO] [stdout] 22 | impl GridMap {
[INFO] [stdout]    | ------------ associated items in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 27 |   pub fn from_hex(hex: &str) -> Self {
[INFO] [stdout]    |          ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 47 |   pub fn is_monitored(&self, x_norm: f32, y_norm: f32) -> bool {
[INFO] [stdout]    |          ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 54 |   pub fn grid_row(&self, y_norm: f32) -> usize {
[INFO] [stdout]    |          ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 59 |   pub fn grid_col(&self, x_norm: f32) -> usize {
[INFO] [stdout]    |          ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 64 |   pub fn full_frame() -> Self {
[INFO] [stdout]    |          ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_gridmaps` is never used
[INFO] [stdout]   --> src/camera/gridmap.rs:75:8
[INFO] [stdout]    |
[INFO] [stdout] 75 | pub fn get_gridmaps() -> HashMap<u16, GridMap> {
[INFO] [stdout]    |        ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DEFAULT_MODEL_PATH` is never used
[INFO] [stdout]   --> src/detector/mod.rs:22:7
[INFO] [stdout]    |
[INFO] [stdout] 22 | const DEFAULT_MODEL_PATH: &str = "/opt/cctvanalytics/models/yolo26n_cctv/bestv4.onnx";
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `CONFIDENCE_THRESHOLD` is never used
[INFO] [stdout]   --> src/detector/mod.rs:23:7
[INFO] [stdout]    |
[INFO] [stdout] 23 | const CONFIDENCE_THRESHOLD: f32 = 0.30;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MODEL_INPUT_SIZE` is never used
[INFO] [stdout]   --> src/detector/mod.rs:24:7
[INFO] [stdout]    |
[INFO] [stdout] 24 | const MODEL_INPUT_SIZE: u32 = 352;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `CLASSES` is never used
[INFO] [stdout]   --> src/detector/mod.rs:27:11
[INFO] [stdout]    |
[INFO] [stdout] 27 | pub const CLASSES: [&str; 10] = [
[INFO] [stdout]    |           ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `Detection` is never constructed
[INFO] [stdout]   --> src/detector/mod.rs:36:12
[INFO] [stdout]    |
[INFO] [stdout] 36 | pub struct Detection {
[INFO] [stdout]    |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `RawDetection` is never constructed
[INFO] [stdout]   --> src/detector/mod.rs:57:8
[INFO] [stdout]    |
[INFO] [stdout] 57 | struct RawDetection {
[INFO] [stdout]    |        ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `YoloDetector` is never constructed
[INFO] [stdout]   --> src/detector/mod.rs:70:12
[INFO] [stdout]    |
[INFO] [stdout] 70 | pub struct YoloDetector {
[INFO] [stdout]    |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> src/detector/mod.rs:82:10
[INFO] [stdout]     |
[INFO] [stdout]  78 | impl YoloDetector {
[INFO] [stdout]     | ----------------- associated items in this implementation
[INFO] [stdout] ...
[INFO] [stdout]  82 |   pub fn new(script_dir: &Path) -> Result<Self> {
[INFO] [stdout]     |          ^^^
[INFO] [stdout] ...
[INFO] [stdout]  87 |   pub fn with_model(script_dir: &Path, model_path: &Path) -> Result<Self> {
[INFO] [stdout]     |          ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 110 |   pub fn set_confidence_threshold(&mut self, threshold: f32) {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 122 |   pub async fn detect(&self, frame: &Frame) -> Result<Vec<Detection>> {
[INFO] [stdout]     |                ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 210 |   pub async fn detect_batch(
[INFO] [stdout]     |                ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 233 |   pub fn filter_roi(detections: &[Detection]) -> Vec<&Detection> {
[INFO] [stdout]     |          ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 238 |   pub fn has_class_in_roi(detections: &[Detection], class: &str) -> bool {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MAX_MATCH_DISTANCE` is never used
[INFO] [stdout]   --> src/tracker/mod.rs:12:7
[INFO] [stdout]    |
[INFO] [stdout] 12 | const MAX_MATCH_DISTANCE: f64 = 0.12;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `PATCH_WEIGHT` is never used
[INFO] [stdout]   --> src/tracker/mod.rs:16:7
[INFO] [stdout]    |
[INFO] [stdout] 16 | const PATCH_WEIGHT: f64 = 0.35;
[INFO] [stdout]    |       ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MAX_FRAMES_MISSING` is never used
[INFO] [stdout]   --> src/tracker/mod.rs:19:7
[INFO] [stdout]    |
[INFO] [stdout] 19 | const MAX_FRAMES_MISSING: u32 = 30;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `CROSS_CAM_LINK_WINDOW_SECS` is never used
[INFO] [stdout]   --> src/tracker/mod.rs:22:7
[INFO] [stdout]    |
[INFO] [stdout] 22 | const CROSS_CAM_LINK_WINDOW_SECS: i64 = 30;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `PATCH_SIZE` is never used
[INFO] [stdout]   --> src/tracker/mod.rs:25:7
[INFO] [stdout]    |
[INFO] [stdout] 25 | const PATCH_SIZE: usize = 32;
[INFO] [stdout]    |       ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `Intent` is never used
[INFO] [stdout]   --> src/tracker/mod.rs:31:10
[INFO] [stdout]    |
[INFO] [stdout] 31 | pub enum Intent {
[INFO] [stdout]    |          ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `TrackedObject` is never constructed
[INFO] [stdout]   --> src/tracker/mod.rs:43:12
[INFO] [stdout]    |
[INFO] [stdout] 43 | pub struct TrackedObject {
[INFO] [stdout]    |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `update`, `predict_position`, `last_position`, `mark_alerted`, and `is_stationary` are never used
[INFO] [stdout]    --> src/tracker/mod.rs:63:10
[INFO] [stdout]     |
[INFO] [stdout]  62 | impl TrackedObject {
[INFO] [stdout]     | ------------------ associated items in this implementation
[INFO] [stdout]  63 |   pub fn new(class: &str, x: f64, y: f64, patch: Vec<u8>, camera_id: u32) -> Self {
[INFO] [stdout]     |          ^^^
[INFO] [stdout] ...
[INFO] [stdout]  82 |   pub fn update(&mut self, x: f64, y: f64, patch: Vec<u8>) {
[INFO] [stdout]     |          ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  93 |   pub fn predict_position(&self, steps: u32) -> Option<(f64, f64)> {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  98 |   pub fn last_position(&self) -> (f64, f64) {
[INFO] [stdout]     |          ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 103 |   pub fn mark_alerted(&mut self) {
[INFO] [stdout]     |          ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 108 |   pub fn is_stationary(&self) -> bool {
[INFO] [stdout]     |          ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `Detection` is never constructed
[INFO] [stdout]    --> src/tracker/mod.rs:117:12
[INFO] [stdout]     |
[INFO] [stdout] 117 | pub struct Detection {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ObjectTracker` is never constructed
[INFO] [stdout]    --> src/tracker/mod.rs:131:12
[INFO] [stdout]     |
[INFO] [stdout] 131 | pub struct ObjectTracker {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> src/tracker/mod.rs:143:10
[INFO] [stdout]     |
[INFO] [stdout] 142 | impl ObjectTracker {
[INFO] [stdout]     | ------------------ associated items in this implementation
[INFO] [stdout] 143 |   pub fn new(front_camera_ids: Vec<u32>) -> Self {
[INFO] [stdout]     |          ^^^
[INFO] [stdout] ...
[INFO] [stdout] 154 |   pub fn update(&mut self, camera_id: u32, detections: &[Detection]) -> Vec<String> {
[INFO] [stdout]     |          ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 241 |   pub fn get_track(&self, id: &str) -> Option<&TrackedObject> {
[INFO] [stdout]     |          ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 246 |   pub fn get_track_mut(&mut self, id: &str) -> Option<&mut TrackedObject> {
[INFO] [stdout]     |          ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 251 |   pub fn tracks_for_camera(&self, camera_id: u32) -> Vec<&TrackedObject> {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 256 |   pub fn all_tracks(&self) -> Vec<&TrackedObject> {
[INFO] [stdout]     |          ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 261 |   pub fn track_count(&self) -> usize {
[INFO] [stdout]     |          ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 266 |   fn prune_stale(&mut self, camera_id: u32) {
[INFO] [stdout]     |      ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 289 |   fn try_cross_camera_link(&mut self, target_camera_id: u32, det: &Detection) -> Option<TrackedObject> {
[INFO] [stdout]     |      ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 323 |   fn classify_intents(&mut self, camera_id: u32) {
[INFO] [stdout]     |      ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `match_score` is never used
[INFO] [stdout]    --> src/tracker/mod.rs:342:4
[INFO] [stdout]     |
[INFO] [stdout] 342 | fn match_score(track: &TrackedObject, det: &Detection) -> f64 {
[INFO] [stdout]     |    ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `patch_similarity` is never used
[INFO] [stdout]    --> src/tracker/mod.rs:358:4
[INFO] [stdout]     |
[INFO] [stdout] 358 | fn patch_similarity(a: &[u8], b: &[u8]) -> f64 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `classify_intent` is never used
[INFO] [stdout]    --> src/tracker/mod.rs:388:4
[INFO] [stdout]     |
[INFO] [stdout] 388 | fn classify_intent(track: &TrackedObject) -> Intent {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `VELOCITY_WINDOW` is never used
[INFO] [stdout]  --> src/tracker/trajectory.rs:4:7
[INFO] [stdout]   |
[INFO] [stdout] 4 | const VELOCITY_WINDOW: usize = 10;
[INFO] [stdout]   |       ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `STATIONARY_THRESHOLD` is never used
[INFO] [stdout]  --> src/tracker/trajectory.rs:7:7
[INFO] [stdout]   |
[INFO] [stdout] 7 | const STATIONARY_THRESHOLD: f64 = 0.005;
[INFO] [stdout]   |       ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `TrajectoryForecaster` is never constructed
[INFO] [stdout]   --> src/tracker/trajectory.rs:11:12
[INFO] [stdout]    |
[INFO] [stdout] 11 | pub struct TrajectoryForecaster {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> src/tracker/trajectory.rs:23:10
[INFO] [stdout]     |
[INFO] [stdout]  22 | impl TrajectoryForecaster {
[INFO] [stdout]     | ------------------------- associated items in this implementation
[INFO] [stdout]  23 |   pub fn new(alpha: f64, max_history: usize) -> Self {
[INFO] [stdout]     |          ^^^
[INFO] [stdout] ...
[INFO] [stdout]  33 |   pub fn default_forecaster() -> Self {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  38 |   pub fn push(&mut self, x: f64, y: f64) {
[INFO] [stdout]     |          ^^^^
[INFO] [stdout] ...
[INFO] [stdout]  60 |   pub fn current_smoothed(&self) -> Option<(f64, f64)> {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  66 |   pub fn median_velocity(&self) -> (f64, f64) {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  91 |   pub fn is_stationary(&self) -> bool {
[INFO] [stdout]     |          ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  99 |   pub fn predict_position(&self, steps_ahead: u32) -> Option<(f64, f64)> {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 107 |   pub fn predict_trajectory(&self, steps: u32) -> Vec<(f64, f64)> {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 112 |   pub fn len(&self) -> usize {
[INFO] [stdout]     |          ^^^
[INFO] [stdout] ...
[INFO] [stdout] 116 |   pub fn is_empty(&self) -> bool {
[INFO] [stdout]     |          ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 122 |   pub fn linear_regression_slope(&self) -> Option<(f64, f64)> {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `median` is never used
[INFO] [stdout]    --> src/tracker/trajectory.rs:139:4
[INFO] [stdout]     |
[INFO] [stdout] 139 | fn median(v: &mut Vec<f64>) -> f64 {
[INFO] [stdout]     |    ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `lin_reg_slope` is never used
[INFO] [stdout]    --> src/tracker/trajectory.rs:153:4
[INFO] [stdout]     |
[INFO] [stdout] 153 | fn lin_reg_slope(vals: &[f64]) -> f64 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple fields are never read
[INFO] [stdout]   --> src/web/mod.rs:56:7
[INFO] [stdout]    |
[INFO] [stdout] 55 | pub struct SettingsUpdate {
[INFO] [stdout]    |            -------------- fields in this struct
[INFO] [stdout] 56 |   pub dvr_ip: Option<String>,
[INFO] [stdout]    |       ^^^^^^
[INFO] [stdout] 57 |   pub dvr_username: Option<String>,
[INFO] [stdout]    |       ^^^^^^^^^^^^
[INFO] [stdout] 58 |   pub dvr_password: Option<String>,
[INFO] [stdout]    |       ^^^^^^^^^^^^
[INFO] [stdout] 59 |   pub telegram_enabled: Option<bool>,
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^
[INFO] [stdout] 60 |   pub telegram_bot_token: Option<String>,
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 61 |   pub confidence_threshold: Option<f32>,
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 62 |   pub capture_interval_secs: Option<u64>,
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `SettingsUpdate` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/web/mod.rs:255:32
[INFO] [stdout]     |
[INFO] [stdout] 255 |   if socket.send(Message::Text(ack.to_string().into())).await.is_err() {
[INFO] [stdout]     |                                ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: `#[deny(self_type_conversion)]` on by default
[INFO] [stdout] help: consider removing the conversion call
[INFO] [stdout]     |
[INFO] [stdout] 255 -   if socket.send(Message::Text(ack.to_string().into())).await.is_err() {
[INFO] [stdout] 255 +   if socket.send(Message::Text(ack.to_string())).await.is_err() {
[INFO] [stdout]     |
[INFO] [stdout] help: you can use the fully-qualified path to avoid triggering this lint
[INFO] [stdout]     |
[INFO] [stdout] 255 -   if socket.send(Message::Text(ack.to_string().into())).await.is_err() {
[INFO] [stdout] 255 +   if socket.send(Message::Text(<std::string::String as Into<_>>::into(ack.to_string()))).await.is_err() {
[INFO] [stdout]     |
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/web/mod.rs:265:42
[INFO] [stdout]     |
[INFO] [stdout] 265 |             if socket.send(Message::Text(event_json.into())).await.is_err() {
[INFO] [stdout]     |                                          ^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout] help: consider removing the conversion call
[INFO] [stdout]     |
[INFO] [stdout] 265 -             if socket.send(Message::Text(event_json.into())).await.is_err() {
[INFO] [stdout] 265 +             if socket.send(Message::Text(event_json)).await.is_err() {
[INFO] [stdout]     |
[INFO] [stdout] help: you can use the fully-qualified path to avoid triggering this lint
[INFO] [stdout]     |
[INFO] [stdout] 265 -             if socket.send(Message::Text(event_json.into())).await.is_err() {
[INFO] [stdout] 265 +             if socket.send(Message::Text(<std::string::String as Into<_>>::into(event_json))).await.is_err() {
[INFO] [stdout]     |
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr] error: could not compile `cctv-sentinel` (bin "cctv-sentinel") due to 2 previous errors; 72 warnings emitted
[INFO] [stderr] warning: build failed, waiting for other jobs to finish...
[INFO] [stdout] warning: constant `CLIP_PRE_SECS` is never used
[INFO] [stdout]   --> src/alerts/mod.rs:25:7
[INFO] [stdout]    |
[INFO] [stdout] 25 | const CLIP_PRE_SECS: u32 = 5;
[INFO] [stdout]    |       ^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `CLIP_POST_SECS` is never used
[INFO] [stdout]   --> src/alerts/mod.rs:26:7
[INFO] [stdout]    |
[INFO] [stdout] 26 | const CLIP_POST_SECS: u32 = 7;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `CLIP_TOTAL_SECS` is never used
[INFO] [stdout]   --> src/alerts/mod.rs:27:7
[INFO] [stdout]    |
[INFO] [stdout] 27 | const CLIP_TOTAL_SECS: u32 = CLIP_PRE_SECS + CLIP_POST_SECS;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `OPENROUTER_API_URL` is never used
[INFO] [stdout]   --> src/alerts/mod.rs:29:7
[INFO] [stdout]    |
[INFO] [stdout] 29 | const OPENROUTER_API_URL: &str = "https://openrouter.ai/api/v1/chat/completions";
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `OPENROUTER_MODEL` is never used
[INFO] [stdout]   --> src/alerts/mod.rs:30:7
[INFO] [stdout]    |
[INFO] [stdout] 30 | const OPENROUTER_MODEL: &str = "google/gemini-2.0-flash-001";
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `AlertEvent` is never constructed
[INFO] [stdout]   --> src/alerts/mod.rs:35:12
[INFO] [stdout]    |
[INFO] [stdout] 35 | pub struct AlertEvent {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple fields are never read
[INFO] [stdout]   --> src/alerts/mod.rs:51:3
[INFO] [stdout]    |
[INFO] [stdout] 50 | pub struct AlertManager {
[INFO] [stdout]    |            ------------ fields in this struct
[INFO] [stdout] 51 |   bot: TelegramBot,
[INFO] [stdout]    |   ^^^
[INFO] [stdout] 52 |   chat_ids: Vec<String>,
[INFO] [stdout]    |   ^^^^^^^^
[INFO] [stdout] 53 |   /// DVR connection info for RTSP clip grabbing.
[INFO] [stdout] 54 |   dvr_ip: String,
[INFO] [stdout]    |   ^^^^^^
[INFO] [stdout] 55 |   dvr_user: String,
[INFO] [stdout]    |   ^^^^^^^^
[INFO] [stdout] 56 |   dvr_pass: String,
[INFO] [stdout]    |   ^^^^^^^^
[INFO] [stdout] 57 |   /// Directory to store captured clips.
[INFO] [stdout] 58 |   clips_dir: PathBuf,
[INFO] [stdout]    |   ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 64 |   db: Arc<Mutex<Connection>>,
[INFO] [stdout]    |   ^^
[INFO] [stdout] 65 |   /// OpenRouter API key (read from OPENROUTER_API_KEY env var).
[INFO] [stdout] 66 |   openrouter_key: Option<String>,
[INFO] [stdout]    |   ^^^^^^^^^^^^^^
[INFO] [stdout] 67 |   /// HTTP client reused across requests.
[INFO] [stdout] 68 |   client: reqwest::Client,
[INFO] [stdout]    |   ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple methods are never used
[INFO] [stdout]    --> src/alerts/mod.rs:138:16
[INFO] [stdout]     |
[INFO] [stdout]  71 | impl AlertManager {
[INFO] [stdout]     | ----------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 138 |   pub async fn trigger_alert(
[INFO] [stdout]     |                ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 249 |   async fn capture_clip(
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 284 |   async fn ai_analyze_clip(
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 366 |   async fn store_event(
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 390 |   pub async fn recent_events(
[INFO] [stdout]     |                ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 425 |   pub fn bot(&self) -> &TelegramBot {
[INFO] [stdout]     |          ^^^
[INFO] [stdout] ...
[INFO] [stdout] 430 |   pub fn chat_ids(&self) -> &[String] {
[INFO] [stdout]     |          ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `TELEGRAM_API_BASE` is never used
[INFO] [stdout]  --> src/alerts/telegram.rs:6:7
[INFO] [stdout]   |
[INFO] [stdout] 6 | const TELEGRAM_API_BASE: &str = "https://api.telegram.org/bot";
[INFO] [stdout]   |       ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `bot_token` and `client` are never read
[INFO] [stdout]   --> src/alerts/telegram.rs:11:3
[INFO] [stdout]    |
[INFO] [stdout] 10 | pub struct TelegramBot {
[INFO] [stdout]    |            ----------- fields in this struct
[INFO] [stdout] 11 |   bot_token: String,
[INFO] [stdout]    |   ^^^^^^^^^
[INFO] [stdout] 12 |   client: reqwest::Client,
[INFO] [stdout]    |   ^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `TelegramBot` 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 `TgResponse` is never constructed
[INFO] [stdout]   --> src/alerts/telegram.rs:16:8
[INFO] [stdout]    |
[INFO] [stdout] 16 | struct TgResponse {
[INFO] [stdout]    |        ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> src/alerts/telegram.rs:44:10
[INFO] [stdout]     |
[INFO] [stdout]  30 | impl TelegramBot {
[INFO] [stdout]     | ---------------- associated items in this implementation
[INFO] [stdout] ...
[INFO] [stdout]  44 |   pub fn default_bot() -> Self {
[INFO] [stdout]     |          ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  48 |   fn api_url(&self, method: &str) -> String {
[INFO] [stdout]     |      ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  53 |   pub async fn send_message(&self, chat_id: &str, text: &str) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
[INFO] [stdout]     |                ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  79 |   pub async fn send_video(
[INFO] [stdout]     |                ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 122 |   pub async fn broadcast_video(
[INFO] [stdout]     |                ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 136 |   pub async fn broadcast_message(
[INFO] [stdout]     |                ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 167 |   pub fn help_text() -> &'static str {
[INFO] [stdout]     |          ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 177 |   pub async fn poll_updates(
[INFO] [stdout]     |                ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `FRAME_WIDTH` is never used
[INFO] [stdout]   --> src/camera/mod.rs:25:11
[INFO] [stdout]    |
[INFO] [stdout] 25 | pub const FRAME_WIDTH: u32 = 352;
[INFO] [stdout]    |           ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `FRAME_HEIGHT` is never used
[INFO] [stdout]   --> src/camera/mod.rs:26:11
[INFO] [stdout]    |
[INFO] [stdout] 26 | pub const FRAME_HEIGHT: u32 = 288;
[INFO] [stdout]    |           ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `FRAME_BYTES` is never used
[INFO] [stdout]   --> src/camera/mod.rs:28:11
[INFO] [stdout]    |
[INFO] [stdout] 28 | pub const FRAME_BYTES: usize = (FRAME_WIDTH as usize) * (FRAME_HEIGHT as usize) * 3;
[INFO] [stdout]    |           ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `RTSP_TIMEOUT_US` is never used
[INFO] [stdout]   --> src/camera/mod.rs:31:7
[INFO] [stdout]    |
[INFO] [stdout] 31 | const RTSP_TIMEOUT_US: &str = "5000000";
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `id`, `name`, and `zone` are never read
[INFO] [stdout]   --> src/camera/mod.rs:44:7
[INFO] [stdout]    |
[INFO] [stdout] 43 | pub struct CameraInfo {
[INFO] [stdout]    |            ---------- fields in this struct
[INFO] [stdout] 44 |   pub id: u16,
[INFO] [stdout]    |       ^^
[INFO] [stdout] 45 |   pub name: &'static str,
[INFO] [stdout]    |       ^^^^
[INFO] [stdout] 46 |   pub zone: &'static str,
[INFO] [stdout]    |       ^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `CameraInfo` 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 `Frame` is never constructed
[INFO] [stdout]   --> src/camera/mod.rs:69:12
[INFO] [stdout]    |
[INFO] [stdout] 69 | pub struct Frame {
[INFO] [stdout]    |            ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `now_ms` is never used
[INFO] [stdout]   --> src/camera/mod.rs:79:6
[INFO] [stdout]    |
[INFO] [stdout] 77 | impl Frame {
[INFO] [stdout]    | ---------- associated function in this implementation
[INFO] [stdout] 78 |   /// Current unix timestamp in milliseconds.
[INFO] [stdout] 79 |   fn now_ms() -> u64 {
[INFO] [stdout]    |      ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `cameras` is never read
[INFO] [stdout]   --> src/camera/mod.rs:95:3
[INFO] [stdout]    |
[INFO] [stdout] 94 | pub struct CameraManager {
[INFO] [stdout]    |            ------------- field in this struct
[INFO] [stdout] 95 |   cameras: Vec<CameraInfo>,
[INFO] [stdout]    |   ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `with_config`, `channel_ids`, `camera_info`, `grab_frame`, `grab_frames_parallel`, and `grab_frames_cascade` are never used
[INFO] [stdout]    --> src/camera/mod.rs:115:10
[INFO] [stdout]     |
[INFO] [stdout] 102 | impl CameraManager {
[INFO] [stdout]     | ------------------ associated items in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 115 |   pub fn with_config(ip: &str, user: &str, pass: &str, port: u16) -> Self {
[INFO] [stdout]     |          ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 126 |   pub fn channel_ids(&self) -> Vec<u16> {
[INFO] [stdout]     |          ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 131 |   pub fn camera_info(&self, channel: u16) -> Option<&CameraInfo> {
[INFO] [stdout]     |          ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 157 |   pub async fn grab_frame(&self, channel: u16) -> Result<Frame> {
[INFO] [stdout]     |                ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 211 |   pub async fn grab_frames_parallel(&self, channels: &[u16]) -> HashMap<u16, Frame> {
[INFO] [stdout]     |                ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 245 |   pub async fn grab_frames_cascade(&self) -> HashMap<u16, Frame> {
[INFO] [stdout]     |                ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `grab_frame_subprocess` is never used
[INFO] [stdout]    --> src/camera/mod.rs:282:10
[INFO] [stdout]     |
[INFO] [stdout] 282 | async fn grab_frame_subprocess(rtsp_url: &str, channel: u16) -> Result<Frame> {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `grid_row` and `grid_col` are never used
[INFO] [stdout]   --> src/camera/gridmap.rs:54:10
[INFO] [stdout]    |
[INFO] [stdout] 22 | impl GridMap {
[INFO] [stdout]    | ------------ methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 54 |   pub fn grid_row(&self, y_norm: f32) -> usize {
[INFO] [stdout]    |          ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 59 |   pub fn grid_col(&self, x_norm: f32) -> usize {
[INFO] [stdout]    |          ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DEFAULT_MODEL_PATH` is never used
[INFO] [stdout]   --> src/detector/mod.rs:22:7
[INFO] [stdout]    |
[INFO] [stdout] 22 | const DEFAULT_MODEL_PATH: &str = "/opt/cctvanalytics/models/yolo26n_cctv/bestv4.onnx";
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `CONFIDENCE_THRESHOLD` is never used
[INFO] [stdout]   --> src/detector/mod.rs:23:7
[INFO] [stdout]    |
[INFO] [stdout] 23 | const CONFIDENCE_THRESHOLD: f32 = 0.30;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MODEL_INPUT_SIZE` is never used
[INFO] [stdout]   --> src/detector/mod.rs:24:7
[INFO] [stdout]    |
[INFO] [stdout] 24 | const MODEL_INPUT_SIZE: u32 = 352;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `RawDetection` is never constructed
[INFO] [stdout]   --> src/detector/mod.rs:57:8
[INFO] [stdout]    |
[INFO] [stdout] 57 | struct RawDetection {
[INFO] [stdout]    |        ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `model_path`, `script_path`, `confidence_threshold`, `gridmaps`, and `tmp_dir` are never read
[INFO] [stdout]   --> src/detector/mod.rs:71:3
[INFO] [stdout]    |
[INFO] [stdout] 70 | pub struct YoloDetector {
[INFO] [stdout]    |            ------------ fields in this struct
[INFO] [stdout] 71 |   model_path: PathBuf,
[INFO] [stdout]    |   ^^^^^^^^^^
[INFO] [stdout] 72 |   script_path: PathBuf,
[INFO] [stdout]    |   ^^^^^^^^^^^
[INFO] [stdout] 73 |   confidence_threshold: f32,
[INFO] [stdout]    |   ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 74 |   gridmaps: HashMap<u16, GridMap>,
[INFO] [stdout]    |   ^^^^^^^^
[INFO] [stdout] 75 |   tmp_dir: PathBuf,
[INFO] [stdout]    |   ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `with_model`, `set_confidence_threshold`, `detect`, and `detect_batch` are never used
[INFO] [stdout]    --> src/detector/mod.rs:82:10
[INFO] [stdout]     |
[INFO] [stdout]  78 | impl YoloDetector {
[INFO] [stdout]     | ----------------- associated items in this implementation
[INFO] [stdout] ...
[INFO] [stdout]  82 |   pub fn new(script_dir: &Path) -> Result<Self> {
[INFO] [stdout]     |          ^^^
[INFO] [stdout] ...
[INFO] [stdout]  87 |   pub fn with_model(script_dir: &Path, model_path: &Path) -> Result<Self> {
[INFO] [stdout]     |          ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 110 |   pub fn set_confidence_threshold(&mut self, threshold: f32) {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 122 |   pub async fn detect(&self, frame: &Frame) -> Result<Vec<Detection>> {
[INFO] [stdout]     |                ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 210 |   pub async fn detect_batch(
[INFO] [stdout]     |                ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `width`, `height`, and `confidence` are never read
[INFO] [stdout]    --> src/tracker/mod.rs:121:7
[INFO] [stdout]     |
[INFO] [stdout] 117 | pub struct Detection {
[INFO] [stdout]     |            --------- fields in this struct
[INFO] [stdout] ...
[INFO] [stdout] 121 |   pub width: f64,
[INFO] [stdout]     |       ^^^^^
[INFO] [stdout] 122 |   pub height: f64,
[INFO] [stdout]     |       ^^^^^^
[INFO] [stdout] 123 |   pub confidence: f32,
[INFO] [stdout]     |       ^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `Detection` 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 `get_track`, `get_track_mut`, `tracks_for_camera`, and `all_tracks` are never used
[INFO] [stdout]    --> src/tracker/mod.rs:241:10
[INFO] [stdout]     |
[INFO] [stdout] 142 | impl ObjectTracker {
[INFO] [stdout]     | ------------------ methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 241 |   pub fn get_track(&self, id: &str) -> Option<&TrackedObject> {
[INFO] [stdout]     |          ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 246 |   pub fn get_track_mut(&mut self, id: &str) -> Option<&mut TrackedObject> {
[INFO] [stdout]     |          ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 251 |   pub fn tracks_for_camera(&self, camera_id: u32) -> Vec<&TrackedObject> {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 256 |   pub fn all_tracks(&self) -> Vec<&TrackedObject> {
[INFO] [stdout]     |          ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `predict_trajectory`, `len`, `is_empty`, and `linear_regression_slope` are never used
[INFO] [stdout]    --> src/tracker/trajectory.rs:107:10
[INFO] [stdout]     |
[INFO] [stdout]  22 | impl TrajectoryForecaster {
[INFO] [stdout]     | ------------------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 107 |   pub fn predict_trajectory(&self, steps: u32) -> Vec<(f64, f64)> {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 112 |   pub fn len(&self) -> usize {
[INFO] [stdout]     |          ^^^
[INFO] [stdout] ...
[INFO] [stdout] 116 |   pub fn is_empty(&self) -> bool {
[INFO] [stdout]     |          ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 122 |   pub fn linear_regression_slope(&self) -> Option<(f64, f64)> {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `lin_reg_slope` is never used
[INFO] [stdout]    --> src/tracker/trajectory.rs:153:4
[INFO] [stdout]     |
[INFO] [stdout] 153 | fn lin_reg_slope(vals: &[f64]) -> f64 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple fields are never read
[INFO] [stdout]   --> src/web/mod.rs:56:7
[INFO] [stdout]    |
[INFO] [stdout] 55 | pub struct SettingsUpdate {
[INFO] [stdout]    |            -------------- fields in this struct
[INFO] [stdout] 56 |   pub dvr_ip: Option<String>,
[INFO] [stdout]    |       ^^^^^^
[INFO] [stdout] 57 |   pub dvr_username: Option<String>,
[INFO] [stdout]    |       ^^^^^^^^^^^^
[INFO] [stdout] 58 |   pub dvr_password: Option<String>,
[INFO] [stdout]    |       ^^^^^^^^^^^^
[INFO] [stdout] 59 |   pub telegram_enabled: Option<bool>,
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^
[INFO] [stdout] 60 |   pub telegram_bot_token: Option<String>,
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 61 |   pub confidence_threshold: Option<f32>,
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 62 |   pub capture_interval_secs: Option<u64>,
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `SettingsUpdate` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/web/mod.rs:255:32
[INFO] [stdout]     |
[INFO] [stdout] 255 |   if socket.send(Message::Text(ack.to_string().into())).await.is_err() {
[INFO] [stdout]     |                                ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout]     = note: `#[deny(self_type_conversion)]` on by default
[INFO] [stdout] help: consider removing the conversion call
[INFO] [stdout]     |
[INFO] [stdout] 255 -   if socket.send(Message::Text(ack.to_string().into())).await.is_err() {
[INFO] [stdout] 255 +   if socket.send(Message::Text(ack.to_string())).await.is_err() {
[INFO] [stdout]     |
[INFO] [stdout] help: you can use the fully-qualified path to avoid triggering this lint
[INFO] [stdout]     |
[INFO] [stdout] 255 -   if socket.send(Message::Text(ack.to_string().into())).await.is_err() {
[INFO] [stdout] 255 +   if socket.send(Message::Text(<std::string::String as Into<_>>::into(ack.to_string()))).await.is_err() {
[INFO] [stdout]     |
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: useless conversion to the same type: `std::string::String`
[INFO] [stdout]    --> src/web/mod.rs:265:42
[INFO] [stdout]     |
[INFO] [stdout] 265 |             if socket.send(Message::Text(event_json.into())).await.is_err() {
[INFO] [stdout]     |                                          ^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: this method call relies on the `impl<T> Into<T> for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors
[INFO] [stdout] help: consider removing the conversion call
[INFO] [stdout]     |
[INFO] [stdout] 265 -             if socket.send(Message::Text(event_json.into())).await.is_err() {
[INFO] [stdout] 265 +             if socket.send(Message::Text(event_json)).await.is_err() {
[INFO] [stdout]     |
[INFO] [stdout] help: you can use the fully-qualified path to avoid triggering this lint
[INFO] [stdout]     |
[INFO] [stdout] 265 -             if socket.send(Message::Text(event_json.into())).await.is_err() {
[INFO] [stdout] 265 +             if socket.send(Message::Text(<std::string::String as Into<_>>::into(event_json))).await.is_err() {
[INFO] [stdout]     |
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr] error: could not compile `cctv-sentinel` (bin "cctv-sentinel" test) due to 2 previous errors; 35 warnings emitted
[INFO] [stderr] warning: unused dependency `tower`
[INFO] [stderr]   --> Cargo.toml:10:1
[INFO] [stderr]    |
[INFO] [stderr] 10 | tower = "0.4"
[INFO] [stderr]    | ^^^^^^^^^^^^^
[INFO] [stderr]    |
[INFO] [stderr]    = note: `cargo::unused_dependencies` is set to `warn` by default
[INFO] [stderr] help: consider removing the dependency on `tower`
[INFO] [stderr] warning: `cctv-sentinel` (manifest) generated 1 warning
[INFO] running `Command { std: "docker" "inspect" "61668475b6c2b97cb3dc4b9548b2e6a3fce26dacf2b20e654f869e8614d8a522", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "61668475b6c2b97cb3dc4b9548b2e6a3fce26dacf2b20e654f869e8614d8a522", kill_on_drop: false }`
[INFO] [stdout] 61668475b6c2b97cb3dc4b9548b2e6a3fce26dacf2b20e654f869e8614d8a522
