[INFO] cloning repository https://github.com/phatch25/tempo [INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/phatch25/tempo" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fphatch25%2Ftempo", kill_on_drop: false }` [INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fphatch25%2Ftempo'... [INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }` [INFO] [stdout] bc605a1d3087fb26cb947a2bca3a67ee886aaed2 [INFO] linting phatch25/tempo against nightly for clippy-nonminimal_bool-denied [INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fphatch25%2Ftempo" "/workspace/builds/worker-4-tc1/source", kill_on_drop: false }` [INFO] [stderr] Cloning into '/workspace/builds/worker-4-tc1/source'... [INFO] [stderr] done. [INFO] started tweaking git repo https://github.com/phatch25/tempo [INFO] finished tweaking git repo https://github.com/phatch25/tempo [INFO] tweaked toml for git repo https://github.com/phatch25/tempo written to /workspace/builds/worker-4-tc1/source/Cargo.toml [INFO] validating manifest of git repo https://github.com/phatch25/tempo on toolchain nightly [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+nightly" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }` [INFO] crate git repo https://github.com/phatch25/tempo already has a lockfile, it will not be regenerated [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+nightly" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] [stderr] Updating crates.io index [INFO] [stderr] Downloading crates ... [INFO] [stderr] Downloaded midly v0.5.3 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+nightly" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] [stdout] 9c5fa30a85b612a28a2a8c8914f22f655193f2f9e0a679a51ce624e0c9d27d74 [INFO] running `Command { std: "docker" "start" "-a" "9c5fa30a85b612a28a2a8c8914f22f655193f2f9e0a679a51ce624e0c9d27d74", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "9c5fa30a85b612a28a2a8c8914f22f655193f2f9e0a679a51ce624e0c9d27d74", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "9c5fa30a85b612a28a2a8c8914f22f655193f2f9e0a679a51ce624e0c9d27d74", kill_on_drop: false }` [INFO] [stdout] 9c5fa30a85b612a28a2a8c8914f22f655193f2f9e0a679a51ce624e0c9d27d74 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+nightly" "clippy" "--frozen" "--all" "--all-targets" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] e43f03bddc98c17a096d23b64b2bb5e5e06774d925c5c0afecfd75fd647db4b7 [INFO] running `Command { std: "docker" "start" "-a" "e43f03bddc98c17a096d23b64b2bb5e5e06774d925c5c0afecfd75fd647db4b7", kill_on_drop: false }` [INFO] [stderr] Compiling libc v0.2.178 [INFO] [stderr] Checking either v1.15.0 [INFO] [stderr] Checking colored v2.2.0 [INFO] [stderr] Checking yansi v1.0.1 [INFO] [stderr] Checking diff v0.1.13 [INFO] [stderr] Compiling syn v2.0.111 [INFO] [stderr] Checking serde_json v1.0.145 [INFO] [stderr] Checking pretty_assertions v1.4.1 [INFO] [stderr] Checking rayon v1.11.0 [INFO] [stderr] Checking getrandom v0.2.16 [INFO] [stderr] Checking rand_core v0.6.4 [INFO] [stderr] Checking rand_chacha v0.3.1 [INFO] [stderr] Checking rand v0.8.5 [INFO] [stderr] Checking midly v0.5.3 [INFO] [stderr] Compiling thiserror-impl v1.0.69 [INFO] [stderr] Compiling clap_derive v4.5.49 [INFO] [stderr] Compiling serde_derive v1.0.228 [INFO] [stderr] Checking thiserror v1.0.69 [INFO] [stderr] Checking clap v4.5.53 [INFO] [stderr] Checking serde v1.0.228 [INFO] [stderr] Checking tempo v0.1.0 (/opt/rustwide/workdir) [INFO] [stdout] warning: unused imports: `ChordQuality` and `PitchClass` [INFO] [stdout] --> src/midi/export.rs:312:25 [INFO] [stdout] | [INFO] [stdout] 312 | use crate::theory::{PitchClass, ChordQuality}; [INFO] [stdout] | ^^^^^^^^^^ ^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `crate::generation::progression::CommonProgressions` [INFO] [stdout] --> src/midi/export.rs:313:9 [INFO] [stdout] | [INFO] [stdout] 313 | use crate::generation::progression::CommonProgressions; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused variable: `gen` [INFO] [stdout] --> src/generation/progression.rs:231:13 [INFO] [stdout] | [INFO] [stdout] 231 | let gen = ProgressionGenerator::new(key, false); [INFO] [stdout] | ^^^ help: if this is intentional, prefix it with an underscore: `_gen` [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: variable `current_tick` is assigned to, but never used [INFO] [stdout] --> src/midi/export.rs:213:9 [INFO] [stdout] | [INFO] [stdout] 213 | let mut current_tick = 0u32; [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: consider using `_current_tick` instead [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: value assigned to `current_tick` is never read [INFO] [stdout] --> src/midi/export.rs:225:9 [INFO] [stdout] | [INFO] [stdout] 225 | current_tick += duration_ticks; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: maybe it is overwritten before being read? [INFO] [stdout] = note: `#[warn(unused_assignments)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused variable: `oct` [INFO] [stdout] --> src/display/keyboard.rs:112:9 [INFO] [stdout] | [INFO] [stdout] 112 | for oct in 0..octaves { [INFO] [stdout] | ^^^ help: if this is intentional, prefix it with an underscore: `_oct` [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `rem_euclid` implementation [INFO] [stdout] --> src/theory/note.rs:40:26 [INFO] [stdout] | [INFO] [stdout] 40 | let normalized = ((semitone % 12) + 12) % 12; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `semitone.rem_euclid(12)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_rem_euclid [INFO] [stdout] = note: `#[warn(clippy::manual_rem_euclid)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `from_str` can be confused for the standard trait method `std::str::FromStr::from_str` [INFO] [stdout] --> src/theory/note.rs:172:5 [INFO] [stdout] | [INFO] [stdout] 172 | / pub fn from_str(s: &str) -> Result { [INFO] [stdout] 173 | | let s = s.trim(); [INFO] [stdout] 174 | | if s.is_empty() { [INFO] [stdout] 175 | | return Err("Empty note string".to_string()); [INFO] [stdout] ... | [INFO] [stdout] 225 | | Ok(Self { pitch_class, octave }) [INFO] [stdout] 226 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: consider implementing the trait `std::str::FromStr` or choosing a less ambiguous method name [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#should_implement_trait [INFO] [stdout] = note: `#[warn(clippy::should_implement_trait)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `rem_euclid` implementation [INFO] [stdout] --> src/theory/interval.rs:51:24 [INFO] [stdout] | [INFO] [stdout] 51 | semitones: ((semitones % 12 + 12) % 12) as u8, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `semitones.rem_euclid(12)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_rem_euclid [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused variable: `gen` [INFO] [stdout] --> src/generation/progression.rs:231:13 [INFO] [stdout] | [INFO] [stdout] 231 | let gen = ProgressionGenerator::new(key, false); [INFO] [stdout] | ^^^ help: if this is intentional, prefix it with an underscore: `_gen` [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `from_str` can be confused for the standard trait method `std::str::FromStr::from_str` [INFO] [stdout] --> src/theory/scale.rs:270:5 [INFO] [stdout] | [INFO] [stdout] 270 | / pub fn from_str(s: &str) -> Result { [INFO] [stdout] 271 | | let s = s.to_lowercase().replace(['-', '_', ' '], ""); [INFO] [stdout] 272 | | match s.as_str() { [INFO] [stdout] 273 | | "major" | "maj" | "ionian" => Ok(ScaleType::Major), [INFO] [stdout] ... | [INFO] [stdout] 293 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: consider implementing the trait `std::str::FromStr` or choosing a less ambiguous method name [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#should_implement_trait [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `from_str` can be confused for the standard trait method `std::str::FromStr::from_str` [INFO] [stdout] --> src/theory/chord.rs:295:5 [INFO] [stdout] | [INFO] [stdout] 295 | / pub fn from_str(s: &str) -> Result { [INFO] [stdout] 296 | | let s = s.trim(); [INFO] [stdout] 297 | | match s.to_lowercase().as_str() { [INFO] [stdout] 298 | | "" | "maj" | "major" => Ok(ChordQuality::Major), [INFO] [stdout] ... | [INFO] [stdout] 327 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: consider implementing the trait `std::str::FromStr` or choosing a less ambiguous method name [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#should_implement_trait [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: variable `current_tick` is assigned to, but never used [INFO] [stdout] --> src/midi/export.rs:213:9 [INFO] [stdout] | [INFO] [stdout] 213 | let mut current_tick = 0u32; [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: consider using `_current_tick` instead [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: value assigned to `current_tick` is never read [INFO] [stdout] --> src/midi/export.rs:225:9 [INFO] [stdout] | [INFO] [stdout] 225 | current_tick += duration_ticks; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: maybe it is overwritten before being read? [INFO] [stdout] = note: `#[warn(unused_assignments)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused variable: `oct` [INFO] [stdout] --> src/display/keyboard.rs:112:9 [INFO] [stdout] | [INFO] [stdout] 112 | for oct in 0..octaves { [INFO] [stdout] | ^^^ help: if this is intentional, prefix it with an underscore: `_oct` [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `rem_euclid` implementation [INFO] [stdout] --> src/theory/note.rs:40:26 [INFO] [stdout] | [INFO] [stdout] 40 | let normalized = ((semitone % 12) + 12) % 12; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `semitone.rem_euclid(12)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_rem_euclid [INFO] [stdout] = note: `#[warn(clippy::manual_rem_euclid)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `from_str` can be confused for the standard trait method `std::str::FromStr::from_str` [INFO] [stdout] --> src/theory/note.rs:172:5 [INFO] [stdout] | [INFO] [stdout] 172 | / pub fn from_str(s: &str) -> Result { [INFO] [stdout] 173 | | let s = s.trim(); [INFO] [stdout] 174 | | if s.is_empty() { [INFO] [stdout] 175 | | return Err("Empty note string".to_string()); [INFO] [stdout] ... | [INFO] [stdout] 225 | | Ok(Self { pitch_class, octave }) [INFO] [stdout] 226 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: consider implementing the trait `std::str::FromStr` or choosing a less ambiguous method name [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#should_implement_trait [INFO] [stdout] = note: `#[warn(clippy::should_implement_trait)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `rem_euclid` implementation [INFO] [stdout] --> src/theory/interval.rs:51:24 [INFO] [stdout] | [INFO] [stdout] 51 | semitones: ((semitones % 12 + 12) % 12) as u8, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `semitones.rem_euclid(12)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_rem_euclid [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manually reimplementing `div_ceil` [INFO] [stdout] --> src/generation/melody.rs:74:30 [INFO] [stdout] | [INFO] [stdout] 74 | let phrases_needed = (bars + 1) / 2; // 2 bars per phrase [INFO] [stdout] | ^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `bars.div_ceil(2)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_div_ceil [INFO] [stdout] = note: `#[warn(clippy::manual_div_ceil)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: casting to the same type is unnecessary (`i32` -> `i32`) [INFO] [stdout] --> src/generation/melody.rs:142:28 [INFO] [stdout] | [INFO] [stdout] 142 | let start_degree = *start_degrees.choose(rng).unwrap() as i32; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `*start_degrees.choose(rng).unwrap()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_cast [INFO] [stdout] = note: `#[warn(clippy::unnecessary_cast)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `from_str` can be confused for the standard trait method `std::str::FromStr::from_str` [INFO] [stdout] --> src/theory/scale.rs:270:5 [INFO] [stdout] | [INFO] [stdout] 270 | / pub fn from_str(s: &str) -> Result { [INFO] [stdout] 271 | | let s = s.to_lowercase().replace(['-', '_', ' '], ""); [INFO] [stdout] 272 | | match s.as_str() { [INFO] [stdout] 273 | | "major" | "maj" | "ionian" => Ok(ScaleType::Major), [INFO] [stdout] ... | [INFO] [stdout] 293 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: consider implementing the trait `std::str::FromStr` or choosing a less ambiguous method name [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#should_implement_trait [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: casting to the same type is unnecessary (`i32` -> `i32`) [INFO] [stdout] --> src/generation/melody.rs:199:21 [INFO] [stdout] | [INFO] [stdout] 199 | let start = *contrast_degrees.choose(rng).unwrap() as i32; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `*contrast_degrees.choose(rng).unwrap()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_cast [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: casting to the same type is unnecessary (`i32` -> `i32`) [INFO] [stdout] --> src/generation/melody.rs:281:28 [INFO] [stdout] | [INFO] [stdout] 281 | let start_degree = rng.gen_range(4..=6) as i32; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `rng.gen_range(4..=6)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_cast [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&mut Vec` instead of `&mut [_]` involves a new object where a slice will do [INFO] [stdout] --> src/generation/melody.rs:311:34 [INFO] [stdout] | [INFO] [stdout] 311 | fn pad_phrase(&self, phrase: &mut Vec, target_beats: f32) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stdout] = note: `#[warn(clippy::ptr_arg)]` on by default [INFO] [stdout] help: change this to [INFO] [stdout] | [INFO] [stdout] 311 - fn pad_phrase(&self, phrase: &mut Vec, target_beats: f32) { [INFO] [stdout] 311 + fn pad_phrase(&self, phrase: &mut [MelodyNote], target_beats: f32) { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `from_str` can be confused for the standard trait method `std::str::FromStr::from_str` [INFO] [stdout] --> src/theory/chord.rs:295:5 [INFO] [stdout] | [INFO] [stdout] 295 | / pub fn from_str(s: &str) -> Result { [INFO] [stdout] 296 | | let s = s.trim(); [INFO] [stdout] 297 | | match s.to_lowercase().as_str() { [INFO] [stdout] 298 | | "" | "maj" | "major" => Ok(ChordQuality::Major), [INFO] [stdout] ... | [INFO] [stdout] 327 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: consider implementing the trait `std::str::FromStr` or choosing a less ambiguous method name [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#should_implement_trait [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manually reimplementing `div_ceil` [INFO] [stdout] --> src/generation/melody.rs:74:30 [INFO] [stdout] | [INFO] [stdout] 74 | let phrases_needed = (bars + 1) / 2; // 2 bars per phrase [INFO] [stdout] | ^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `bars.div_ceil(2)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_div_ceil [INFO] [stdout] = note: `#[warn(clippy::manual_div_ceil)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: casting to the same type is unnecessary (`i32` -> `i32`) [INFO] [stdout] --> src/generation/melody.rs:142:28 [INFO] [stdout] | [INFO] [stdout] 142 | let start_degree = *start_degrees.choose(rng).unwrap() as i32; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `*start_degrees.choose(rng).unwrap()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_cast [INFO] [stdout] = note: `#[warn(clippy::unnecessary_cast)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: casting to the same type is unnecessary (`i32` -> `i32`) [INFO] [stdout] --> src/generation/melody.rs:199:21 [INFO] [stdout] | [INFO] [stdout] 199 | let start = *contrast_degrees.choose(rng).unwrap() as i32; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `*contrast_degrees.choose(rng).unwrap()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_cast [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: casting to the same type is unnecessary (`i32` -> `i32`) [INFO] [stdout] --> src/generation/melody.rs:281:28 [INFO] [stdout] | [INFO] [stdout] 281 | let start_degree = rng.gen_range(4..=6) as i32; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `rng.gen_range(4..=6)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_cast [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&mut Vec` instead of `&mut [_]` involves a new object where a slice will do [INFO] [stdout] --> src/generation/melody.rs:311:34 [INFO] [stdout] | [INFO] [stdout] 311 | fn pad_phrase(&self, phrase: &mut Vec, target_beats: f32) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stdout] = note: `#[warn(clippy::ptr_arg)]` on by default [INFO] [stdout] help: change this to [INFO] [stdout] | [INFO] [stdout] 311 - fn pad_phrase(&self, phrase: &mut Vec, target_beats: f32) { [INFO] [stdout] 311 + fn pad_phrase(&self, phrase: &mut [MelodyNote], target_beats: f32) { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` has identical blocks [INFO] [stdout] --> src/display/fretboard.rs:80:27 [INFO] [stdout] | [INFO] [stdout] 80 | if marker { [INFO] [stdout] | ___________________________^ [INFO] [stdout] 81 | | result.push_str("───"); [INFO] [stdout] 82 | | } else { [INFO] [stdout] | |_________________^ [INFO] [stdout] | [INFO] [stdout] note: same as this [INFO] [stdout] --> src/display/fretboard.rs:82:24 [INFO] [stdout] | [INFO] [stdout] 82 | } else { [INFO] [stdout] | ________________________^ [INFO] [stdout] 83 | | result.push_str("───"); [INFO] [stdout] 84 | | } [INFO] [stdout] | |_________________^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#if_same_then_else [INFO] [stdout] = note: `#[warn(clippy::if_same_then_else)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: useless use of `vec!` [INFO] [stdout] --> src/generation/melody.rs:284:22 [INFO] [stdout] | [INFO] [stdout] 284 | let rhythm = vec![0.5, 0.5, 0.5, 0.5, 1.0]; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: you can use an array directly: `[0.5, 0.5, 0.5, 0.5, 1.0]` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_vec [INFO] [stdout] = note: `#[warn(clippy::useless_vec)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` has identical blocks [INFO] [stdout] --> src/display/fretboard.rs:80:27 [INFO] [stdout] | [INFO] [stdout] 80 | if marker { [INFO] [stdout] | ___________________________^ [INFO] [stdout] 81 | | result.push_str("───"); [INFO] [stdout] 82 | | } else { [INFO] [stdout] | |_________________^ [INFO] [stdout] | [INFO] [stdout] note: same as this [INFO] [stdout] --> src/display/fretboard.rs:82:24 [INFO] [stdout] | [INFO] [stdout] 82 | } else { [INFO] [stdout] | ________________________^ [INFO] [stdout] 83 | | result.push_str("───"); [INFO] [stdout] 84 | | } [INFO] [stdout] | |_________________^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#if_same_then_else [INFO] [stdout] = note: `#[warn(clippy::if_same_then_else)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: useless use of `vec!` [INFO] [stdout] --> src/generation/melody.rs:284:22 [INFO] [stdout] | [INFO] [stdout] 284 | let rhythm = vec![0.5, 0.5, 0.5, 0.5, 1.0]; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: you can use an array directly: `[0.5, 0.5, 0.5, 0.5, 1.0]` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_vec [INFO] [stdout] = note: `#[warn(clippy::useless_vec)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused imports: `ChordQuality` and `PitchClass` [INFO] [stdout] --> src/midi/export.rs:312:25 [INFO] [stdout] | [INFO] [stdout] 312 | use crate::theory::{PitchClass, ChordQuality}; [INFO] [stdout] | ^^^^^^^^^^ ^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `crate::generation::progression::CommonProgressions` [INFO] [stdout] --> src/midi/export.rs:313:9 [INFO] [stdout] | [INFO] [stdout] 313 | use crate::generation::progression::CommonProgressions; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused variable: `gen` [INFO] [stdout] --> src/generation/progression.rs:231:13 [INFO] [stdout] | [INFO] [stdout] 231 | let gen = ProgressionGenerator::new(key, false); [INFO] [stdout] | ^^^ help: if this is intentional, prefix it with an underscore: `_gen` [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: variable `current_tick` is assigned to, but never used [INFO] [stdout] --> src/midi/export.rs:213:9 [INFO] [stdout] | [INFO] [stdout] 213 | let mut current_tick = 0u32; [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: consider using `_current_tick` instead [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: value assigned to `current_tick` is never read [INFO] [stdout] --> src/midi/export.rs:225:9 [INFO] [stdout] | [INFO] [stdout] 225 | current_tick += duration_ticks; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: maybe it is overwritten before being read? [INFO] [stdout] = note: `#[warn(unused_assignments)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused variable: `oct` [INFO] [stdout] --> src/display/keyboard.rs:112:9 [INFO] [stdout] | [INFO] [stdout] 112 | for oct in 0..octaves { [INFO] [stdout] | ^^^ help: if this is intentional, prefix it with an underscore: `_oct` [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused variable: `gen` [INFO] [stdout] --> src/generation/progression.rs:231:13 [INFO] [stdout] | [INFO] [stdout] 231 | let gen = ProgressionGenerator::new(key, false); [INFO] [stdout] | ^^^ help: if this is intentional, prefix it with an underscore: `_gen` [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `enharmonic_name` and `flat_name` are never used [INFO] [stdout] --> src/theory/note.rs:71:12 [INFO] [stdout] | [INFO] [stdout] 29 | impl PitchClass { [INFO] [stdout] | --------------- methods in this implementation [INFO] [stdout] ... [INFO] [stdout] 71 | pub fn enharmonic_name(self) -> Option<&'static str> { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 103 | pub fn flat_name(self) -> &'static str { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `new`, `without_octave`, `from_midi`, and `transpose` are never used [INFO] [stdout] --> src/theory/note.rs:156:12 [INFO] [stdout] | [INFO] [stdout] 154 | impl Note { [INFO] [stdout] | --------- associated items in this implementation [INFO] [stdout] 155 | /// Creates a new note with the given pitch class and octave. [INFO] [stdout] 156 | pub fn new(pitch_class: PitchClass, octave: i8) -> Self { [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 164 | pub fn without_octave(pitch_class: PitchClass) -> Self { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 239 | pub fn from_midi(midi: u8) -> Self { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 246 | pub fn transpose(self, semitones: i32) -> Self { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/theory/interval.rs:30:15 [INFO] [stdout] | [INFO] [stdout] 16 | impl Interval { [INFO] [stdout] | ------------- associated items in this implementation [INFO] [stdout] ... [INFO] [stdout] 30 | pub const OCTAVE: Interval = Interval { semitones: 12 }; [INFO] [stdout] | ^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 33 | pub const MINOR_NINTH: Interval = Interval { semitones: 13 }; [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 34 | pub const MAJOR_NINTH: Interval = Interval { semitones: 14 }; [INFO] [stdout] 35 | pub const MINOR_TENTH: Interval = Interval { semitones: 15 }; [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 36 | pub const MAJOR_TENTH: Interval = Interval { semitones: 16 }; [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 37 | pub const PERFECT_ELEVENTH: Interval = Interval { semitones: 17 }; [INFO] [stdout] 38 | pub const AUGMENTED_ELEVENTH: Interval = Interval { semitones: 18 }; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 39 | pub const PERFECT_TWELFTH: Interval = Interval { semitones: 19 }; [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] 40 | pub const MINOR_THIRTEENTH: Interval = Interval { semitones: 20 }; [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 49 | pub fn from_semitones(semitones: i32) -> Self { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 74 | pub fn inversion(self) -> Self { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 123 | pub fn quality(self) -> IntervalQuality { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 134 | pub fn number(self) -> u8 { [INFO] [stdout] | ^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 152 | pub fn is_consonant(self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 157 | pub fn is_dissonant(self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enum `IntervalQuality` is never used [INFO] [stdout] --> src/theory/interval.rs:190:10 [INFO] [stdout] | [INFO] [stdout] 190 | pub enum IntervalQuality { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `root`, `scale_type`, `degree`, `relative`, `parallel`, and `contains` are never used [INFO] [stdout] --> src/theory/scale.rs:22:12 [INFO] [stdout] | [INFO] [stdout] 15 | impl Scale { [INFO] [stdout] | ---------- methods in this implementation [INFO] [stdout] ... [INFO] [stdout] 22 | pub fn root(&self) -> PitchClass { [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 27 | pub fn scale_type(&self) -> ScaleType { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 48 | pub fn degree(&self, n: usize) -> Option { [INFO] [stdout] | ^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 72 | pub fn relative(&self) -> Option { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 87 | pub fn parallel(&self) -> Option { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 100 | pub fn contains(&self, pitch: PitchClass) -> bool { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: variants `Ionian` and `Aeolian` are never constructed [INFO] [stdout] --> src/theory/scale.rs:110:5 [INFO] [stdout] | [INFO] [stdout] 107 | pub enum ScaleType { [INFO] [stdout] | --------- variants in this enum [INFO] [stdout] ... [INFO] [stdout] 110 | Ionian, // Same as Major [INFO] [stdout] | ^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 115 | Aeolian, // Same as Natural Minor [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `ScaleType` 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 `inversion`, `bass_note`, `contains`, and `add` are never used [INFO] [stdout] --> src/theory/chord.rs:43:12 [INFO] [stdout] | [INFO] [stdout] 15 | impl Chord { [INFO] [stdout] | ---------- methods in this implementation [INFO] [stdout] ... [INFO] [stdout] 43 | pub fn inversion(&self, n: usize) -> Vec { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 54 | pub fn bass_note(&self, inversion: usize) -> PitchClass { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 103 | pub fn contains(&self, pitch: PitchClass) -> bool { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 108 | pub fn add(&self, interval: Interval) -> Vec { [INFO] [stdout] | ^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `is_major`, `is_minor`, and `is_diminished` are never used [INFO] [stdout] --> src/theory/chord.rs:330:12 [INFO] [stdout] | [INFO] [stdout] 159 | impl ChordQuality { [INFO] [stdout] | ----------------- methods in this implementation [INFO] [stdout] ... [INFO] [stdout] 330 | pub fn is_major(&self) -> bool { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 345 | pub fn is_minor(&self) -> bool { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 359 | pub fn is_diminished(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: fields `key` and `is_minor` are never read [INFO] [stdout] --> src/generation/progression.rs:12:9 [INFO] [stdout] | [INFO] [stdout] 11 | pub struct Progression { [INFO] [stdout] | ----------- fields in this struct [INFO] [stdout] 12 | pub key: PitchClass, [INFO] [stdout] | ^^^ [INFO] [stdout] 13 | pub is_minor: bool, [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `Progression` 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 `CommonProgressions` is never constructed [INFO] [stdout] --> src/generation/progression.rs:226:12 [INFO] [stdout] | [INFO] [stdout] 226 | pub struct CommonProgressions; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated functions `four_chord`, `two_five_one`, `twelve_bar_blues`, `andalusian`, and `pachelbel` are never used [INFO] [stdout] --> src/generation/progression.rs:230:12 [INFO] [stdout] | [INFO] [stdout] 228 | impl CommonProgressions { [INFO] [stdout] | ----------------------- associated functions in this implementation [INFO] [stdout] 229 | /// Returns the "Four Chord Song" progression (I-V-vi-IV). [INFO] [stdout] 230 | pub fn four_chord(key: PitchClass) -> Progression { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 248 | pub fn two_five_one(key: PitchClass) -> Progression { [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 264 | pub fn twelve_bar_blues(key: PitchClass) -> Progression { [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 290 | pub fn andalusian(key: PitchClass) -> Progression { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 307 | pub fn pachelbel(key: PitchClass) -> Progression { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: fields `key`, `scale_type`, and `tempo` are never read [INFO] [stdout] --> src/generation/melody.rs:38:9 [INFO] [stdout] | [INFO] [stdout] 36 | pub struct Melody { [INFO] [stdout] | ------ fields in this struct [INFO] [stdout] 37 | pub notes: Vec, [INFO] [stdout] 38 | pub key: PitchClass, [INFO] [stdout] | ^^^ [INFO] [stdout] 39 | pub scale_type: ScaleType, [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] 40 | pub tempo: u16, [INFO] [stdout] | ^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `Melody` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `render_keyboard_compact` is never used [INFO] [stdout] --> src/display/keyboard.rs:219:8 [INFO] [stdout] | [INFO] [stdout] 219 | pub fn render_keyboard_compact(midi_notes: &[u8]) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `render_fretboard_compact` is never used [INFO] [stdout] --> src/display/fretboard.rs:114:8 [INFO] [stdout] | [INFO] [stdout] 114 | pub fn render_fretboard_compact(notes: &[PitchClass]) -> String { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `rem_euclid` implementation [INFO] [stdout] --> src/theory/note.rs:40:26 [INFO] [stdout] | [INFO] [stdout] 40 | let normalized = ((semitone % 12) + 12) % 12; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `semitone.rem_euclid(12)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_rem_euclid [INFO] [stdout] = note: `#[warn(clippy::manual_rem_euclid)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `rem_euclid` implementation [INFO] [stdout] --> src/theory/interval.rs:51:24 [INFO] [stdout] | [INFO] [stdout] 51 | semitones: ((semitones % 12 + 12) % 12) as u8, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `semitones.rem_euclid(12)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_rem_euclid [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: variable `current_tick` is assigned to, but never used [INFO] [stdout] --> src/midi/export.rs:213:9 [INFO] [stdout] | [INFO] [stdout] 213 | let mut current_tick = 0u32; [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: consider using `_current_tick` instead [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: value assigned to `current_tick` is never read [INFO] [stdout] --> src/midi/export.rs:225:9 [INFO] [stdout] | [INFO] [stdout] 225 | current_tick += duration_ticks; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: maybe it is overwritten before being read? [INFO] [stdout] = note: `#[warn(unused_assignments)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused variable: `oct` [INFO] [stdout] --> src/display/keyboard.rs:112:9 [INFO] [stdout] | [INFO] [stdout] 112 | for oct in 0..octaves { [INFO] [stdout] | ^^^ help: if this is intentional, prefix it with an underscore: `_oct` [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manually reimplementing `div_ceil` [INFO] [stdout] --> src/generation/melody.rs:74:30 [INFO] [stdout] | [INFO] [stdout] 74 | let phrases_needed = (bars + 1) / 2; // 2 bars per phrase [INFO] [stdout] | ^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `bars.div_ceil(2)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_div_ceil [INFO] [stdout] = note: `#[warn(clippy::manual_div_ceil)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: casting to the same type is unnecessary (`i32` -> `i32`) [INFO] [stdout] --> src/generation/melody.rs:142:28 [INFO] [stdout] | [INFO] [stdout] 142 | let start_degree = *start_degrees.choose(rng).unwrap() as i32; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `*start_degrees.choose(rng).unwrap()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_cast [INFO] [stdout] = note: `#[warn(clippy::unnecessary_cast)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: casting to the same type is unnecessary (`i32` -> `i32`) [INFO] [stdout] --> src/generation/melody.rs:199:21 [INFO] [stdout] | [INFO] [stdout] 199 | let start = *contrast_degrees.choose(rng).unwrap() as i32; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `*contrast_degrees.choose(rng).unwrap()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_cast [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: casting to the same type is unnecessary (`i32` -> `i32`) [INFO] [stdout] --> src/generation/melody.rs:281:28 [INFO] [stdout] | [INFO] [stdout] 281 | let start_degree = rng.gen_range(4..=6) as i32; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `rng.gen_range(4..=6)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_cast [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&mut Vec` instead of `&mut [_]` involves a new object where a slice will do [INFO] [stdout] --> src/generation/melody.rs:311:34 [INFO] [stdout] | [INFO] [stdout] 311 | fn pad_phrase(&self, phrase: &mut Vec, target_beats: f32) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stdout] = note: `#[warn(clippy::ptr_arg)]` on by default [INFO] [stdout] help: change this to [INFO] [stdout] | [INFO] [stdout] 311 - fn pad_phrase(&self, phrase: &mut Vec, target_beats: f32) { [INFO] [stdout] 311 + fn pad_phrase(&self, phrase: &mut [MelodyNote], target_beats: f32) { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` has identical blocks [INFO] [stdout] --> src/display/fretboard.rs:80:27 [INFO] [stdout] | [INFO] [stdout] 80 | if marker { [INFO] [stdout] | ___________________________^ [INFO] [stdout] 81 | | result.push_str("───"); [INFO] [stdout] 82 | | } else { [INFO] [stdout] | |_________________^ [INFO] [stdout] | [INFO] [stdout] note: same as this [INFO] [stdout] --> src/display/fretboard.rs:82:24 [INFO] [stdout] | [INFO] [stdout] 82 | } else { [INFO] [stdout] | ________________________^ [INFO] [stdout] 83 | | result.push_str("───"); [INFO] [stdout] 84 | | } [INFO] [stdout] | |_________________^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#if_same_then_else [INFO] [stdout] = note: `#[warn(clippy::if_same_then_else)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `enharmonic_name` and `flat_name` are never used [INFO] [stdout] --> src/theory/note.rs:71:12 [INFO] [stdout] | [INFO] [stdout] 29 | impl PitchClass { [INFO] [stdout] | --------------- methods in this implementation [INFO] [stdout] ... [INFO] [stdout] 71 | pub fn enharmonic_name(self) -> Option<&'static str> { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 103 | pub fn flat_name(self) -> &'static str { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated items `without_octave` and `transpose` are never used [INFO] [stdout] --> src/theory/note.rs:164:12 [INFO] [stdout] | [INFO] [stdout] 154 | impl Note { [INFO] [stdout] | --------- associated items in this implementation [INFO] [stdout] ... [INFO] [stdout] 164 | pub fn without_octave(pitch_class: PitchClass) -> Self { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 246 | pub fn transpose(self, semitones: i32) -> Self { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: multiple associated items are never used [INFO] [stdout] --> src/theory/interval.rs:30:15 [INFO] [stdout] | [INFO] [stdout] 16 | impl Interval { [INFO] [stdout] | ------------- associated items in this implementation [INFO] [stdout] ... [INFO] [stdout] 30 | pub const OCTAVE: Interval = Interval { semitones: 12 }; [INFO] [stdout] | ^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 33 | pub const MINOR_NINTH: Interval = Interval { semitones: 13 }; [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 34 | pub const MAJOR_NINTH: Interval = Interval { semitones: 14 }; [INFO] [stdout] 35 | pub const MINOR_TENTH: Interval = Interval { semitones: 15 }; [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 36 | pub const MAJOR_TENTH: Interval = Interval { semitones: 16 }; [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] 37 | pub const PERFECT_ELEVENTH: Interval = Interval { semitones: 17 }; [INFO] [stdout] 38 | pub const AUGMENTED_ELEVENTH: Interval = Interval { semitones: 18 }; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] 39 | pub const PERFECT_TWELFTH: Interval = Interval { semitones: 19 }; [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] 40 | pub const MINOR_THIRTEENTH: Interval = Interval { semitones: 20 }; [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 49 | pub fn from_semitones(semitones: i32) -> Self { [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 123 | pub fn quality(self) -> IntervalQuality { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 134 | pub fn number(self) -> u8 { [INFO] [stdout] | ^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: enum `IntervalQuality` is never used [INFO] [stdout] --> src/theory/interval.rs:190:10 [INFO] [stdout] | [INFO] [stdout] 190 | pub enum IntervalQuality { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `degree` and `parallel` are never used [INFO] [stdout] --> src/theory/scale.rs:48:12 [INFO] [stdout] | [INFO] [stdout] 15 | impl Scale { [INFO] [stdout] | ---------- methods in this implementation [INFO] [stdout] ... [INFO] [stdout] 48 | pub fn degree(&self, n: usize) -> Option { [INFO] [stdout] | ^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 87 | pub fn parallel(&self) -> Option { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: variants `Ionian` and `Aeolian` are never constructed [INFO] [stdout] --> src/theory/scale.rs:110:5 [INFO] [stdout] | [INFO] [stdout] 107 | pub enum ScaleType { [INFO] [stdout] | --------- variants in this enum [INFO] [stdout] ... [INFO] [stdout] 110 | Ionian, // Same as Major [INFO] [stdout] | ^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 115 | Aeolian, // Same as Natural Minor [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `ScaleType` 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 `bass_note`, `contains`, and `add` are never used [INFO] [stdout] --> src/theory/chord.rs:54:12 [INFO] [stdout] | [INFO] [stdout] 15 | impl Chord { [INFO] [stdout] | ---------- methods in this implementation [INFO] [stdout] ... [INFO] [stdout] 54 | pub fn bass_note(&self, inversion: usize) -> PitchClass { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 103 | pub fn contains(&self, pitch: PitchClass) -> bool { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 108 | pub fn add(&self, interval: Interval) -> Vec { [INFO] [stdout] | ^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `is_major`, `is_minor`, and `is_diminished` are never used [INFO] [stdout] --> src/theory/chord.rs:330:12 [INFO] [stdout] | [INFO] [stdout] 159 | impl ChordQuality { [INFO] [stdout] | ----------------- methods in this implementation [INFO] [stdout] ... [INFO] [stdout] 330 | pub fn is_major(&self) -> bool { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 345 | pub fn is_minor(&self) -> bool { [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 359 | pub fn is_diminished(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: associated functions `four_chord`, `andalusian`, and `pachelbel` are never used [INFO] [stdout] --> src/generation/progression.rs:230:12 [INFO] [stdout] | [INFO] [stdout] 228 | impl CommonProgressions { [INFO] [stdout] | ----------------------- associated functions in this implementation [INFO] [stdout] 229 | /// Returns the "Four Chord Song" progression (I-V-vi-IV). [INFO] [stdout] 230 | pub fn four_chord(key: PitchClass) -> Progression { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 290 | pub fn andalusian(key: PitchClass) -> Progression { [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 307 | pub fn pachelbel(key: PitchClass) -> Progression { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `tempo` is never read [INFO] [stdout] --> src/generation/melody.rs:40:9 [INFO] [stdout] | [INFO] [stdout] 36 | pub struct Melody { [INFO] [stdout] | ------ field in this struct [INFO] [stdout] ... [INFO] [stdout] 40 | pub tempo: u16, [INFO] [stdout] | ^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `Melody` 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: manual `rem_euclid` implementation [INFO] [stdout] --> src/theory/note.rs:40:26 [INFO] [stdout] | [INFO] [stdout] 40 | let normalized = ((semitone % 12) + 12) % 12; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `semitone.rem_euclid(12)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_rem_euclid [INFO] [stdout] = note: `#[warn(clippy::manual_rem_euclid)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `rem_euclid` implementation [INFO] [stdout] --> src/theory/interval.rs:51:24 [INFO] [stdout] | [INFO] [stdout] 51 | semitones: ((semitones % 12 + 12) % 12) as u8, [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `semitones.rem_euclid(12)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_rem_euclid [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this boolean expression can be simplified [INFO] [stdout] --> src/main.rs:410:12 [INFO] [stdout] | [INFO] [stdout] 410 | if piano || (!piano && !fretboard) { [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] 410 - if piano || (!piano && !fretboard) { [INFO] [stdout] 410 + if !(!piano && fretboard) { [INFO] [stdout] | [INFO] [stdout] 410 - if piano || (!piano && !fretboard) { [INFO] [stdout] 410 + if piano || !fretboard { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this boolean expression can be simplified [INFO] [stdout] --> src/main.rs:435:20 [INFO] [stdout] | [INFO] [stdout] 435 | if piano || (!piano && !fretboard) { [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] help: try [INFO] [stdout] | [INFO] [stdout] 435 - if piano || (!piano && !fretboard) { [INFO] [stdout] 435 + if !(!piano && fretboard) { [INFO] [stdout] | [INFO] [stdout] 435 - if piano || (!piano && !fretboard) { [INFO] [stdout] 435 + if piano || !fretboard { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this boolean expression can be simplified [INFO] [stdout] --> src/main.rs:451:12 [INFO] [stdout] | [INFO] [stdout] 451 | if piano || (!piano && !fretboard) { [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] help: try [INFO] [stdout] | [INFO] [stdout] 451 - if piano || (!piano && !fretboard) { [INFO] [stdout] 451 + if !(!piano && fretboard) { [INFO] [stdout] | [INFO] [stdout] 451 - if piano || (!piano && !fretboard) { [INFO] [stdout] 451 + if piano || !fretboard { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: literal with an empty format string [INFO] [stdout] --> src/main.rs:488:64 [INFO] [stdout] | [INFO] [stdout] 488 | println!(" {} {}", "Possible chords:".white().bold(), ""); [INFO] [stdout] | ^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#print_literal [INFO] [stdout] = note: `#[warn(clippy::print_literal)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 488 - println!(" {} {}", "Possible chords:".white().bold(), ""); [INFO] [stdout] 488 + println!(" {} ", "Possible chords:".white().bold()); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: useless use of `vec!` [INFO] [stdout] --> src/generation/melody.rs:284:22 [INFO] [stdout] | [INFO] [stdout] 284 | let rhythm = vec![0.5, 0.5, 0.5, 0.5, 1.0]; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: you can use an array directly: `[0.5, 0.5, 0.5, 0.5, 1.0]` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_vec [INFO] [stdout] = note: `#[warn(clippy::useless_vec)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manually reimplementing `div_ceil` [INFO] [stdout] --> src/generation/melody.rs:74:30 [INFO] [stdout] | [INFO] [stdout] 74 | let phrases_needed = (bars + 1) / 2; // 2 bars per phrase [INFO] [stdout] | ^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `bars.div_ceil(2)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_div_ceil [INFO] [stdout] = note: `#[warn(clippy::manual_div_ceil)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: casting to the same type is unnecessary (`i32` -> `i32`) [INFO] [stdout] --> src/generation/melody.rs:142:28 [INFO] [stdout] | [INFO] [stdout] 142 | let start_degree = *start_degrees.choose(rng).unwrap() as i32; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `*start_degrees.choose(rng).unwrap()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_cast [INFO] [stdout] = note: `#[warn(clippy::unnecessary_cast)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: casting to the same type is unnecessary (`i32` -> `i32`) [INFO] [stdout] --> src/generation/melody.rs:199:21 [INFO] [stdout] | [INFO] [stdout] 199 | let start = *contrast_degrees.choose(rng).unwrap() as i32; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `*contrast_degrees.choose(rng).unwrap()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_cast [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: casting to the same type is unnecessary (`i32` -> `i32`) [INFO] [stdout] --> src/generation/melody.rs:281:28 [INFO] [stdout] | [INFO] [stdout] 281 | let start_degree = rng.gen_range(4..=6) as i32; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `rng.gen_range(4..=6)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_cast [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&mut Vec` instead of `&mut [_]` involves a new object where a slice will do [INFO] [stdout] --> src/generation/melody.rs:311:34 [INFO] [stdout] | [INFO] [stdout] 311 | fn pad_phrase(&self, phrase: &mut Vec, target_beats: f32) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stdout] = note: `#[warn(clippy::ptr_arg)]` on by default [INFO] [stdout] help: change this to [INFO] [stdout] | [INFO] [stdout] 311 - fn pad_phrase(&self, phrase: &mut Vec, target_beats: f32) { [INFO] [stdout] 311 + fn pad_phrase(&self, phrase: &mut [MelodyNote], target_beats: f32) { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` has identical blocks [INFO] [stdout] --> src/display/fretboard.rs:80:27 [INFO] [stdout] | [INFO] [stdout] 80 | if marker { [INFO] [stdout] | ___________________________^ [INFO] [stdout] 81 | | result.push_str("───"); [INFO] [stdout] 82 | | } else { [INFO] [stdout] | |_________________^ [INFO] [stdout] | [INFO] [stdout] note: same as this [INFO] [stdout] --> src/display/fretboard.rs:82:24 [INFO] [stdout] | [INFO] [stdout] 82 | } else { [INFO] [stdout] | ________________________^ [INFO] [stdout] 83 | | result.push_str("───"); [INFO] [stdout] 84 | | } [INFO] [stdout] | |_________________^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#if_same_then_else [INFO] [stdout] = note: `#[warn(clippy::if_same_then_else)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this boolean expression can be simplified [INFO] [stdout] --> src/main.rs:410:12 [INFO] [stdout] | [INFO] [stdout] 410 | if piano || (!piano && !fretboard) { [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] 410 - if piano || (!piano && !fretboard) { [INFO] [stdout] 410 + if !(!piano && fretboard) { [INFO] [stdout] | [INFO] [stdout] 410 - if piano || (!piano && !fretboard) { [INFO] [stdout] 410 + if piano || !fretboard { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this boolean expression can be simplified [INFO] [stdout] --> src/main.rs:435:20 [INFO] [stdout] | [INFO] [stdout] 435 | if piano || (!piano && !fretboard) { [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] help: try [INFO] [stdout] | [INFO] [stdout] 435 - if piano || (!piano && !fretboard) { [INFO] [stdout] 435 + if !(!piano && fretboard) { [INFO] [stdout] | [INFO] [stdout] 435 - if piano || (!piano && !fretboard) { [INFO] [stdout] 435 + if piano || !fretboard { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this boolean expression can be simplified [INFO] [stdout] --> src/main.rs:451:12 [INFO] [stdout] | [INFO] [stdout] 451 | if piano || (!piano && !fretboard) { [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] help: try [INFO] [stdout] | [INFO] [stdout] 451 - if piano || (!piano && !fretboard) { [INFO] [stdout] 451 + if !(!piano && fretboard) { [INFO] [stdout] | [INFO] [stdout] 451 - if piano || (!piano && !fretboard) { [INFO] [stdout] 451 + if piano || !fretboard { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: literal with an empty format string [INFO] [stdout] --> src/main.rs:488:64 [INFO] [stdout] | [INFO] [stdout] 488 | println!(" {} {}", "Possible chords:".white().bold(), ""); [INFO] [stdout] | ^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#print_literal [INFO] [stdout] = note: `#[warn(clippy::print_literal)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 488 - println!(" {} {}", "Possible chords:".white().bold(), ""); [INFO] [stdout] 488 + println!(" {} ", "Possible chords:".white().bold()); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: useless use of `vec!` [INFO] [stdout] --> src/generation/melody.rs:284:22 [INFO] [stdout] | [INFO] [stdout] 284 | let rhythm = vec![0.5, 0.5, 0.5, 0.5, 1.0]; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: you can use an array directly: `[0.5, 0.5, 0.5, 0.5, 1.0]` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_vec [INFO] [stdout] = note: `#[warn(clippy::useless_vec)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 12.83s [INFO] running `Command { std: "docker" "inspect" "e43f03bddc98c17a096d23b64b2bb5e5e06774d925c5c0afecfd75fd647db4b7", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "e43f03bddc98c17a096d23b64b2bb5e5e06774d925c5c0afecfd75fd647db4b7", kill_on_drop: false }` [INFO] [stdout] e43f03bddc98c17a096d23b64b2bb5e5e06774d925c5c0afecfd75fd647db4b7