[INFO] fetching crate imps 3.1.3... [INFO] linting imps-3.1.3 against nightly for clippy-nonminimal_bool-denied [INFO] extracting crate imps 3.1.3 into /workspace/builds/worker-7-tc1/source [INFO] started tweaking crates.io crate imps 3.1.3 [INFO] finished tweaking crates.io crate imps 3.1.3 [INFO] tweaked toml for crates.io crate imps 3.1.3 written to /workspace/builds/worker-7-tc1/source/Cargo.toml [INFO] validating manifest of crates.io crate imps 3.1.3 on toolchain nightly [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+nightly" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }` [INFO] crate crates.io crate imps 3.1.3 already has a lockfile, it will not be regenerated [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+nightly" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] [stderr] Blocking waiting for file lock on package cache [INFO] [stderr] Updating crates.io index [INFO] [stderr] Downloading crates ... [INFO] [stderr] Downloaded from_variants_impl v1.0.2 [INFO] [stderr] Downloaded derive_is_enum_variant v0.1.1 [INFO] [stderr] Downloaded irctokens v0.1.3 [INFO] [stderr] Downloaded from_variants v1.0.2 [INFO] [stderr] Downloaded irc-connect v0.2.0 [INFO] [stderr] Downloaded argh_shared v0.1.13 [INFO] [stderr] Downloaded foxerror v0.1.1 [INFO] [stderr] Downloaded argh v0.1.13 [INFO] [stderr] Downloaded dbus v0.9.7 [INFO] [stderr] Downloaded argh_derive v0.1.13 [INFO] [stderr] Downloaded mpris v2.0.1 [INFO] [stderr] Downloaded tokio v1.47.0 [INFO] [stderr] Downloaded rust-fuzzy-search v0.1.1 [INFO] [stderr] Downloaded libdbus-sys v0.2.5 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-7-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-7-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+nightly" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] [stdout] b71f13b88c72efc259ee1191ff3385630f359f0d8fc2da99d806666291681943 [INFO] running `Command { std: "docker" "start" "-a" "b71f13b88c72efc259ee1191ff3385630f359f0d8fc2da99d806666291681943", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "b71f13b88c72efc259ee1191ff3385630f359f0d8fc2da99d806666291681943", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "b71f13b88c72efc259ee1191ff3385630f359f0d8fc2da99d806666291681943", kill_on_drop: false }` [INFO] [stdout] b71f13b88c72efc259ee1191ff3385630f359f0d8fc2da99d806666291681943 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-7-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-7-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+nightly" "clippy" "--frozen" "--all" "--all-targets" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] d689997d0cb8bfd3207dc34a4103d26a5f1cea562bcdaa17c1aecea7f29009ef [INFO] running `Command { std: "docker" "start" "-a" "d689997d0cb8bfd3207dc34a4103d26a5f1cea562bcdaa17c1aecea7f29009ef", kill_on_drop: false }` [INFO] [stderr] Compiling cc v1.2.30 [INFO] [stderr] Checking futures-core v0.3.31 [INFO] [stderr] Compiling strsim v0.10.0 [INFO] [stderr] Checking futures-sink v0.3.31 [INFO] [stderr] Compiling syn v1.0.109 [INFO] [stderr] Checking getrandom v0.2.16 [INFO] [stderr] Compiling futures-macro v0.3.31 [INFO] [stderr] Compiling libdbus-sys v0.2.5 [INFO] [stderr] Compiling thiserror-impl v1.0.69 [INFO] [stderr] Checking futures-channel v0.3.31 [INFO] [stderr] Compiling tokio-macros v2.5.0 [INFO] [stderr] Checking socket2 v0.6.0 [INFO] [stderr] Compiling rustls v0.23.31 [INFO] [stderr] Compiling unicode-xid v0.0.4 [INFO] [stderr] Checking getrandom v0.3.3 [INFO] [stderr] Compiling synom v0.11.3 [INFO] [stderr] Compiling serde_derive v1.0.219 [INFO] [stderr] Compiling quote v0.3.15 [INFO] [stderr] Checking rand_core v0.9.3 [INFO] [stderr] Compiling syn v0.11.11 [INFO] [stderr] Checking futures-util v0.3.31 [INFO] [stderr] Checking either v1.15.0 [INFO] [stderr] Checking tokio v1.47.0 [INFO] [stderr] Compiling argh_shared v0.1.13 [INFO] [stderr] Checking regex-automata v0.4.9 [INFO] [stderr] Checking thiserror v1.0.69 [INFO] [stderr] Compiling argh_derive v0.1.13 [INFO] [stderr] Compiling ring v0.17.14 [INFO] [stderr] Compiling derive_is_enum_variant v0.1.1 [INFO] [stderr] Checking dbus v0.9.7 [INFO] [stderr] Checking rand_chacha v0.9.0 [INFO] [stderr] Compiling foxerror v0.1.1 [INFO] [stderr] Checking rust-fuzzy-search v0.1.1 [INFO] [stderr] Checking regex v1.11.1 [INFO] [stderr] Checking rand v0.9.2 [INFO] [stderr] Checking irctokens v0.1.3 [INFO] [stderr] Checking serde v1.0.219 [INFO] [stderr] Checking futures-executor v0.3.31 [INFO] [stderr] Checking tokio-socks v0.5.2 [INFO] [stderr] Checking futures v0.3.31 [INFO] [stderr] Compiling darling_core v0.14.4 [INFO] [stderr] Compiling enum-kinds v0.5.1 [INFO] [stderr] Checking rustls-webpki v0.103.4 [INFO] [stderr] Compiling darling_macro v0.14.4 [INFO] [stderr] Compiling darling v0.14.4 [INFO] [stderr] Compiling from_variants_impl v1.0.2 [INFO] [stderr] Checking argh v0.1.13 [INFO] [stderr] Checking from_variants v1.0.2 [INFO] [stderr] Checking mpris v2.0.1 [INFO] [stderr] Checking tokio-rustls v0.26.2 [INFO] [stderr] Checking irc-connect v0.2.0 [INFO] [stderr] Checking imps v3.1.3 (/opt/rustwide/workdir) [INFO] [stdout] warning: unused import: `net::lookup_host` [INFO] [stdout] --> src/main.rs:16:5 [INFO] [stdout] | [INFO] [stdout] 16 | net::lookup_host, [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: `net::lookup_host` [INFO] [stdout] --> src/main.rs:16:5 [INFO] [stdout] | [INFO] [stdout] 16 | net::lookup_host, [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/main.rs:155:31 [INFO] [stdout] | [INFO] [stdout] 155 | .map(|pat| Regex::new(&pat).expect("Invalid regex pattern")); [INFO] [stdout] | ^^^^ help: change this to: `pat` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] = note: `#[warn(clippy::needless_borrow)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unnecessary `if let` since only the `Ok` variant of the iterator element is used [INFO] [stdout] --> src/main.rs:185:13 [INFO] [stdout] | [INFO] [stdout] 185 | / for event in events { [INFO] [stdout] 186 | | if let Ok(ev) = event { [INFO] [stdout] 187 | | if let Event::TrackChanged(metadata) = ev { [INFO] [stdout] 188 | | let title = metadata.title().unwrap_or("Unknown"); [INFO] [stdout] ... | [INFO] [stdout] 206 | | } [INFO] [stdout] | |_____________^ [INFO] [stdout] | [INFO] [stdout] help: try `.flatten()` and remove the `if let` statement in the for loop [INFO] [stdout] --> src/main.rs:186:17 [INFO] [stdout] | [INFO] [stdout] 186 | / if let Ok(ev) = event { [INFO] [stdout] 187 | | if let Event::TrackChanged(metadata) = ev { [INFO] [stdout] 188 | | let title = metadata.title().unwrap_or("Unknown"); [INFO] [stdout] 189 | | let artist = metadata [INFO] [stdout] ... | [INFO] [stdout] 205 | | } [INFO] [stdout] | |_________________^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_flatten [INFO] [stdout] = note: `#[warn(clippy::manual_flatten)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 185 ~ for ev in events.flatten() { [INFO] [stdout] 186 + if let Event::TrackChanged(metadata) = ev { [INFO] [stdout] 187 + let title = metadata.title().unwrap_or("Unknown"); [INFO] [stdout] 188 + let artist = metadata [INFO] [stdout] 189 + .artists() [INFO] [stdout] 190 + .and_then(|a| a.get(0).cloned()) [INFO] [stdout] 191 + .unwrap_or("Unknown"); [INFO] [stdout] 192 + [INFO] [stdout] 193 + let now_playing = format!("{} - {}", artist, title); [INFO] [stdout] 194 + [INFO] [stdout] 195 + let _ = mpris_chan_tx.send_if_modified(|old| { [INFO] [stdout] 196 + if *old != now_playing { [INFO] [stdout] 197 + *old = now_playing; [INFO] [stdout] 198 + true [INFO] [stdout] 199 + } else { [INFO] [stdout] 200 + false [INFO] [stdout] 201 + } [INFO] [stdout] 202 + }); [INFO] [stdout] 203 + } [INFO] [stdout] 204 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if let` can be collapsed into the outer `if let` [INFO] [stdout] --> src/main.rs:187:21 [INFO] [stdout] | [INFO] [stdout] 187 | / if let Event::TrackChanged(metadata) = ev { [INFO] [stdout] 188 | | let title = metadata.title().unwrap_or("Unknown"); [INFO] [stdout] 189 | | let artist = metadata [INFO] [stdout] 190 | | .artists() [INFO] [stdout] ... | [INFO] [stdout] 203 | | }); [INFO] [stdout] 204 | | } [INFO] [stdout] | |_____________________^ [INFO] [stdout] | [INFO] [stdout] help: the outer pattern can be modified to include the inner pattern [INFO] [stdout] --> src/main.rs:186:27 [INFO] [stdout] | [INFO] [stdout] 186 | if let Ok(ev) = event { [INFO] [stdout] | ^^ replace this binding [INFO] [stdout] 187 | if let Event::TrackChanged(metadata) = ev { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ with this pattern [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_match [INFO] [stdout] = note: `#[warn(clippy::collapsible_match)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/main.rs:186:17 [INFO] [stdout] | [INFO] [stdout] 186 | / if let Ok(ev) = event { [INFO] [stdout] 187 | | if let Event::TrackChanged(metadata) = ev { [INFO] [stdout] 188 | | let title = metadata.title().unwrap_or("Unknown"); [INFO] [stdout] 189 | | let artist = metadata [INFO] [stdout] ... | [INFO] [stdout] 205 | | } [INFO] [stdout] | |_________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] = note: `#[warn(clippy::collapsible_if)]` on by default [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 186 ~ if let Ok(ev) = event [INFO] [stdout] 187 ~ && let Event::TrackChanged(metadata) = ev { [INFO] [stdout] 188 | let title = metadata.title().unwrap_or("Unknown"); [INFO] [stdout] ... [INFO] [stdout] 203 | }); [INFO] [stdout] 204 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: accessing first element with `a.get(0)` [INFO] [stdout] --> src/main.rs:191:43 [INFO] [stdout] | [INFO] [stdout] 191 | ... .and_then(|a| a.get(0).cloned()) [INFO] [stdout] | ^^^^^^^^ help: try: `a.first()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_first [INFO] [stdout] = note: `#[warn(clippy::get_first)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` can be collapsed into the outer `match` [INFO] [stdout] --> src/main.rs:237:29 [INFO] [stdout] | [INFO] [stdout] 237 | / ... if !received_001 { [INFO] [stdout] 238 | | ... received_001 = true; [INFO] [stdout] 239 | | ... if opt.log_ircconn { [INFO] [stdout] 240 | | ... println!("Connected to IRC server!"); [INFO] [stdout] 241 | | ... } [INFO] [stdout] 242 | | ... write_line(&Line { tags: None, source: None, command: "JOIN".to_string(), arguments: vec![opt.channel.as_bytes().to_vec... [INFO] [stdout] 243 | | ... } [INFO] [stdout] | |_______^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_match [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 236 ~ "001" [INFO] [stdout] 237 ~ if !received_001 => { [INFO] [stdout] 238 | received_001 = true; [INFO] [stdout] ... [INFO] [stdout] 242 | write_line(&Line { tags: None, source: None, command: "JOIN".to_string(), arguments: vec![opt.channel.as_bytes().to_vec()]}, &mut write).await; [INFO] [stdout] 243 ~ }, [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: comparison to empty slice [INFO] [stdout] --> src/main.rs:259:20 [INFO] [stdout] | [INFO] [stdout] 259 | if playing != "" { [INFO] [stdout] | ^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!playing.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#comparison_to_empty [INFO] [stdout] = note: `#[warn(clippy::comparison_to_empty)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this boolean expression can be simplified [INFO] [stdout] --> src/main.rs:297:16 [INFO] [stdout] | [INFO] [stdout] 297 | if !((check && !opt.inverted) || (!check && opt.inverted)) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#nonminimal_bool [INFO] [stdout] = note: `#[warn(clippy::nonminimal_bool)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 297 - if !((check && !opt.inverted) || (!check && opt.inverted)) { [INFO] [stdout] 297 + if (opt.inverted || !check) && (!opt.inverted || check) { [INFO] [stdout] | [INFO] [stdout] 297 - if !((check && !opt.inverted) || (!check && opt.inverted)) { [INFO] [stdout] 297 + if check && opt.inverted || !check && !opt.inverted { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/main.rs:317:5 [INFO] [stdout] | [INFO] [stdout] 317 | / return Ok(first_paused [INFO] [stdout] 318 | | .or(first_with_track) [INFO] [stdout] 319 | | .or(first_found) [INFO] [stdout] 320 | | .ok_or(PlayerObtainError::NoPlayer)?); [INFO] [stdout] | |_____________________________________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] = note: `#[warn(clippy::needless_return)]` on by default [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 317 ~ Ok(first_paused [INFO] [stdout] 318 + .or(first_with_track) [INFO] [stdout] 319 + .or(first_found) [INFO] [stdout] 320 ~ .ok_or(PlayerObtainError::NoPlayer)?) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/main.rs:296:37 [INFO] [stdout] | [INFO] [stdout] 296 | let check = re.is_match(&player.identity()); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ help: change this to: `player.identity()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enclosing `Ok` and `?` operator are unneeded [INFO] [stdout] --> src/main.rs:317:12 [INFO] [stdout] | [INFO] [stdout] 317 | return Ok(first_paused [INFO] [stdout] | ____________^ [INFO] [stdout] 318 | | .or(first_with_track) [INFO] [stdout] 319 | | .or(first_found) [INFO] [stdout] 320 | | .ok_or(PlayerObtainError::NoPlayer)?); [INFO] [stdout] | |_____________________________________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_question_mark [INFO] [stdout] = note: `#[warn(clippy::needless_question_mark)]` on by default [INFO] [stdout] help: remove the enclosing `Ok` and `?` operator [INFO] [stdout] | [INFO] [stdout] 317 ~ return first_paused [INFO] [stdout] 318 | .or(first_with_track) [INFO] [stdout] 319 | .or(first_found) [INFO] [stdout] 320 ~ .ok_or(PlayerObtainError::NoPlayer); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/main.rs:155:31 [INFO] [stdout] | [INFO] [stdout] 155 | .map(|pat| Regex::new(&pat).expect("Invalid regex pattern")); [INFO] [stdout] | ^^^^ help: change this to: `pat` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] = note: `#[warn(clippy::needless_borrow)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unnecessary `if let` since only the `Ok` variant of the iterator element is used [INFO] [stdout] --> src/main.rs:185:13 [INFO] [stdout] | [INFO] [stdout] 185 | / for event in events { [INFO] [stdout] 186 | | if let Ok(ev) = event { [INFO] [stdout] 187 | | if let Event::TrackChanged(metadata) = ev { [INFO] [stdout] 188 | | let title = metadata.title().unwrap_or("Unknown"); [INFO] [stdout] ... | [INFO] [stdout] 206 | | } [INFO] [stdout] | |_____________^ [INFO] [stdout] | [INFO] [stdout] help: try `.flatten()` and remove the `if let` statement in the for loop [INFO] [stdout] --> src/main.rs:186:17 [INFO] [stdout] | [INFO] [stdout] 186 | / if let Ok(ev) = event { [INFO] [stdout] 187 | | if let Event::TrackChanged(metadata) = ev { [INFO] [stdout] 188 | | let title = metadata.title().unwrap_or("Unknown"); [INFO] [stdout] 189 | | let artist = metadata [INFO] [stdout] ... | [INFO] [stdout] 205 | | } [INFO] [stdout] | |_________________^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_flatten [INFO] [stdout] = note: `#[warn(clippy::manual_flatten)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 185 ~ for ev in events.flatten() { [INFO] [stdout] 186 + if let Event::TrackChanged(metadata) = ev { [INFO] [stdout] 187 + let title = metadata.title().unwrap_or("Unknown"); [INFO] [stdout] 188 + let artist = metadata [INFO] [stdout] 189 + .artists() [INFO] [stdout] 190 + .and_then(|a| a.get(0).cloned()) [INFO] [stdout] 191 + .unwrap_or("Unknown"); [INFO] [stdout] 192 + [INFO] [stdout] 193 + let now_playing = format!("{} - {}", artist, title); [INFO] [stdout] 194 + [INFO] [stdout] 195 + let _ = mpris_chan_tx.send_if_modified(|old| { [INFO] [stdout] 196 + if *old != now_playing { [INFO] [stdout] 197 + *old = now_playing; [INFO] [stdout] 198 + true [INFO] [stdout] 199 + } else { [INFO] [stdout] 200 + false [INFO] [stdout] 201 + } [INFO] [stdout] 202 + }); [INFO] [stdout] 203 + } [INFO] [stdout] 204 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if let` can be collapsed into the outer `if let` [INFO] [stdout] --> src/main.rs:187:21 [INFO] [stdout] | [INFO] [stdout] 187 | / if let Event::TrackChanged(metadata) = ev { [INFO] [stdout] 188 | | let title = metadata.title().unwrap_or("Unknown"); [INFO] [stdout] 189 | | let artist = metadata [INFO] [stdout] 190 | | .artists() [INFO] [stdout] ... | [INFO] [stdout] 203 | | }); [INFO] [stdout] 204 | | } [INFO] [stdout] | |_____________________^ [INFO] [stdout] | [INFO] [stdout] help: the outer pattern can be modified to include the inner pattern [INFO] [stdout] --> src/main.rs:186:27 [INFO] [stdout] | [INFO] [stdout] 186 | if let Ok(ev) = event { [INFO] [stdout] | ^^ replace this binding [INFO] [stdout] 187 | if let Event::TrackChanged(metadata) = ev { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ with this pattern [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_match [INFO] [stdout] = note: `#[warn(clippy::collapsible_match)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/main.rs:186:17 [INFO] [stdout] | [INFO] [stdout] 186 | / if let Ok(ev) = event { [INFO] [stdout] 187 | | if let Event::TrackChanged(metadata) = ev { [INFO] [stdout] 188 | | let title = metadata.title().unwrap_or("Unknown"); [INFO] [stdout] 189 | | let artist = metadata [INFO] [stdout] ... | [INFO] [stdout] 205 | | } [INFO] [stdout] | |_________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] = note: `#[warn(clippy::collapsible_if)]` on by default [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 186 ~ if let Ok(ev) = event [INFO] [stdout] 187 ~ && let Event::TrackChanged(metadata) = ev { [INFO] [stdout] 188 | let title = metadata.title().unwrap_or("Unknown"); [INFO] [stdout] ... [INFO] [stdout] 203 | }); [INFO] [stdout] 204 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: accessing first element with `a.get(0)` [INFO] [stdout] --> src/main.rs:191:43 [INFO] [stdout] | [INFO] [stdout] 191 | ... .and_then(|a| a.get(0).cloned()) [INFO] [stdout] | ^^^^^^^^ help: try: `a.first()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_first [INFO] [stdout] = note: `#[warn(clippy::get_first)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` can be collapsed into the outer `match` [INFO] [stdout] --> src/main.rs:237:29 [INFO] [stdout] | [INFO] [stdout] 237 | / ... if !received_001 { [INFO] [stdout] 238 | | ... received_001 = true; [INFO] [stdout] 239 | | ... if opt.log_ircconn { [INFO] [stdout] 240 | | ... println!("Connected to IRC server!"); [INFO] [stdout] 241 | | ... } [INFO] [stdout] 242 | | ... write_line(&Line { tags: None, source: None, command: "JOIN".to_string(), arguments: vec![opt.channel.as_bytes().to_vec... [INFO] [stdout] 243 | | ... } [INFO] [stdout] | |_______^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_match [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 236 ~ "001" [INFO] [stdout] 237 ~ if !received_001 => { [INFO] [stdout] 238 | received_001 = true; [INFO] [stdout] ... [INFO] [stdout] 242 | write_line(&Line { tags: None, source: None, command: "JOIN".to_string(), arguments: vec![opt.channel.as_bytes().to_vec()]}, &mut write).await; [INFO] [stdout] 243 ~ }, [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: comparison to empty slice [INFO] [stdout] --> src/main.rs:259:20 [INFO] [stdout] | [INFO] [stdout] 259 | if playing != "" { [INFO] [stdout] | ^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!playing.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#comparison_to_empty [INFO] [stdout] = note: `#[warn(clippy::comparison_to_empty)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this boolean expression can be simplified [INFO] [stdout] --> src/main.rs:297:16 [INFO] [stdout] | [INFO] [stdout] 297 | if !((check && !opt.inverted) || (!check && opt.inverted)) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#nonminimal_bool [INFO] [stdout] = note: `#[warn(clippy::nonminimal_bool)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 297 - if !((check && !opt.inverted) || (!check && opt.inverted)) { [INFO] [stdout] 297 + if (opt.inverted || !check) && (!opt.inverted || check) { [INFO] [stdout] | [INFO] [stdout] 297 - if !((check && !opt.inverted) || (!check && opt.inverted)) { [INFO] [stdout] 297 + if check && opt.inverted || !check && !opt.inverted { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/main.rs:317:5 [INFO] [stdout] | [INFO] [stdout] 317 | / return Ok(first_paused [INFO] [stdout] 318 | | .or(first_with_track) [INFO] [stdout] 319 | | .or(first_found) [INFO] [stdout] 320 | | .ok_or(PlayerObtainError::NoPlayer)?); [INFO] [stdout] | |_____________________________________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] = note: `#[warn(clippy::needless_return)]` on by default [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 317 ~ Ok(first_paused [INFO] [stdout] 318 + .or(first_with_track) [INFO] [stdout] 319 + .or(first_found) [INFO] [stdout] 320 ~ .ok_or(PlayerObtainError::NoPlayer)?) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/main.rs:296:37 [INFO] [stdout] | [INFO] [stdout] 296 | let check = re.is_match(&player.identity()); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ help: change this to: `player.identity()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enclosing `Ok` and `?` operator are unneeded [INFO] [stdout] --> src/main.rs:317:12 [INFO] [stdout] | [INFO] [stdout] 317 | return Ok(first_paused [INFO] [stdout] | ____________^ [INFO] [stdout] 318 | | .or(first_with_track) [INFO] [stdout] 319 | | .or(first_found) [INFO] [stdout] 320 | | .ok_or(PlayerObtainError::NoPlayer)?); [INFO] [stdout] | |_____________________________________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_question_mark [INFO] [stdout] = note: `#[warn(clippy::needless_question_mark)]` on by default [INFO] [stdout] help: remove the enclosing `Ok` and `?` operator [INFO] [stdout] | [INFO] [stdout] 317 ~ return first_paused [INFO] [stdout] 318 | .or(first_with_track) [INFO] [stdout] 319 | .or(first_found) [INFO] [stdout] 320 ~ .ok_or(PlayerObtainError::NoPlayer); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 39.36s [INFO] running `Command { std: "docker" "inspect" "d689997d0cb8bfd3207dc34a4103d26a5f1cea562bcdaa17c1aecea7f29009ef", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "d689997d0cb8bfd3207dc34a4103d26a5f1cea562bcdaa17c1aecea7f29009ef", kill_on_drop: false }` [INFO] [stdout] d689997d0cb8bfd3207dc34a4103d26a5f1cea562bcdaa17c1aecea7f29009ef