[INFO] crate fractal-matrix-api 3.30.0 is already in cache [INFO] extracting crate fractal-matrix-api 3.30.0 into work/ex/clippy-test-run/sources/stable/reg/fractal-matrix-api/3.30.0 [INFO] extracting crate fractal-matrix-api 3.30.0 into work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/reg/fractal-matrix-api/3.30.0 [INFO] validating manifest of fractal-matrix-api-3.30.0 on toolchain stable [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "read-manifest" "--manifest-path" "Cargo.toml"` [INFO] validating manifest of fractal-matrix-api-3.30.0 on toolchain stable+rustflags=-Dclippy::into_iter_on_array [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "read-manifest" "--manifest-path" "Cargo.toml"` [INFO] started frobbing fractal-matrix-api-3.30.0 [INFO] finished frobbing fractal-matrix-api-3.30.0 [INFO] frobbed toml for fractal-matrix-api-3.30.0 written to work/ex/clippy-test-run/sources/stable/reg/fractal-matrix-api/3.30.0/Cargo.toml [INFO] started frobbing fractal-matrix-api-3.30.0 [INFO] finished frobbing fractal-matrix-api-3.30.0 [INFO] frobbed toml for fractal-matrix-api-3.30.0 written to work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/reg/fractal-matrix-api/3.30.0/Cargo.toml [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "generate-lockfile" "--manifest-path" "Cargo.toml" "-Zno-index-update"` [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "generate-lockfile" "--manifest-path" "Cargo.toml" "-Zno-index-update"` [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "fetch" "--locked" "--manifest-path" "Cargo.toml"` [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "fetch" "--locked" "--manifest-path" "Cargo.toml"` [INFO] linting fractal-matrix-api-3.30.0 against stable for clippy-test-run [INFO] running `"docker" "create" "-v" "/mnt/big/crater/work/local/target-dirs/clippy-test-run/worker-5/stable:/opt/crater/target:rw,Z" "-v" "/mnt/big/crater/work/ex/clippy-test-run/sources/stable/reg/fractal-matrix-api/3.30.0:/opt/crater/workdir:ro,Z" "-v" "/mnt/big/crater/work/local/cargo-home:/opt/crater/cargo-home:ro,Z" "-v" "/mnt/big/crater/work/local/rustup-home:/opt/crater/rustup-home:ro,Z" "-e" "USER_ID=1000" "-e" "SOURCE_DIR=/opt/crater/workdir" "-e" "MAP_USER_ID=1000" "-e" "CARGO_TARGET_DIR=/opt/crater/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/crater/cargo-home" "-e" "RUSTUP_HOME=/opt/crater/rustup-home" "-w" "/opt/crater/workdir" "-m" "1536M" "--network" "none" "rustops/crates-build-env" "/opt/crater/cargo-home/bin/cargo" "+stable" "clippy" "--frozen" "--all" "--all-targets"` [INFO] [stdout] 57214e356a5d0cfd55b95731bc0e969644374125fb2058d48189e6add7b2b11d [INFO] running `"docker" "start" "-a" "57214e356a5d0cfd55b95731bc0e969644374125fb2058d48189e6add7b2b11d"` [INFO] [stderr] Checking fractal-matrix-api v3.30.0 (/opt/crater/workdir) [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/model/room.rs:38:13 [INFO] [stderr] | [INFO] [stderr] 38 | id: id, [INFO] [stderr] | ^^^^^^ help: replace it with: `id` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::redundant_field_names)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/model/room.rs:39:13 [INFO] [stderr] | [INFO] [stderr] 39 | name: name, [INFO] [stderr] | ^^^^^^^^^^ help: replace it with: `name` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/backend/mod.rs:48:13 [INFO] [stderr] | [INFO] [stderr] 48 | tx: tx, [INFO] [stderr] | ^^^^^^ help: replace it with: `tx` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/model/room.rs:38:13 [INFO] [stderr] | [INFO] [stderr] 38 | id: id, [INFO] [stderr] | ^^^^^^ help: replace it with: `id` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::redundant_field_names)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/model/room.rs:39:13 [INFO] [stderr] | [INFO] [stderr] 39 | name: name, [INFO] [stderr] | ^^^^^^^^^^ help: replace it with: `name` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/backend/mod.rs:48:13 [INFO] [stderr] | [INFO] [stderr] 48 | tx: tx, [INFO] [stderr] | ^^^^^^ help: replace it with: `tx` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: statement can be reduced [INFO] [stderr] --> src/util.rs:213:5 [INFO] [stderr] | [INFO] [stderr] 213 | / &r["account_data"]["events"] [INFO] [stderr] 214 | | .as_array() [INFO] [stderr] 215 | | .unwrap_or(&vec![]).iter() [INFO] [stderr] 216 | | .find(|x| x["type"] == "m.direct") [INFO] [stderr] ... | [INFO] [stderr] 225 | | } [INFO] [stderr] 226 | | }); [INFO] [stderr] | |___________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::unnecessary_operation)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_operation [INFO] [stderr] help: replace it with [INFO] [stderr] | [INFO] [stderr] 213 | r["account_data"]["events"] [INFO] [stderr] 214 | .as_array() [INFO] [stderr] 215 | .unwrap_or(&vec![]).iter() [INFO] [stderr] 216 | .find(|x| x["type"] == "m.direct") [INFO] [stderr] 217 | .and_then(|js| js["content"].as_object()) [INFO] [stderr] 218 | .map(|js| { [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] error: for loop over `dataevs.as_array()`, which is an `Option`. This is more readably written as an `if let` statement. [INFO] [stderr] --> src/util.rs:267:19 [INFO] [stderr] | [INFO] [stderr] 267 | for ev in dataevs.as_array() { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[deny(clippy::for_loop_over_option)] on by default [INFO] [stderr] = help: consider replacing `for ev in dataevs.as_array()` with `if let Some(ev) = dataevs.as_array()` [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#for_loop_over_option [INFO] [stderr] [INFO] [stderr] warning: redundant pattern matching, consider using `is_some()` [INFO] [stderr] --> src/util.rs:269:24 [INFO] [stderr] | [INFO] [stderr] 269 | if let Some(_) = tag["content"]["tags"]["m.favourite"].as_object() { [INFO] [stderr] | _________________- ^^^^^^^ [INFO] [stderr] 270 | | r.fav = true; [INFO] [stderr] 271 | | } [INFO] [stderr] | |_________________- help: try this: `if tag["content"]["tags"]["m.favourite"].as_object().is_some()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::redundant_pattern_matching)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern_matching [INFO] [stderr] [INFO] [stderr] warning: this .into_iter() call is equivalent to .iter() and will not move the Vec [INFO] [stderr] --> src/util.rs:281:41 [INFO] [stderr] | [INFO] [stderr] 281 | r.add_receipt_from_json(evs.into_iter().filter(|ev| ev["type"] == "m.receipt").collect::>()); [INFO] [stderr] | ^^^^^^^^^ help: call directly: `iter` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::into_iter_on_ref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#into_iter_on_ref [INFO] [stderr] [INFO] [stderr] warning: called `filter(p).next()` on an `Iterator`. This is more succinctly expressed by calling `.find(p)` instead. [INFO] [stderr] --> src/util.rs:285:34 [INFO] [stderr] | [INFO] [stderr] 285 | if let Some(fread) = evs.into_iter().filter(|x| x["type"] == "m.fully_read").next() { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::filter_next)] on by default [INFO] [stderr] = note: replace `filter(|x| x["type"] == "m.fully_read").next()` with `find(|x| x["type"] == "m.fully_read")` [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#filter_next [INFO] [stderr] [INFO] [stderr] warning: this .into_iter() call is equivalent to .iter() and will not move the Vec [INFO] [stderr] --> src/util.rs:285:38 [INFO] [stderr] | [INFO] [stderr] 285 | if let Some(fread) = evs.into_iter().filter(|x| x["type"] == "m.fully_read").next() { [INFO] [stderr] | ^^^^^^^^^ help: call directly: `iter` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#into_iter_on_ref [INFO] [stderr] [INFO] [stderr] warning: called `map(f)` on an Option value where `f` is a unit closure [INFO] [stderr] --> src/util.rs:286:17 [INFO] [stderr] | [INFO] [stderr] 286 | fread["content"]["event_id"].as_str() [INFO] [stderr] | _________________^ [INFO] [stderr] | |_________________| [INFO] [stderr] | || [INFO] [stderr] 287 | || .map(|ev| r.add_receipt_from_fully_read(userid, ev)); [INFO] [stderr] | ||________________________________________________________________________^- help: try this: `if let Some(ev) = fread["content"]["event_id"].as_str() { r.add_receipt_from_fully_read(userid, ev) }` [INFO] [stderr] | |_________________________________________________________________________| [INFO] [stderr] | [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::option_map_unit_fn)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#option_map_unit_fn [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/util.rs:501:27 [INFO] [stderr] | [INFO] [stderr] 501 | if array.is_none() || array.unwrap().len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `array.unwrap().is_empty()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::len_zero)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: `if _ { .. } else { .. }` is an expression [INFO] [stderr] --> src/util.rs:552:5 [INFO] [stderr] | [INFO] [stderr] 552 | / let path: String; [INFO] [stderr] 553 | | [INFO] [stderr] 554 | | if thumb { [INFO] [stderr] 555 | | params.push(("width", format!("{}", w))); [INFO] [stderr] ... | [INFO] [stderr] 560 | | path = format!("download/{}/{}", server, media); [INFO] [stderr] 561 | | } [INFO] [stderr] | |_____^ help: it is more idiomatic to write: `let path = if thumb { ..; $ crate :: fmt :: format ( format_args ! ( $ ( $ arg ) * ) ) } else { $ crate :: fmt :: format ( format_args ! ( $ ( $ arg ) * ) ) };` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::useless_let_if_seq)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_let_if_seq [INFO] [stderr] [INFO] [stderr] warning: `if _ { .. } else { .. }` is an expression [INFO] [stderr] --> src/util.rs:579:5 [INFO] [stderr] | [INFO] [stderr] 579 | / let path: String; [INFO] [stderr] 580 | | [INFO] [stderr] 581 | | if thumb { [INFO] [stderr] 582 | | params.push(("width", format!("{}", w))); [INFO] [stderr] ... | [INFO] [stderr] 587 | | path = format!("download/{}/{}", server, media); [INFO] [stderr] 588 | | } [INFO] [stderr] | |_____^ help: it is more idiomatic to write: `let path = if thumb { ..; $ crate :: fmt :: format ( format_args ! ( $ ( $ arg ) * ) ) } else { $ crate :: fmt :: format ( format_args ! ( $ ( $ arg ) * ) ) };` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_let_if_seq [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/util.rs:823:5 [INFO] [stderr] | [INFO] [stderr] 823 | / match end { [INFO] [stderr] 824 | | Some(ref e) => { params.push(("from", e.clone())) } [INFO] [stderr] 825 | | None => {} [INFO] [stderr] 826 | | }; [INFO] [stderr] | |_____^ help: try this: `if let Some(ref e) = end { params.push(("from", e.clone())) }` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_match)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/util.rs:836:27 [INFO] [stderr] | [INFO] [stderr] 836 | if array.is_none() || array.unwrap().len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `array.unwrap().is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/util.rs:885:27 [INFO] [stderr] | [INFO] [stderr] 885 | if array.is_none() || array.unwrap().len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `array.unwrap().is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to one [INFO] [stderr] --> src/util.rs:907:12 [INFO] [stderr] | [INFO] [stderr] 907 | if params.len() >= 1 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!params.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: statement can be reduced [INFO] [stderr] --> src/util.rs:213:5 [INFO] [stderr] | [INFO] [stderr] 213 | / &r["account_data"]["events"] [INFO] [stderr] 214 | | .as_array() [INFO] [stderr] 215 | | .unwrap_or(&vec![]).iter() [INFO] [stderr] 216 | | .find(|x| x["type"] == "m.direct") [INFO] [stderr] ... | [INFO] [stderr] 225 | | } [INFO] [stderr] 226 | | }); [INFO] [stderr] | |___________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::unnecessary_operation)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_operation [INFO] [stderr] help: replace it with [INFO] [stderr] | [INFO] [stderr] 213 | r["account_data"]["events"] [INFO] [stderr] 214 | .as_array() [INFO] [stderr] 215 | .unwrap_or(&vec![]).iter() [INFO] [stderr] 216 | .find(|x| x["type"] == "m.direct") [INFO] [stderr] 217 | .and_then(|js| js["content"].as_object()) [INFO] [stderr] 218 | .map(|js| { [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] error: for loop over `dataevs.as_array()`, which is an `Option`. This is more readably written as an `if let` statement. [INFO] [stderr] --> src/util.rs:267:19 [INFO] [stderr] | [INFO] [stderr] 267 | for ev in dataevs.as_array() { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[deny(clippy::for_loop_over_option)] on by default [INFO] [stderr] = help: consider replacing `for ev in dataevs.as_array()` with `if let Some(ev) = dataevs.as_array()` [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#for_loop_over_option [INFO] [stderr] [INFO] [stderr] warning: redundant pattern matching, consider using `is_some()` [INFO] [stderr] --> src/util.rs:269:24 [INFO] [stderr] | [INFO] [stderr] 269 | if let Some(_) = tag["content"]["tags"]["m.favourite"].as_object() { [INFO] [stderr] | _________________- ^^^^^^^ [INFO] [stderr] 270 | | r.fav = true; [INFO] [stderr] 271 | | } [INFO] [stderr] | |_________________- help: try this: `if tag["content"]["tags"]["m.favourite"].as_object().is_some()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::redundant_pattern_matching)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern_matching [INFO] [stderr] [INFO] [stderr] warning: this .into_iter() call is equivalent to .iter() and will not move the Vec [INFO] [stderr] --> src/util.rs:281:41 [INFO] [stderr] | [INFO] [stderr] 281 | r.add_receipt_from_json(evs.into_iter().filter(|ev| ev["type"] == "m.receipt").collect::>()); [INFO] [stderr] | ^^^^^^^^^ help: call directly: `iter` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::into_iter_on_ref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#into_iter_on_ref [INFO] [stderr] [INFO] [stderr] warning: called `filter(p).next()` on an `Iterator`. This is more succinctly expressed by calling `.find(p)` instead. [INFO] [stderr] --> src/util.rs:285:34 [INFO] [stderr] | [INFO] [stderr] 285 | if let Some(fread) = evs.into_iter().filter(|x| x["type"] == "m.fully_read").next() { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::filter_next)] on by default [INFO] [stderr] = note: replace `filter(|x| x["type"] == "m.fully_read").next()` with `find(|x| x["type"] == "m.fully_read")` [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#filter_next [INFO] [stderr] [INFO] [stderr] warning: this .into_iter() call is equivalent to .iter() and will not move the Vec [INFO] [stderr] --> src/util.rs:285:38 [INFO] [stderr] | [INFO] [stderr] 285 | if let Some(fread) = evs.into_iter().filter(|x| x["type"] == "m.fully_read").next() { [INFO] [stderr] | ^^^^^^^^^ help: call directly: `iter` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#into_iter_on_ref [INFO] [stderr] [INFO] [stderr] warning: called `map(f)` on an Option value where `f` is a unit closure [INFO] [stderr] --> src/util.rs:286:17 [INFO] [stderr] | [INFO] [stderr] 286 | fread["content"]["event_id"].as_str() [INFO] [stderr] | _________________^ [INFO] [stderr] | |_________________| [INFO] [stderr] | || [INFO] [stderr] 287 | || .map(|ev| r.add_receipt_from_fully_read(userid, ev)); [INFO] [stderr] | ||________________________________________________________________________^- help: try this: `if let Some(ev) = fread["content"]["event_id"].as_str() { r.add_receipt_from_fully_read(userid, ev) }` [INFO] [stderr] | |_________________________________________________________________________| [INFO] [stderr] | [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::option_map_unit_fn)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#option_map_unit_fn [INFO] [stderr] [INFO] [stderr] warning: called `cloned().collect()` on a slice to create a `Vec`. Calling `to_vec()` is both faster and more readable [INFO] [stderr] --> src/model/room.rs:107:23 [INFO] [stderr] | [INFO] [stderr] 107 | messages: self.messages.iter().cloned().collect(), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::iter_cloned_collect)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#iter_cloned_collect [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/util.rs:501:27 [INFO] [stderr] | [INFO] [stderr] 501 | if array.is_none() || array.unwrap().len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `array.unwrap().is_empty()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::len_zero)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: `if _ { .. } else { .. }` is an expression [INFO] [stderr] --> src/util.rs:552:5 [INFO] [stderr] | [INFO] [stderr] 552 | / let path: String; [INFO] [stderr] 553 | | [INFO] [stderr] 554 | | if thumb { [INFO] [stderr] 555 | | params.push(("width", format!("{}", w))); [INFO] [stderr] ... | [INFO] [stderr] 560 | | path = format!("download/{}/{}", server, media); [INFO] [stderr] 561 | | } [INFO] [stderr] | |_____^ help: it is more idiomatic to write: `let path = if thumb { ..; $ crate :: fmt :: format ( format_args ! ( $ ( $ arg ) * ) ) } else { $ crate :: fmt :: format ( format_args ! ( $ ( $ arg ) * ) ) };` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::useless_let_if_seq)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_let_if_seq [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/model/message.rs:37:19 [INFO] [stderr] | [INFO] [stderr] 37 | date: self.date.clone(), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `self.date` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::clone_on_copy)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: `if _ { .. } else { .. }` is an expression [INFO] [stderr] --> src/util.rs:579:5 [INFO] [stderr] | [INFO] [stderr] 579 | / let path: String; [INFO] [stderr] 580 | | [INFO] [stderr] 581 | | if thumb { [INFO] [stderr] 582 | | params.push(("width", format!("{}", w))); [INFO] [stderr] ... | [INFO] [stderr] 587 | | path = format!("download/{}/{}", server, media); [INFO] [stderr] 588 | | } [INFO] [stderr] | |_____^ help: it is more idiomatic to write: `let path = if thumb { ..; $ crate :: fmt :: format ( format_args ! ( $ ( $ arg ) * ) ) } else { $ crate :: fmt :: format ( format_args ! ( $ ( $ arg ) * ) ) };` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_let_if_seq [INFO] [stderr] [INFO] [stderr] warning: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/model/message.rs:116:32 [INFO] [stderr] | [INFO] [stderr] 116 | pub fn supported_event(ev: &&JsonValue) -> bool { [INFO] [stderr] | ^^^^^^^^^^^ help: consider passing by value instead: `&JsonValue` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::trivially_copy_pass_by_ref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#trivially_copy_pass_by_ref [INFO] [stderr] [INFO] [stderr] warning: redundant closure found [INFO] [stderr] --> src/model/message.rs:176:63 [INFO] [stderr] | [INFO] [stderr] 176 | let formatted_body = c["formatted_body"].as_str().map(|s| String::from(s)); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^ help: remove closure as shown: `String::from` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::redundant_closure)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stderr] [INFO] [stderr] warning: redundant closure found [INFO] [stderr] --> src/model/message.rs:177:47 [INFO] [stderr] | [INFO] [stderr] 177 | let format = c["format"].as_str().map(|s| String::from(s)); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^ help: remove closure as shown: `String::from` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/util.rs:823:5 [INFO] [stderr] | [INFO] [stderr] 823 | / match end { [INFO] [stderr] 824 | | Some(ref e) => { params.push(("from", e.clone())) } [INFO] [stderr] 825 | | None => {} [INFO] [stderr] 826 | | }; [INFO] [stderr] | |_____^ help: try this: `if let Some(ref e) = end { params.push(("from", e.clone())) }` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_match)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/util.rs:836:27 [INFO] [stderr] | [INFO] [stderr] 836 | if array.is_none() || array.unwrap().len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `array.unwrap().is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/util.rs:885:27 [INFO] [stderr] | [INFO] [stderr] 885 | if array.is_none() || array.unwrap().len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `array.unwrap().is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to one [INFO] [stderr] --> src/util.rs:907:12 [INFO] [stderr] | [INFO] [stderr] 907 | if params.len() >= 1 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!params.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/model/userinfo.rs:12:23 [INFO] [stderr] | [INFO] [stderr] 12 | added_at: self.added_at.clone(), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `self.added_at` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/model/userinfo.rs:14:27 [INFO] [stderr] | [INFO] [stderr] 14 | validated_at: self.validated_at.clone(), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `self.validated_at` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: you should consider deriving a `Default` implementation for `cache::CacheMap` [INFO] [stderr] --> src/cache.rs:11:5 [INFO] [stderr] | [INFO] [stderr] 11 | / pub fn new() -> CacheMap { [INFO] [stderr] 12 | | CacheMap { map: HashMap::new(), timeout: 10 } [INFO] [stderr] 13 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::new_without_default_derive)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default_derive [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 5 | #[derive(Default)] [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/cache.rs:20:26 [INFO] [stderr] | [INFO] [stderr] 20 | pub fn get(&self, k: &String) -> Option<&T> { [INFO] [stderr] | ^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::ptr_arg)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/cache.rs:46:40 [INFO] [stderr] | [INFO] [stderr] 46 | map.map.insert(k.clone(), (v.0.clone(), v.1.clone())); [INFO] [stderr] | ^^^^^^^^^^^ help: try removing the `clone` call: `v.0` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: large size difference between variants [INFO] [stderr] --> src/backend/types.rs:67:5 [INFO] [stderr] | [INFO] [stderr] 67 | AttachFile(Message), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::large_enum_variant)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#large_enum_variant [INFO] [stderr] help: consider boxing the large fields to reduce the total size of the enum [INFO] [stderr] | [INFO] [stderr] 67 | AttachFile(Box), [INFO] [stderr] | ^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: large size difference between variants [INFO] [stderr] --> src/backend/types.rs:127:5 [INFO] [stderr] | [INFO] [stderr] 127 | NewRoom(Room, String), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] help: consider boxing the large fields to reduce the total size of the enum [INFO] [stderr] --> src/backend/types.rs:127:5 [INFO] [stderr] | [INFO] [stderr] 127 | NewRoom(Room, String), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#large_enum_variant [INFO] [stderr] [INFO] [stderr] warning: called `cloned().collect()` on a slice to create a `Vec`. Calling `to_vec()` is both faster and more readable [INFO] [stderr] --> src/model/room.rs:107:23 [INFO] [stderr] | [INFO] [stderr] 107 | messages: self.messages.iter().cloned().collect(), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] warning: `if _ { .. } else { .. }` is an expression [INFO] [stderr] --> src/backend/register.rs:44:5 [INFO] [stderr] | [INFO] [stderr] 44 | / let attrs; [INFO] [stderr] 45 | | [INFO] [stderr] 46 | | // Email [INFO] [stderr] 47 | | if emailre.is_match(&user) { [INFO] [stderr] ... | [INFO] [stderr] 66 | | }); [INFO] [stderr] 67 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_let_if_seq [INFO] [stderr] | [INFO] [stderr] help: it is more idiomatic to write [INFO] [stderr] | [INFO] [stderr] 44 | let attrs = if emailre.is_match(&user) { $ crate :: Value :: Object ( [INFO] [stderr] 45 | { [INFO] [stderr] 46 | let mut object = $ crate :: Map :: new ( ) ; json_internal ! ( [INFO] [stderr] 47 | @ object object ( ) ( $ ( $ tt ) + ) ( $ ( $ tt ) + ) ) ; object } ) } else { $ crate :: Value :: Object ( [INFO] [stderr] 48 | { [INFO] [stderr] 49 | let mut object = $ crate :: Map :: new ( ) ; json_internal ! ( [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] = note: #[warn(clippy::iter_cloned_collect)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#iter_cloned_collect [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/backend/user.rs:60:23 [INFO] [stderr] | [INFO] [stderr] 60 | let url = bk.url(&format!("account/3pid"), vec![])?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"account/3pid".to_string()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::useless_format)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/backend/user.rs:101:23 [INFO] [stderr] | [INFO] [stderr] 101 | let url = bk.url(&format!("account/3pid/email/requestToken"), vec![])?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"account/3pid/email/requestToken".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/backend/user.rs:130:23 [INFO] [stderr] | [INFO] [stderr] 130 | let url = bk.url(&format!("account/3pid/msisdn/requestToken"), vec![])?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"account/3pid/msisdn/requestToken".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/backend/user.rs:160:23 [INFO] [stderr] | [INFO] [stderr] 160 | let url = bk.url(&format!("account/3pid"), vec![])?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"account/3pid".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: equality checks against true are unnecessary [INFO] [stderr] --> src/backend/user.rs:194:31 [INFO] [stderr] | [INFO] [stderr] 194 | let result = if r["success"] == true { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^ help: try simplifying it as shown: `r["success"]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::bool_comparison)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bool_comparison [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/model/message.rs:37:19 [INFO] [stderr] | [INFO] [stderr] 37 | date: self.date.clone(), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `self.date` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::clone_on_copy)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/backend/user.rs:233:23 [INFO] [stderr] | [INFO] [stderr] 233 | let url = bk.url(&format!("account/password"), vec![])?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"account/password".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/backend/user.rs:259:23 [INFO] [stderr] | [INFO] [stderr] 259 | let url = bk.url(&format!("account/deactivate"), vec![])?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"account/deactivate".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/model/message.rs:116:32 [INFO] [stderr] | [INFO] [stderr] 116 | pub fn supported_event(ev: &&JsonValue) -> bool { [INFO] [stderr] | ^^^^^^^^^^^ help: consider passing by value instead: `&JsonValue` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::trivially_copy_pass_by_ref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#trivially_copy_pass_by_ref [INFO] [stderr] [INFO] [stderr] warning: redundant closure found [INFO] [stderr] --> src/model/message.rs:176:63 [INFO] [stderr] | [INFO] [stderr] 176 | let formatted_body = c["formatted_body"].as_str().map(|s| String::from(s)); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^ help: remove closure as shown: `String::from` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::redundant_closure)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stderr] [INFO] [stderr] warning: redundant closure found [INFO] [stderr] --> src/model/message.rs:177:47 [INFO] [stderr] | [INFO] [stderr] 177 | let format = c["format"].as_str().map(|s| String::from(s)); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^ help: remove closure as shown: `String::from` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/backend/user.rs:427:23 [INFO] [stderr] | [INFO] [stderr] 427 | let url = bk.url(&format!("user_directory/search"), vec![])?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"user_directory/search".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: use of `unwrap_or` followed by a function call [INFO] [stderr] --> src/backend/room.rs:81:26 [INFO] [stderr] | [INFO] [stderr] 81 | .unwrap_or(String::from("")); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|_| String::from(""))` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::or_fun_call)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#or_fun_call [INFO] [stderr] [INFO] [stderr] warning: use of `unwrap_or` followed by a function call [INFO] [stderr] --> src/backend/room.rs:90:26 [INFO] [stderr] | [INFO] [stderr] 90 | .unwrap_or(String::from("")); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|_| String::from(""))` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#or_fun_call [INFO] [stderr] [INFO] [stderr] warning: redundant pattern matching, consider using `is_none()` [INFO] [stderr] --> src/backend/room.rs:157:24 [INFO] [stderr] | [INFO] [stderr] 157 | if let None = id { [INFO] [stderr] | _________________- ^^^^ [INFO] [stderr] 158 | | id = Some(msg["event_id"].as_str().unwrap_or("").to_string()); [INFO] [stderr] 159 | | } [INFO] [stderr] | |_________________- help: try this: `if id.is_none()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern_matching [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/backend/room.rs:169:16 [INFO] [stderr] | [INFO] [stderr] 169 | if ms.len() == 0 && id.is_some() { [INFO] [stderr] | ^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `ms.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/model/userinfo.rs:12:23 [INFO] [stderr] | [INFO] [stderr] 12 | added_at: self.added_at.clone(), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `self.added_at` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/model/userinfo.rs:14:27 [INFO] [stderr] | [INFO] [stderr] 14 | validated_at: self.validated_at.clone(), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `self.validated_at` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: you should consider deriving a `Default` implementation for `cache::CacheMap` [INFO] [stderr] --> src/cache.rs:11:5 [INFO] [stderr] | [INFO] [stderr] 11 | / pub fn new() -> CacheMap { [INFO] [stderr] 12 | | CacheMap { map: HashMap::new(), timeout: 10 } [INFO] [stderr] 13 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::new_without_default_derive)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default_derive [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 5 | #[derive(Default)] [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/cache.rs:20:26 [INFO] [stderr] | [INFO] [stderr] 20 | pub fn get(&self, k: &String) -> Option<&T> { [INFO] [stderr] | ^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::ptr_arg)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/cache.rs:46:40 [INFO] [stderr] | [INFO] [stderr] 46 | map.map.insert(k.clone(), (v.0.clone(), v.1.clone())); [INFO] [stderr] | ^^^^^^^^^^^ help: try removing the `clone` call: `v.0` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: large size difference between variants [INFO] [stderr] --> src/backend/types.rs:67:5 [INFO] [stderr] | [INFO] [stderr] 67 | AttachFile(Message), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::large_enum_variant)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#large_enum_variant [INFO] [stderr] help: consider boxing the large fields to reduce the total size of the enum [INFO] [stderr] | [INFO] [stderr] 67 | AttachFile(Box), [INFO] [stderr] | ^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: large size difference between variants [INFO] [stderr] --> src/backend/types.rs:127:5 [INFO] [stderr] | [INFO] [stderr] 127 | NewRoom(Room, String), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] help: consider boxing the large fields to reduce the total size of the enum [INFO] [stderr] --> src/backend/types.rs:127:5 [INFO] [stderr] | [INFO] [stderr] 127 | NewRoom(Room, String), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#large_enum_variant [INFO] [stderr] [INFO] [stderr] warning: called `map(f)` on an Option value where `f` is a unit closure [INFO] [stderr] --> src/backend/room.rs:473:17 [INFO] [stderr] | [INFO] [stderr] 473 | directs.get_mut(&m.uid).map(|v| v.push(id.clone())); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^- [INFO] [stderr] | | [INFO] [stderr] | help: try this: `if let Some(v) = directs.get_mut(&m.uid) { v.push(id.clone()) }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#option_map_unit_fn [INFO] [stderr] [INFO] [stderr] warning: `if _ { .. } else { .. }` is an expression [INFO] [stderr] --> src/backend/register.rs:44:5 [INFO] [stderr] | [INFO] [stderr] 44 | / let attrs; [INFO] [stderr] 45 | | [INFO] [stderr] 46 | | // Email [INFO] [stderr] 47 | | if emailre.is_match(&user) { [INFO] [stderr] ... | [INFO] [stderr] 66 | | }); [INFO] [stderr] 67 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_let_if_seq [INFO] [stderr] help: it is more idiomatic to write [INFO] [stderr] | [INFO] [stderr] 44 | let attrs = if emailre.is_match(&user) { $ crate :: Value :: Object ( [INFO] [stderr] 45 | { [INFO] [stderr] 46 | let mut object = $ crate :: Map :: new ( ) ; json_internal ! ( [INFO] [stderr] 47 | @ object object ( ) ( $ ( $ tt ) + ) ( $ ( $ tt ) + ) ) ; object } ) } else { $ crate :: Value :: Object ( [INFO] [stderr] 48 | { [INFO] [stderr] 49 | let mut object = $ crate :: Map :: new ( ) ; json_internal ! ( [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/backend/room.rs:551:18 [INFO] [stderr] | [INFO] [stderr] 551 | let method = match tofav { true => "put", false => "delete" }; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using an if/else expression: `if tofav { "put" } else { "delete" }` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::match_bool)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_bool [INFO] [stderr] [INFO] [stderr] warning: `if _ { .. } else { .. }` is an expression [INFO] [stderr] --> src/backend/sync.rs:26:5 [INFO] [stderr] | [INFO] [stderr] 26 | / let timeout; [INFO] [stderr] 27 | | [INFO] [stderr] 28 | | if since.is_empty() { [INFO] [stderr] 29 | | let filter = format!("{{ [INFO] [stderr] ... | [INFO] [stderr] 52 | | timeout = 30; [INFO] [stderr] 53 | | } [INFO] [stderr] | |_____^ help: it is more idiomatic to write: `let timeout = if since.is_empty() { ..; 0 } else { ..; 30 };` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_let_if_seq [INFO] [stderr] [INFO] [stderr] warning: identical conversion [INFO] [stderr] --> src/backend/sync.rs:46:32 [INFO] [stderr] | [INFO] [stderr] 46 | params.push(("filter", String::from(filter))); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^ help: consider removing `String::from()`: `filter` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::identity_conversion)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#identity_conversion [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/backend/sync.rs:99:21 [INFO] [stderr] | [INFO] [stderr] 99 | / match get_rooms_notifies_from_json(&r) { [INFO] [stderr] 100 | | Ok(notifies) => { [INFO] [stderr] 101 | | for (r, n, h) in notifies { [INFO] [stderr] 102 | | tx.send(BKResponse::RoomNotifications(r.clone(), n, h)).unwrap(); [INFO] [stderr] ... | [INFO] [stderr] 105 | | Err(_) => {} [INFO] [stderr] 106 | | }; [INFO] [stderr] | |_____________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 99 | if let Ok(notifies) = get_rooms_notifies_from_json(&r) { [INFO] [stderr] 100 | for (r, n, h) in notifies { [INFO] [stderr] 101 | tx.send(BKResponse::RoomNotifications(r.clone(), n, h)).unwrap(); [INFO] [stderr] 102 | } [INFO] [stderr] 103 | }; [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/backend/user.rs:60:23 [INFO] [stderr] | [INFO] [stderr] 60 | let url = bk.url(&format!("account/3pid"), vec![])?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"account/3pid".to_string()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::useless_format)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/backend/user.rs:101:23 [INFO] [stderr] | [INFO] [stderr] 101 | let url = bk.url(&format!("account/3pid/email/requestToken"), vec![])?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"account/3pid/email/requestToken".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/backend/media.rs:113:30 [INFO] [stderr] | [INFO] [stderr] 113 | let name = url.split("/").last().unwrap_or_default(); [INFO] [stderr] | ^^^ help: try using a char instead: `'/'` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_char_pattern)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_char_pattern [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/backend/user.rs:130:23 [INFO] [stderr] | [INFO] [stderr] 130 | let url = bk.url(&format!("account/3pid/msisdn/requestToken"), vec![])?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"account/3pid/msisdn/requestToken".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/backend/user.rs:160:23 [INFO] [stderr] | [INFO] [stderr] 160 | let url = bk.url(&format!("account/3pid"), vec![])?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"account/3pid".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: equality checks against true are unnecessary [INFO] [stderr] --> src/backend/user.rs:194:31 [INFO] [stderr] | [INFO] [stderr] 194 | let result = if r["success"] == true { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^ help: try simplifying it as shown: `r["success"]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::bool_comparison)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bool_comparison [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/backend/user.rs:233:23 [INFO] [stderr] | [INFO] [stderr] 233 | let url = bk.url(&format!("account/password"), vec![])?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"account/password".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/backend/user.rs:259:23 [INFO] [stderr] | [INFO] [stderr] 259 | let url = bk.url(&format!("account/deactivate"), vec![])?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"account/deactivate".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/backend/stickers.rs:78:33 [INFO] [stderr] | [INFO] [stderr] 78 | let widget_id = match id.is_empty() { [INFO] [stderr] | _________________________________^ [INFO] [stderr] 79 | | true => None, [INFO] [stderr] 80 | | false => Some(id), [INFO] [stderr] 81 | | }; [INFO] [stderr] | |_________________^ help: consider using an if/else expression: `if id.is_empty() { None } else { Some(id) }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_bool [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/backend/user.rs:427:23 [INFO] [stderr] | [INFO] [stderr] 427 | let url = bk.url(&format!("user_directory/search"), vec![])?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"user_directory/search".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: use of `unwrap_or` followed by a function call [INFO] [stderr] --> src/backend/room.rs:81:26 [INFO] [stderr] | [INFO] [stderr] 81 | .unwrap_or(String::from("")); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|_| String::from(""))` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::or_fun_call)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#or_fun_call [INFO] [stderr] [INFO] [stderr] warning: use of `unwrap_or` followed by a function call [INFO] [stderr] --> src/backend/room.rs:90:26 [INFO] [stderr] | [INFO] [stderr] 90 | .unwrap_or(String::from("")); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|_| String::from(""))` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#or_fun_call [INFO] [stderr] [INFO] [stderr] warning: the function has a cyclomatic complexity of 59 [INFO] [stderr] --> src/backend/mod.rs:86:5 [INFO] [stderr] | [INFO] [stderr] 86 | / pub fn command_recv(&mut self, cmd: Result) -> bool { [INFO] [stderr] 87 | | let tx = self.tx.clone(); [INFO] [stderr] 88 | | [INFO] [stderr] 89 | | match cmd { [INFO] [stderr] ... | [INFO] [stderr] 360 | | true [INFO] [stderr] 361 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::cyclomatic_complexity)] on by default [INFO] [stderr] = help: you could split it up into multiple smaller functions [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cyclomatic_complexity [INFO] [stderr] [INFO] [stderr] warning: redundant pattern matching, consider using `is_none()` [INFO] [stderr] --> src/backend/room.rs:157:24 [INFO] [stderr] | [INFO] [stderr] 157 | if let None = id { [INFO] [stderr] | _________________- ^^^^ [INFO] [stderr] 158 | | id = Some(msg["event_id"].as_str().unwrap_or("").to_string()); [INFO] [stderr] 159 | | } [INFO] [stderr] | |_________________- help: try this: `if id.is_none()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern_matching [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/backend/room.rs:169:16 [INFO] [stderr] | [INFO] [stderr] 169 | if ms.len() == 0 && id.is_some() { [INFO] [stderr] | ^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `ms.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] error: aborting due to previous error [INFO] [stderr] [INFO] [stderr] warning: called `map(f)` on an Option value where `f` is a unit closure [INFO] [stderr] --> src/backend/room.rs:473:17 [INFO] [stderr] | [INFO] [stderr] 473 | directs.get_mut(&m.uid).map(|v| v.push(id.clone())); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^- [INFO] [stderr] | | [INFO] [stderr] | help: try this: `if let Some(v) = directs.get_mut(&m.uid) { v.push(id.clone()) }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#option_map_unit_fn [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/backend/room.rs:551:18 [INFO] [stderr] | [INFO] [stderr] 551 | let method = match tofav { true => "put", false => "delete" }; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using an if/else expression: `if tofav { "put" } else { "delete" }` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::match_bool)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_bool [INFO] [stderr] [INFO] [stderr] error: Could not compile `fractal-matrix-api`. [INFO] [stderr] warning: build failed, waiting for other jobs to finish... [INFO] [stderr] warning: `if _ { .. } else { .. }` is an expression [INFO] [stderr] --> src/backend/sync.rs:26:5 [INFO] [stderr] | [INFO] [stderr] 26 | / let timeout; [INFO] [stderr] 27 | | [INFO] [stderr] 28 | | if since.is_empty() { [INFO] [stderr] 29 | | let filter = format!("{{ [INFO] [stderr] ... | [INFO] [stderr] 52 | | timeout = 30; [INFO] [stderr] 53 | | } [INFO] [stderr] | |_____^ help: it is more idiomatic to write: `let timeout = if since.is_empty() { ..; 0 } else { ..; 30 };` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_let_if_seq [INFO] [stderr] [INFO] [stderr] warning: identical conversion [INFO] [stderr] --> src/backend/sync.rs:46:32 [INFO] [stderr] | [INFO] [stderr] 46 | params.push(("filter", String::from(filter))); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^ help: consider removing `String::from()`: `filter` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::identity_conversion)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#identity_conversion [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/backend/sync.rs:99:21 [INFO] [stderr] | [INFO] [stderr] 99 | / match get_rooms_notifies_from_json(&r) { [INFO] [stderr] 100 | | Ok(notifies) => { [INFO] [stderr] 101 | | for (r, n, h) in notifies { [INFO] [stderr] 102 | | tx.send(BKResponse::RoomNotifications(r.clone(), n, h)).unwrap(); [INFO] [stderr] ... | [INFO] [stderr] 105 | | Err(_) => {} [INFO] [stderr] 106 | | }; [INFO] [stderr] | |_____________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 99 | if let Ok(notifies) = get_rooms_notifies_from_json(&r) { [INFO] [stderr] 100 | for (r, n, h) in notifies { [INFO] [stderr] 101 | tx.send(BKResponse::RoomNotifications(r.clone(), n, h)).unwrap(); [INFO] [stderr] 102 | } [INFO] [stderr] 103 | }; [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/backend/media.rs:113:30 [INFO] [stderr] | [INFO] [stderr] 113 | let name = url.split("/").last().unwrap_or_default(); [INFO] [stderr] | ^^^ help: try using a char instead: `'/'` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_char_pattern)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_char_pattern [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/backend/stickers.rs:78:33 [INFO] [stderr] | [INFO] [stderr] 78 | let widget_id = match id.is_empty() { [INFO] [stderr] | _________________________________^ [INFO] [stderr] 79 | | true => None, [INFO] [stderr] 80 | | false => Some(id), [INFO] [stderr] 81 | | }; [INFO] [stderr] | |_________________^ help: consider using an if/else expression: `if id.is_empty() { None } else { Some(id) }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_bool [INFO] [stderr] [INFO] [stderr] warning: the function has a cyclomatic complexity of 59 [INFO] [stderr] --> src/backend/mod.rs:86:5 [INFO] [stderr] | [INFO] [stderr] 86 | / pub fn command_recv(&mut self, cmd: Result) -> bool { [INFO] [stderr] 87 | | let tx = self.tx.clone(); [INFO] [stderr] 88 | | [INFO] [stderr] 89 | | match cmd { [INFO] [stderr] ... | [INFO] [stderr] 360 | | true [INFO] [stderr] 361 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::cyclomatic_complexity)] on by default [INFO] [stderr] = help: you could split it up into multiple smaller functions [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cyclomatic_complexity [INFO] [stderr] [INFO] [stderr] error: aborting due to previous error [INFO] [stderr] [INFO] [stderr] error: Could not compile `fractal-matrix-api`. [INFO] [stderr] [INFO] [stderr] To learn more, run the command again with --verbose. [INFO] running `"docker" "inspect" "57214e356a5d0cfd55b95731bc0e969644374125fb2058d48189e6add7b2b11d"` [INFO] running `"docker" "rm" "-f" "57214e356a5d0cfd55b95731bc0e969644374125fb2058d48189e6add7b2b11d"` [INFO] [stdout] 57214e356a5d0cfd55b95731bc0e969644374125fb2058d48189e6add7b2b11d