[INFO] crate canteen 0.5.1 is already in cache [INFO] extracting crate canteen 0.5.1 into work/ex/clippy-test-run/sources/stable/reg/canteen/0.5.1 [INFO] extracting crate canteen 0.5.1 into work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/reg/canteen/0.5.1 [INFO] validating manifest of canteen-0.5.1 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 canteen-0.5.1 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 canteen-0.5.1 [INFO] finished frobbing canteen-0.5.1 [INFO] frobbed toml for canteen-0.5.1 written to work/ex/clippy-test-run/sources/stable/reg/canteen/0.5.1/Cargo.toml [INFO] started frobbing canteen-0.5.1 [INFO] finished frobbing canteen-0.5.1 [INFO] frobbed toml for canteen-0.5.1 written to work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/reg/canteen/0.5.1/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 canteen-0.5.1 against stable for clippy-test-run [INFO] running `"docker" "create" "-v" "/mnt/big/crater/work/local/target-dirs/clippy-test-run/worker-1/stable:/opt/crater/target:rw,Z" "-v" "/mnt/big/crater/work/ex/clippy-test-run/sources/stable/reg/canteen/0.5.1:/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] ba5b33734cf62b9205c8720af41beee35d3aa8e1709697e42e8e477cf31a2ac3 [INFO] running `"docker" "start" "-a" "ba5b33734cf62b9205c8720af41beee35d3aa8e1709697e42e8e477cf31a2ac3"` [INFO] [stderr] Checking canteen v0.5.1 (/opt/crater/workdir) [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/route.rs:94:13 [INFO] [stderr] | [INFO] [stderr] 94 | params: params, [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: replace it with: `params` [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/route.rs:95:13 [INFO] [stderr] | [INFO] [stderr] 95 | method: method, [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: replace it with: `method` [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/route.rs:96:13 [INFO] [stderr] | [INFO] [stderr] 96 | handler: handler, [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: replace it with: `handler` [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/lib.rs:126:13 [INFO] [stderr] | [INFO] [stderr] 126 | sock: sock, [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `sock` [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/lib.rs:127:13 [INFO] [stderr] | [INFO] [stderr] 127 | token: token, [INFO] [stderr] | ^^^^^^^^^^^^^ help: replace it with: `token` [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/route.rs:94:13 [INFO] [stderr] | [INFO] [stderr] 94 | params: params, [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: replace it with: `params` [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/route.rs:95:13 [INFO] [stderr] | [INFO] [stderr] 95 | method: method, [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: replace it with: `method` [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/route.rs:96:13 [INFO] [stderr] | [INFO] [stderr] 96 | handler: handler, [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: replace it with: `handler` [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/lib.rs:126:13 [INFO] [stderr] | [INFO] [stderr] 126 | sock: sock, [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `sock` [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/lib.rs:127:13 [INFO] [stderr] | [INFO] [stderr] 127 | token: token, [INFO] [stderr] | ^^^^^^^^^^^^^ help: replace it with: `token` [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: Constants have by default a `'static` lifetime [INFO] [stderr] --> src/response.rs:13:17 [INFO] [stderr] | [INFO] [stderr] 13 | const VERSION: &'static str = env!("CARGO_PKG_VERSION"); [INFO] [stderr] | -^^^^^^^---- help: consider removing `'static`: `&str` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::const_static_lifetime)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#const_static_lifetime [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/lib.rs:144:25 [INFO] [stderr] | [INFO] [stderr] 144 | return Ok(true); [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: remove `return` as shown: `Ok(true)` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_return)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/lib.rs:147:25 [INFO] [stderr] | [INFO] [stderr] 147 | return Ok(false); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^ help: remove `return` as shown: `Ok(false)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/lib.rs:152:17 [INFO] [stderr] | [INFO] [stderr] 152 | return Ok(false); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^ help: remove `return` as shown: `Ok(false)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: Constants have by default a `'static` lifetime [INFO] [stderr] --> src/response.rs:13:17 [INFO] [stderr] | [INFO] [stderr] 13 | const VERSION: &'static str = env!("CARGO_PKG_VERSION"); [INFO] [stderr] | -^^^^^^^---- help: consider removing `'static`: `&str` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::const_static_lifetime)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#const_static_lifetime [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/lib.rs:144:25 [INFO] [stderr] | [INFO] [stderr] 144 | return Ok(true); [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: remove `return` as shown: `Ok(true)` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_return)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/lib.rs:147:25 [INFO] [stderr] | [INFO] [stderr] 147 | return Ok(false); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^ help: remove `return` as shown: `Ok(false)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/lib.rs:152:17 [INFO] [stderr] | [INFO] [stderr] 152 | return Ok(false); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^ help: remove `return` as shown: `Ok(false)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/utils.rs:102:24 [INFO] [stderr] | [INFO] [stderr] 102 | if !fixed.contains("%") { [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/route.rs:52:33 [INFO] [stderr] | [INFO] [stderr] 52 | let chunk: String = match re.is_match(part) { [INFO] [stderr] | _________________________________^ [INFO] [stderr] 53 | | true => { [INFO] [stderr] 54 | | let caps = re.captures(part).unwrap(); [INFO] [stderr] 55 | | let param = caps.get(2).unwrap().as_str(); [INFO] [stderr] ... | [INFO] [stderr] 83 | | false => String::from("/") + part, [INFO] [stderr] 84 | | }; [INFO] [stderr] | |_____________^ [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] help: consider using an if/else expression [INFO] [stderr] | [INFO] [stderr] 52 | let chunk: String = if re.is_match(part) { [INFO] [stderr] 53 | let caps = re.captures(part).unwrap(); [INFO] [stderr] 54 | let param = caps.get(2).unwrap().as_str(); [INFO] [stderr] 55 | let ptype: ParamType = match caps.get(1) { [INFO] [stderr] 56 | Some(x) => { [INFO] [stderr] 57 | match x.as_str() { [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you seem to want to iterate on a map's keys [INFO] [stderr] --> src/route.rs:111:31 [INFO] [stderr] | [INFO] [stderr] 111 | for (param, _) in &self.params { [INFO] [stderr] | ^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::for_kv_map)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#for_kv_map [INFO] [stderr] help: use the corresponding method [INFO] [stderr] | [INFO] [stderr] 111 | for param in self.params.keys() { [INFO] [stderr] | ^^^^^ ^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: you should consider adding a `Default` implementation for `request::Request` [INFO] [stderr] --> src/request.rs:85:5 [INFO] [stderr] | [INFO] [stderr] 85 | / pub fn new() -> Request { [INFO] [stderr] 86 | | Request { [INFO] [stderr] 87 | | method: Method::NoImpl, [INFO] [stderr] 88 | | path: String::new(), [INFO] [stderr] ... | [INFO] [stderr] 92 | | } [INFO] [stderr] 93 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::new_without_default)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 83 | impl Default for request::Request { [INFO] [stderr] 84 | fn default() -> Self { [INFO] [stderr] 85 | Self::new() [INFO] [stderr] 86 | } [INFO] [stderr] 87 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: defining a method called `from_str` on this type; consider implementing the `std::str::FromStr` trait or choosing a less ambiguous name [INFO] [stderr] --> src/request.rs:96:5 [INFO] [stderr] | [INFO] [stderr] 96 | / pub fn from_str(rqstr: &str) -> Request { [INFO] [stderr] 97 | | let mut req = Request::new(); [INFO] [stderr] 98 | | req.parse(rqstr); [INFO] [stderr] 99 | | req [INFO] [stderr] 100 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::should_implement_trait)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#should_implement_trait [INFO] [stderr] [INFO] [stderr] warning: you should consider deriving a `Default` implementation for `response::Response` [INFO] [stderr] --> src/response.rs:56:5 [INFO] [stderr] | [INFO] [stderr] 56 | / pub fn new() -> Response { [INFO] [stderr] 57 | | let mut res = Response { [INFO] [stderr] 58 | | status: 200, [INFO] [stderr] 59 | | cmsg: String::from("OK"), [INFO] [stderr] ... | [INFO] [stderr] 71 | | res [INFO] [stderr] 72 | | } [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] 46 | #[derive(Default)] [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: methods called `as_*` usually take self by reference or self by mutable reference; consider choosing a less ambiguous name [INFO] [stderr] --> src/response.rs:90:34 [INFO] [stderr] | [INFO] [stderr] 90 | pub fn as_json(data: &T) -> Response { [INFO] [stderr] | ^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::wrong_self_convention)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#wrong_self_convention [INFO] [stderr] [INFO] [stderr] warning: this .into_iter() call is equivalent to .iter() and will not move the slice [INFO] [stderr] --> src/response.rs:206:49 [INFO] [stderr] | [INFO] [stderr] 206 | self.payload.extend(payload.to_output().into_iter()); [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: length comparison to zero [INFO] [stderr] --> src/lib.rs:164:12 [INFO] [stderr] | [INFO] [stderr] 164 | if self.o_buf.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `self.o_buf.is_empty()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::len_zero)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/lib.rs:168:15 [INFO] [stderr] | [INFO] [stderr] 168 | while self.o_buf.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!self.o_buf.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: you should consider adding a `Default` implementation for `Canteen` [INFO] [stderr] --> src/lib.rs:263:5 [INFO] [stderr] | [INFO] [stderr] 263 | / pub fn new() -> Canteen { [INFO] [stderr] 264 | | Canteen { [INFO] [stderr] 265 | | routes: HashMap::new(), [INFO] [stderr] 266 | | rcache: HashMap::new(), [INFO] [stderr] ... | [INFO] [stderr] 272 | | } [INFO] [stderr] 273 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 253 | impl Default for Canteen { [INFO] [stderr] 254 | fn default() -> Self { [INFO] [stderr] 255 | Self::new() [INFO] [stderr] 256 | } [INFO] [stderr] 257 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/lib.rs:358:72 [INFO] [stderr] | [INFO] [stderr] 358 | Err(std::io::Error::new(std::io::ErrorKind::ConnectionAborted, format!("booo"))) [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: consider using .to_string(): `"booo".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: usage of `contains_key` followed by `insert` on a `HashMap` [INFO] [stderr] --> src/lib.rs:372:9 [INFO] [stderr] | [INFO] [stderr] 372 | / if self.rcache.contains_key(&resolved) { [INFO] [stderr] 373 | | let ref route = self.routes[&self.rcache[&resolved]]; [INFO] [stderr] 374 | | [INFO] [stderr] 375 | | handler = route.handler; [INFO] [stderr] ... | [INFO] [stderr] 388 | | } [INFO] [stderr] 389 | | } [INFO] [stderr] | |_________^ help: consider using: `self.rcache.entry(resolved)` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::map_entry)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_entry [INFO] [stderr] [INFO] [stderr] warning: `ref` on an entire `let` pattern is discouraged, take a reference with `&` instead [INFO] [stderr] --> src/lib.rs:373:17 [INFO] [stderr] | [INFO] [stderr] 373 | let ref route = self.routes[&self.rcache[&resolved]]; [INFO] [stderr] | ----^^^^^^^^^---------------------------------------- help: try: `let route = &self.routes[&self.rcache[&resolved]];` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::toplevel_ref_arg)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#toplevel_ref_arg [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/lib.rs:379:17 [INFO] [stderr] | [INFO] [stderr] 379 | / match (route).is_match(&req) { [INFO] [stderr] 380 | | true => { [INFO] [stderr] 381 | | handler = route.handler; [INFO] [stderr] 382 | | req.params = route.parse(&req.path); [INFO] [stderr] ... | [INFO] [stderr] 386 | | false => continue, [INFO] [stderr] 387 | | } [INFO] [stderr] | |_________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_bool [INFO] [stderr] help: consider using an if/else expression [INFO] [stderr] | [INFO] [stderr] 379 | if (route).is_match(&req) { [INFO] [stderr] 380 | handler = route.handler; [INFO] [stderr] 381 | req.params = route.parse(&req.path); [INFO] [stderr] 382 | self.rcache.insert(resolved, (*path).clone()); [INFO] [stderr] 383 | break; [INFO] [stderr] 384 | } else { continue } [INFO] [stderr] | [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/lib.rs:397:9 [INFO] [stderr] | [INFO] [stderr] 397 | / match self.get_client(token).receive() { [INFO] [stderr] 398 | | Ok(true) => { [INFO] [stderr] 399 | | let buf = self.get_client(token).i_buf.clone(); [INFO] [stderr] 400 | | let rqstr = String::from_utf8(buf).unwrap(); [INFO] [stderr] ... | [INFO] [stderr] 403 | | _ => {}, [INFO] [stderr] 404 | | }; [INFO] [stderr] | |_________^ [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] help: try this [INFO] [stderr] | [INFO] [stderr] 397 | if let Ok(true) = self.get_client(token).receive() { [INFO] [stderr] 398 | let buf = self.get_client(token).i_buf.clone(); [INFO] [stderr] 399 | let rqstr = String::from_utf8(buf).unwrap(); [INFO] [stderr] 400 | self.handle_request(token, evl.channel(), &rqstr); [INFO] [stderr] 401 | }; [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/utils.rs:102:24 [INFO] [stderr] | [INFO] [stderr] 102 | if !fixed.contains("%") { [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/route.rs:52:33 [INFO] [stderr] | [INFO] [stderr] 52 | let chunk: String = match re.is_match(part) { [INFO] [stderr] | _________________________________^ [INFO] [stderr] 53 | | true => { [INFO] [stderr] 54 | | let caps = re.captures(part).unwrap(); [INFO] [stderr] 55 | | let param = caps.get(2).unwrap().as_str(); [INFO] [stderr] ... | [INFO] [stderr] 83 | | false => String::from("/") + part, [INFO] [stderr] 84 | | }; [INFO] [stderr] | |_____________^ [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] help: consider using an if/else expression [INFO] [stderr] | [INFO] [stderr] 52 | let chunk: String = if re.is_match(part) { [INFO] [stderr] 53 | let caps = re.captures(part).unwrap(); [INFO] [stderr] 54 | let param = caps.get(2).unwrap().as_str(); [INFO] [stderr] 55 | let ptype: ParamType = match caps.get(1) { [INFO] [stderr] 56 | Some(x) => { [INFO] [stderr] 57 | match x.as_str() { [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you seem to want to iterate on a map's keys [INFO] [stderr] --> src/route.rs:111:31 [INFO] [stderr] | [INFO] [stderr] 111 | for (param, _) in &self.params { [INFO] [stderr] | ^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::for_kv_map)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#for_kv_map [INFO] [stderr] help: use the corresponding method [INFO] [stderr] | [INFO] [stderr] 111 | for param in self.params.keys() { [INFO] [stderr] | ^^^^^ ^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/route.rs:156:36 [INFO] [stderr] | [INFO] [stderr] 156 | assert_eq!("blahblahblah", parsed.get("foo_stuff").unwrap()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&parsed["foo_stuff"]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::get_unwrap)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/route.rs:164:27 [INFO] [stderr] | [INFO] [stderr] 164 | assert_eq!("123", parsed.get("foo_id").unwrap()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&parsed["foo_id"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/route.rs:176:27 [INFO] [stderr] | [INFO] [stderr] 176 | assert_eq!("123", parsed.get("foo_id").unwrap()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&parsed["foo_id"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/route.rs:183:36 [INFO] [stderr] | [INFO] [stderr] 183 | assert_eq!("blahblahblah", rt.parse("/api/v1/foo/blahblahblah").get("foo_stuff").unwrap()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&rt.parse("/api/v1/foo/blahblahblah")["foo_stuff"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/route.rs:191:27 [INFO] [stderr] | [INFO] [stderr] 191 | assert_eq!("123", rm.get("foo_id").unwrap()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&rm["foo_id"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/route.rs:192:27 [INFO] [stderr] | [INFO] [stderr] 192 | assert_eq!("bar", rm.get("bar").unwrap()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&rm["bar"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/route.rs:193:27 [INFO] [stderr] | [INFO] [stderr] 193 | assert_eq!("456", rm.get("baz_id").unwrap()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&rm["baz_id"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/route.rs:206:13 [INFO] [stderr] | [INFO] [stderr] 206 | / match route.is_match(&request) { [INFO] [stderr] 207 | | false => continue, [INFO] [stderr] 208 | | true => { [INFO] [stderr] 209 | | request.params = route.parse(&request.path); [INFO] [stderr] 210 | | break; [INFO] [stderr] 211 | | }, [INFO] [stderr] 212 | | } [INFO] [stderr] | |_____________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_bool [INFO] [stderr] help: consider using an if/else expression [INFO] [stderr] | [INFO] [stderr] 206 | if route.is_match(&request) { [INFO] [stderr] 207 | request.params = route.parse(&request.path); [INFO] [stderr] 208 | break; [INFO] [stderr] 209 | } else { continue } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you should consider adding a `Default` implementation for `request::Request` [INFO] [stderr] --> src/request.rs:85:5 [INFO] [stderr] | [INFO] [stderr] 85 | / pub fn new() -> Request { [INFO] [stderr] 86 | | Request { [INFO] [stderr] 87 | | method: Method::NoImpl, [INFO] [stderr] 88 | | path: String::new(), [INFO] [stderr] ... | [INFO] [stderr] 92 | | } [INFO] [stderr] 93 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::new_without_default)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 83 | impl Default for request::Request { [INFO] [stderr] 84 | fn default() -> Self { [INFO] [stderr] 85 | Self::new() [INFO] [stderr] 86 | } [INFO] [stderr] 87 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: defining a method called `from_str` on this type; consider implementing the `std::str::FromStr` trait or choosing a less ambiguous name [INFO] [stderr] --> src/request.rs:96:5 [INFO] [stderr] | [INFO] [stderr] 96 | / pub fn from_str(rqstr: &str) -> Request { [INFO] [stderr] 97 | | let mut req = Request::new(); [INFO] [stderr] 98 | | req.parse(rqstr); [INFO] [stderr] 99 | | req [INFO] [stderr] 100 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::should_implement_trait)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#should_implement_trait [INFO] [stderr] [INFO] [stderr] error: strict comparison of f32 or f64 [INFO] [stderr] --> src/request.rs:274:9 [INFO] [stderr] | [INFO] [stderr] 274 | assert_eq!(123.45f32, ::from_uri(&pos)); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[deny(clippy::float_cmp)] on by default [INFO] [stderr] note: std::f32::EPSILON and std::f64::EPSILON are available. [INFO] [stderr] --> src/request.rs:274:9 [INFO] [stderr] | [INFO] [stderr] 274 | assert_eq!(123.45f32, ::from_uri(&pos)); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#float_cmp [INFO] [stderr] = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) [INFO] [stderr] [INFO] [stderr] error: strict comparison of f32 or f64 [INFO] [stderr] --> src/request.rs:277:9 [INFO] [stderr] | [INFO] [stderr] 277 | assert_eq!(-54.321f32, ::from_uri(&neg)); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] note: std::f32::EPSILON and std::f64::EPSILON are available. [INFO] [stderr] --> src/request.rs:277:9 [INFO] [stderr] | [INFO] [stderr] 277 | assert_eq!(-54.321f32, ::from_uri(&neg)); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#float_cmp [INFO] [stderr] = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) [INFO] [stderr] [INFO] [stderr] warning: you should consider deriving a `Default` implementation for `response::Response` [INFO] [stderr] --> src/response.rs:56:5 [INFO] [stderr] | [INFO] [stderr] 56 | / pub fn new() -> Response { [INFO] [stderr] 57 | | let mut res = Response { [INFO] [stderr] 58 | | status: 200, [INFO] [stderr] 59 | | cmsg: String::from("OK"), [INFO] [stderr] ... | [INFO] [stderr] 71 | | res [INFO] [stderr] 72 | | } [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] 46 | #[derive(Default)] [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: methods called `as_*` usually take self by reference or self by mutable reference; consider choosing a less ambiguous name [INFO] [stderr] --> src/response.rs:90:34 [INFO] [stderr] | [INFO] [stderr] 90 | pub fn as_json(data: &T) -> Response { [INFO] [stderr] | ^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::wrong_self_convention)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#wrong_self_convention [INFO] [stderr] [INFO] [stderr] warning: this .into_iter() call is equivalent to .iter() and will not move the slice [INFO] [stderr] --> src/response.rs:206:49 [INFO] [stderr] | [INFO] [stderr] 206 | self.payload.extend(payload.to_output().into_iter()); [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: use of a blacklisted/placeholder name `foo` [INFO] [stderr] --> src/response.rs:243:13 [INFO] [stderr] | [INFO] [stderr] 243 | let foo = Foo { item: 12345 }; [INFO] [stderr] | ^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::blacklisted_name)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#blacklisted_name [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/lib.rs:164:12 [INFO] [stderr] | [INFO] [stderr] 164 | if self.o_buf.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `self.o_buf.is_empty()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::len_zero)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/lib.rs:168:15 [INFO] [stderr] | [INFO] [stderr] 168 | while self.o_buf.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!self.o_buf.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: you should consider adding a `Default` implementation for `Canteen` [INFO] [stderr] --> src/lib.rs:263:5 [INFO] [stderr] | [INFO] [stderr] 263 | / pub fn new() -> Canteen { [INFO] [stderr] 264 | | Canteen { [INFO] [stderr] 265 | | routes: HashMap::new(), [INFO] [stderr] 266 | | rcache: HashMap::new(), [INFO] [stderr] ... | [INFO] [stderr] 272 | | } [INFO] [stderr] 273 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 253 | impl Default for Canteen { [INFO] [stderr] 254 | fn default() -> Self { [INFO] [stderr] 255 | Self::new() [INFO] [stderr] 256 | } [INFO] [stderr] 257 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/lib.rs:358:72 [INFO] [stderr] | [INFO] [stderr] 358 | Err(std::io::Error::new(std::io::ErrorKind::ConnectionAborted, format!("booo"))) [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: consider using .to_string(): `"booo".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: usage of `contains_key` followed by `insert` on a `HashMap` [INFO] [stderr] --> src/lib.rs:372:9 [INFO] [stderr] | [INFO] [stderr] 372 | / if self.rcache.contains_key(&resolved) { [INFO] [stderr] 373 | | let ref route = self.routes[&self.rcache[&resolved]]; [INFO] [stderr] 374 | | [INFO] [stderr] 375 | | handler = route.handler; [INFO] [stderr] ... | [INFO] [stderr] 388 | | } [INFO] [stderr] 389 | | } [INFO] [stderr] | |_________^ help: consider using: `self.rcache.entry(resolved)` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::map_entry)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_entry [INFO] [stderr] [INFO] [stderr] warning: `ref` on an entire `let` pattern is discouraged, take a reference with `&` instead [INFO] [stderr] --> src/lib.rs:373:17 [INFO] [stderr] | [INFO] [stderr] 373 | let ref route = self.routes[&self.rcache[&resolved]]; [INFO] [stderr] | ----^^^^^^^^^---------------------------------------- help: try: `let route = &self.routes[&self.rcache[&resolved]];` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::toplevel_ref_arg)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#toplevel_ref_arg [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/lib.rs:379:17 [INFO] [stderr] | [INFO] [stderr] 379 | / match (route).is_match(&req) { [INFO] [stderr] 380 | | true => { [INFO] [stderr] 381 | | handler = route.handler; [INFO] [stderr] 382 | | req.params = route.parse(&req.path); [INFO] [stderr] ... | [INFO] [stderr] 386 | | false => continue, [INFO] [stderr] 387 | | } [INFO] [stderr] | |_________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_bool [INFO] [stderr] help: consider using an if/else expression [INFO] [stderr] | [INFO] [stderr] 379 | if (route).is_match(&req) { [INFO] [stderr] 380 | handler = route.handler; [INFO] [stderr] 381 | req.params = route.parse(&req.path); [INFO] [stderr] 382 | self.rcache.insert(resolved, (*path).clone()); [INFO] [stderr] 383 | break; [INFO] [stderr] 384 | } else { continue } [INFO] [stderr] | [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/lib.rs:397:9 [INFO] [stderr] | [INFO] [stderr] 397 | / match self.get_client(token).receive() { [INFO] [stderr] 398 | | Ok(true) => { [INFO] [stderr] 399 | | let buf = self.get_client(token).i_buf.clone(); [INFO] [stderr] 400 | | let rqstr = String::from_utf8(buf).unwrap(); [INFO] [stderr] ... | [INFO] [stderr] 403 | | _ => {}, [INFO] [stderr] 404 | | }; [INFO] [stderr] | |_________^ [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] help: try this [INFO] [stderr] | [INFO] [stderr] 397 | if let Ok(true) = self.get_client(token).receive() { [INFO] [stderr] 398 | let buf = self.get_client(token).i_buf.clone(); [INFO] [stderr] 399 | let rqstr = String::from_utf8(buf).unwrap(); [INFO] [stderr] 400 | self.handle_request(token, evl.channel(), &rqstr); [INFO] [stderr] 401 | }; [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] error: aborting due to 2 previous errors [INFO] [stderr] [INFO] [stderr] error: Could not compile `canteen`. [INFO] [stderr] [INFO] [stderr] To learn more, run the command again with --verbose. [INFO] running `"docker" "inspect" "ba5b33734cf62b9205c8720af41beee35d3aa8e1709697e42e8e477cf31a2ac3"` [INFO] running `"docker" "rm" "-f" "ba5b33734cf62b9205c8720af41beee35d3aa8e1709697e42e8e477cf31a2ac3"` [INFO] [stdout] ba5b33734cf62b9205c8720af41beee35d3aa8e1709697e42e8e477cf31a2ac3