[INFO] crate thruster 0.5.0 is already in cache [INFO] extracting crate thruster 0.5.0 into work/ex/clippy-test-run/sources/stable/reg/thruster/0.5.0 [INFO] extracting crate thruster 0.5.0 into work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/reg/thruster/0.5.0 [INFO] validating manifest of thruster-0.5.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 thruster-0.5.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 thruster-0.5.0 [INFO] finished frobbing thruster-0.5.0 [INFO] frobbed toml for thruster-0.5.0 written to work/ex/clippy-test-run/sources/stable/reg/thruster/0.5.0/Cargo.toml [INFO] started frobbing thruster-0.5.0 [INFO] finished frobbing thruster-0.5.0 [INFO] frobbed toml for thruster-0.5.0 written to work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/reg/thruster/0.5.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 thruster-0.5.0 against stable for clippy-test-run [INFO] running `"docker" "create" "-v" "/mnt/big/crater/work/local/target-dirs/clippy-test-run/worker-7/stable:/opt/crater/target:rw,Z" "-v" "/mnt/big/crater/work/ex/clippy-test-run/sources/stable/reg/thruster/0.5.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] 6fa4a2b8fff07bcff2f8677c8f52387f151736f6fefce13b0f3209f98a41088b [INFO] running `"docker" "start" "-a" "6fa4a2b8fff07bcff2f8677c8f52387f151736f6fefce13b0f3209f98a41088b"` [INFO] [stderr] Checking env_logger v0.3.5 [INFO] [stderr] Checking rand_xoshiro v0.1.0 [INFO] [stderr] Checking templatify v0.2.3 [INFO] [stderr] Compiling diesel_derives v1.4.0 [INFO] [stderr] Checking failure v0.1.5 [INFO] [stderr] Checking hyper v0.12.23 [INFO] [stderr] Checking dotenv v0.13.0 [INFO] [stderr] Checking criterion v0.2.9 [INFO] [stderr] Checking diesel v1.4.1 [INFO] [stderr] Checking thruster v0.5.0 (/opt/crater/workdir) [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/builtins/server.rs:115:7 [INFO] [stderr] | [INFO] [stderr] 115 | app: app [INFO] [stderr] | ^^^^^^^^ help: replace it with: `app` [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/builtins/hyper_server.rs:38:7 [INFO] [stderr] | [INFO] [stderr] 38 | app: app [INFO] [stderr] | ^^^^^^^^ help: replace it with: `app` [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/middleware.rs:30:7 [INFO] [stderr] | [INFO] [stderr] 30 | middleware: middleware, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `middleware` [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/request.rs:145:9 [INFO] [stderr] | [INFO] [stderr] 145 | 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/request.rs:146:9 [INFO] [stderr] | [INFO] [stderr] 146 | path: path, [INFO] [stderr] | ^^^^^^^^^^ help: replace it with: `path` [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/request.rs:147:9 [INFO] [stderr] | [INFO] [stderr] 147 | version: version, [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: replace it with: `version` [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/request.rs:148:9 [INFO] [stderr] | [INFO] [stderr] 148 | headers: headers, [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: replace it with: `headers` [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_parser.rs:68:9 [INFO] [stderr] | [INFO] [stderr] 68 | query_params: query_params, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `query_params` [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_parser.rs:78:9 [INFO] [stderr] | [INFO] [stderr] 78 | query_params: query_params, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `query_params` [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_tree/node.rs:32:7 [INFO] [stderr] | [INFO] [stderr] 32 | children: children, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^ help: replace it with: `children` [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_tree/node.rs:33:7 [INFO] [stderr] | [INFO] [stderr] 33 | middleware: middleware, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `middleware` [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/testing/mod.rs:107:7 [INFO] [stderr] | [INFO] [stderr] 107 | headers: headers, [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: replace it with: `headers` [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: returning the result of a let binding from a block. Consider returning the expression directly. [INFO] [stderr] --> src/http.rs:18:9 [INFO] [stderr] | [INFO] [stderr] 18 | res [INFO] [stderr] | ^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::let_and_return)] on by default [INFO] [stderr] note: this expression can be directly returned [INFO] [stderr] --> src/http.rs:16:19 [INFO] [stderr] | [INFO] [stderr] 16 | let res = request::decode(buf); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return [INFO] [stderr] [INFO] [stderr] warning: returning the result of a let binding from a block. Consider returning the expression directly. [INFO] [stderr] --> src/route_parser.rs:30:5 [INFO] [stderr] | [INFO] [stderr] 30 | parser [INFO] [stderr] | ^^^^^^ [INFO] [stderr] | [INFO] [stderr] note: this expression can be directly returned [INFO] [stderr] --> src/route_parser.rs:25:18 [INFO] [stderr] | [INFO] [stderr] 25 | let parser = RouteParser { [INFO] [stderr] | __________________^ [INFO] [stderr] 26 | | route_tree: RouteTree::new(), [INFO] [stderr] 27 | | shortcuts: HashMap::new() [INFO] [stderr] 28 | | }; [INFO] [stderr] | |_____^ [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return [INFO] [stderr] [INFO] [stderr] warning: this `else { if .. }` block can be collapsed [INFO] [stderr] --> src/route_tree/node.rs:219:12 [INFO] [stderr] | [INFO] [stderr] 219 | } else { [INFO] [stderr] | ____________^ [INFO] [stderr] 220 | | if self.is_terminal_node { [INFO] [stderr] 221 | | (&self.middleware, params, self.is_terminal_node) [INFO] [stderr] 222 | | } else if let Some(wildcard_node) = &self.wildcard_node { [INFO] [stderr] ... | [INFO] [stderr] 238 | | } [INFO] [stderr] 239 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::collapsible_if)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 219 | } else if self.is_terminal_node { [INFO] [stderr] 220 | (&self.middleware, params, self.is_terminal_node) [INFO] [stderr] 221 | } else if let Some(wildcard_node) = &self.wildcard_node { [INFO] [stderr] 222 | if wildcard_node.param_key == None { [INFO] [stderr] 223 | let results = wildcard_node.match_route_with_params(route, params); [INFO] [stderr] 224 | [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: use of deprecated item 'tokio::reactor::Handle::current': semantics were sometimes surprising, use Handle::default() [INFO] [stderr] --> src/builtins/server.rs:70:59 [INFO] [stderr] | [INFO] [stderr] 70 | let listener = TcpListener::from_std(listener, &tokio::reactor::Handle::current()).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(deprecated)] on by default [INFO] [stderr] [INFO] [stderr] error: useless lint attribute [INFO] [stderr] --> src/lib.rs:24:1 [INFO] [stderr] | [INFO] [stderr] 24 | #[allow(unused_imports)] [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: if you just forgot a `!`, use: `#![allow(unused_imports)]` [INFO] [stderr] | [INFO] [stderr] = note: #[deny(clippy::useless_attribute)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_attribute [INFO] [stderr] [INFO] [stderr] warning: methods called `new` usually return `Self` [INFO] [stderr] --> src/app.rs:95:3 [INFO] [stderr] | [INFO] [stderr] 95 | / pub fn new() -> App { [INFO] [stderr] 96 | | App::create(generate_context) [INFO] [stderr] 97 | | } [INFO] [stderr] | |___^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::new_ret_no_self)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_ret_no_self [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/builtins/query_params.rs:17:32 [INFO] [stderr] | [INFO] [stderr] 17 | let mut iter = route.split("?"); [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 use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/builtins/query_params.rs:20:5 [INFO] [stderr] | [INFO] [stderr] 20 | / match iter.next() { [INFO] [stderr] 21 | | Some(query_string) => { [INFO] [stderr] 22 | | for query_piece in query_string.split("&") { [INFO] [stderr] 23 | | let mut query_iterator = query_piece.split("="); [INFO] [stderr] ... | [INFO] [stderr] 31 | | None => () [INFO] [stderr] 32 | | }; [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] 20 | if let Some(query_string) = iter.next() { [INFO] [stderr] 21 | for query_piece in query_string.split("&") { [INFO] [stderr] 22 | let mut query_iterator = query_piece.split("="); [INFO] [stderr] 23 | let key = query_iterator.next().unwrap().to_owned(); [INFO] [stderr] 24 | match query_iterator.next() { [INFO] [stderr] 25 | Some(val) => query_param_hash.insert(key, val.to_owned()), [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/builtins/query_params.rs:22:47 [INFO] [stderr] | [INFO] [stderr] 22 | for query_piece in query_string.split("&") { [INFO] [stderr] | ^^^ help: try using a char instead: `'&'` [INFO] [stderr] | [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: single-character string constant used as pattern [INFO] [stderr] --> src/builtins/query_params.rs:23:54 [INFO] [stderr] | [INFO] [stderr] 23 | let mut query_iterator = query_piece.split("="); [INFO] [stderr] | ^^^ help: try using a char instead: `'='` [INFO] [stderr] | [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 should consider adding a `Default` implementation for `builtins::basic_context::BasicContext` [INFO] [stderr] --> src/builtins/basic_context.rs:57:3 [INFO] [stderr] | [INFO] [stderr] 57 | / pub fn new() -> BasicContext { [INFO] [stderr] 58 | | BasicContext { [INFO] [stderr] 59 | | body: "".to_owned(), [INFO] [stderr] 60 | | params: HashMap::new(), [INFO] [stderr] ... | [INFO] [stderr] 65 | | } [INFO] [stderr] 66 | | } [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] 56 | impl Default for builtins::basic_context::BasicContext { [INFO] [stderr] 57 | fn default() -> Self { [INFO] [stderr] 58 | Self::new() [INFO] [stderr] 59 | } [INFO] [stderr] 60 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/builtins/basic_context.rs:138:8 [INFO] [stderr] | [INFO] [stderr] 138 | if options.domain.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!options.domain.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: you should consider deriving a `Default` implementation for `builtins::basic_hyper_context::BasicHyperContext` [INFO] [stderr] --> src/builtins/basic_hyper_context.rs:54:3 [INFO] [stderr] | [INFO] [stderr] 54 | / pub fn new() -> BasicHyperContext { [INFO] [stderr] 55 | | let mut req = Request::builder() [INFO] [stderr] 56 | | .body(Body::empty()).unwrap(); [INFO] [stderr] 57 | | [INFO] [stderr] ... | [INFO] [stderr] 67 | | } [INFO] [stderr] 68 | | } [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] 45 | #[derive(Default)] [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/builtins/basic_hyper_context.rs:152:8 [INFO] [stderr] | [INFO] [stderr] 152 | if options.domain.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!options.domain.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 `response::Response` [INFO] [stderr] --> src/response.rs:17:5 [INFO] [stderr] | [INFO] [stderr] 17 | / pub fn new() -> Response { [INFO] [stderr] 18 | | Response { [INFO] [stderr] 19 | | response: Vec::new(), [INFO] [stderr] 20 | | status_message: StatusMessage::Ok, [INFO] [stderr] 21 | | header_raw: BytesMut::new() [INFO] [stderr] 22 | | } [INFO] [stderr] 23 | | } [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] 16 | impl Default for response::Response { [INFO] [stderr] 17 | fn default() -> Self { [INFO] [stderr] 18 | Self::new() [INFO] [stderr] 19 | } [INFO] [stderr] 20 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you should consider deriving a `Default` implementation for `request::Request` [INFO] [stderr] --> src/request.rs:30:5 [INFO] [stderr] | [INFO] [stderr] 30 | / pub fn new() -> Self { [INFO] [stderr] 31 | | Request { [INFO] [stderr] 32 | | body: (0,0), [INFO] [stderr] 33 | | method: (0,0), [INFO] [stderr] ... | [INFO] [stderr] 39 | | } [INFO] [stderr] 40 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [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] 16 | #[derive(Default)] [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] error: a const item with interior mutability should not be borrowed [INFO] [stderr] --> src/request.rs:128:31 [INFO] [stderr] | [INFO] [stderr] 128 | if header.name == httplib::header::CONTENT_LENGTH { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[deny(clippy::borrow_interior_mutable_const)] on by default [INFO] [stderr] = help: assign this const to a local or static variable, and use the variable here [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#borrow_interior_mutable_const [INFO] [stderr] [INFO] [stderr] warning: you should consider adding a `Default` implementation for `route_parser::RouteParser` [INFO] [stderr] --> src/route_parser.rs:24:3 [INFO] [stderr] | [INFO] [stderr] 24 | / pub fn new() -> RouteParser { [INFO] [stderr] 25 | | let parser = RouteParser { [INFO] [stderr] 26 | | route_tree: RouteTree::new(), [INFO] [stderr] 27 | | shortcuts: HashMap::new() [INFO] [stderr] ... | [INFO] [stderr] 30 | | parser [INFO] [stderr] 31 | | } [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] 23 | impl Default for route_parser::RouteParser { [INFO] [stderr] 24 | fn default() -> Self { [INFO] [stderr] 25 | Self::new() [INFO] [stderr] 26 | } [INFO] [stderr] 27 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/route_tree/node.rs:23:20 [INFO] [stderr] | [INFO] [stderr] 23 | let wildcard = match self.is_wildcard { [INFO] [stderr] | ____________________^ [INFO] [stderr] 24 | | false => Some(Box::new(match &self.wildcard_node { [INFO] [stderr] 25 | | Some(wildcard) => (**wildcard).clone(), [INFO] [stderr] 26 | | None => Node::new_wildcard(None) [INFO] [stderr] 27 | | })), [INFO] [stderr] 28 | | true => None [INFO] [stderr] 29 | | }; [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] 23 | let wildcard = if self.is_wildcard { None } else { Some(Box::new(match &self.wildcard_node { [INFO] [stderr] 24 | Some(wildcard) => (**wildcard).clone(), [INFO] [stderr] 25 | None => Node::new_wildcard(None) [INFO] [stderr] 26 | })) }; [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/route_tree/node.rs:73:13 [INFO] [stderr] | [INFO] [stderr] 73 | }.split("/"); [INFO] [stderr] | ^^^ help: try using a char instead: `'/'` [INFO] [stderr] | [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: length comparison to zero [INFO] [stderr] --> src/route_tree/node.rs:76:10 [INFO] [stderr] | [INFO] [stderr] 76 | if piece.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `piece.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: single-character string constant used as pattern [INFO] [stderr] --> src/route_tree/node.rs:119:13 [INFO] [stderr] | [INFO] [stderr] 119 | }.split("/"); [INFO] [stderr] | ^^^ help: try using a char instead: `'/'` [INFO] [stderr] | [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: length comparison to zero [INFO] [stderr] --> src/route_tree/node.rs:122:10 [INFO] [stderr] | [INFO] [stderr] 122 | if piece.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `piece.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: very complex type used. Consider factoring parts into `type` definitions [INFO] [stderr] --> src/route_tree/node.rs:162:52 [INFO] [stderr] | [INFO] [stderr] 162 | pub fn match_route(&self, route: Split<&str>) -> (&SmallVec<[Middleware; 8]>, HashMap, bool) { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::type_complexity)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#type_complexity [INFO] [stderr] [INFO] [stderr] warning: this boolean expression can be simplified [INFO] [stderr] --> src/route_tree/node.rs:197:25 [INFO] [stderr] | [INFO] [stderr] 197 | } else if piece.len() == 0 && !wildcard_node.param_key.is_some() { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `piece.len() == 0 && wildcard_node.param_key.is_none()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::nonminimal_bool)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#nonminimal_bool [INFO] [stderr] [INFO] [stderr] warning: very complex type used. Consider factoring parts into `type` definitions [INFO] [stderr] --> src/route_tree/node.rs:166:105 [INFO] [stderr] | [INFO] [stderr] 166 | pub fn match_route_with_params(&self, mut route: Split<&str>, mut params: HashMap) -> (&SmallVec<[Middleware; 8]>, HashMap, bool) { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#type_complexity [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/route_tree/node.rs:195:18 [INFO] [stderr] | [INFO] [stderr] 195 | if piece.len() == 0 && wildcard_node.param_key.is_some() { [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `piece.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/route_tree/node.rs:197:25 [INFO] [stderr] | [INFO] [stderr] 197 | } else if piece.len() == 0 && !wildcard_node.param_key.is_some() { [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `piece.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 seem to want to iterate on a map's values [INFO] [stderr] --> src/route_tree/node.rs:267:23 [INFO] [stderr] | [INFO] [stderr] 267 | for (_, child) in &self.children { [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] 267 | for child in self.children.values() { [INFO] [stderr] | ^^^^^ ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: very complex type used. Consider factoring parts into `type` definitions [INFO] [stderr] --> src/route_tree/node.rs:278:30 [INFO] [stderr] | [INFO] [stderr] 278 | pub fn enumerate(&self) -> SmallVec<[(String, SmallVec<[Middleware; 8]>); 8]> { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#type_complexity [INFO] [stderr] [INFO] [stderr] warning: you seem to want to iterate on a map's values [INFO] [stderr] --> src/route_tree/node.rs:281:26 [INFO] [stderr] | [INFO] [stderr] 281 | for (_key, child) in &self.children { [INFO] [stderr] | ^^^^^^^^^^^^^^ [INFO] [stderr] | [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] 281 | for child in self.children.values() { [INFO] [stderr] | ^^^^^ ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/route_tree/node.rs:289:10 [INFO] [stderr] | [INFO] [stderr] 289 | if child_enumeration.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!child_enumeration.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/route_tree/node.rs:336:8 [INFO] [stderr] | [INFO] [stderr] 336 | if self.middleware.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!self.middleware.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 `route_tree::RouteTree` [INFO] [stderr] --> src/route_tree/mod.rs:34:3 [INFO] [stderr] | [INFO] [stderr] 34 | / pub fn new() -> RouteTree { [INFO] [stderr] 35 | | RouteTree { [INFO] [stderr] 36 | | root_node: Node::new(""), [INFO] [stderr] 37 | | generic_root_node: Node::new(""), [INFO] [stderr] 38 | | specific_root_node: Node::new("") [INFO] [stderr] 39 | | } [INFO] [stderr] 40 | | } [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] 33 | impl Default for route_tree::RouteTree { [INFO] [stderr] 34 | fn default() -> Self { [INFO] [stderr] 35 | Self::new() [INFO] [stderr] 36 | } [INFO] [stderr] 37 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: use of `unwrap_or` followed by a function call [INFO] [stderr] --> src/route_tree/mod.rs:88:8 [INFO] [stderr] | [INFO] [stderr] 88 | .unwrap_or(Node::new(method_prefix)); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|| Node::new(method_prefix))` [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: single-character string constant used as pattern [INFO] [stderr] --> src/route_tree/mod.rs:110:58 [INFO] [stderr] | [INFO] [stderr] 110 | let results = self.root_node.match_route(route.split("/")); [INFO] [stderr] | ^^^ help: try using a char instead: `'/'` [INFO] [stderr] | [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: single-character string constant used as pattern [INFO] [stderr] --> src/route_tree/mod.rs:116:70 [INFO] [stderr] | [INFO] [stderr] 116 | let results = self.root_node.match_route_with_params(route.split("/"), params); [INFO] [stderr] | ^^^ help: try using a char instead: `'/'` [INFO] [stderr] | [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: length comparison to zero [INFO] [stderr] --> src/testing/mod.rs:96:10 [INFO] [stderr] | [INFO] [stderr] 96 | if header_pair.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!header_pair.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: single-character string constant used as pattern [INFO] [stderr] --> src/testing/mod.rs:97:43 [INFO] [stderr] | [INFO] [stderr] 97 | let mut split = header_pair.split(":"); [INFO] [stderr] | ^^^ help: try using a char instead: `':'` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_char_pattern [INFO] [stderr] [INFO] [stderr] error: aborting due to 2 previous errors [INFO] [stderr] [INFO] [stderr] error: Could not compile `thruster`. [INFO] [stderr] warning: build failed, waiting for other jobs to finish... [INFO] [stderr] error: build failed [INFO] running `"docker" "inspect" "6fa4a2b8fff07bcff2f8677c8f52387f151736f6fefce13b0f3209f98a41088b"` [INFO] running `"docker" "rm" "-f" "6fa4a2b8fff07bcff2f8677c8f52387f151736f6fefce13b0f3209f98a41088b"` [INFO] [stdout] 6fa4a2b8fff07bcff2f8677c8f52387f151736f6fefce13b0f3209f98a41088b