[INFO] cloning repository https://github.com/Cybernetick/rust-bittorrent-client [INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/Cybernetick/rust-bittorrent-client" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FCybernetick%2Frust-bittorrent-client", kill_on_drop: false }` [INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FCybernetick%2Frust-bittorrent-client'... [INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }` [INFO] [stdout] e7a5c0a68f2c9e24d32bb703391a7f073a00ba92 [INFO] linting Cybernetick/rust-bittorrent-client against nightly for clippy-nonminimal_bool-denied [INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FCybernetick%2Frust-bittorrent-client" "/workspace/builds/worker-2-tc1/source", kill_on_drop: false }` [INFO] [stderr] Cloning into '/workspace/builds/worker-2-tc1/source'... [INFO] [stderr] done. [INFO] started tweaking git repo https://github.com/Cybernetick/rust-bittorrent-client [INFO] finished tweaking git repo https://github.com/Cybernetick/rust-bittorrent-client [INFO] tweaked toml for git repo https://github.com/Cybernetick/rust-bittorrent-client written to /workspace/builds/worker-2-tc1/source/Cargo.toml [INFO] validating manifest of git repo https://github.com/Cybernetick/rust-bittorrent-client 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/Cybernetick/rust-bittorrent-client 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 windows-targets v0.48.4 [INFO] [stderr] Downloaded serde_bytes v0.11.12 [INFO] [stderr] Downloaded base16 v0.2.1 [INFO] [stderr] Downloaded serde_bencode v0.2.3 [INFO] [stderr] Downloaded anstyle-wincon v1.0.2 [INFO] [stderr] Downloaded clap v4.3.22 [INFO] [stderr] Downloaded clap_builder v4.3.22 [INFO] [stderr] Downloaded windows_x86_64_gnullvm v0.48.4 [INFO] [stderr] Downloaded windows_aarch64_gnullvm v0.48.4 [INFO] [stderr] Downloaded windows_aarch64_msvc v0.48.4 [INFO] [stderr] Downloaded windows_x86_64_msvc v0.48.4 [INFO] [stderr] Downloaded windows_i686_gnu v0.48.4 [INFO] [stderr] Downloaded windows_x86_64_gnu v0.48.4 [INFO] [stderr] Downloaded windows_i686_msvc v0.48.4 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-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] d532df9e347d395f053d2596fde44e4eeedecf5b24275039a5d471c817d5c5aa [INFO] running `Command { std: "docker" "start" "-a" "d532df9e347d395f053d2596fde44e4eeedecf5b24275039a5d471c817d5c5aa", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "d532df9e347d395f053d2596fde44e4eeedecf5b24275039a5d471c817d5c5aa", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "d532df9e347d395f053d2596fde44e4eeedecf5b24275039a5d471c817d5c5aa", kill_on_drop: false }` [INFO] [stdout] d532df9e347d395f053d2596fde44e4eeedecf5b24275039a5d471c817d5c5aa [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-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] 47efb28b94ffebf0009d664949645cfdbbfd23fc97c88049e18d83cbc8915df1 [INFO] running `Command { std: "docker" "start" "-a" "47efb28b94ffebf0009d664949645cfdbbfd23fc97c88049e18d83cbc8915df1", kill_on_drop: false }` [INFO] [stderr] Checking bytes v1.3.0 [INFO] [stderr] Compiling libc v0.2.153 [INFO] [stderr] Compiling rustix v0.38.8 [INFO] [stderr] Compiling quote v1.0.33 [INFO] [stderr] Checking parking_lot v0.12.1 [INFO] [stderr] Checking generic-array v0.14.7 [INFO] [stderr] Compiling syn v1.0.48 [INFO] [stderr] Checking futures-util v0.3.30 [INFO] [stderr] Checking indexmap v2.2.5 [INFO] [stderr] Checking anstyle-parse v0.2.1 [INFO] [stderr] Checking anstyle-query v1.0.0 [INFO] [stderr] Checking colorchoice v1.0.0 [INFO] [stderr] Checking anstyle v1.0.1 [INFO] [stderr] Checking idna v0.4.0 [INFO] [stderr] Checking regex-syntax v0.7.4 [INFO] [stderr] Checking clap_lex v0.5.0 [INFO] [stderr] Compiling syn v2.0.29 [INFO] [stderr] Checking serde_json v1.0.105 [INFO] [stderr] Checking serde_urlencoded v0.7.1 [INFO] [stderr] Checking serde_bytes v0.11.12 [INFO] [stderr] Checking http v0.2.12 [INFO] [stderr] Checking fastrand v2.0.0 [INFO] [stderr] Checking cpufeatures v0.2.9 [INFO] [stderr] Checking base16 v0.2.1 [INFO] [stderr] Checking serde_bencode v0.2.3 [INFO] [stderr] Checking crypto-common v0.1.6 [INFO] [stderr] Checking block-buffer v0.10.4 [INFO] [stderr] Compiling cc v1.0.82 [INFO] [stderr] Checking digest v0.10.7 [INFO] [stderr] Checking url v2.4.1 [INFO] [stderr] Checking sha1 v0.10.6 [INFO] [stderr] Checking http-body v0.4.6 [INFO] [stderr] Compiling openssl-sys v0.9.101 [INFO] [stderr] Compiling openssl v0.10.64 [INFO] [stderr] Compiling native-tls v0.2.11 [INFO] [stderr] Compiling thiserror-impl v1.0.38 [INFO] [stderr] Checking is-terminal v0.4.9 [INFO] [stderr] Checking tempfile v3.7.1 [INFO] [stderr] Checking regex-automata v0.3.6 [INFO] [stderr] Checking anstream v0.3.2 [INFO] [stderr] Checking clap_builder v4.3.22 [INFO] [stderr] Compiling tokio-macros v2.2.0 [INFO] [stderr] Compiling openssl-macros v0.1.1 [INFO] [stderr] Compiling clap_derive v4.3.12 [INFO] [stderr] Checking thiserror v1.0.38 [INFO] [stderr] Checking tokio v1.36.0 [INFO] [stderr] Checking clap v4.3.22 [INFO] [stderr] Checking regex v1.9.3 [INFO] [stderr] Checking tokio-util v0.7.10 [INFO] [stderr] Checking tokio-native-tls v0.3.1 [INFO] [stderr] Checking h2 v0.3.25 [INFO] [stderr] Checking hyper v0.14.28 [INFO] [stderr] Checking hyper-tls v0.5.0 [INFO] [stderr] Checking reqwest v0.11.27 [INFO] [stderr] Checking bittorrent-starter-rust v0.1.0 (/opt/rustwide/workdir) [INFO] [stdout] warning: this import is redundant [INFO] [stdout] --> src/main.rs:4:1 [INFO] [stdout] | [INFO] [stdout] 4 | use serde_json; [INFO] [stdout] | ^^^^^^^^^^^^^^^ help: remove it entirely [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_component_path_imports [INFO] [stdout] = note: `#[warn(clippy::single_component_path_imports)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this import is redundant [INFO] [stdout] --> src/main.rs:4:1 [INFO] [stdout] | [INFO] [stdout] 4 | use serde_json; [INFO] [stdout] | ^^^^^^^^^^^^^^^ help: remove it entirely [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_component_path_imports [INFO] [stdout] = note: `#[warn(clippy::single_component_path_imports)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `interval` is never read [INFO] [stdout] --> src/tracker.rs:178:13 [INFO] [stdout] | [INFO] [stdout] 177 | struct PeersResponse { [INFO] [stdout] | ------------- field in this struct [INFO] [stdout] 178 | pub interval: usize, [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `PeersResponse` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis [INFO] [stdout] = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `interval` is never read [INFO] [stdout] --> src/tracker.rs:178:13 [INFO] [stdout] | [INFO] [stdout] 177 | struct PeersResponse { [INFO] [stdout] | ------------- field in this struct [INFO] [stdout] 178 | pub interval: usize, [INFO] [stdout] | ^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `PeersResponse` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis [INFO] [stdout] = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: module has the same name as its containing module [INFO] [stdout] --> src/tracker.rs:1:1 [INFO] [stdout] | [INFO] [stdout] 1 | / pub mod tracker { [INFO] [stdout] 2 | | use std::io::{Error, ErrorKind}; [INFO] [stdout] 3 | | use std::net::{IpAddr, SocketAddr}; [INFO] [stdout] 4 | | use std::path::PathBuf; [INFO] [stdout] ... | [INFO] [stdout] 266 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#module_inception [INFO] [stdout] = note: `#[warn(clippy::module_inception)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: module has the same name as its containing module [INFO] [stdout] --> src/tracker.rs:1:1 [INFO] [stdout] | [INFO] [stdout] 1 | / pub mod tracker { [INFO] [stdout] 2 | | use std::io::{Error, ErrorKind}; [INFO] [stdout] 3 | | use std::net::{IpAddr, SocketAddr}; [INFO] [stdout] 4 | | use std::path::PathBuf; [INFO] [stdout] ... | [INFO] [stdout] 266 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#module_inception [INFO] [stdout] = note: `#[warn(clippy::module_inception)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: slow zero-filling initialization [INFO] [stdout] --> src/tracker.rs:101:61 [INFO] [stdout] | [INFO] [stdout] 101 | ... let mut response_buf: Vec = vec![]; [INFO] [stdout] | _______________________________________________________^ [INFO] [stdout] 102 | | ... response_buf.resize(buf.len(), 0); [INFO] [stdout] | |_______________________________________________________^ help: consider replacing this with: `vec![0; buf.len()]` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#slow_vector_initialization [INFO] [stdout] = note: `#[warn(clippy::slow_vector_initialization)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manually reimplementing `div_ceil` [INFO] [stdout] --> src/tracker.rs:119:39 [INFO] [stdout] | [INFO] [stdout] 119 | let block_count = (meta_data.info.piece_length + (MAX_BLOCK_SIZE - 1)) / MAX_BLOCK_SIZE; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `meta_data.info.piece_length.div_ceil(MAX_BLOCK_SIZE)` [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: slow zero-filling initialization [INFO] [stdout] --> src/tracker.rs:101:61 [INFO] [stdout] | [INFO] [stdout] 101 | ... let mut response_buf: Vec = vec![]; [INFO] [stdout] | _______________________________________________________^ [INFO] [stdout] 102 | | ... response_buf.resize(buf.len(), 0); [INFO] [stdout] | |_______________________________________________________^ help: consider replacing this with: `vec![0; buf.len()]` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#slow_vector_initialization [INFO] [stdout] = note: `#[warn(clippy::slow_vector_initialization)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> src/tracker.rs:161:43 [INFO] [stdout] | [INFO] [stdout] 161 | encoded.push_str(&hex::encode(&[b])) [INFO] [stdout] | ^^^^ help: change this to: `[b]` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrows_for_generic_args [INFO] [stdout] = note: `#[warn(clippy::needless_borrows_for_generic_args)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manually reimplementing `div_ceil` [INFO] [stdout] --> src/tracker.rs:119:39 [INFO] [stdout] | [INFO] [stdout] 119 | let block_count = (meta_data.info.piece_length + (MAX_BLOCK_SIZE - 1)) / MAX_BLOCK_SIZE; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `meta_data.info.piece_length.div_ceil(MAX_BLOCK_SIZE)` [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: the borrowed expression implements the required traits [INFO] [stdout] --> src/tracker.rs:161:43 [INFO] [stdout] | [INFO] [stdout] 161 | encoded.push_str(&hex::encode(&[b])) [INFO] [stdout] | ^^^^ help: change this to: `[b]` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrows_for_generic_args [INFO] [stdout] = note: `#[warn(clippy::needless_borrows_for_generic_args)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/main.rs:15:5 [INFO] [stdout] | [INFO] [stdout] 15 | / return match encoded_string.chars().nth(0).expect("fail to create iterator over input string") { [INFO] [stdout] 16 | | 'i' => { [INFO] [stdout] 17 | | let delimiter = encoded_string.find('e').expect("supplied string starts like integer, but missing enclosing symbol"); [INFO] [stdout] 18 | | let parsed_number = encoded_string[1..delimiter].parse::().expect("unable to parse integer"); [INFO] [stdout] ... | [INFO] [stdout] 73 | | }; [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] = note: `#[warn(clippy::needless_return)]` on by default [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 15 ~ match encoded_string.chars().nth(0).expect("fail to create iterator over input string") { [INFO] [stdout] 16 + 'i' => { [INFO] [stdout] 17 + let delimiter = encoded_string.find('e').expect("supplied string starts like integer, but missing enclosing symbol"); [INFO] [stdout] 18 + let parsed_number = encoded_string[1..delimiter].parse::().expect("unable to parse integer"); [INFO] [stdout] 19 + (serde_json::Value::Number(Number::from(parsed_number)), delimiter + 1) [INFO] [stdout] 20 + } [INFO] [stdout] 21 + item if item.is_digit(10) => { [INFO] [stdout] 22 + let delimiter = encoded_string.find(':'); [INFO] [stdout] 23 + match delimiter { [INFO] [stdout] 24 + None => { [INFO] [stdout] 25 + panic!("malformed input. expecting a string, but cannot find a semicolon delimiter for {}", encoded_string) [INFO] [stdout] 26 + } [INFO] [stdout] 27 + Some(delimiter_safe) => { [INFO] [stdout] 28 + let key = encoded_string[..delimiter_safe].parse::().expect("unable to parse key as digit"); [INFO] [stdout] 29 + let mut bytes: Vec = vec![]; [INFO] [stdout] 30 + let mut size = 0; [INFO] [stdout] 31 + let _ = &encoded_string[delimiter_safe + 1..].char_indices().take(key).for_each(|item| { [INFO] [stdout] 32 + bytes.push(item.1 as u8); [INFO] [stdout] 33 + size = item.0 [INFO] [stdout] 34 + }); [INFO] [stdout] 35 + size += 1; [INFO] [stdout] 36 + let safe_string = String::from_utf8(bytes.clone()); [INFO] [stdout] 37 + return match safe_string { [INFO] [stdout] 38 + Ok(formatted) => { (serde_json::Value::String(formatted), (delimiter_safe + size + 1)) } [INFO] [stdout] 39 + Err(_) => { (serde_json::Value::from(bytes), (delimiter_safe + size + 1)) } [INFO] [stdout] 40 + }; [INFO] [stdout] 41 + } [INFO] [stdout] 42 + } [INFO] [stdout] 43 + } [INFO] [stdout] 44 + 'l' => { [INFO] [stdout] 45 + let mut total: Vec = vec![]; [INFO] [stdout] 46 + let mut cursor: usize = 1; [INFO] [stdout] 47 + while encoded_string.chars().nth(cursor).unwrap() != 'e' { [INFO] [stdout] 48 + let (result, size) = decode_bencoded_string(&encoded_string[cursor..encoded_string.len()]); [INFO] [stdout] 49 + total.push(result); [INFO] [stdout] 50 + cursor += size; [INFO] [stdout] 51 + } [INFO] [stdout] 52 + [INFO] [stdout] 53 + (serde_json::Value::Array(total), cursor + 1) [INFO] [stdout] 54 + } [INFO] [stdout] 55 + 'd' => { [INFO] [stdout] 56 + let mut result = serde_json::Map::new(); [INFO] [stdout] 57 + let mut cursor: usize = 1; [INFO] [stdout] 58 + while encoded_string.chars().nth(cursor).is_some() && encoded_string.chars().nth(cursor).unwrap() != 'e' { [INFO] [stdout] 59 + let (key, size) = decode_bencoded_string(&encoded_string[cursor..encoded_string.len()]); [INFO] [stdout] 60 + cursor += size; [INFO] [stdout] 61 + let (value, size) = decode_bencoded_string(&encoded_string[cursor..encoded_string.len()]); [INFO] [stdout] 62 + cursor += size; [INFO] [stdout] 63 + result.insert(key.as_str().expect("cannot unwrap key").to_string(), value); [INFO] [stdout] 64 + } [INFO] [stdout] 65 + (result.into(), cursor + 1) [INFO] [stdout] 66 + } [INFO] [stdout] 67 + 'e' => { [INFO] [stdout] 68 + (serde_json::Value::Null, 0) [INFO] [stdout] 69 + } [INFO] [stdout] 70 + _ => { [INFO] [stdout] 71 + panic!("unknown input {}", encoded_string) [INFO] [stdout] 72 + } [INFO] [stdout] 73 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `.nth(0)` on a `std::iter::Iterator`, when `.next()` is equivalent [INFO] [stdout] --> src/main.rs:15:18 [INFO] [stdout] | [INFO] [stdout] 15 | return match encoded_string.chars().nth(0).expect("fail to create iterator over input string") { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try calling `.next()` instead of `.nth(0)`: `encoded_string.chars().next()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#iter_nth_zero [INFO] [stdout] = note: `#[warn(clippy::iter_nth_zero)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: use of `char::is_digit` with literal radix of 10 [INFO] [stdout] --> src/main.rs:21:17 [INFO] [stdout] | [INFO] [stdout] 21 | item if item.is_digit(10) => { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ help: try: `item.is_ascii_digit()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#is_digit_ascii_radix [INFO] [stdout] = note: `#[warn(clippy::is_digit_ascii_radix)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/main.rs:15:5 [INFO] [stdout] | [INFO] [stdout] 15 | / return match encoded_string.chars().nth(0).expect("fail to create iterator over input string") { [INFO] [stdout] 16 | | 'i' => { [INFO] [stdout] 17 | | let delimiter = encoded_string.find('e').expect("supplied string starts like integer, but missing enclosing symbol"); [INFO] [stdout] 18 | | let parsed_number = encoded_string[1..delimiter].parse::().expect("unable to parse integer"); [INFO] [stdout] ... | [INFO] [stdout] 73 | | }; [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] = note: `#[warn(clippy::needless_return)]` on by default [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 15 ~ match encoded_string.chars().nth(0).expect("fail to create iterator over input string") { [INFO] [stdout] 16 + 'i' => { [INFO] [stdout] 17 + let delimiter = encoded_string.find('e').expect("supplied string starts like integer, but missing enclosing symbol"); [INFO] [stdout] 18 + let parsed_number = encoded_string[1..delimiter].parse::().expect("unable to parse integer"); [INFO] [stdout] 19 + (serde_json::Value::Number(Number::from(parsed_number)), delimiter + 1) [INFO] [stdout] 20 + } [INFO] [stdout] 21 + item if item.is_digit(10) => { [INFO] [stdout] 22 + let delimiter = encoded_string.find(':'); [INFO] [stdout] 23 + match delimiter { [INFO] [stdout] 24 + None => { [INFO] [stdout] 25 + panic!("malformed input. expecting a string, but cannot find a semicolon delimiter for {}", encoded_string) [INFO] [stdout] 26 + } [INFO] [stdout] 27 + Some(delimiter_safe) => { [INFO] [stdout] 28 + let key = encoded_string[..delimiter_safe].parse::().expect("unable to parse key as digit"); [INFO] [stdout] 29 + let mut bytes: Vec = vec![]; [INFO] [stdout] 30 + let mut size = 0; [INFO] [stdout] 31 + let _ = &encoded_string[delimiter_safe + 1..].char_indices().take(key).for_each(|item| { [INFO] [stdout] 32 + bytes.push(item.1 as u8); [INFO] [stdout] 33 + size = item.0 [INFO] [stdout] 34 + }); [INFO] [stdout] 35 + size += 1; [INFO] [stdout] 36 + let safe_string = String::from_utf8(bytes.clone()); [INFO] [stdout] 37 + return match safe_string { [INFO] [stdout] 38 + Ok(formatted) => { (serde_json::Value::String(formatted), (delimiter_safe + size + 1)) } [INFO] [stdout] 39 + Err(_) => { (serde_json::Value::from(bytes), (delimiter_safe + size + 1)) } [INFO] [stdout] 40 + }; [INFO] [stdout] 41 + } [INFO] [stdout] 42 + } [INFO] [stdout] 43 + } [INFO] [stdout] 44 + 'l' => { [INFO] [stdout] 45 + let mut total: Vec = vec![]; [INFO] [stdout] 46 + let mut cursor: usize = 1; [INFO] [stdout] 47 + while encoded_string.chars().nth(cursor).unwrap() != 'e' { [INFO] [stdout] 48 + let (result, size) = decode_bencoded_string(&encoded_string[cursor..encoded_string.len()]); [INFO] [stdout] 49 + total.push(result); [INFO] [stdout] 50 + cursor += size; [INFO] [stdout] 51 + } [INFO] [stdout] 52 + [INFO] [stdout] 53 + (serde_json::Value::Array(total), cursor + 1) [INFO] [stdout] 54 + } [INFO] [stdout] 55 + 'd' => { [INFO] [stdout] 56 + let mut result = serde_json::Map::new(); [INFO] [stdout] 57 + let mut cursor: usize = 1; [INFO] [stdout] 58 + while encoded_string.chars().nth(cursor).is_some() && encoded_string.chars().nth(cursor).unwrap() != 'e' { [INFO] [stdout] 59 + let (key, size) = decode_bencoded_string(&encoded_string[cursor..encoded_string.len()]); [INFO] [stdout] 60 + cursor += size; [INFO] [stdout] 61 + let (value, size) = decode_bencoded_string(&encoded_string[cursor..encoded_string.len()]); [INFO] [stdout] 62 + cursor += size; [INFO] [stdout] 63 + result.insert(key.as_str().expect("cannot unwrap key").to_string(), value); [INFO] [stdout] 64 + } [INFO] [stdout] 65 + (result.into(), cursor + 1) [INFO] [stdout] 66 + } [INFO] [stdout] 67 + 'e' => { [INFO] [stdout] 68 + (serde_json::Value::Null, 0) [INFO] [stdout] 69 + } [INFO] [stdout] 70 + _ => { [INFO] [stdout] 71 + panic!("unknown input {}", encoded_string) [INFO] [stdout] 72 + } [INFO] [stdout] 73 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this boolean expression can be simplified [INFO] [stdout] --> src/main.rs:93:24 [INFO] [stdout] | [INFO] [stdout] 93 | if !iterator.next().is_none() { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `iterator.next().is_some()` [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] [INFO] [stdout] [INFO] [stdout] warning: called `.nth(0)` on a `std::iter::Iterator`, when `.next()` is equivalent [INFO] [stdout] --> src/main.rs:15:18 [INFO] [stdout] | [INFO] [stdout] 15 | return match encoded_string.chars().nth(0).expect("fail to create iterator over input string") { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try calling `.next()` instead of `.nth(0)`: `encoded_string.chars().next()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#iter_nth_zero [INFO] [stdout] = note: `#[warn(clippy::iter_nth_zero)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: `to_string` applied to a type that implements `Display` in `println!` args [INFO] [stdout] --> src/main.rs:82:43 [INFO] [stdout] | [INFO] [stdout] 82 | println!("{}", decoded_value.0.to_string()); [INFO] [stdout] | ^^^^^^^^^^^^ help: remove this [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#to_string_in_format_args [INFO] [stdout] = note: `#[warn(clippy::to_string_in_format_args)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: use of `char::is_digit` with literal radix of 10 [INFO] [stdout] --> src/main.rs:21:17 [INFO] [stdout] | [INFO] [stdout] 21 | item if item.is_digit(10) => { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ help: try: `item.is_ascii_digit()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#is_digit_ascii_radix [INFO] [stdout] = note: `#[warn(clippy::is_digit_ascii_radix)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this boolean expression can be simplified [INFO] [stdout] --> src/main.rs:93:24 [INFO] [stdout] | [INFO] [stdout] 93 | if !iterator.next().is_none() { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `iterator.next().is_some()` [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] [INFO] [stdout] [INFO] [stdout] warning: `to_string` applied to a type that implements `Display` in `println!` args [INFO] [stdout] --> src/main.rs:82:43 [INFO] [stdout] | [INFO] [stdout] 82 | println!("{}", decoded_value.0.to_string()); [INFO] [stdout] | ^^^^^^^^^^^^ help: remove this [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#to_string_in_format_args [INFO] [stdout] = note: `#[warn(clippy::to_string_in_format_args)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you seem to be trying to use `match` for destructuring a single pattern. Consider using `if let` [INFO] [stdout] --> src/main.rs:118:13 [INFO] [stdout] | [INFO] [stdout] 118 | / match file { [INFO] [stdout] 119 | | Ok(meta_data) => { [INFO] [stdout] 120 | | let mut address_iterator = peer_address.as_str().to_socket_addrs().expect("invalid address supplied"); [INFO] [stdout] 121 | | let address = address_iterator.next(); [INFO] [stdout] ... | [INFO] [stdout] 131 | | Err(_) => {} [INFO] [stdout] 132 | | } [INFO] [stdout] | |_____________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stdout] = note: `#[warn(clippy::single_match)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 118 ~ if let Ok(meta_data) = file { [INFO] [stdout] 119 + let mut address_iterator = peer_address.as_str().to_socket_addrs().expect("invalid address supplied"); [INFO] [stdout] 120 + let address = address_iterator.next(); [INFO] [stdout] 121 + match address { [INFO] [stdout] 122 + None => { [INFO] [stdout] 123 + eprintln!("address iterator is empty") [INFO] [stdout] 124 + } [INFO] [stdout] 125 + Some(addr) => { [INFO] [stdout] 126 + handshake_with_peer(addr.ip(), addr.port(), &meta_data).await.expect("handshake failed"); [INFO] [stdout] 127 + } [INFO] [stdout] 128 + } [INFO] [stdout] 129 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: returning the result of a `let` binding from a block [INFO] [stdout] --> src/main.rs:156:5 [INFO] [stdout] | [INFO] [stdout] 151 | / let path = if env::args().any(|item| item == "--directory") { [INFO] [stdout] 152 | | PathBuf::from(env::args().last().unwrap()) [INFO] [stdout] 153 | | } else { [INFO] [stdout] 154 | | env::current_dir().unwrap_or(PathBuf::new()) [INFO] [stdout] 155 | | }; [INFO] [stdout] | |______- unnecessary `let` binding [INFO] [stdout] 156 | path [INFO] [stdout] | ^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return [INFO] [stdout] = note: `#[warn(clippy::let_and_return)]` on by default [INFO] [stdout] help: return the expression directly [INFO] [stdout] | [INFO] [stdout] 151 ~ [INFO] [stdout] 152 ~ if env::args().any(|item| item == "--directory") { [INFO] [stdout] 153 + PathBuf::from(env::args().last().unwrap()) [INFO] [stdout] 154 + } else { [INFO] [stdout] 155 + env::current_dir().unwrap_or(PathBuf::new()) [INFO] [stdout] 156 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `Iterator::last` on a `DoubleEndedIterator`; this will needlessly iterate the entire iterator [INFO] [stdout] --> src/main.rs:152:23 [INFO] [stdout] | [INFO] [stdout] 152 | PathBuf::from(env::args().last().unwrap()) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#double_ended_iterator_last [INFO] [stdout] = note: `#[warn(clippy::double_ended_iterator_last)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 152 - PathBuf::from(env::args().last().unwrap()) [INFO] [stdout] 152 + PathBuf::from(env::args().next_back().unwrap()) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: use of `unwrap_or` to construct default value [INFO] [stdout] --> src/main.rs:154:28 [INFO] [stdout] | [INFO] [stdout] 154 | env::current_dir().unwrap_or(PathBuf::new()) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `unwrap_or_default()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unwrap_or_default [INFO] [stdout] = note: `#[warn(clippy::unwrap_or_default)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you seem to be trying to use `match` for destructuring a single pattern. Consider using `if let` [INFO] [stdout] --> src/main.rs:118:13 [INFO] [stdout] | [INFO] [stdout] 118 | / match file { [INFO] [stdout] 119 | | Ok(meta_data) => { [INFO] [stdout] 120 | | let mut address_iterator = peer_address.as_str().to_socket_addrs().expect("invalid address supplied"); [INFO] [stdout] 121 | | let address = address_iterator.next(); [INFO] [stdout] ... | [INFO] [stdout] 131 | | Err(_) => {} [INFO] [stdout] 132 | | } [INFO] [stdout] | |_____________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stdout] = note: `#[warn(clippy::single_match)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 118 ~ if let Ok(meta_data) = file { [INFO] [stdout] 119 + let mut address_iterator = peer_address.as_str().to_socket_addrs().expect("invalid address supplied"); [INFO] [stdout] 120 + let address = address_iterator.next(); [INFO] [stdout] 121 + match address { [INFO] [stdout] 122 + None => { [INFO] [stdout] 123 + eprintln!("address iterator is empty") [INFO] [stdout] 124 + } [INFO] [stdout] 125 + Some(addr) => { [INFO] [stdout] 126 + handshake_with_peer(addr.ip(), addr.port(), &meta_data).await.expect("handshake failed"); [INFO] [stdout] 127 + } [INFO] [stdout] 128 + } [INFO] [stdout] 129 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: returning the result of a `let` binding from a block [INFO] [stdout] --> src/main.rs:156:5 [INFO] [stdout] | [INFO] [stdout] 151 | / let path = if env::args().any(|item| item == "--directory") { [INFO] [stdout] 152 | | PathBuf::from(env::args().last().unwrap()) [INFO] [stdout] 153 | | } else { [INFO] [stdout] 154 | | env::current_dir().unwrap_or(PathBuf::new()) [INFO] [stdout] 155 | | }; [INFO] [stdout] | |______- unnecessary `let` binding [INFO] [stdout] 156 | path [INFO] [stdout] | ^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return [INFO] [stdout] = note: `#[warn(clippy::let_and_return)]` on by default [INFO] [stdout] help: return the expression directly [INFO] [stdout] | [INFO] [stdout] 151 ~ [INFO] [stdout] 152 ~ if env::args().any(|item| item == "--directory") { [INFO] [stdout] 153 + PathBuf::from(env::args().last().unwrap()) [INFO] [stdout] 154 + } else { [INFO] [stdout] 155 + env::current_dir().unwrap_or(PathBuf::new()) [INFO] [stdout] 156 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `Iterator::last` on a `DoubleEndedIterator`; this will needlessly iterate the entire iterator [INFO] [stdout] --> src/main.rs:152:23 [INFO] [stdout] | [INFO] [stdout] 152 | PathBuf::from(env::args().last().unwrap()) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#double_ended_iterator_last [INFO] [stdout] = note: `#[warn(clippy::double_ended_iterator_last)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 152 - PathBuf::from(env::args().last().unwrap()) [INFO] [stdout] 152 + PathBuf::from(env::args().next_back().unwrap()) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: use of `unwrap_or` to construct default value [INFO] [stdout] --> src/main.rs:154:28 [INFO] [stdout] | [INFO] [stdout] 154 | env::current_dir().unwrap_or(PathBuf::new()) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `unwrap_or_default()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unwrap_or_default [INFO] [stdout] = note: `#[warn(clippy::unwrap_or_default)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 29.84s [INFO] running `Command { std: "docker" "inspect" "47efb28b94ffebf0009d664949645cfdbbfd23fc97c88049e18d83cbc8915df1", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "47efb28b94ffebf0009d664949645cfdbbfd23fc97c88049e18d83cbc8915df1", kill_on_drop: false }` [INFO] [stdout] 47efb28b94ffebf0009d664949645cfdbbfd23fc97c88049e18d83cbc8915df1