[INFO] updating cached repository cpsdqs/espterm-emulator [INFO] running `"git" "fetch" "--all"` [INFO] [stdout] Fetching origin [INFO] [stderr] From git://github.com/cpsdqs/espterm-emulator [INFO] [stderr] * branch HEAD -> FETCH_HEAD [INFO] running `"git" "clone" "work/cache/sources/gh/cpsdqs/espterm-emulator" "work/ex/clippy-test-run/sources/stable/gh/cpsdqs/espterm-emulator"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable/gh/cpsdqs/espterm-emulator'... [INFO] [stderr] done. [INFO] running `"git" "clone" "work/cache/sources/gh/cpsdqs/espterm-emulator" "work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/cpsdqs/espterm-emulator"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/cpsdqs/espterm-emulator'... [INFO] [stderr] done. [INFO] running `"git" "rev-parse" "HEAD"` [INFO] [stdout] 1cb282bcada98d073eb4537e49dabb7432e250fc [INFO] sha for GitHub repo cpsdqs/espterm-emulator: 1cb282bcada98d073eb4537e49dabb7432e250fc [INFO] validating manifest of cpsdqs/espterm-emulator on toolchain stable [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "read-manifest" "--manifest-path" "Cargo.toml"` [INFO] validating manifest of cpsdqs/espterm-emulator on toolchain stable+rustflags=-Dclippy::into_iter_on_array [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "read-manifest" "--manifest-path" "Cargo.toml"` [INFO] started frobbing cpsdqs/espterm-emulator [INFO] finished frobbing cpsdqs/espterm-emulator [INFO] frobbed toml for cpsdqs/espterm-emulator written to work/ex/clippy-test-run/sources/stable/gh/cpsdqs/espterm-emulator/Cargo.toml [INFO] started frobbing cpsdqs/espterm-emulator [INFO] finished frobbing cpsdqs/espterm-emulator [INFO] frobbed toml for cpsdqs/espterm-emulator written to work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/cpsdqs/espterm-emulator/Cargo.toml [INFO] crate cpsdqs/espterm-emulator has a lockfile. skipping [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "fetch" "--locked" "--manifest-path" "Cargo.toml"` [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "fetch" "--locked" "--manifest-path" "Cargo.toml"` [INFO] linting cpsdqs/espterm-emulator against stable for clippy-test-run [INFO] running `"docker" "create" "-v" "/mnt/big/crater/work/local/target-dirs/clippy-test-run/worker-6/stable:/opt/crater/target:rw,Z" "-v" "/mnt/big/crater/work/ex/clippy-test-run/sources/stable/gh/cpsdqs/espterm-emulator:/opt/crater/workdir:ro,Z" "-v" "/mnt/big/crater/work/local/cargo-home:/opt/crater/cargo-home:ro,Z" "-v" "/mnt/big/crater/work/local/rustup-home:/opt/crater/rustup-home:ro,Z" "-e" "USER_ID=1000" "-e" "SOURCE_DIR=/opt/crater/workdir" "-e" "MAP_USER_ID=1000" "-e" "CARGO_TARGET_DIR=/opt/crater/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/crater/cargo-home" "-e" "RUSTUP_HOME=/opt/crater/rustup-home" "-w" "/opt/crater/workdir" "-m" "1536M" "--network" "none" "rustops/crates-build-env" "/opt/crater/cargo-home/bin/cargo" "+stable" "clippy" "--frozen" "--all" "--all-targets"` [INFO] [stdout] b20704a023a87444e1889f4659b7d408b7622d5910c33068ff5cc001e024e28c [INFO] running `"docker" "start" "-a" "b20704a023a87444e1889f4659b7d408b7622d5910c33068ff5cc001e024e28c"` [INFO] [stderr] Checking errno v0.1.8 [INFO] [stderr] Checking qstring v0.6.0 [INFO] [stderr] Checking serde_json v1.0.26 [INFO] [stderr] Checking ws v0.7.6 [INFO] [stderr] Checking pty v0.2.2 [INFO] [stderr] Checking espterm-emulator v0.1.0 (/opt/crater/workdir) [INFO] [stderr] warning: long literal lacking separators [INFO] [stderr] --> src/main.rs:509:65 [INFO] [stderr] | [INFO] [stderr] 509 | content.push(terminal::encode_as_code_point(999999)); [INFO] [stderr] | ^^^^^^ help: consider: `999_999` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::unreadable_literal)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unreadable_literal [INFO] [stderr] [INFO] [stderr] warning: long literal lacking separators [INFO] [stderr] --> src/main.rs:509:65 [INFO] [stderr] | [INFO] [stderr] 509 | content.push(terminal::encode_as_code_point(999999)); [INFO] [stderr] | ^^^^^^ help: consider: `999_999` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::unreadable_literal)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unreadable_literal [INFO] [stderr] [INFO] [stderr] warning: method is never used: `is_tracking_mouse` [INFO] [stderr] --> src/terminal/mod.rs:641:5 [INFO] [stderr] | [INFO] [stderr] 641 | pub fn is_tracking_mouse(&self) -> bool { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(dead_code)] on by default [INFO] [stderr] [INFO] [stderr] warning: method is never used: `reset_partial_screen` [INFO] [stderr] --> src/terminal/mod.rs:652:5 [INFO] [stderr] | [INFO] [stderr] 652 | pub fn reset_partial_screen(&mut self) { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: the function has a cyclomatic complexity of 26 [INFO] [stderr] --> src/terminal/seq_parser.rs:150:5 [INFO] [stderr] | [INFO] [stderr] 150 | / pub fn apply_seq(&mut self) { [INFO] [stderr] 151 | | let seq = mem::replace(&mut self.sequence, String::new()); [INFO] [stderr] 152 | | self.reset_state(); [INFO] [stderr] 153 | | let first_char = seq.chars().next().unwrap_or(0 as char); [INFO] [stderr] ... | [INFO] [stderr] 492 | | }; [INFO] [stderr] 493 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::cyclomatic_complexity)] on by default [INFO] [stderr] = help: you could split it up into multiple smaller functions [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cyclomatic_complexity [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/terminal/seq_parser.rs:171:52 [INFO] [stderr] | [INFO] [stderr] 171 | let numbers: Vec> = if content.trim().len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `content.trim().is_empty()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::len_zero)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/terminal/seq_parser.rs:251:28 [INFO] [stderr] | [INFO] [stderr] 251 | if numbers.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `numbers.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: this loop could be written as a `while let` loop [INFO] [stderr] --> src/terminal/seq_parser.rs:255:29 [INFO] [stderr] | [INFO] [stderr] 255 | / loop { [INFO] [stderr] 256 | | if let Some(sgr_type) = numbers.next() { [INFO] [stderr] 257 | | let sgr_type = sgr_type.unwrap_or(0); [INFO] [stderr] 258 | | match sgr_type { [INFO] [stderr] ... | [INFO] [stderr] 381 | | } [INFO] [stderr] 382 | | } [INFO] [stderr] | |_____________________________^ help: try: `while let Some(sgr_type) = numbers.next() { .. }` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::while_let_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_loop [INFO] [stderr] [INFO] [stderr] warning: it looks like you're manually copying between slices [INFO] [stderr] --> src/terminal/mod.rs:105:22 [INFO] [stderr] | [INFO] [stderr] 105 | for x in 0..old_lines[0].len().min(width) { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try replacing the loop by: `self.lines[y][..old_lines[0].len().min(width)].clone_from_slice(&old_lines[y][..old_lines[0].len().min(width)])` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::manual_memcpy)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_memcpy [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/terminal/mod.rs:226:13 [INFO] [stderr] | [INFO] [stderr] 226 | self.state.style.clone(), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `self.state.style` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::clone_on_copy)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: `if _ { .. } else { .. }` is an expression [INFO] [stderr] --> src/terminal/mod.rs:261:9 [INFO] [stderr] | [INFO] [stderr] 261 | / let line; [INFO] [stderr] 262 | | if target < 0 || target as u32 >= self.state.scroll_margin_bottom { [INFO] [stderr] 263 | | line = ScreenBuffer::make_line(self.width as usize, self.state.style); [INFO] [stderr] 264 | | } else { [INFO] [stderr] 265 | | line = self.state.buffer.lines[target as usize].clone(); [INFO] [stderr] 266 | | } [INFO] [stderr] | |_________^ help: it is more idiomatic to write: `let line = if target < 0 || target as u32 >= self.state.scroll_margin_bottom { ScreenBuffer::make_line(self.width as usize, self.state.style) } else { self.state.buffer.lines[target as usize].clone() };` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::useless_let_if_seq)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_let_if_seq [INFO] [stderr] [INFO] [stderr] warning: method is never used: `is_tracking_mouse` [INFO] [stderr] --> src/terminal/mod.rs:641:5 [INFO] [stderr] | [INFO] [stderr] 641 | pub fn is_tracking_mouse(&self) -> bool { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(dead_code)] on by default [INFO] [stderr] [INFO] [stderr] warning: method is never used: `reset_partial_screen` [INFO] [stderr] --> src/terminal/mod.rs:652:5 [INFO] [stderr] | [INFO] [stderr] 652 | pub fn reset_partial_screen(&mut self) { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/terminal/mod.rs:463:37 [INFO] [stderr] | [INFO] [stderr] 463 | let current_style = self.state.style.clone(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `self.state.style` [INFO] [stderr] warning: constant item is never used: `TOPIC_CHANGE_CONTENT_ALL` [INFO] [stderr] --> src/main.rs:416:9 [INFO] [stderr] | [INFO] [stderr] 416 | const TOPIC_CHANGE_CONTENT_ALL: u8 = 1 << 1; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] | [INFO] [stderr] warning: constant item is never used: `TOPIC_CHANGE_BUTTONS` [INFO] [stderr] --> src/main.rs:419:9 [INFO] [stderr] | [INFO] [stderr] 419 | const TOPIC_CHANGE_BUTTONS: u8 = 1 << 4; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/terminal/mod.rs:468:68 [INFO] [stderr] | [INFO] [stderr] 468 | self.clear_line_before(cursor_y, cursor_x, current_style.clone()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `current_style` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/terminal/mod.rs:470:48 [INFO] [stderr] | [INFO] [stderr] 470 | self.clear_line(y, current_style.clone()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `current_style` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/terminal/mod.rs:474:67 [INFO] [stderr] | [INFO] [stderr] 474 | self.clear_line_after(cursor_y, cursor_x, current_style.clone()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `current_style` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/terminal/mod.rs:476:48 [INFO] [stderr] | [INFO] [stderr] 476 | self.clear_line(y, current_style.clone()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `current_style` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/terminal/mod.rs:484:37 [INFO] [stderr] | [INFO] [stderr] 484 | let current_style = self.state.style.clone(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `self.state.style` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: the operation is ineffective. Consider reducing it to `1` [INFO] [stderr] --> src/terminal/mod.rs:516:43 [INFO] [stderr] | [INFO] [stderr] 516 | self.state.style.attrs |= 1 << 0; // set attr_fg [INFO] [stderr] | ^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::identity_op)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#identity_op [INFO] [stderr] [INFO] [stderr] warning: the operation is ineffective. Consider reducing it to `1` [INFO] [stderr] --> src/terminal/mod.rs:522:56 [INFO] [stderr] | [INFO] [stderr] 522 | ResetColorFG => self.state.style.attrs &= !(1 << 0), [INFO] [stderr] | ^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#identity_op [INFO] [stderr] [INFO] [stderr] warning: casting u8 to u32 may become silently lossy if types change [INFO] [stderr] --> src/terminal/mod.rs:621:23 [INFO] [stderr] | [INFO] [stderr] 621 | attributes |= (self.state.cursor.style as u32) << 9; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `u32::from(self.state.cursor.style)` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::cast_lossless)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: casting u8 to u32 may become silently lossy if types change [INFO] [stderr] --> src/terminal/mod.rs:634:9 [INFO] [stderr] | [INFO] [stderr] 634 | self.state.charset as u32 [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `u32::from(self.state.charset)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/terminal/mod.rs:661:33 [INFO] [stderr] | [INFO] [stderr] 661 | screen_vec.push(self.state.buffer.lines[y][x].clone()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `self.state.buffer.lines[y][x]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: casting i32 to f64 may become silently lossy if types change [INFO] [stderr] --> src/terminal/mod.rs:744:47 [INFO] [stderr] | [INFO] [stderr] 744 | fg: get_rainbow_color(((x + y) as f64) / 10.0 + time), [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: try: `f64::from(x + y)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/terminal/mod.rs:749:21 [INFO] [stderr] | [INFO] [stderr] 749 | cell.style.clone() [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `cell.style` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: casting u16 to u32 may become silently lossy if types change [INFO] [stderr] --> src/terminal/mod.rs:777:56 [INFO] [stderr] | [INFO] [stderr] 777 | data.push(encode_as_code_point(style.attrs as u32)); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^ help: try: `u32::from(style.attrs)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: the variable `index` is used as a loop counter. Consider using `for (index, item) in &self.state.buffer.line_sizes.enumerate()` or similar iterators [INFO] [stderr] --> src/terminal/mod.rs:793:21 [INFO] [stderr] | [INFO] [stderr] 793 | for size in &self.state.buffer.line_sizes { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::explicit_counter_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_counter_loop [INFO] [stderr] [INFO] [stderr] warning: the function has a cyclomatic complexity of 26 [INFO] [stderr] --> src/terminal/seq_parser.rs:150:5 [INFO] [stderr] | [INFO] [stderr] 150 | / pub fn apply_seq(&mut self) { [INFO] [stderr] 151 | | let seq = mem::replace(&mut self.sequence, String::new()); [INFO] [stderr] 152 | | self.reset_state(); [INFO] [stderr] 153 | | let first_char = seq.chars().next().unwrap_or(0 as char); [INFO] [stderr] ... | [INFO] [stderr] 492 | | }; [INFO] [stderr] 493 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::cyclomatic_complexity)] on by default [INFO] [stderr] = help: you could split it up into multiple smaller functions [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cyclomatic_complexity [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/terminal/seq_parser.rs:171:52 [INFO] [stderr] | [INFO] [stderr] 171 | let numbers: Vec> = if content.trim().len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `content.trim().is_empty()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::len_zero)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/main.rs:32:47 [INFO] [stderr] | [INFO] [stderr] 32 | let parts: Vec<_> = captures[1].split(":").collect(); [INFO] [stderr] | ^^^ help: try using a char instead: `':'` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_char_pattern)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_char_pattern [INFO] [stderr] [INFO] [stderr] warning: casting u8 to u32 may become silently lossy if types change [INFO] [stderr] --> src/main.rs:47:6 [INFO] [stderr] | [INFO] [stderr] 47 | (data[0] as u32 - 1) + (data[1] as u32 - 1) * 127 [INFO] [stderr] | ^^^^^^^^^^^^^^ help: try: `u32::from(data[0])` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: casting u8 to u32 may become silently lossy if types change [INFO] [stderr] --> src/main.rs:47:29 [INFO] [stderr] | [INFO] [stderr] 47 | (data[0] as u32 - 1) + (data[1] as u32 - 1) * 127 [INFO] [stderr] | ^^^^^^^^^^^^^^ help: try: `u32::from(data[1])` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/terminal/seq_parser.rs:251:28 [INFO] [stderr] | [INFO] [stderr] 251 | if numbers.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `numbers.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: this loop could be written as a `while let` loop [INFO] [stderr] --> src/terminal/seq_parser.rs:255:29 [INFO] [stderr] | [INFO] [stderr] 255 | / loop { [INFO] [stderr] 256 | | if let Some(sgr_type) = numbers.next() { [INFO] [stderr] 257 | | let sgr_type = sgr_type.unwrap_or(0); [INFO] [stderr] 258 | | match sgr_type { [INFO] [stderr] ... | [INFO] [stderr] 381 | | } [INFO] [stderr] 382 | | } [INFO] [stderr] | |_____________________________^ help: try: `while let Some(sgr_type) = numbers.next() { .. }` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::while_let_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_loop [INFO] [stderr] [INFO] [stderr] warning: it looks like you're manually copying between slices [INFO] [stderr] --> src/terminal/mod.rs:105:22 [INFO] [stderr] | [INFO] [stderr] 105 | for x in 0..old_lines[0].len().min(width) { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try replacing the loop by: `self.lines[y][..old_lines[0].len().min(width)].clone_from_slice(&old_lines[y][..old_lines[0].len().min(width)])` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::manual_memcpy)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_memcpy [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/terminal/mod.rs:226:13 [INFO] [stderr] | [INFO] [stderr] 226 | self.state.style.clone(), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `self.state.style` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::clone_on_copy)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: `if _ { .. } else { .. }` is an expression [INFO] [stderr] --> src/terminal/mod.rs:261:9 [INFO] [stderr] | [INFO] [stderr] 261 | / let line; [INFO] [stderr] 262 | | if target < 0 || target as u32 >= self.state.scroll_margin_bottom { [INFO] [stderr] 263 | | line = ScreenBuffer::make_line(self.width as usize, self.state.style); [INFO] [stderr] 264 | | } else { [INFO] [stderr] 265 | | line = self.state.buffer.lines[target as usize].clone(); [INFO] [stderr] 266 | | } [INFO] [stderr] | |_________^ help: it is more idiomatic to write: `let line = if target < 0 || target as u32 >= self.state.scroll_margin_bottom { ScreenBuffer::make_line(self.width as usize, self.state.style) } else { self.state.buffer.lines[target as usize].clone() };` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::useless_let_if_seq)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_let_if_seq [INFO] [stderr] [INFO] [stderr] warning: Matching on `Some` with `ok()` is redundant [INFO] [stderr] --> src/main.rs:360:5 [INFO] [stderr] | [INFO] [stderr] 360 | / if let Some(mut master) = fork.is_parent().ok() { [INFO] [stderr] 361 | | let slave_fd; [INFO] [stderr] 362 | | unsafe { [INFO] [stderr] 363 | | let fd = master.as_raw_fd(); [INFO] [stderr] ... | [INFO] [stderr] 677 | | } [INFO] [stderr] 678 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::if_let_some_result)] on by default [INFO] [stderr] = help: Consider matching on `Ok(mut master)` and removing the call to `ok` instead [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#if_let_some_result [INFO] [stderr] [INFO] [stderr] warning: this loop could be written as a `while let` loop [INFO] [stderr] --> src/main.rs:429:13 [INFO] [stderr] | [INFO] [stderr] 429 | / loop { [INFO] [stderr] 430 | | if let Ok(data) = shell_recv.try_recv() { [INFO] [stderr] 431 | | master.write(&data).unwrap(); [INFO] [stderr] 432 | | } else { [INFO] [stderr] 433 | | break; [INFO] [stderr] 434 | | } [INFO] [stderr] 435 | | } [INFO] [stderr] | |_____________^ help: try: `while let Ok(data) = shell_recv.try_recv() { .. }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_loop [INFO] [stderr] [INFO] [stderr] error: handle written amount returned or use `Write::write_all` instead [INFO] [stderr] --> src/main.rs:431:21 [INFO] [stderr] | [INFO] [stderr] 431 | master.write(&data).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[deny(clippy::unused_io_amount)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unused_io_amount [INFO] [stderr] [INFO] [stderr] warning: you seem to want to iterate on a map's values [INFO] [stderr] --> src/main.rs:469:40 [INFO] [stderr] | [INFO] [stderr] 469 | for (_, client) in &state.clients { [INFO] [stderr] | ^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::for_kv_map)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#for_kv_map [INFO] [stderr] help: use the corresponding method [INFO] [stderr] | [INFO] [stderr] 469 | for client in state.clients.values() { [INFO] [stderr] | ^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/terminal/mod.rs:463:37 [INFO] [stderr] | [INFO] [stderr] 463 | let current_style = self.state.style.clone(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `self.state.style` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/terminal/mod.rs:468:68 [INFO] [stderr] | [INFO] [stderr] 468 | self.clear_line_before(cursor_y, cursor_x, current_style.clone()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `current_style` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/terminal/mod.rs:470:48 [INFO] [stderr] | [INFO] [stderr] 470 | self.clear_line(y, current_style.clone()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `current_style` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/terminal/mod.rs:474:67 [INFO] [stderr] | [INFO] [stderr] 474 | self.clear_line_after(cursor_y, cursor_x, current_style.clone()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `current_style` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/terminal/mod.rs:476:48 [INFO] [stderr] | [INFO] [stderr] 476 | self.clear_line(y, current_style.clone()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `current_style` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/terminal/mod.rs:484:37 [INFO] [stderr] | [INFO] [stderr] 484 | let current_style = self.state.style.clone(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `self.state.style` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: the operation is ineffective. Consider reducing it to `1` [INFO] [stderr] --> src/terminal/mod.rs:516:43 [INFO] [stderr] | [INFO] [stderr] 516 | self.state.style.attrs |= 1 << 0; // set attr_fg [INFO] [stderr] | ^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::identity_op)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#identity_op [INFO] [stderr] [INFO] [stderr] warning: the operation is ineffective. Consider reducing it to `1` [INFO] [stderr] --> src/terminal/mod.rs:522:56 [INFO] [stderr] | [INFO] [stderr] 522 | ResetColorFG => self.state.style.attrs &= !(1 << 0), [INFO] [stderr] | ^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#identity_op [INFO] [stderr] [INFO] [stderr] warning: casting u32 to f64 may become silently lossy if types change [INFO] [stderr] --> src/main.rs:612:52 [INFO] [stderr] | [INFO] [stderr] 612 | elapsed.as_secs() as f64 + elapsed.subsec_nanos() as f64 / 1_000_000_000.; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `f64::from(elapsed.subsec_nanos())` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: casting u8 to u32 may become silently lossy if types change [INFO] [stderr] --> src/terminal/mod.rs:621:23 [INFO] [stderr] | [INFO] [stderr] 621 | attributes |= (self.state.cursor.style as u32) << 9; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `u32::from(self.state.cursor.style)` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::cast_lossless)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: casting u8 to u32 may become silently lossy if types change [INFO] [stderr] --> src/terminal/mod.rs:634:9 [INFO] [stderr] | [INFO] [stderr] 634 | self.state.charset as u32 [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `u32::from(self.state.charset)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/terminal/mod.rs:661:33 [INFO] [stderr] | [INFO] [stderr] 661 | screen_vec.push(self.state.buffer.lines[y][x].clone()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `self.state.buffer.lines[y][x]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: casting i32 to f64 may become silently lossy if types change [INFO] [stderr] --> src/terminal/mod.rs:744:47 [INFO] [stderr] | [INFO] [stderr] 744 | fg: get_rainbow_color(((x + y) as f64) / 10.0 + time), [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: try: `f64::from(x + y)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/terminal/mod.rs:749:21 [INFO] [stderr] | [INFO] [stderr] 749 | cell.style.clone() [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `cell.style` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: casting u16 to u32 may become silently lossy if types change [INFO] [stderr] --> src/terminal/mod.rs:777:56 [INFO] [stderr] | [INFO] [stderr] 777 | data.push(encode_as_code_point(style.attrs as u32)); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^ help: try: `u32::from(style.attrs)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] error: aborting due to previous error [INFO] [stderr] [INFO] [stderr] warning: the variable `index` is used as a loop counter. Consider using `for (index, item) in &self.state.buffer.line_sizes.enumerate()` or similar iterators [INFO] [stderr] --> src/terminal/mod.rs:793:21 [INFO] [stderr] | [INFO] [stderr] 793 | for size in &self.state.buffer.line_sizes { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::explicit_counter_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_counter_loop [INFO] [stderr] [INFO] [stderr] error: Could not compile `espterm-emulator`. [INFO] [stderr] warning: build failed, waiting for other jobs to finish... [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/main.rs:32:47 [INFO] [stderr] | [INFO] [stderr] 32 | let parts: Vec<_> = captures[1].split(":").collect(); [INFO] [stderr] | ^^^ help: try using a char instead: `':'` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_char_pattern)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_char_pattern [INFO] [stderr] [INFO] [stderr] warning: casting u8 to u32 may become silently lossy if types change [INFO] [stderr] --> src/main.rs:47:6 [INFO] [stderr] | [INFO] [stderr] 47 | (data[0] as u32 - 1) + (data[1] as u32 - 1) * 127 [INFO] [stderr] | ^^^^^^^^^^^^^^ help: try: `u32::from(data[0])` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: casting u8 to u32 may become silently lossy if types change [INFO] [stderr] --> src/main.rs:47:29 [INFO] [stderr] | [INFO] [stderr] 47 | (data[0] as u32 - 1) + (data[1] as u32 - 1) * 127 [INFO] [stderr] | ^^^^^^^^^^^^^^ help: try: `u32::from(data[1])` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: Matching on `Some` with `ok()` is redundant [INFO] [stderr] --> src/main.rs:360:5 [INFO] [stderr] | [INFO] [stderr] 360 | / if let Some(mut master) = fork.is_parent().ok() { [INFO] [stderr] 361 | | let slave_fd; [INFO] [stderr] 362 | | unsafe { [INFO] [stderr] 363 | | let fd = master.as_raw_fd(); [INFO] [stderr] ... | [INFO] [stderr] 677 | | } [INFO] [stderr] 678 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::if_let_some_result)] on by default [INFO] [stderr] = help: Consider matching on `Ok(mut master)` and removing the call to `ok` instead [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#if_let_some_result [INFO] [stderr] [INFO] [stderr] warning: this loop could be written as a `while let` loop [INFO] [stderr] --> src/main.rs:429:13 [INFO] [stderr] | [INFO] [stderr] 429 | / loop { [INFO] [stderr] 430 | | if let Ok(data) = shell_recv.try_recv() { [INFO] [stderr] 431 | | master.write(&data).unwrap(); [INFO] [stderr] 432 | | } else { [INFO] [stderr] 433 | | break; [INFO] [stderr] 434 | | } [INFO] [stderr] 435 | | } [INFO] [stderr] | |_____________^ help: try: `while let Ok(data) = shell_recv.try_recv() { .. }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_loop [INFO] [stderr] [INFO] [stderr] error: handle written amount returned or use `Write::write_all` instead [INFO] [stderr] --> src/main.rs:431:21 [INFO] [stderr] | [INFO] [stderr] 431 | master.write(&data).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[deny(clippy::unused_io_amount)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unused_io_amount [INFO] [stderr] [INFO] [stderr] warning: you seem to want to iterate on a map's values [INFO] [stderr] --> src/main.rs:469:40 [INFO] [stderr] | [INFO] [stderr] 469 | for (_, client) in &state.clients { [INFO] [stderr] | ^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::for_kv_map)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#for_kv_map [INFO] [stderr] help: use the corresponding method [INFO] [stderr] | [INFO] [stderr] 469 | for client in state.clients.values() { [INFO] [stderr] | ^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: casting u32 to f64 may become silently lossy if types change [INFO] [stderr] --> src/main.rs:612:52 [INFO] [stderr] | [INFO] [stderr] 612 | elapsed.as_secs() as f64 + elapsed.subsec_nanos() as f64 / 1_000_000_000.; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `f64::from(elapsed.subsec_nanos())` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] error: aborting due to previous error [INFO] [stderr] [INFO] [stderr] error: Could not compile `espterm-emulator`. [INFO] [stderr] [INFO] [stderr] To learn more, run the command again with --verbose. [INFO] running `"docker" "inspect" "b20704a023a87444e1889f4659b7d408b7622d5910c33068ff5cc001e024e28c"` [INFO] running `"docker" "rm" "-f" "b20704a023a87444e1889f4659b7d408b7622d5910c33068ff5cc001e024e28c"` [INFO] [stdout] b20704a023a87444e1889f4659b7d408b7622d5910c33068ff5cc001e024e28c