[INFO] cloning repository https://github.com/JohnnyHuang101/lab3 [INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/JohnnyHuang101/lab3" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FJohnnyHuang101%2Flab3", kill_on_drop: false }` [INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FJohnnyHuang101%2Flab3'... [INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }` [INFO] [stdout] a6a6e54a62b009c02e25a0eeff2ebeffb794f9db [INFO] linting JohnnyHuang101/lab3 against nightly for clippy-nonminimal_bool-denied [INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FJohnnyHuang101%2Flab3" "/workspace/builds/worker-0-tc1/source", kill_on_drop: false }` [INFO] [stderr] Cloning into '/workspace/builds/worker-0-tc1/source'... [INFO] [stderr] done. [INFO] started tweaking git repo https://github.com/JohnnyHuang101/lab3 [INFO] finished tweaking git repo https://github.com/JohnnyHuang101/lab3 [INFO] tweaked toml for git repo https://github.com/JohnnyHuang101/lab3 written to /workspace/builds/worker-0-tc1/source/Cargo.toml [INFO] validating manifest of git repo https://github.com/JohnnyHuang101/lab3 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/JohnnyHuang101/lab3 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] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-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] 405441b8e4f34edc78d51673e349143c28a031c7310360b3f18e3ec1e84f7dd7 [INFO] running `Command { std: "docker" "start" "-a" "405441b8e4f34edc78d51673e349143c28a031c7310360b3f18e3ec1e84f7dd7", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "405441b8e4f34edc78d51673e349143c28a031c7310360b3f18e3ec1e84f7dd7", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "405441b8e4f34edc78d51673e349143c28a031c7310360b3f18e3ec1e84f7dd7", kill_on_drop: false }` [INFO] [stdout] 405441b8e4f34edc78d51673e349143c28a031c7310360b3f18e3ec1e84f7dd7 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-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] 042eff658f68cdae7187ff64924338583cb3b82bb0a5852561bb23ed4d207b71 [INFO] running `Command { std: "docker" "start" "-a" "042eff658f68cdae7187ff64924338583cb3b82bb0a5852561bb23ed4d207b71", kill_on_drop: false }` [INFO] [stderr] Checking lab2 v0.1.0 (/opt/rustwide/workdir) [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/lab2/script_gen.rs:45:13 [INFO] [stdout] | [INFO] [stdout] 45 | return Err(GENERATION_FAILURE); [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] 45 - return Err(GENERATION_FAILURE); [INFO] [stdout] 45 + Err(GENERATION_FAILURE) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you should consider adding a `Default` implementation for `Play` [INFO] [stdout] --> src/lab2/play.rs:28:5 [INFO] [stdout] | [INFO] [stdout] 28 | / pub fn new() -> Self { [INFO] [stdout] 29 | | Self { [INFO] [stdout] 30 | | fragments: Vec::new(), [INFO] [stdout] 31 | | } [INFO] [stdout] 32 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default [INFO] [stdout] = note: `#[warn(clippy::new_without_default)]` on by default [INFO] [stdout] help: try adding this [INFO] [stdout] | [INFO] [stdout] 27 + impl Default for Play { [INFO] [stdout] 28 + fn default() -> Self { [INFO] [stdout] 29 + Self::new() [INFO] [stdout] 30 + } [INFO] [stdout] 31 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this match could be written as a `let` statement [INFO] [stdout] --> src/lab2/play.rs:48:13 [INFO] [stdout] | [INFO] [stdout] 48 | / match a_cfg {(is_title, text_field) => { //both is_title and text_field are refs [INFO] [stdout] 49 | | if *is_title{ [INFO] [stdout] 50 | | title_str = text_field.to_string(); [INFO] [stdout] 51 | | }else{ [INFO] [stdout] ... | [INFO] [stdout] 84 | | }} [INFO] [stdout] | |______________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_single_binding [INFO] [stdout] = note: `#[warn(clippy::match_single_binding)]` on by default [INFO] [stdout] help: consider using a `let` statement [INFO] [stdout] | [INFO] [stdout] 48 ~ let (is_title, text_field) = a_cfg; [INFO] [stdout] 49 + if *is_title{ [INFO] [stdout] 50 + title_str = text_field.to_string(); [INFO] [stdout] 51 + }else{ [INFO] [stdout] 52 + //1: push title_str init SceneFrag to vec of fragments and update idx [INFO] [stdout] 53 + self.fragments.push(Arc::new(Mutex::new(SceneFragment::new(&title_str)))); [INFO] [stdout] 54 + latest_frag_idx = self.fragments.len() - 1; [INFO] [stdout] 55 + //2: reset title_str to empty [INFO] [stdout] 56 + title_str = String::new(); [INFO] [stdout] 57 + //3: pass text_field to new fragment prepare method method and 4 match result on errors [INFO] [stdout] 58 + [INFO] [stdout] 59 + [INFO] [stdout] 60 + //might need for error [INFO] [stdout] 61 + let frag_ref = Arc::clone(&self.fragments[latest_frag_idx]); [INFO] [stdout] 62 + let cfg_str = text_field.to_string(); [INFO] [stdout] 63 + [INFO] [stdout] 64 + let handle = thread::spawn(move || { [INFO] [stdout] 65 + [INFO] [stdout] 66 + // println!("Thread attempting lock"); [INFO] [stdout] 67 + match frag_ref.lock() { [INFO] [stdout] 68 + [INFO] [stdout] 69 + //here `scene_ref` is an immutable reference to SceneFragment [INFO] [stdout] 70 + Ok(mut scene_ref) => match scene_ref.prepare(&cfg_str) { [INFO] [stdout] 71 + Ok(_) => Ok(()),//do ntihging [INFO] [stdout] 72 + Err(_e_code) => Err(GENERATION_FAILURE), [INFO] [stdout] 73 + }, [INFO] [stdout] 74 + // let _ = writeln!(stderr,"Error from process config of Play after calling prepare on Fragment: {}", e_code); [INFO] [stdout] 75 + [INFO] [stdout] 76 + Err(_) => Err(GENERATION_FAILURE), [INFO] [stdout] 77 + } [INFO] [stdout] 78 + }); [INFO] [stdout] 79 + [INFO] [stdout] 80 + [INFO] [stdout] 81 + handles.push(handle); [INFO] [stdout] 82 + println!("handle pushed for a_cfg"); [INFO] [stdout] 83 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&String` instead of `&str` involves a new object where a slice will do [INFO] [stdout] --> src/lab2/play.rs:113:40 [INFO] [stdout] | [INFO] [stdout] 113 | pub fn add_config(&self, cfg_line: &String, play_cfg: &mut ScriptConfig){ [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] 113 - pub fn add_config(&self, cfg_line: &String, play_cfg: &mut ScriptConfig){ [INFO] [stdout] 113 + pub fn add_config(&self, cfg_line: &str, play_cfg: &mut ScriptConfig){ [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/lab2/play.rs:151:39 [INFO] [stdout] | [INFO] [stdout] 151 | match grab_trimmed_file_lines(&cfg_fname, &mut cfg_lines) { [INFO] [stdout] | ^^^^^^^^^^ help: change this to: `cfg_fname` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] = note: `#[warn(clippy::needless_borrow)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this boolean expression can be simplified [INFO] [stdout] --> src/lab2/play.rs:202:20 [INFO] [stdout] | [INFO] [stdout] 202 | if !scene_ref.scene_title.split_whitespace().next().is_some() { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `scene_ref.scene_title.split_whitespace().next().is_none()` [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: deref which would be done by auto-deref [INFO] [stdout] --> src/lab2/play.rs:247:41 [INFO] [stdout] | [INFO] [stdout] 247 | scene_ref.enter(&*prev_scene_ref); //do the enter call [INFO] [stdout] | ^^^^^^^^^^^^^^^^ help: try: `&prev_scene_ref` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_auto_deref [INFO] [stdout] = note: `#[warn(clippy::explicit_auto_deref)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: deref which would be done by auto-deref [INFO] [stdout] --> src/lab2/play.rs:272:40 [INFO] [stdout] | [INFO] [stdout] 272 | scene_ref.exit(&*next_scene_ref); //do the exit call [INFO] [stdout] | ^^^^^^^^^^^^^^^^ help: try: `&next_scene_ref` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_auto_deref [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&String` instead of `&str` involves a new object where a slice will do [INFO] [stdout] --> src/lab2/player.rs:29:50 [INFO] [stdout] | [INFO] [stdout] 29 | fn add_script_line(&mut self, unparsed_line: &String){ [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] help: change this to [INFO] [stdout] | [INFO] [stdout] 29 - fn add_script_line(&mut self, unparsed_line: &String){ [INFO] [stdout] 29 + fn add_script_line(&mut self, unparsed_line: &str){ [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lab2/player.rs:32:12 [INFO] [stdout] | [INFO] [stdout] 32 | if unparsed_line.len() > 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!unparsed_line.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] = note: `#[warn(clippy::len_zero)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/lab2/player.rs:55:54 [INFO] [stdout] | [INFO] [stdout] 55 | if let Err(e_code) = grab_trimmed_file_lines(&part_name, &mut cur_file_line_vec) { [INFO] [stdout] | ^^^^^^^^^^ help: change this to: `part_name` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/lab2/player.rs:93:13 [INFO] [stdout] | [INFO] [stdout] 93 | return Some(self.char_lines[self.cur_entry_idx].0) [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] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 93 - return Some(self.char_lines[self.cur_entry_idx].0) [INFO] [stdout] 93 + Some(self.char_lines[self.cur_entry_idx].0) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/lab2/player.rs:95:13 [INFO] [stdout] | [INFO] [stdout] 95 | return None [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] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 95 - return None [INFO] [stdout] 95 + None [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/lab2/player.rs:110:9 [INFO] [stdout] | [INFO] [stdout] 110 | return false [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] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 110 - return false [INFO] [stdout] 110 + false [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lab2/player.rs:104:12 [INFO] [stdout] | [INFO] [stdout] 104 | if self.char_lines.len() == 0 && other.char_lines.len() == 0{ [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `self.char_lines.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lab2/player.rs:104:42 [INFO] [stdout] | [INFO] [stdout] 104 | if self.char_lines.len() == 0 && other.char_lines.len() == 0{ [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `other.char_lines.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lab2/player.rs:106:18 [INFO] [stdout] | [INFO] [stdout] 106 | }else if self.char_lines.len() != 0 && other.char_lines.len() != 0{ [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!self.char_lines.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lab2/player.rs:106:48 [INFO] [stdout] | [INFO] [stdout] 106 | }else if self.char_lines.len() != 0 && other.char_lines.len() != 0{ [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!other.char_lines.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: non-canonical implementation of `partial_cmp` on an `Ord` type [INFO] [stdout] --> src/lab2/player.rs:120:1 [INFO] [stdout] | [INFO] [stdout] 120 | / impl PartialOrd for Player{ [INFO] [stdout] 121 | | fn partial_cmp(&self, other: &Self) -> Option{ [INFO] [stdout] 122 | | if self.char_lines.len() == 0 && other.char_lines.len() != 0 { [INFO] [stdout] 123 | | return Some(Ordering::Less) [INFO] [stdout] ... | [INFO] [stdout] 138 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#non_canonical_partial_ord_impl [INFO] [stdout] = note: `#[warn(clippy::non_canonical_partial_ord_impl)]` on by default [INFO] [stdout] help: change this to [INFO] [stdout] | [INFO] [stdout] 121 - fn partial_cmp(&self, other: &Self) -> Option{ [INFO] [stdout] 122 - if self.char_lines.len() == 0 && other.char_lines.len() != 0 { [INFO] [stdout] 123 - return Some(Ordering::Less) [INFO] [stdout] 124 - } [INFO] [stdout] 125 - if self.char_lines.len() != 0 && other.char_lines.len() == 0 { [INFO] [stdout] 126 - return Some(Ordering::Greater) [INFO] [stdout] 127 - } [INFO] [stdout] 128 - //first line number comparison [INFO] [stdout] 129 - if self.char_lines[0].0 < other.char_lines[0].0{ [INFO] [stdout] 130 - return Some(Ordering::Less) [INFO] [stdout] 131 - } [INFO] [stdout] 132 - if self.char_lines[0].0 > other.char_lines[0].0{ [INFO] [stdout] 133 - return Some(Ordering::Greater) [INFO] [stdout] 134 - } [INFO] [stdout] 135 - return Some(Ordering::Equal) [INFO] [stdout] 136 - [INFO] [stdout] 137 - } [INFO] [stdout] 121 + fn partial_cmp(&self, other: &Self) -> Option{ Some(self.cmp(other)) } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/lab2/player.rs:135:9 [INFO] [stdout] | [INFO] [stdout] 135 | return Some(Ordering::Equal) [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] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 135 - return Some(Ordering::Equal) [INFO] [stdout] 135 + Some(Ordering::Equal) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lab2/player.rs:122:12 [INFO] [stdout] | [INFO] [stdout] 122 | if self.char_lines.len() == 0 && other.char_lines.len() != 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `self.char_lines.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lab2/player.rs:122:42 [INFO] [stdout] | [INFO] [stdout] 122 | if self.char_lines.len() == 0 && other.char_lines.len() != 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!other.char_lines.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lab2/player.rs:125:12 [INFO] [stdout] | [INFO] [stdout] 125 | if self.char_lines.len() != 0 && other.char_lines.len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!self.char_lines.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lab2/player.rs:125:42 [INFO] [stdout] | [INFO] [stdout] 125 | if self.char_lines.len() != 0 && other.char_lines.len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `other.char_lines.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/lab2/player.rs:156:9 [INFO] [stdout] | [INFO] [stdout] 156 | return Ordering::Equal [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] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 156 - return Ordering::Equal [INFO] [stdout] 156 + Ordering::Equal [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lab2/player.rs:143:12 [INFO] [stdout] | [INFO] [stdout] 143 | if self.char_lines.len() == 0 && other.char_lines.len() != 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `self.char_lines.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lab2/player.rs:143:42 [INFO] [stdout] | [INFO] [stdout] 143 | if self.char_lines.len() == 0 && other.char_lines.len() != 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!other.char_lines.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lab2/player.rs:146:12 [INFO] [stdout] | [INFO] [stdout] 146 | if self.char_lines.len() != 0 && other.char_lines.len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!self.char_lines.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lab2/player.rs:146:42 [INFO] [stdout] | [INFO] [stdout] 146 | if self.char_lines.len() != 0 && other.char_lines.len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `other.char_lines.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this match could be written as a `let` statement [INFO] [stdout] --> src/lab2/scene_fragments.rs:44:13 [INFO] [stdout] | [INFO] [stdout] 44 | / match a_cfg {(char_name, speak_file) => { [INFO] [stdout] 45 | | let mut new_player = Player::new(&char_name); //need mut since prepare take mut &self [INFO] [stdout] 46 | | let speak_file_clone = speak_file.clone(); [INFO] [stdout] ... | [INFO] [stdout] 58 | | handles.push(handle); [INFO] [stdout] 59 | | }} [INFO] [stdout] | |______________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_single_binding [INFO] [stdout] help: consider using a `let` statement [INFO] [stdout] | [INFO] [stdout] 44 ~ let (char_name, speak_file) = a_cfg; [INFO] [stdout] 45 + { [INFO] [stdout] 46 + let mut new_player = Player::new(&char_name); //need mut since prepare take mut &self [INFO] [stdout] 47 + let speak_file_clone = speak_file.clone(); [INFO] [stdout] 48 + [INFO] [stdout] 49 + let handle = thread::spawn(move || { [INFO] [stdout] 50 + let mut stderr = io::stderr(); [INFO] [stdout] 51 + if let Err(e) = new_player.prepare(&speak_file_clone){ //TODO: confirm if this is the prepare function he wants us to call and if we should call this before or after push to vec? [INFO] [stdout] 52 + let _ = writeln!(stderr,"Error from process_config of SceneFragment: {}", e); [INFO] [stdout] 53 + return Err(GENERATION_FAILURE); [INFO] [stdout] 54 + } [INFO] [stdout] 55 + Ok::(new_player) // return the prepared player [INFO] [stdout] 56 + } [INFO] [stdout] 57 + ); [INFO] [stdout] 58 + [INFO] [stdout] 59 + handles.push(handle); [INFO] [stdout] 60 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/lab2/scene_fragments.rs:45:50 [INFO] [stdout] | [INFO] [stdout] 45 | let mut new_player = Player::new(&char_name); //need mut since prepare take mut &self [INFO] [stdout] | ^^^^^^^^^^ help: change this to: `char_name` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&String` instead of `&str` involves a new object where a slice will do [INFO] [stdout] --> src/lab2/scene_fragments.rs:76:40 [INFO] [stdout] | [INFO] [stdout] 76 | pub fn add_config(&self, cfg_line: &String, play_cfg: &mut PlayConfig){ [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] help: change this to [INFO] [stdout] | [INFO] [stdout] 76 - pub fn add_config(&self, cfg_line: &String, play_cfg: &mut PlayConfig){ [INFO] [stdout] 76 + pub fn add_config(&self, cfg_line: &str, play_cfg: &mut PlayConfig){ [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/lab2/scene_fragments.rs:105:39 [INFO] [stdout] | [INFO] [stdout] 105 | match grab_trimmed_file_lines(&cfg_fname, &mut cfg_lines) { [INFO] [stdout] | ^^^^^^^^^^ help: change this to: `cfg_fname` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/lab2/scene_fragments.rs:156:36 [INFO] [stdout] | [INFO] [stdout] 156 | self.chars_in_play.sort_by(|a, b| SceneFragment::ref_compare(a, b)); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the associated function itself: `SceneFragment::ref_compare` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] = note: `#[warn(clippy::redundant_closure)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/lab2/scene_fragments.rs:183:25 [INFO] [stdout] | [INFO] [stdout] 183 | / if !linenum_insert_status{ [INFO] [stdout] 184 | | if WHINGE.load(Ordering::SeqCst){ [INFO] [stdout] 185 | | let _ = writeln!(stderr,"WHINGE Warning: duplicate line detected for line number: {}", line_num); [INFO] [stdout] 186 | | } [INFO] [stdout] 187 | | } [INFO] [stdout] | |_________________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] = note: `#[warn(clippy::collapsible_if)]` on by default [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 183 ~ if !linenum_insert_status [INFO] [stdout] 184 ~ && WHINGE.load(Ordering::SeqCst){ [INFO] [stdout] 185 | let _ = writeln!(stderr,"WHINGE Warning: duplicate line detected for line number: {}", line_num); [INFO] [stdout] 186 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/lab2/scene_fragments.rs:201:9 [INFO] [stdout] | [INFO] [stdout] 201 | / if WHINGE.load(Ordering::SeqCst) { [INFO] [stdout] 202 | | if linenum_and_speaker_vec[0].0 != 0{ [INFO] [stdout] 203 | | let _ = writeln!(stderr,"WHINGE Warning: line number should start at 0!"); [INFO] [stdout] ... | [INFO] [stdout] 206 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 201 ~ if WHINGE.load(Ordering::SeqCst) [INFO] [stdout] 202 ~ && linenum_and_speaker_vec[0].0 != 0{ [INFO] [stdout] 203 | let _ = writeln!(stderr,"WHINGE Warning: line number should start at 0!"); [INFO] [stdout] 204 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: deref on an immutable reference [INFO] [stdout] --> src/lab2/scene_fragments.rs:327:45 [INFO] [stdout] | [INFO] [stdout] 327 | match p1_locked.partial_cmp(&*p2_locked){ [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#borrow_deref_ref [INFO] [stdout] = note: `#[warn(clippy::borrow_deref_ref)]` on by default [INFO] [stdout] help: if you would like to reborrow, try removing `&*` [INFO] [stdout] | [INFO] [stdout] 327 - match p1_locked.partial_cmp(&*p2_locked){ [INFO] [stdout] 327 + match p1_locked.partial_cmp(p2_locked){ [INFO] [stdout] | [INFO] [stdout] help: if you would like to deref, try using `&**` [INFO] [stdout] | [INFO] [stdout] 327 | match p1_locked.partial_cmp(&**p2_locked){ [INFO] [stdout] | + [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/main.rs:62:5 [INFO] [stdout] | [INFO] [stdout] 62 | return ReturnWrapper::new(SUCCESS_CODE) [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] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 62 - return ReturnWrapper::new(SUCCESS_CODE) [INFO] [stdout] 62 + ReturnWrapper::new(SUCCESS_CODE) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/lab2/script_gen.rs:45:13 [INFO] [stdout] | [INFO] [stdout] 45 | return Err(GENERATION_FAILURE); [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] 45 - return Err(GENERATION_FAILURE); [INFO] [stdout] 45 + Err(GENERATION_FAILURE) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you should consider adding a `Default` implementation for `Play` [INFO] [stdout] --> src/lab2/play.rs:28:5 [INFO] [stdout] | [INFO] [stdout] 28 | / pub fn new() -> Self { [INFO] [stdout] 29 | | Self { [INFO] [stdout] 30 | | fragments: Vec::new(), [INFO] [stdout] 31 | | } [INFO] [stdout] 32 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default [INFO] [stdout] = note: `#[warn(clippy::new_without_default)]` on by default [INFO] [stdout] help: try adding this [INFO] [stdout] | [INFO] [stdout] 27 + impl Default for Play { [INFO] [stdout] 28 + fn default() -> Self { [INFO] [stdout] 29 + Self::new() [INFO] [stdout] 30 + } [INFO] [stdout] 31 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this match could be written as a `let` statement [INFO] [stdout] --> src/lab2/play.rs:48:13 [INFO] [stdout] | [INFO] [stdout] 48 | / match a_cfg {(is_title, text_field) => { //both is_title and text_field are refs [INFO] [stdout] 49 | | if *is_title{ [INFO] [stdout] 50 | | title_str = text_field.to_string(); [INFO] [stdout] 51 | | }else{ [INFO] [stdout] ... | [INFO] [stdout] 84 | | }} [INFO] [stdout] | |______________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_single_binding [INFO] [stdout] = note: `#[warn(clippy::match_single_binding)]` on by default [INFO] [stdout] help: consider using a `let` statement [INFO] [stdout] | [INFO] [stdout] 48 ~ let (is_title, text_field) = a_cfg; [INFO] [stdout] 49 + if *is_title{ [INFO] [stdout] 50 + title_str = text_field.to_string(); [INFO] [stdout] 51 + }else{ [INFO] [stdout] 52 + //1: push title_str init SceneFrag to vec of fragments and update idx [INFO] [stdout] 53 + self.fragments.push(Arc::new(Mutex::new(SceneFragment::new(&title_str)))); [INFO] [stdout] 54 + latest_frag_idx = self.fragments.len() - 1; [INFO] [stdout] 55 + //2: reset title_str to empty [INFO] [stdout] 56 + title_str = String::new(); [INFO] [stdout] 57 + //3: pass text_field to new fragment prepare method method and 4 match result on errors [INFO] [stdout] 58 + [INFO] [stdout] 59 + [INFO] [stdout] 60 + //might need for error [INFO] [stdout] 61 + let frag_ref = Arc::clone(&self.fragments[latest_frag_idx]); [INFO] [stdout] 62 + let cfg_str = text_field.to_string(); [INFO] [stdout] 63 + [INFO] [stdout] 64 + let handle = thread::spawn(move || { [INFO] [stdout] 65 + [INFO] [stdout] 66 + // println!("Thread attempting lock"); [INFO] [stdout] 67 + match frag_ref.lock() { [INFO] [stdout] 68 + [INFO] [stdout] 69 + //here `scene_ref` is an immutable reference to SceneFragment [INFO] [stdout] 70 + Ok(mut scene_ref) => match scene_ref.prepare(&cfg_str) { [INFO] [stdout] 71 + Ok(_) => Ok(()),//do ntihging [INFO] [stdout] 72 + Err(_e_code) => Err(GENERATION_FAILURE), [INFO] [stdout] 73 + }, [INFO] [stdout] 74 + // let _ = writeln!(stderr,"Error from process config of Play after calling prepare on Fragment: {}", e_code); [INFO] [stdout] 75 + [INFO] [stdout] 76 + Err(_) => Err(GENERATION_FAILURE), [INFO] [stdout] 77 + } [INFO] [stdout] 78 + }); [INFO] [stdout] 79 + [INFO] [stdout] 80 + [INFO] [stdout] 81 + handles.push(handle); [INFO] [stdout] 82 + println!("handle pushed for a_cfg"); [INFO] [stdout] 83 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&String` instead of `&str` involves a new object where a slice will do [INFO] [stdout] --> src/lab2/play.rs:113:40 [INFO] [stdout] | [INFO] [stdout] 113 | pub fn add_config(&self, cfg_line: &String, play_cfg: &mut ScriptConfig){ [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] 113 - pub fn add_config(&self, cfg_line: &String, play_cfg: &mut ScriptConfig){ [INFO] [stdout] 113 + pub fn add_config(&self, cfg_line: &str, play_cfg: &mut ScriptConfig){ [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/lab2/play.rs:151:39 [INFO] [stdout] | [INFO] [stdout] 151 | match grab_trimmed_file_lines(&cfg_fname, &mut cfg_lines) { [INFO] [stdout] | ^^^^^^^^^^ help: change this to: `cfg_fname` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] = note: `#[warn(clippy::needless_borrow)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this boolean expression can be simplified [INFO] [stdout] --> src/lab2/play.rs:202:20 [INFO] [stdout] | [INFO] [stdout] 202 | if !scene_ref.scene_title.split_whitespace().next().is_some() { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `scene_ref.scene_title.split_whitespace().next().is_none()` [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: deref which would be done by auto-deref [INFO] [stdout] --> src/lab2/play.rs:247:41 [INFO] [stdout] | [INFO] [stdout] 247 | scene_ref.enter(&*prev_scene_ref); //do the enter call [INFO] [stdout] | ^^^^^^^^^^^^^^^^ help: try: `&prev_scene_ref` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_auto_deref [INFO] [stdout] = note: `#[warn(clippy::explicit_auto_deref)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: deref which would be done by auto-deref [INFO] [stdout] --> src/lab2/play.rs:272:40 [INFO] [stdout] | [INFO] [stdout] 272 | scene_ref.exit(&*next_scene_ref); //do the exit call [INFO] [stdout] | ^^^^^^^^^^^^^^^^ help: try: `&next_scene_ref` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_auto_deref [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&String` instead of `&str` involves a new object where a slice will do [INFO] [stdout] --> src/lab2/player.rs:29:50 [INFO] [stdout] | [INFO] [stdout] 29 | fn add_script_line(&mut self, unparsed_line: &String){ [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] help: change this to [INFO] [stdout] | [INFO] [stdout] 29 - fn add_script_line(&mut self, unparsed_line: &String){ [INFO] [stdout] 29 + fn add_script_line(&mut self, unparsed_line: &str){ [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lab2/player.rs:32:12 [INFO] [stdout] | [INFO] [stdout] 32 | if unparsed_line.len() > 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!unparsed_line.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] = note: `#[warn(clippy::len_zero)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/lab2/player.rs:55:54 [INFO] [stdout] | [INFO] [stdout] 55 | if let Err(e_code) = grab_trimmed_file_lines(&part_name, &mut cur_file_line_vec) { [INFO] [stdout] | ^^^^^^^^^^ help: change this to: `part_name` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/lab2/player.rs:93:13 [INFO] [stdout] | [INFO] [stdout] 93 | return Some(self.char_lines[self.cur_entry_idx].0) [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] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 93 - return Some(self.char_lines[self.cur_entry_idx].0) [INFO] [stdout] 93 + Some(self.char_lines[self.cur_entry_idx].0) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/lab2/player.rs:95:13 [INFO] [stdout] | [INFO] [stdout] 95 | return None [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] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 95 - return None [INFO] [stdout] 95 + None [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/lab2/player.rs:110:9 [INFO] [stdout] | [INFO] [stdout] 110 | return false [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] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 110 - return false [INFO] [stdout] 110 + false [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lab2/player.rs:104:12 [INFO] [stdout] | [INFO] [stdout] 104 | if self.char_lines.len() == 0 && other.char_lines.len() == 0{ [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `self.char_lines.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lab2/player.rs:104:42 [INFO] [stdout] | [INFO] [stdout] 104 | if self.char_lines.len() == 0 && other.char_lines.len() == 0{ [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `other.char_lines.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lab2/player.rs:106:18 [INFO] [stdout] | [INFO] [stdout] 106 | }else if self.char_lines.len() != 0 && other.char_lines.len() != 0{ [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!self.char_lines.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lab2/player.rs:106:48 [INFO] [stdout] | [INFO] [stdout] 106 | }else if self.char_lines.len() != 0 && other.char_lines.len() != 0{ [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!other.char_lines.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: non-canonical implementation of `partial_cmp` on an `Ord` type [INFO] [stdout] --> src/lab2/player.rs:120:1 [INFO] [stdout] | [INFO] [stdout] 120 | / impl PartialOrd for Player{ [INFO] [stdout] 121 | | fn partial_cmp(&self, other: &Self) -> Option{ [INFO] [stdout] 122 | | if self.char_lines.len() == 0 && other.char_lines.len() != 0 { [INFO] [stdout] 123 | | return Some(Ordering::Less) [INFO] [stdout] ... | [INFO] [stdout] 138 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#non_canonical_partial_ord_impl [INFO] [stdout] = note: `#[warn(clippy::non_canonical_partial_ord_impl)]` on by default [INFO] [stdout] help: change this to [INFO] [stdout] | [INFO] [stdout] 121 - fn partial_cmp(&self, other: &Self) -> Option{ [INFO] [stdout] 122 - if self.char_lines.len() == 0 && other.char_lines.len() != 0 { [INFO] [stdout] 123 - return Some(Ordering::Less) [INFO] [stdout] 124 - } [INFO] [stdout] 125 - if self.char_lines.len() != 0 && other.char_lines.len() == 0 { [INFO] [stdout] 126 - return Some(Ordering::Greater) [INFO] [stdout] 127 - } [INFO] [stdout] 128 - //first line number comparison [INFO] [stdout] 129 - if self.char_lines[0].0 < other.char_lines[0].0{ [INFO] [stdout] 130 - return Some(Ordering::Less) [INFO] [stdout] 131 - } [INFO] [stdout] 132 - if self.char_lines[0].0 > other.char_lines[0].0{ [INFO] [stdout] 133 - return Some(Ordering::Greater) [INFO] [stdout] 134 - } [INFO] [stdout] 135 - return Some(Ordering::Equal) [INFO] [stdout] 136 - [INFO] [stdout] 137 - } [INFO] [stdout] 121 + fn partial_cmp(&self, other: &Self) -> Option{ Some(self.cmp(other)) } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/lab2/player.rs:135:9 [INFO] [stdout] | [INFO] [stdout] 135 | return Some(Ordering::Equal) [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] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 135 - return Some(Ordering::Equal) [INFO] [stdout] 135 + Some(Ordering::Equal) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lab2/player.rs:122:12 [INFO] [stdout] | [INFO] [stdout] 122 | if self.char_lines.len() == 0 && other.char_lines.len() != 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `self.char_lines.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lab2/player.rs:122:42 [INFO] [stdout] | [INFO] [stdout] 122 | if self.char_lines.len() == 0 && other.char_lines.len() != 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!other.char_lines.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lab2/player.rs:125:12 [INFO] [stdout] | [INFO] [stdout] 125 | if self.char_lines.len() != 0 && other.char_lines.len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!self.char_lines.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lab2/player.rs:125:42 [INFO] [stdout] | [INFO] [stdout] 125 | if self.char_lines.len() != 0 && other.char_lines.len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `other.char_lines.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/lab2/player.rs:156:9 [INFO] [stdout] | [INFO] [stdout] 156 | return Ordering::Equal [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] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 156 - return Ordering::Equal [INFO] [stdout] 156 + Ordering::Equal [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lab2/player.rs:143:12 [INFO] [stdout] | [INFO] [stdout] 143 | if self.char_lines.len() == 0 && other.char_lines.len() != 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `self.char_lines.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lab2/player.rs:143:42 [INFO] [stdout] | [INFO] [stdout] 143 | if self.char_lines.len() == 0 && other.char_lines.len() != 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!other.char_lines.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lab2/player.rs:146:12 [INFO] [stdout] | [INFO] [stdout] 146 | if self.char_lines.len() != 0 && other.char_lines.len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!self.char_lines.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/lab2/player.rs:146:42 [INFO] [stdout] | [INFO] [stdout] 146 | if self.char_lines.len() != 0 && other.char_lines.len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `other.char_lines.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.53s [INFO] [stdout] warning: this match could be written as a `let` statement [INFO] [stdout] --> src/lab2/scene_fragments.rs:44:13 [INFO] [stdout] | [INFO] [stdout] 44 | / match a_cfg {(char_name, speak_file) => { [INFO] [stdout] 45 | | let mut new_player = Player::new(&char_name); //need mut since prepare take mut &self [INFO] [stdout] 46 | | let speak_file_clone = speak_file.clone(); [INFO] [stdout] ... | [INFO] [stdout] 58 | | handles.push(handle); [INFO] [stdout] 59 | | }} [INFO] [stdout] | |______________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_single_binding [INFO] [stdout] help: consider using a `let` statement [INFO] [stdout] | [INFO] [stdout] 44 ~ let (char_name, speak_file) = a_cfg; [INFO] [stdout] 45 + { [INFO] [stdout] 46 + let mut new_player = Player::new(&char_name); //need mut since prepare take mut &self [INFO] [stdout] 47 + let speak_file_clone = speak_file.clone(); [INFO] [stdout] 48 + [INFO] [stdout] 49 + let handle = thread::spawn(move || { [INFO] [stdout] 50 + let mut stderr = io::stderr(); [INFO] [stdout] 51 + if let Err(e) = new_player.prepare(&speak_file_clone){ //TODO: confirm if this is the prepare function he wants us to call and if we should call this before or after push to vec? [INFO] [stdout] 52 + let _ = writeln!(stderr,"Error from process_config of SceneFragment: {}", e); [INFO] [stdout] 53 + return Err(GENERATION_FAILURE); [INFO] [stdout] 54 + } [INFO] [stdout] 55 + Ok::(new_player) // return the prepared player [INFO] [stdout] 56 + } [INFO] [stdout] 57 + ); [INFO] [stdout] 58 + [INFO] [stdout] 59 + handles.push(handle); [INFO] [stdout] 60 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/lab2/scene_fragments.rs:45:50 [INFO] [stdout] | [INFO] [stdout] 45 | let mut new_player = Player::new(&char_name); //need mut since prepare take mut &self [INFO] [stdout] | ^^^^^^^^^^ help: change this to: `char_name` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&String` instead of `&str` involves a new object where a slice will do [INFO] [stdout] --> src/lab2/scene_fragments.rs:76:40 [INFO] [stdout] | [INFO] [stdout] 76 | pub fn add_config(&self, cfg_line: &String, play_cfg: &mut PlayConfig){ [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] help: change this to [INFO] [stdout] | [INFO] [stdout] 76 - pub fn add_config(&self, cfg_line: &String, play_cfg: &mut PlayConfig){ [INFO] [stdout] 76 + pub fn add_config(&self, cfg_line: &str, play_cfg: &mut PlayConfig){ [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/lab2/scene_fragments.rs:105:39 [INFO] [stdout] | [INFO] [stdout] 105 | match grab_trimmed_file_lines(&cfg_fname, &mut cfg_lines) { [INFO] [stdout] | ^^^^^^^^^^ help: change this to: `cfg_fname` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/lab2/scene_fragments.rs:156:36 [INFO] [stdout] | [INFO] [stdout] 156 | self.chars_in_play.sort_by(|a, b| SceneFragment::ref_compare(a, b)); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the associated function itself: `SceneFragment::ref_compare` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] = note: `#[warn(clippy::redundant_closure)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/lab2/scene_fragments.rs:183:25 [INFO] [stdout] | [INFO] [stdout] 183 | / if !linenum_insert_status{ [INFO] [stdout] 184 | | if WHINGE.load(Ordering::SeqCst){ [INFO] [stdout] 185 | | let _ = writeln!(stderr,"WHINGE Warning: duplicate line detected for line number: {}", line_num); [INFO] [stdout] 186 | | } [INFO] [stdout] 187 | | } [INFO] [stdout] | |_________________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] = note: `#[warn(clippy::collapsible_if)]` on by default [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 183 ~ if !linenum_insert_status [INFO] [stdout] 184 ~ && WHINGE.load(Ordering::SeqCst){ [INFO] [stdout] 185 | let _ = writeln!(stderr,"WHINGE Warning: duplicate line detected for line number: {}", line_num); [INFO] [stdout] 186 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/lab2/scene_fragments.rs:201:9 [INFO] [stdout] | [INFO] [stdout] 201 | / if WHINGE.load(Ordering::SeqCst) { [INFO] [stdout] 202 | | if linenum_and_speaker_vec[0].0 != 0{ [INFO] [stdout] 203 | | let _ = writeln!(stderr,"WHINGE Warning: line number should start at 0!"); [INFO] [stdout] ... | [INFO] [stdout] 206 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 201 ~ if WHINGE.load(Ordering::SeqCst) [INFO] [stdout] 202 ~ && linenum_and_speaker_vec[0].0 != 0{ [INFO] [stdout] 203 | let _ = writeln!(stderr,"WHINGE Warning: line number should start at 0!"); [INFO] [stdout] 204 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: deref on an immutable reference [INFO] [stdout] --> src/lab2/scene_fragments.rs:327:45 [INFO] [stdout] | [INFO] [stdout] 327 | match p1_locked.partial_cmp(&*p2_locked){ [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#borrow_deref_ref [INFO] [stdout] = note: `#[warn(clippy::borrow_deref_ref)]` on by default [INFO] [stdout] help: if you would like to reborrow, try removing `&*` [INFO] [stdout] | [INFO] [stdout] 327 - match p1_locked.partial_cmp(&*p2_locked){ [INFO] [stdout] 327 + match p1_locked.partial_cmp(p2_locked){ [INFO] [stdout] | [INFO] [stdout] help: if you would like to deref, try using `&**` [INFO] [stdout] | [INFO] [stdout] 327 | match p1_locked.partial_cmp(&**p2_locked){ [INFO] [stdout] | + [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/main.rs:62:5 [INFO] [stdout] | [INFO] [stdout] 62 | return ReturnWrapper::new(SUCCESS_CODE) [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] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 62 - return ReturnWrapper::new(SUCCESS_CODE) [INFO] [stdout] 62 + ReturnWrapper::new(SUCCESS_CODE) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] running `Command { std: "docker" "inspect" "042eff658f68cdae7187ff64924338583cb3b82bb0a5852561bb23ed4d207b71", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "042eff658f68cdae7187ff64924338583cb3b82bb0a5852561bb23ed4d207b71", kill_on_drop: false }` [INFO] [stdout] 042eff658f68cdae7187ff64924338583cb3b82bb0a5852561bb23ed4d207b71