[INFO] fetching crate cfc 0.1.0... [INFO] linting cfc-0.1.0 against nightly for clippy-nonminimal_bool-denied [INFO] extracting crate cfc 0.1.0 into /workspace/builds/worker-1-tc1/source [INFO] started tweaking crates.io crate cfc 0.1.0 [INFO] finished tweaking crates.io crate cfc 0.1.0 [INFO] tweaked toml for crates.io crate cfc 0.1.0 written to /workspace/builds/worker-1-tc1/source/Cargo.toml [INFO] validating manifest of crates.io crate cfc 0.1.0 on toolchain nightly [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+nightly" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }` [INFO] crate crates.io crate cfc 0.1.0 already has a lockfile, it will not be regenerated [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+nightly" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] [stderr] Updating crates.io index [INFO] [stderr] Downloading crates ... [INFO] [stderr] Downloaded proc-macro2 v1.0.81 [INFO] [stderr] Downloaded thiserror-impl v1.0.59 [INFO] [stderr] Downloaded hyperlocal-next v0.9.0 [INFO] [stderr] Downloaded ini_core v0.2.0 [INFO] [stderr] Downloaded serde_derive v1.0.198 [INFO] [stderr] Downloaded thiserror v1.0.59 [INFO] [stderr] Downloaded croner v2.0.4 [INFO] [stderr] Downloaded anyhow v1.0.82 [INFO] [stderr] Downloaded bollard-stubs v1.44.0-rc.2 [INFO] [stderr] Downloaded serde v1.0.198 [INFO] [stderr] Downloaded cc v1.0.95 [INFO] [stderr] Downloaded serde_json v1.0.116 [INFO] [stderr] Downloaded bollard v0.16.1 [INFO] [stderr] Downloaded hyper v1.3.1 [INFO] [stderr] Downloaded syn v2.0.60 [INFO] [stderr] Downloaded json v0.12.4 [INFO] [stderr] Downloaded saphyr-parser v0.0.1 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-1-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-1-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+nightly" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] [stdout] c9e25f174c79342e914b22eb2c9fae627dd259bce5cdd452a87b595c492834a6 [INFO] running `Command { std: "docker" "start" "-a" "c9e25f174c79342e914b22eb2c9fae627dd259bce5cdd452a87b595c492834a6", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "c9e25f174c79342e914b22eb2c9fae627dd259bce5cdd452a87b595c492834a6", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "c9e25f174c79342e914b22eb2c9fae627dd259bce5cdd452a87b595c492834a6", kill_on_drop: false }` [INFO] [stdout] c9e25f174c79342e914b22eb2c9fae627dd259bce5cdd452a87b595c492834a6 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-1-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-1-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+nightly" "clippy" "--frozen" "--all" "--all-targets" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] 056dfcc020c4bb1f4031f129f126ad07acc5d4dbbe5376c51e1dd7ea4d184c1a [INFO] running `Command { std: "docker" "start" "-a" "056dfcc020c4bb1f4031f129f126ad07acc5d4dbbe5376c51e1dd7ea4d184c1a", kill_on_drop: false }` [INFO] [stderr] Compiling proc-macro2 v1.0.81 [INFO] [stderr] Compiling autocfg v1.2.0 [INFO] [stderr] Checking bytes v1.6.0 [INFO] [stderr] Checking pin-project-lite v0.2.14 [INFO] [stderr] Checking futures-core v0.3.30 [INFO] [stderr] Checking tracing-core v0.1.32 [INFO] [stderr] Checking log v0.4.21 [INFO] [stderr] Checking signal-hook-registry v1.4.2 [INFO] [stderr] Compiling serde v1.0.198 [INFO] [stderr] Compiling ahash v0.8.11 [INFO] [stderr] Checking smallvec v1.13.2 [INFO] [stderr] Checking futures-channel v0.3.30 [INFO] [stderr] Checking tower-layer v0.3.2 [INFO] [stderr] Compiling slab v0.4.9 [INFO] [stderr] Compiling num-traits v0.2.18 [INFO] [stderr] Checking zerocopy v0.7.32 [INFO] [stderr] Checking unicode-normalization v0.1.23 [INFO] [stderr] Checking memchr v2.7.2 [INFO] [stderr] Checking unicode-bidi v0.3.15 [INFO] [stderr] Checking http v1.1.0 [INFO] [stderr] Compiling thiserror v1.0.59 [INFO] [stderr] Checking anstyle v1.0.6 [INFO] [stderr] Checking allocator-api2 v0.2.18 [INFO] [stderr] Compiling quote v1.0.36 [INFO] [stderr] Compiling serde_json v1.0.116 [INFO] [stderr] Checking anstream v0.6.13 [INFO] [stderr] Checking idna v0.5.0 [INFO] [stderr] Compiling syn v2.0.60 [INFO] [stderr] Checking hashbrown v0.14.3 [INFO] [stderr] Compiling anyhow v1.0.82 [INFO] [stderr] Checking futures-sink v0.3.30 [INFO] [stderr] Checking aho-corasick v1.1.3 [INFO] [stderr] Checking clap_lex v0.7.0 [INFO] [stderr] Checking http-body v1.0.0 [INFO] [stderr] Checking regex-syntax v0.8.3 [INFO] [stderr] Checking iana-time-zone v0.1.60 [INFO] [stderr] Checking http-body-util v0.1.1 [INFO] [stderr] Checking url v2.5.0 [INFO] [stderr] Checking clap_builder v4.5.2 [INFO] [stderr] Checking hashlink v0.8.4 [INFO] [stderr] Checking sharded-slab v0.1.7 [INFO] [stderr] Checking tracing-log v0.2.0 [INFO] [stderr] Checking chrono v0.4.38 [INFO] [stderr] Checking thread_local v1.1.8 [INFO] [stderr] Checking base64 v0.22.0 [INFO] [stderr] Checking saphyr-parser v0.0.1 [INFO] [stderr] Checking ini_core v0.2.0 [INFO] [stderr] Checking json v0.12.4 [INFO] [stderr] Checking tracing-subscriber v0.3.18 [INFO] [stderr] Checking croner v2.0.4 [INFO] [stderr] Checking regex-automata v0.4.6 [INFO] [stderr] Compiling tokio-macros v2.2.0 [INFO] [stderr] Compiling serde_derive v1.0.198 [INFO] [stderr] Compiling futures-macro v0.3.30 [INFO] [stderr] Compiling tracing-attributes v0.1.27 [INFO] [stderr] Compiling pin-project-internal v1.1.5 [INFO] [stderr] Compiling thiserror-impl v1.0.59 [INFO] [stderr] Compiling serde_repr v0.1.19 [INFO] [stderr] Compiling clap_derive v4.5.4 [INFO] [stderr] Checking regex v1.10.4 [INFO] [stderr] Checking tokio v1.37.0 [INFO] [stderr] Checking futures-util v0.3.30 [INFO] [stderr] Checking pin-project v1.1.5 [INFO] [stderr] Checking tracing v0.1.40 [INFO] [stderr] Checking clap v4.5.4 [INFO] [stderr] Checking hyper v1.3.1 [INFO] [stderr] Checking tower v0.4.13 [INFO] [stderr] Checking tokio-util v0.7.10 [INFO] [stderr] Checking serde_with v3.7.0 [INFO] [stderr] Checking serde_urlencoded v0.7.1 [INFO] [stderr] Checking hyper-util v0.1.3 [INFO] [stderr] Checking hyperlocal-next v0.9.0 [INFO] [stderr] Checking bollard-stubs v1.44.0-rc.2 [INFO] [stderr] Checking bollard v0.16.1 [INFO] [stderr] Checking cfc v0.1.0 (/opt/rustwide/workdir) [INFO] [stdout] warning: the type of the `self` parameter does not need to be arbitrary [INFO] [stdout] --> src/context.rs:23:23 [INFO] [stdout] | [INFO] [stdout] 23 | pub fn get_handle(self: &Self) -> Result { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_arbitrary_self_type [INFO] [stdout] = note: `#[warn(clippy::needless_arbitrary_self_type)]` on by default [INFO] [stdout] help: remove the type [INFO] [stdout] | [INFO] [stdout] 23 - pub fn get_handle(self: &Self) -> Result { [INFO] [stdout] 23 + pub fn get_handle(&self) -> Result { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: constants have by default a `'static` lifetime [INFO] [stdout] --> src/job/common.rs:1:44 [INFO] [stdout] | [INFO] [stdout] 1 | pub(crate) const UNKNOWN_CONTAINER_LABEL: &'static str = "UNKNOWN"; [INFO] [stdout] | -^^^^^^^---- help: consider removing `'static`: `&str` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_static_lifetimes [INFO] [stdout] = note: `#[warn(clippy::redundant_static_lifetimes)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the type of the `self` parameter does not need to be arbitrary [INFO] [stdout] --> src/context.rs:23:23 [INFO] [stdout] | [INFO] [stdout] 23 | pub fn get_handle(self: &Self) -> Result { [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_arbitrary_self_type [INFO] [stdout] = note: `#[warn(clippy::needless_arbitrary_self_type)]` on by default [INFO] [stdout] help: remove the type [INFO] [stdout] | [INFO] [stdout] 23 - pub fn get_handle(self: &Self) -> Result { [INFO] [stdout] 23 + pub fn get_handle(&self) -> Result { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: constants have by default a `'static` lifetime [INFO] [stdout] --> src/job/common.rs:1:44 [INFO] [stdout] | [INFO] [stdout] 1 | pub(crate) const UNKNOWN_CONTAINER_LABEL: &'static str = "UNKNOWN"; [INFO] [stdout] | -^^^^^^^---- help: consider removing `'static`: `&str` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_static_lifetimes [INFO] [stdout] = note: `#[warn(clippy::redundant_static_lifetimes)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/job/local.rs:61:22 [INFO] [stdout] | [INFO] [stdout] 61 | .map_err(|e| Error::new(e)) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ help: replace the closure with the associated function itself: `Error::new` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] = note: `#[warn(clippy::redundant_closure)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `Result.and_then(|x| Ok(y))`, which is more succinctly expressed as `map(|x| y)` [INFO] [stdout] --> src/job/local.rs:32:9 [INFO] [stdout] | [INFO] [stdout] 32 | / command.output().await [INFO] [stdout] 33 | | .and_then(|o| { [INFO] [stdout] 34 | | // TODO: move this to the caller and return an object enum to handle the distinction between timer and job [INFO] [stdout] 35 | | if o.status.code().and_then(|c| Some(c != 0)).unwrap_or(true) { [INFO] [stdout] ... | [INFO] [stdout] 59 | | Ok(None) [INFO] [stdout] 60 | | }) [INFO] [stdout] | |______________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bind_instead_of_map [INFO] [stdout] = note: `#[warn(clippy::bind_instead_of_map)]` on by default [INFO] [stdout] help: use `map` instead [INFO] [stdout] | [INFO] [stdout] 33 ~ .map(|o| { [INFO] [stdout] 34 | // TODO: move this to the caller and return an object enum to handle the distinction between timer and job [INFO] [stdout] ... [INFO] [stdout] 58 | } [INFO] [stdout] 59 ~ None [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `Option.and_then(|x| Some(y))`, which is more succinctly expressed as `map(|x| y)` [INFO] [stdout] --> src/job/local.rs:35:20 [INFO] [stdout] | [INFO] [stdout] 35 | if o.status.code().and_then(|c| Some(c != 0)).unwrap_or(true) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `o.status.code().map(|c| c != 0)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bind_instead_of_map [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: literal with an empty format string [INFO] [stdout] --> src/job/local.rs:78:13 [INFO] [stdout] | [INFO] [stdout] 78 | "CFC_HOST", [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#write_literal [INFO] [stdout] = note: `#[warn(clippy::write_literal)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 75 ~ "{}.{}.CFC_HOST", [INFO] [stdout] 76 | Self::LABEL, [INFO] [stdout] 77 ~ self.name, [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you seem to be trying to use `match` for destructuring a single pattern. Consider using `if let` [INFO] [stdout] --> src/job/mod.rs:26:5 [INFO] [stdout] | [INFO] [stdout] 26 | / match re.captures(sched.as_str()) { [INFO] [stdout] 27 | | Some(c) => { [INFO] [stdout] 28 | | let interval: i32 = c.name("interval").unwrap().as_str().parse().unwrap(); [INFO] [stdout] 29 | | let unit = c.name("unit").unwrap().as_str(); [INFO] [stdout] ... | [INFO] [stdout] 38 | | None => {}, [INFO] [stdout] 39 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stdout] = note: `#[warn(clippy::single_match)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 26 ~ if let Some(c) = re.captures(sched.as_str()) { [INFO] [stdout] 27 + let interval: i32 = c.name("interval").unwrap().as_str().parse().unwrap(); [INFO] [stdout] 28 + let unit = c.name("unit").unwrap().as_str(); [INFO] [stdout] 29 + match unit { [INFO] [stdout] 30 + // TODO: add randomization of 0 values [INFO] [stdout] 31 + "s" => sched = format!("*/{} * * * * *", interval).to_string(), [INFO] [stdout] 32 + "m" => sched = format!("0 */{} * * * *", interval).to_string(), [INFO] [stdout] 33 + "h" => sched = format!("0 0 */{} * * *", interval).to_string(), [INFO] [stdout] 34 + _ => unreachable!("Encountered an unhandled time unit while parsing a schedule"), [INFO] [stdout] 35 + } [INFO] [stdout] 36 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/job/mod.rs:40:63 [INFO] [stdout] | [INFO] [stdout] 40 | Cron::new(&sched).with_seconds_optional().parse().map_err(|e| Error::new(e)) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ help: replace the closure with the associated function itself: `Error::new` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: binary comparison to literal `Option::None` [INFO] [stdout] --> src/job/mod.rs:119:12 [INFO] [stdout] | [INFO] [stdout] 119 | if kind == None { [INFO] [stdout] | ^^^^^^^^^^^^ help: use `Option::is_none()` instead: `kind.is_none()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#partialeq_to_none [INFO] [stdout] = note: `#[warn(clippy::partialeq_to_none)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: useless use of `format!` [INFO] [stdout] --> src/job/mod.rs:120:35 [INFO] [stdout] | [INFO] [stdout] 120 | return Err(Error::msg(format!["The job has no job type"])); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `"The job has no job type".to_string()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stdout] = note: `#[warn(clippy::useless_format)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: binary comparison to literal `Option::None` [INFO] [stdout] --> src/job/mod.rs:125:12 [INFO] [stdout] | [INFO] [stdout] 125 | if command == None { [INFO] [stdout] | ^^^^^^^^^^^^^^^ help: use `Option::is_none()` instead: `command.is_none()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#partialeq_to_none [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: useless use of `format!` [INFO] [stdout] --> src/job/mod.rs:126:35 [INFO] [stdout] | [INFO] [stdout] 126 | return Err(Error::msg(format!["The job has no command"])); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `"The job has no command".to_string()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: binary comparison to literal `Option::None` [INFO] [stdout] --> src/job/mod.rs:128:12 [INFO] [stdout] | [INFO] [stdout] 128 | if schedule == None { [INFO] [stdout] | ^^^^^^^^^^^^^^^^ help: use `Option::is_none()` instead: `schedule.is_none()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#partialeq_to_none [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: useless use of `format!` [INFO] [stdout] --> src/job/mod.rs:129:35 [INFO] [stdout] | [INFO] [stdout] 129 | return Err(Error::msg(format!["The job has no schedule"])); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `"The job has no schedule".to_string()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded late initialization [INFO] [stdout] --> src/job/mod.rs:133:9 [INFO] [stdout] | [INFO] [stdout] 133 | let job_info: JobInfo; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_late_init [INFO] [stdout] = note: `#[warn(clippy::needless_late_init)]` on by default [INFO] [stdout] help: move the declaration `job_info` here and remove the assignments from the `match` arms [INFO] [stdout] | [INFO] [stdout] 133 ~ [INFO] [stdout] 134 ~ let job_info: JobInfo = match kind.as_str() { [INFO] [stdout] 135 | ExecJobInfo::LABEL => { [INFO] [stdout] ... [INFO] [stdout] 144 | }; [INFO] [stdout] 145 ~ JobInfo::ExecJob(Box::new(job)) [INFO] [stdout] 146 | }, [INFO] [stdout] ... [INFO] [stdout] 164 | } [INFO] [stdout] 165 ~ JobInfo::RunJob(Box::new(job)) [INFO] [stdout] 166 | }, [INFO] [stdout] ... [INFO] [stdout] 174 | }; [INFO] [stdout] 175 ~ JobInfo::LocalJob(Box::new(job)) [INFO] [stdout] 176 | }, [INFO] [stdout] ... [INFO] [stdout] 188 | }; [INFO] [stdout] 189 ~ JobInfo::ServiceRunJob(Box::new(job)) [INFO] [stdout] 190 | } [INFO] [stdout] 191 | _ => return Err(Error::msg(format!["Unsupported job type {}", kind])), [INFO] [stdout] 192 ~ }; [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/job/mod.rs:138:48 [INFO] [stdout] | [INFO] [stdout] 138 | schedule: schedule_to_cron(&schedule.as_str()).unwrap(), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ help: change this to: `schedule.as_str()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] = note: `#[warn(clippy::needless_borrow)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `map_or` can be simplified [INFO] [stdout] --> src/job/mod.rs:142:26 [INFO] [stdout] | [INFO] [stdout] 142 | tty: parameters.remove("tty").map_or(false, |mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_map_or [INFO] [stdout] = note: `#[warn(clippy::unnecessary_map_or)]` on by default [INFO] [stdout] help: use `is_some_and` instead [INFO] [stdout] | [INFO] [stdout] 142 - tty: parameters.remove("tty").map_or(false, |mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] 142 + tty: parameters.remove("tty").is_some_and(|mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: use of `unwrap_or` to construct default value [INFO] [stdout] --> src/job/mod.rs:143:67 [INFO] [stdout] | [INFO] [stdout] 143 | environment: parameters.remove("environment").unwrap_or(Default::default()), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `unwrap_or_default()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unwrap_or_default [INFO] [stdout] = note: `#[warn(clippy::unwrap_or_default)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/job/mod.rs:150:48 [INFO] [stdout] | [INFO] [stdout] 150 | schedule: schedule_to_cron(&schedule.as_str()).unwrap(), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ help: change this to: `schedule.as_str()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `map_or(None, ..)` on an `Option` value [INFO] [stdout] --> src/job/mod.rs:153:27 [INFO] [stdout] | [INFO] [stdout] 153 | user: parameters.remove("user").map_or(None, |mut u| Some(u.pop().unwrap())), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `map`: `parameters.remove("user").map(|mut u| u.pop().unwrap())` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#option_map_or_none [INFO] [stdout] = note: `#[warn(clippy::option_map_or_none)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `map_or(None, ..)` on an `Option` value [INFO] [stdout] --> src/job/mod.rs:155:31 [INFO] [stdout] | [INFO] [stdout] 155 | hostname: parameters.remove("hostname").map_or(None, |mut u| Some(u.pop().unwrap())), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `map`: `parameters.remove("hostname").map(|mut u| u.pop().unwrap())` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#option_map_or_none [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `map_or` can be simplified [INFO] [stdout] --> src/job/mod.rs:156:29 [INFO] [stdout] | [INFO] [stdout] 156 | delete: parameters.remove("delete").map_or(true, |mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_map_or [INFO] [stdout] help: use `is_none_or` instead [INFO] [stdout] | [INFO] [stdout] 156 - delete: parameters.remove("delete").map_or(true, |mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] 156 + delete: parameters.remove("delete").is_none_or(|mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `map_or` can be simplified [INFO] [stdout] --> src/job/mod.rs:158:26 [INFO] [stdout] | [INFO] [stdout] 158 | tty: parameters.remove("tty").map_or(false, |mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_map_or [INFO] [stdout] help: use `is_some_and` instead [INFO] [stdout] | [INFO] [stdout] 158 - tty: parameters.remove("tty").map_or(false, |mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] 158 + tty: parameters.remove("tty").is_some_and(|mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/job/mod.rs:159:72 [INFO] [stdout] | [INFO] [stdout] 159 | volume: parameters.remove("volume").unwrap_or_else(|| Default::default()), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the associated function itself: `Default::default` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: use of `unwrap_or` to construct default value [INFO] [stdout] --> src/job/mod.rs:160:67 [INFO] [stdout] | [INFO] [stdout] 160 | environment: parameters.remove("environment").unwrap_or(Default::default()), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `unwrap_or_default()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unwrap_or_default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: binary comparison to literal `Option::None` [INFO] [stdout] --> src/job/mod.rs:162:20 [INFO] [stdout] | [INFO] [stdout] 162 | if job.image == None && job.container == None { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ help: use `Option::is_none()` instead: `job.image.is_none()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#partialeq_to_none [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: binary comparison to literal `Option::None` [INFO] [stdout] --> src/job/mod.rs:162:41 [INFO] [stdout] | [INFO] [stdout] 162 | if job.image == None && job.container == None { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ help: use `Option::is_none()` instead: `job.container.is_none()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#partialeq_to_none [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/job/mod.rs:170:48 [INFO] [stdout] | [INFO] [stdout] 170 | schedule: schedule_to_cron(&schedule.as_str()).unwrap(), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ help: change this to: `schedule.as_str()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: use of `unwrap_or` to construct default value [INFO] [stdout] --> src/job/mod.rs:173:67 [INFO] [stdout] | [INFO] [stdout] 173 | environment: parameters.remove("environment").unwrap_or(Default::default()), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `unwrap_or_default()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unwrap_or_default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/job/mod.rs:180:48 [INFO] [stdout] | [INFO] [stdout] 180 | schedule: schedule_to_cron(&schedule.as_str()).unwrap(), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ help: change this to: `schedule.as_str()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `map_or(None, ..)` on an `Option` value [INFO] [stdout] --> src/job/mod.rs:183:27 [INFO] [stdout] | [INFO] [stdout] 183 | user: parameters.remove("user").map_or(None, |mut u| Some(u.pop().unwrap())), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `map`: `parameters.remove("user").map(|mut u| u.pop().unwrap())` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#option_map_or_none [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `map_or` can be simplified [INFO] [stdout] --> src/job/mod.rs:185:29 [INFO] [stdout] | [INFO] [stdout] 185 | delete: parameters.remove("delete").map_or(true, |mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_map_or [INFO] [stdout] help: use `is_none_or` instead [INFO] [stdout] | [INFO] [stdout] 185 - delete: parameters.remove("delete").map_or(true, |mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] 185 + delete: parameters.remove("delete").is_none_or(|mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `map_or` can be simplified [INFO] [stdout] --> src/job/mod.rs:187:26 [INFO] [stdout] | [INFO] [stdout] 187 | tty: parameters.remove("tty").map_or(false, |mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_map_or [INFO] [stdout] help: use `is_some_and` instead [INFO] [stdout] | [INFO] [stdout] 187 - tty: parameters.remove("tty").map_or(false, |mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] 187 + tty: parameters.remove("tty").is_some_and(|mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this boolean expression can be simplified [INFO] [stdout] --> src/loader/docker.rs:38:16 [INFO] [stdout] | [INFO] [stdout] 38 | if !container.labels.as_ref().is_some_and(|c| !c.is_empty()) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `container.labels.as_ref().is_none_or(|c| c.is_empty())` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#nonminimal_bool [INFO] [stdout] = note: `#[warn(clippy::nonminimal_bool)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded late initialization [INFO] [stdout] --> src/loader/docker.rs:21:9 [INFO] [stdout] | [INFO] [stdout] 21 | let container_list; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_late_init [INFO] [stdout] help: move the declaration `container_list` here and remove the assignments from the `match` arms [INFO] [stdout] | [INFO] [stdout] 21 ~ [INFO] [stdout] 22 ~ let container_list = match handle.list_containers(Some(options)).await { [INFO] [stdout] 23 ~ Ok(l) => l, [INFO] [stdout] 24 | Err(e) => { [INFO] [stdout] ... [INFO] [stdout] 27 | } [INFO] [stdout] 28 ~ }; [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `map_or` can be simplified [INFO] [stdout] --> src/loader/docker.rs:43:20 [INFO] [stdout] | [INFO] [stdout] 43 | if key_parts.next().map_or(true, |p| !label_prefixes.contains(&p.to_string())) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_map_or [INFO] [stdout] help: use `is_none_or` instead [INFO] [stdout] | [INFO] [stdout] 43 - if key_parts.next().map_or(true, |p| !label_prefixes.contains(&p.to_string())) { [INFO] [stdout] 43 + if key_parts.next().is_none_or(|p| !label_prefixes.contains(&p.to_string())) { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `Option.and_then(|x| Some(y))`, which is more succinctly expressed as `map(|x| y)` [INFO] [stdout] --> src/loader/docker.rs:47:32 [INFO] [stdout] | [INFO] [stdout] 47 | let job_kind = key_parts.next().and_then(|k| Some(k.to_string())); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `key_parts.next().map(|k| k.to_string())` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bind_instead_of_map [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `Option.and_then(|x| Some(y))`, which is more succinctly expressed as `map(|x| y)` [INFO] [stdout] --> src/loader/docker.rs:48:32 [INFO] [stdout] | [INFO] [stdout] 48 | let job_name = key_parts.next().and_then(|n| Some(n.to_string())); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `key_parts.next().map(|n| n.to_string())` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bind_instead_of_map [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `Option.and_then(|x| Some(y))`, which is more succinctly expressed as `map(|x| y)` [INFO] [stdout] --> src/loader/docker.rs:49:37 [INFO] [stdout] | [INFO] [stdout] 49 | let job_parameter = key_parts.next().and_then(|p| Some(p.to_string())); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `key_parts.next().map(|p| p.to_string())` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bind_instead_of_map [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you seem to be trying to use `match` for an equality check. Consider using `if` [INFO] [stdout] --> src/loader/docker.rs:58:21 [INFO] [stdout] | [INFO] [stdout] 58 | / ... match job_kind.as_str() { [INFO] [stdout] 59 | | ... LocalJobInfo::LABEL => { [INFO] [stdout] 60 | | ... event![Level::ERROR, "Found local job declared in tags, however this is not allowed. Skipping label {}.", key]; [INFO] [stdout] 61 | | ... continue; [INFO] [stdout] 62 | | ... }, [INFO] [stdout] 63 | | ... _ => {}, [INFO] [stdout] 64 | | ... } [INFO] [stdout] | |_______^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 58 ~ if job_kind.as_str() == &LocalJobInfo::LABEL { [INFO] [stdout] 59 + event![Level::ERROR, "Found local job declared in tags, however this is not allowed. Skipping label {}.", key]; [INFO] [stdout] 60 + continue; [INFO] [stdout] 61 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/loader/docker.rs:100:37 [INFO] [stdout] | [INFO] [stdout] 100 | ... return Ok(values); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] = note: `#[warn(clippy::needless_return)]` on by default [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 100 - return Ok(values); [INFO] [stdout] 100 + Ok(values) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/loader/docker.rs:102:37 [INFO] [stdout] | [INFO] [stdout] 102 | ... return Err(Error::msg("")); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 102 - return Err(Error::msg("")); [INFO] [stdout] 102 + Err(Error::msg("")) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&String` instead of `&str` involves a new object where a slice will do [INFO] [stdout] --> src/loader/ini.rs:8:27 [INFO] [stdout] | [INFO] [stdout] 8 | pub fn parse_ini(payload: &String) -> Result>>> { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stdout] = note: `#[warn(clippy::ptr_arg)]` on by default [INFO] [stdout] help: change this to [INFO] [stdout] | [INFO] [stdout] 8 ~ pub fn parse_ini(payload: &str) -> Result>>> { [INFO] [stdout] 9 | let mut current_section = "".to_string(); [INFO] [stdout] 10 | let mut current_data = HashMap::new(); [INFO] [stdout] 11 ~ let mut parser = ini::Parser::new(payload); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this loop could be written as a `for` loop [INFO] [stdout] --> src/loader/ini.rs:12:5 [INFO] [stdout] | [INFO] [stdout] 12 | while let Some(i) = parser.next() { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `for i in parser` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_on_iterator [INFO] [stdout] = note: `#[warn(clippy::while_let_on_iterator)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: compiling a regex in a loop [INFO] [stdout] --> src/loader/ini.rs:20:26 [INFO] [stdout] | [INFO] [stdout] 20 | let re = Regex::new("^(?[^\\s]+)\\s*\"(?[^\"]+)\"$").unwrap(); [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] help: move the regex construction outside this loop [INFO] [stdout] --> src/loader/ini.rs:12:5 [INFO] [stdout] | [INFO] [stdout] 12 | while let Some(i) = parser.next() { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#regex_creation_in_loops [INFO] [stdout] = note: `#[warn(clippy::regex_creation_in_loops)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: binary comparison to literal `Option::None` [INFO] [stdout] --> src/loader/ini.rs:61:20 [INFO] [stdout] | [INFO] [stdout] 61 | if v == None { [INFO] [stdout] | ^^^^^^^^^ help: use `Option::is_none()` instead: `v.is_none()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#partialeq_to_none [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `unwrap_err` on `token` after checking its variant with `is_err` [INFO] [stdout] --> src/loader/yaml.rs:16:35 [INFO] [stdout] | [INFO] [stdout] 15 | if token.is_err() { [INFO] [stdout] | ----------------- help: try: `if let Err() = token` [INFO] [stdout] 16 | return Err(Error::new(token.unwrap_err())); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_unwrap [INFO] [stdout] = note: `#[warn(clippy::unnecessary_unwrap)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/loader/yaml.rs:79:5 [INFO] [stdout] | [INFO] [stdout] 79 | return Err(Error::msg("The YAML parser ended unexpectedly")) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 79 - return Err(Error::msg("The YAML parser ended unexpectedly")) [INFO] [stdout] 79 + Err(Error::msg("The YAML parser ended unexpectedly")) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&String` instead of `&str` involves a new object where a slice will do [INFO] [stdout] --> src/loader/yaml.rs:7:28 [INFO] [stdout] | [INFO] [stdout] 7 | pub fn parse_yaml(payload: &String) -> Result>>> { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stdout] help: change this to [INFO] [stdout] | [INFO] [stdout] 7 ~ pub fn parse_yaml(payload: &str) -> Result>>> { [INFO] [stdout] 8 ~ let mut parser = Parser::new_from_str(payload); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this loop could be written as a `for` loop [INFO] [stdout] --> src/loader/yaml.rs:14:5 [INFO] [stdout] | [INFO] [stdout] 14 | while let Some(token) = parser.next() { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `for token in parser` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_on_iterator [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: usage of `contains_key` followed by `insert` on a `HashMap` [INFO] [stdout] --> src/loader/yaml.rs:30:25 [INFO] [stdout] | [INFO] [stdout] 30 | / ... if data.contains_key(&value) { [INFO] [stdout] 31 | | ... warn!("The key '{}' appears several times in a single dict, this may produce unexpected results and is not supported. Pl... [INFO] [stdout] 32 | | ... } else { [INFO] [stdout] 33 | | ... data.insert(value, HashMap::new()); [INFO] [stdout] 34 | | ... } [INFO] [stdout] | |_______^ [INFO] [stdout] | [INFO] [stdout] = help: consider using the `Entry` API: https://doc.rust-lang.org/std/collections/struct.HashMap.html#entry-api [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_entry [INFO] [stdout] = note: `#[warn(clippy::map_entry)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: usage of `contains_key` followed by `insert` on a `HashMap` [INFO] [stdout] --> src/loader/yaml.rs:39:29 [INFO] [stdout] | [INFO] [stdout] 39 | / ... if current_subdict.contains_key(&value) { [INFO] [stdout] 40 | | ... warn!("The key '{}' appears several times in a single dict, this may produce unexpected results and is not supported. Pl... [INFO] [stdout] 41 | | ... } else { [INFO] [stdout] 42 | | ... current_subdict.insert(value, vec![]); [INFO] [stdout] 43 | | ... } [INFO] [stdout] | |_______^ [INFO] [stdout] | [INFO] [stdout] = help: consider using the `Entry` API: https://doc.rust-lang.org/std/collections/struct.HashMap.html#entry-api [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_entry [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/loader/mod.rs:32:5 [INFO] [stdout] | [INFO] [stdout] 32 | return Ok(retval); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 32 - return Ok(retval); [INFO] [stdout] 32 + Ok(retval) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/loader/mod.rs:59:21 [INFO] [stdout] | [INFO] [stdout] 59 | }).and_then(|map| map_to_job(map)) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the function itself: `map_to_job` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `Result.and_then(|x| Ok(y))`, which is more succinctly expressed as `map(|x| y)` [INFO] [stdout] --> src/loader/mod.rs:51:5 [INFO] [stdout] | [INFO] [stdout] 51 | / fs::read(&path).await [INFO] [stdout] 52 | | .map_err(|e| Error::new(e)) [INFO] [stdout] 53 | | .and_then(|bytes| String::from_utf8(bytes).map_err(|e| Error::new(e))) [INFO] [stdout] 54 | | .and_then(|c| load_file_content(&c, &path.split(".").last().unwrap().to_lowercase())) [INFO] [stdout] ... | [INFO] [stdout] 58 | | Ok(map) [INFO] [stdout] 59 | | }).and_then(|map| map_to_job(map)) [INFO] [stdout] | |__________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bind_instead_of_map [INFO] [stdout] help: use `map` instead [INFO] [stdout] | [INFO] [stdout] 55 ~ .map(|mut map| { [INFO] [stdout] 56 | // TODO: load global configs into ctx [INFO] [stdout] 57 | map.remove("global"); [INFO] [stdout] 58 ~ map [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/loader/mod.rs:52:18 [INFO] [stdout] | [INFO] [stdout] 52 | .map_err(|e| Error::new(e)) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ help: replace the closure with the associated function itself: `Error::new` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/loader/mod.rs:53:60 [INFO] [stdout] | [INFO] [stdout] 53 | .and_then(|bytes| String::from_utf8(bytes).map_err(|e| Error::new(e))) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ help: replace the closure with the associated function itself: `Error::new` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/loader/mod.rs:65:19 [INFO] [stdout] | [INFO] [stdout] 65 | .and_then(|map| map_to_job(map)); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the function itself: `map_to_job` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/job/local.rs:61:22 [INFO] [stdout] | [INFO] [stdout] 61 | .map_err(|e| Error::new(e)) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ help: replace the closure with the associated function itself: `Error::new` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] = note: `#[warn(clippy::redundant_closure)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `Result.and_then(|x| Ok(y))`, which is more succinctly expressed as `map(|x| y)` [INFO] [stdout] --> src/job/local.rs:32:9 [INFO] [stdout] | [INFO] [stdout] 32 | / command.output().await [INFO] [stdout] 33 | | .and_then(|o| { [INFO] [stdout] 34 | | // TODO: move this to the caller and return an object enum to handle the distinction between timer and job [INFO] [stdout] 35 | | if o.status.code().and_then(|c| Some(c != 0)).unwrap_or(true) { [INFO] [stdout] ... | [INFO] [stdout] 59 | | Ok(None) [INFO] [stdout] 60 | | }) [INFO] [stdout] | |______________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bind_instead_of_map [INFO] [stdout] = note: `#[warn(clippy::bind_instead_of_map)]` on by default [INFO] [stdout] help: use `map` instead [INFO] [stdout] | [INFO] [stdout] 33 ~ .map(|o| { [INFO] [stdout] 34 | // TODO: move this to the caller and return an object enum to handle the distinction between timer and job [INFO] [stdout] ... [INFO] [stdout] 58 | } [INFO] [stdout] 59 ~ None [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `Option.and_then(|x| Some(y))`, which is more succinctly expressed as `map(|x| y)` [INFO] [stdout] --> src/job/local.rs:35:20 [INFO] [stdout] | [INFO] [stdout] 35 | if o.status.code().and_then(|c| Some(c != 0)).unwrap_or(true) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `o.status.code().map(|c| c != 0)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bind_instead_of_map [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: literal with an empty format string [INFO] [stdout] --> src/job/local.rs:78:13 [INFO] [stdout] | [INFO] [stdout] 78 | "CFC_HOST", [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#write_literal [INFO] [stdout] = note: `#[warn(clippy::write_literal)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 75 ~ "{}.{}.CFC_HOST", [INFO] [stdout] 76 | Self::LABEL, [INFO] [stdout] 77 ~ self.name, [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you seem to be trying to use `match` for destructuring a single pattern. Consider using `if let` [INFO] [stdout] --> src/job/mod.rs:26:5 [INFO] [stdout] | [INFO] [stdout] 26 | / match re.captures(sched.as_str()) { [INFO] [stdout] 27 | | Some(c) => { [INFO] [stdout] 28 | | let interval: i32 = c.name("interval").unwrap().as_str().parse().unwrap(); [INFO] [stdout] 29 | | let unit = c.name("unit").unwrap().as_str(); [INFO] [stdout] ... | [INFO] [stdout] 38 | | None => {}, [INFO] [stdout] 39 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stdout] = note: `#[warn(clippy::single_match)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 26 ~ if let Some(c) = re.captures(sched.as_str()) { [INFO] [stdout] 27 + let interval: i32 = c.name("interval").unwrap().as_str().parse().unwrap(); [INFO] [stdout] 28 + let unit = c.name("unit").unwrap().as_str(); [INFO] [stdout] 29 + match unit { [INFO] [stdout] 30 + // TODO: add randomization of 0 values [INFO] [stdout] 31 + "s" => sched = format!("*/{} * * * * *", interval).to_string(), [INFO] [stdout] 32 + "m" => sched = format!("0 */{} * * * *", interval).to_string(), [INFO] [stdout] 33 + "h" => sched = format!("0 0 */{} * * *", interval).to_string(), [INFO] [stdout] 34 + _ => unreachable!("Encountered an unhandled time unit while parsing a schedule"), [INFO] [stdout] 35 + } [INFO] [stdout] 36 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/job/mod.rs:40:63 [INFO] [stdout] | [INFO] [stdout] 40 | Cron::new(&sched).with_seconds_optional().parse().map_err(|e| Error::new(e)) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ help: replace the closure with the associated function itself: `Error::new` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: binary comparison to literal `Option::None` [INFO] [stdout] --> src/job/mod.rs:119:12 [INFO] [stdout] | [INFO] [stdout] 119 | if kind == None { [INFO] [stdout] | ^^^^^^^^^^^^ help: use `Option::is_none()` instead: `kind.is_none()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#partialeq_to_none [INFO] [stdout] = note: `#[warn(clippy::partialeq_to_none)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: useless use of `format!` [INFO] [stdout] --> src/job/mod.rs:120:35 [INFO] [stdout] | [INFO] [stdout] 120 | return Err(Error::msg(format!["The job has no job type"])); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `"The job has no job type".to_string()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stdout] = note: `#[warn(clippy::useless_format)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: binary comparison to literal `Option::None` [INFO] [stdout] --> src/job/mod.rs:125:12 [INFO] [stdout] | [INFO] [stdout] 125 | if command == None { [INFO] [stdout] | ^^^^^^^^^^^^^^^ help: use `Option::is_none()` instead: `command.is_none()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#partialeq_to_none [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: useless use of `format!` [INFO] [stdout] --> src/job/mod.rs:126:35 [INFO] [stdout] | [INFO] [stdout] 126 | return Err(Error::msg(format!["The job has no command"])); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `"The job has no command".to_string()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: binary comparison to literal `Option::None` [INFO] [stdout] --> src/job/mod.rs:128:12 [INFO] [stdout] | [INFO] [stdout] 128 | if schedule == None { [INFO] [stdout] | ^^^^^^^^^^^^^^^^ help: use `Option::is_none()` instead: `schedule.is_none()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#partialeq_to_none [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: useless use of `format!` [INFO] [stdout] --> src/job/mod.rs:129:35 [INFO] [stdout] | [INFO] [stdout] 129 | return Err(Error::msg(format!["The job has no schedule"])); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `"The job has no schedule".to_string()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded late initialization [INFO] [stdout] --> src/job/mod.rs:133:9 [INFO] [stdout] | [INFO] [stdout] 133 | let job_info: JobInfo; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_late_init [INFO] [stdout] = note: `#[warn(clippy::needless_late_init)]` on by default [INFO] [stdout] help: move the declaration `job_info` here and remove the assignments from the `match` arms [INFO] [stdout] | [INFO] [stdout] 133 ~ [INFO] [stdout] 134 ~ let job_info: JobInfo = match kind.as_str() { [INFO] [stdout] 135 | ExecJobInfo::LABEL => { [INFO] [stdout] ... [INFO] [stdout] 144 | }; [INFO] [stdout] 145 ~ JobInfo::ExecJob(Box::new(job)) [INFO] [stdout] 146 | }, [INFO] [stdout] ... [INFO] [stdout] 164 | } [INFO] [stdout] 165 ~ JobInfo::RunJob(Box::new(job)) [INFO] [stdout] 166 | }, [INFO] [stdout] ... [INFO] [stdout] 174 | }; [INFO] [stdout] 175 ~ JobInfo::LocalJob(Box::new(job)) [INFO] [stdout] 176 | }, [INFO] [stdout] ... [INFO] [stdout] 188 | }; [INFO] [stdout] 189 ~ JobInfo::ServiceRunJob(Box::new(job)) [INFO] [stdout] 190 | } [INFO] [stdout] 191 | _ => return Err(Error::msg(format!["Unsupported job type {}", kind])), [INFO] [stdout] 192 ~ }; [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/job/mod.rs:138:48 [INFO] [stdout] | [INFO] [stdout] 138 | schedule: schedule_to_cron(&schedule.as_str()).unwrap(), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ help: change this to: `schedule.as_str()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] = note: `#[warn(clippy::needless_borrow)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `map_or` can be simplified [INFO] [stdout] --> src/job/mod.rs:142:26 [INFO] [stdout] | [INFO] [stdout] 142 | tty: parameters.remove("tty").map_or(false, |mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_map_or [INFO] [stdout] = note: `#[warn(clippy::unnecessary_map_or)]` on by default [INFO] [stdout] help: use `is_some_and` instead [INFO] [stdout] | [INFO] [stdout] 142 - tty: parameters.remove("tty").map_or(false, |mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] 142 + tty: parameters.remove("tty").is_some_and(|mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: use of `unwrap_or` to construct default value [INFO] [stdout] --> src/job/mod.rs:143:67 [INFO] [stdout] | [INFO] [stdout] 143 | environment: parameters.remove("environment").unwrap_or(Default::default()), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `unwrap_or_default()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unwrap_or_default [INFO] [stdout] = note: `#[warn(clippy::unwrap_or_default)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/job/mod.rs:150:48 [INFO] [stdout] | [INFO] [stdout] 150 | schedule: schedule_to_cron(&schedule.as_str()).unwrap(), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ help: change this to: `schedule.as_str()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `map_or(None, ..)` on an `Option` value [INFO] [stdout] --> src/job/mod.rs:153:27 [INFO] [stdout] | [INFO] [stdout] 153 | user: parameters.remove("user").map_or(None, |mut u| Some(u.pop().unwrap())), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `map`: `parameters.remove("user").map(|mut u| u.pop().unwrap())` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#option_map_or_none [INFO] [stdout] = note: `#[warn(clippy::option_map_or_none)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `map_or(None, ..)` on an `Option` value [INFO] [stdout] --> src/job/mod.rs:155:31 [INFO] [stdout] | [INFO] [stdout] 155 | hostname: parameters.remove("hostname").map_or(None, |mut u| Some(u.pop().unwrap())), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `map`: `parameters.remove("hostname").map(|mut u| u.pop().unwrap())` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#option_map_or_none [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `map_or` can be simplified [INFO] [stdout] --> src/job/mod.rs:156:29 [INFO] [stdout] | [INFO] [stdout] 156 | delete: parameters.remove("delete").map_or(true, |mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_map_or [INFO] [stdout] help: use `is_none_or` instead [INFO] [stdout] | [INFO] [stdout] 156 - delete: parameters.remove("delete").map_or(true, |mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] 156 + delete: parameters.remove("delete").is_none_or(|mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `map_or` can be simplified [INFO] [stdout] --> src/job/mod.rs:158:26 [INFO] [stdout] | [INFO] [stdout] 158 | tty: parameters.remove("tty").map_or(false, |mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_map_or [INFO] [stdout] help: use `is_some_and` instead [INFO] [stdout] | [INFO] [stdout] 158 - tty: parameters.remove("tty").map_or(false, |mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] 158 + tty: parameters.remove("tty").is_some_and(|mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/job/mod.rs:159:72 [INFO] [stdout] | [INFO] [stdout] 159 | volume: parameters.remove("volume").unwrap_or_else(|| Default::default()), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the associated function itself: `Default::default` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: use of `unwrap_or` to construct default value [INFO] [stdout] --> src/job/mod.rs:160:67 [INFO] [stdout] | [INFO] [stdout] 160 | environment: parameters.remove("environment").unwrap_or(Default::default()), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `unwrap_or_default()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unwrap_or_default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: binary comparison to literal `Option::None` [INFO] [stdout] --> src/job/mod.rs:162:20 [INFO] [stdout] | [INFO] [stdout] 162 | if job.image == None && job.container == None { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ help: use `Option::is_none()` instead: `job.image.is_none()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#partialeq_to_none [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: binary comparison to literal `Option::None` [INFO] [stdout] --> src/job/mod.rs:162:41 [INFO] [stdout] | [INFO] [stdout] 162 | if job.image == None && job.container == None { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ help: use `Option::is_none()` instead: `job.container.is_none()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#partialeq_to_none [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/job/mod.rs:170:48 [INFO] [stdout] | [INFO] [stdout] 170 | schedule: schedule_to_cron(&schedule.as_str()).unwrap(), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ help: change this to: `schedule.as_str()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: use of `unwrap_or` to construct default value [INFO] [stdout] --> src/job/mod.rs:173:67 [INFO] [stdout] | [INFO] [stdout] 173 | environment: parameters.remove("environment").unwrap_or(Default::default()), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `unwrap_or_default()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unwrap_or_default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/job/mod.rs:180:48 [INFO] [stdout] | [INFO] [stdout] 180 | schedule: schedule_to_cron(&schedule.as_str()).unwrap(), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ help: change this to: `schedule.as_str()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `map_or(None, ..)` on an `Option` value [INFO] [stdout] --> src/job/mod.rs:183:27 [INFO] [stdout] | [INFO] [stdout] 183 | user: parameters.remove("user").map_or(None, |mut u| Some(u.pop().unwrap())), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `map`: `parameters.remove("user").map(|mut u| u.pop().unwrap())` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#option_map_or_none [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `map_or` can be simplified [INFO] [stdout] --> src/job/mod.rs:185:29 [INFO] [stdout] | [INFO] [stdout] 185 | delete: parameters.remove("delete").map_or(true, |mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_map_or [INFO] [stdout] help: use `is_none_or` instead [INFO] [stdout] | [INFO] [stdout] 185 - delete: parameters.remove("delete").map_or(true, |mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] 185 + delete: parameters.remove("delete").is_none_or(|mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `map_or` can be simplified [INFO] [stdout] --> src/job/mod.rs:187:26 [INFO] [stdout] | [INFO] [stdout] 187 | tty: parameters.remove("tty").map_or(false, |mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_map_or [INFO] [stdout] help: use `is_some_and` instead [INFO] [stdout] | [INFO] [stdout] 187 - tty: parameters.remove("tty").map_or(false, |mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] 187 + tty: parameters.remove("tty").is_some_and(|mut t| t.pop().unwrap().parse().unwrap()), [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this boolean expression can be simplified [INFO] [stdout] --> src/loader/docker.rs:38:16 [INFO] [stdout] | [INFO] [stdout] 38 | if !container.labels.as_ref().is_some_and(|c| !c.is_empty()) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `container.labels.as_ref().is_none_or(|c| c.is_empty())` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#nonminimal_bool [INFO] [stdout] = note: `#[warn(clippy::nonminimal_bool)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded late initialization [INFO] [stdout] --> src/loader/docker.rs:21:9 [INFO] [stdout] | [INFO] [stdout] 21 | let container_list; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_late_init [INFO] [stdout] help: move the declaration `container_list` here and remove the assignments from the `match` arms [INFO] [stdout] | [INFO] [stdout] 21 ~ [INFO] [stdout] 22 ~ let container_list = match handle.list_containers(Some(options)).await { [INFO] [stdout] 23 ~ Ok(l) => l, [INFO] [stdout] 24 | Err(e) => { [INFO] [stdout] ... [INFO] [stdout] 27 | } [INFO] [stdout] 28 ~ }; [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `map_or` can be simplified [INFO] [stdout] --> src/loader/docker.rs:43:20 [INFO] [stdout] | [INFO] [stdout] 43 | if key_parts.next().map_or(true, |p| !label_prefixes.contains(&p.to_string())) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_map_or [INFO] [stdout] help: use `is_none_or` instead [INFO] [stdout] | [INFO] [stdout] 43 - if key_parts.next().map_or(true, |p| !label_prefixes.contains(&p.to_string())) { [INFO] [stdout] 43 + if key_parts.next().is_none_or(|p| !label_prefixes.contains(&p.to_string())) { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `Option.and_then(|x| Some(y))`, which is more succinctly expressed as `map(|x| y)` [INFO] [stdout] --> src/loader/docker.rs:47:32 [INFO] [stdout] | [INFO] [stdout] 47 | let job_kind = key_parts.next().and_then(|k| Some(k.to_string())); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `key_parts.next().map(|k| k.to_string())` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bind_instead_of_map [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `Option.and_then(|x| Some(y))`, which is more succinctly expressed as `map(|x| y)` [INFO] [stdout] --> src/loader/docker.rs:48:32 [INFO] [stdout] | [INFO] [stdout] 48 | let job_name = key_parts.next().and_then(|n| Some(n.to_string())); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `key_parts.next().map(|n| n.to_string())` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bind_instead_of_map [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `Option.and_then(|x| Some(y))`, which is more succinctly expressed as `map(|x| y)` [INFO] [stdout] --> src/loader/docker.rs:49:37 [INFO] [stdout] | [INFO] [stdout] 49 | let job_parameter = key_parts.next().and_then(|p| Some(p.to_string())); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `key_parts.next().map(|p| p.to_string())` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bind_instead_of_map [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you seem to be trying to use `match` for an equality check. Consider using `if` [INFO] [stdout] --> src/loader/docker.rs:58:21 [INFO] [stdout] | [INFO] [stdout] 58 | / ... match job_kind.as_str() { [INFO] [stdout] 59 | | ... LocalJobInfo::LABEL => { [INFO] [stdout] 60 | | ... event![Level::ERROR, "Found local job declared in tags, however this is not allowed. Skipping label {}.", key]; [INFO] [stdout] 61 | | ... continue; [INFO] [stdout] 62 | | ... }, [INFO] [stdout] 63 | | ... _ => {}, [INFO] [stdout] 64 | | ... } [INFO] [stdout] | |_______^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 58 ~ if job_kind.as_str() == &LocalJobInfo::LABEL { [INFO] [stdout] 59 + event![Level::ERROR, "Found local job declared in tags, however this is not allowed. Skipping label {}.", key]; [INFO] [stdout] 60 + continue; [INFO] [stdout] 61 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/loader/docker.rs:100:37 [INFO] [stdout] | [INFO] [stdout] 100 | ... return Ok(values); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] = note: `#[warn(clippy::needless_return)]` on by default [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 100 - return Ok(values); [INFO] [stdout] 100 + Ok(values) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/loader/docker.rs:102:37 [INFO] [stdout] | [INFO] [stdout] 102 | ... return Err(Error::msg("")); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 102 - return Err(Error::msg("")); [INFO] [stdout] 102 + Err(Error::msg("")) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&String` instead of `&str` involves a new object where a slice will do [INFO] [stdout] --> src/loader/ini.rs:8:27 [INFO] [stdout] | [INFO] [stdout] 8 | pub fn parse_ini(payload: &String) -> Result>>> { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stdout] = note: `#[warn(clippy::ptr_arg)]` on by default [INFO] [stdout] help: change this to [INFO] [stdout] | [INFO] [stdout] 8 ~ pub fn parse_ini(payload: &str) -> Result>>> { [INFO] [stdout] 9 | let mut current_section = "".to_string(); [INFO] [stdout] 10 | let mut current_data = HashMap::new(); [INFO] [stdout] 11 ~ let mut parser = ini::Parser::new(payload); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this loop could be written as a `for` loop [INFO] [stdout] --> src/loader/ini.rs:12:5 [INFO] [stdout] | [INFO] [stdout] 12 | while let Some(i) = parser.next() { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `for i in parser` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_on_iterator [INFO] [stdout] = note: `#[warn(clippy::while_let_on_iterator)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: compiling a regex in a loop [INFO] [stdout] --> src/loader/ini.rs:20:26 [INFO] [stdout] | [INFO] [stdout] 20 | let re = Regex::new("^(?[^\\s]+)\\s*\"(?[^\"]+)\"$").unwrap(); [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] help: move the regex construction outside this loop [INFO] [stdout] --> src/loader/ini.rs:12:5 [INFO] [stdout] | [INFO] [stdout] 12 | while let Some(i) = parser.next() { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#regex_creation_in_loops [INFO] [stdout] = note: `#[warn(clippy::regex_creation_in_loops)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: binary comparison to literal `Option::None` [INFO] [stdout] --> src/loader/ini.rs:61:20 [INFO] [stdout] | [INFO] [stdout] 61 | if v == None { [INFO] [stdout] | ^^^^^^^^^ help: use `Option::is_none()` instead: `v.is_none()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#partialeq_to_none [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `unwrap_err` on `token` after checking its variant with `is_err` [INFO] [stdout] --> src/loader/yaml.rs:16:35 [INFO] [stdout] | [INFO] [stdout] 15 | if token.is_err() { [INFO] [stdout] | ----------------- help: try: `if let Err() = token` [INFO] [stdout] 16 | return Err(Error::new(token.unwrap_err())); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_unwrap [INFO] [stdout] = note: `#[warn(clippy::unnecessary_unwrap)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/loader/yaml.rs:79:5 [INFO] [stdout] | [INFO] [stdout] 79 | return Err(Error::msg("The YAML parser ended unexpectedly")) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 79 - return Err(Error::msg("The YAML parser ended unexpectedly")) [INFO] [stdout] 79 + Err(Error::msg("The YAML parser ended unexpectedly")) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&String` instead of `&str` involves a new object where a slice will do [INFO] [stdout] --> src/loader/yaml.rs:7:28 [INFO] [stdout] | [INFO] [stdout] 7 | pub fn parse_yaml(payload: &String) -> Result>>> { [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stdout] help: change this to [INFO] [stdout] | [INFO] [stdout] 7 ~ pub fn parse_yaml(payload: &str) -> Result>>> { [INFO] [stdout] 8 ~ let mut parser = Parser::new_from_str(payload); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this loop could be written as a `for` loop [INFO] [stdout] --> src/loader/yaml.rs:14:5 [INFO] [stdout] | [INFO] [stdout] 14 | while let Some(token) = parser.next() { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `for token in parser` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_on_iterator [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: usage of `contains_key` followed by `insert` on a `HashMap` [INFO] [stdout] --> src/loader/yaml.rs:30:25 [INFO] [stdout] | [INFO] [stdout] 30 | / ... if data.contains_key(&value) { [INFO] [stdout] 31 | | ... warn!("The key '{}' appears several times in a single dict, this may produce unexpected results and is not supported. Pl... [INFO] [stdout] 32 | | ... } else { [INFO] [stdout] 33 | | ... data.insert(value, HashMap::new()); [INFO] [stdout] 34 | | ... } [INFO] [stdout] | |_______^ [INFO] [stdout] | [INFO] [stdout] = help: consider using the `Entry` API: https://doc.rust-lang.org/std/collections/struct.HashMap.html#entry-api [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_entry [INFO] [stdout] = note: `#[warn(clippy::map_entry)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: usage of `contains_key` followed by `insert` on a `HashMap` [INFO] [stdout] --> src/loader/yaml.rs:39:29 [INFO] [stdout] | [INFO] [stdout] 39 | / ... if current_subdict.contains_key(&value) { [INFO] [stdout] 40 | | ... warn!("The key '{}' appears several times in a single dict, this may produce unexpected results and is not supported. Pl... [INFO] [stdout] 41 | | ... } else { [INFO] [stdout] 42 | | ... current_subdict.insert(value, vec![]); [INFO] [stdout] 43 | | ... } [INFO] [stdout] | |_______^ [INFO] [stdout] | [INFO] [stdout] = help: consider using the `Entry` API: https://doc.rust-lang.org/std/collections/struct.HashMap.html#entry-api [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_entry [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/loader/mod.rs:32:5 [INFO] [stdout] | [INFO] [stdout] 32 | return Ok(retval); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 32 - return Ok(retval); [INFO] [stdout] 32 + Ok(retval) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/loader/mod.rs:59:21 [INFO] [stdout] | [INFO] [stdout] 59 | }).and_then(|map| map_to_job(map)) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the function itself: `map_to_job` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `Result.and_then(|x| Ok(y))`, which is more succinctly expressed as `map(|x| y)` [INFO] [stdout] --> src/loader/mod.rs:51:5 [INFO] [stdout] | [INFO] [stdout] 51 | / fs::read(&path).await [INFO] [stdout] 52 | | .map_err(|e| Error::new(e)) [INFO] [stdout] 53 | | .and_then(|bytes| String::from_utf8(bytes).map_err(|e| Error::new(e))) [INFO] [stdout] 54 | | .and_then(|c| load_file_content(&c, &path.split(".").last().unwrap().to_lowercase())) [INFO] [stdout] ... | [INFO] [stdout] 58 | | Ok(map) [INFO] [stdout] 59 | | }).and_then(|map| map_to_job(map)) [INFO] [stdout] | |__________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bind_instead_of_map [INFO] [stdout] help: use `map` instead [INFO] [stdout] | [INFO] [stdout] 55 ~ .map(|mut map| { [INFO] [stdout] 56 | // TODO: load global configs into ctx [INFO] [stdout] 57 | map.remove("global"); [INFO] [stdout] 58 ~ map [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/loader/mod.rs:52:18 [INFO] [stdout] | [INFO] [stdout] 52 | .map_err(|e| Error::new(e)) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ help: replace the closure with the associated function itself: `Error::new` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/loader/mod.rs:53:60 [INFO] [stdout] | [INFO] [stdout] 53 | .and_then(|bytes| String::from_utf8(bytes).map_err(|e| Error::new(e))) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ help: replace the closure with the associated function itself: `Error::new` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/loader/mod.rs:65:19 [INFO] [stdout] | [INFO] [stdout] 65 | .and_then(|map| map_to_job(map)); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the function itself: `map_to_job` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this import is redundant [INFO] [stdout] --> src/bin/main.rs:9:1 [INFO] [stdout] | [INFO] [stdout] 9 | use tracing_subscriber; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ help: remove it entirely [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_component_path_imports [INFO] [stdout] = note: `#[warn(clippy::single_component_path_imports)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this import is redundant [INFO] [stdout] --> src/bin/main.rs:9:1 [INFO] [stdout] | [INFO] [stdout] 9 | use tracing_subscriber; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ help: remove it entirely [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_component_path_imports [INFO] [stdout] = note: `#[warn(clippy::single_component_path_imports)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `Option.and_then(|x| Some(y))`, which is more succinctly expressed as `map(|x| y)` [INFO] [stdout] --> src/bin/main.rs:71:38 [INFO] [stdout] | [INFO] [stdout] 71 | global_context.config_path = self.config.as_ref() [INFO] [stdout] | ______________________________________^ [INFO] [stdout] 72 | | .and_then(|c| Some(c.clone())) [INFO] [stdout] | |__________________________________________^ help: try: `self.config.as_ref().map(|c| c.clone())` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bind_instead_of_map [INFO] [stdout] = note: `#[warn(clippy::bind_instead_of_map)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `Option.and_then(|x| Some(y))`, which is more succinctly expressed as `map(|x| y)` [INFO] [stdout] --> src/bin/main.rs:71:38 [INFO] [stdout] | [INFO] [stdout] 71 | global_context.config_path = self.config.as_ref() [INFO] [stdout] | ______________________________________^ [INFO] [stdout] 72 | | .and_then(|c| Some(c.clone())) [INFO] [stdout] | |__________________________________________^ help: try: `self.config.as_ref().map(|c| c.clone())` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bind_instead_of_map [INFO] [stdout] = note: `#[warn(clippy::bind_instead_of_map)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 01s [INFO] running `Command { std: "docker" "inspect" "056dfcc020c4bb1f4031f129f126ad07acc5d4dbbe5376c51e1dd7ea4d184c1a", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "056dfcc020c4bb1f4031f129f126ad07acc5d4dbbe5376c51e1dd7ea4d184c1a", kill_on_drop: false }` [INFO] [stdout] 056dfcc020c4bb1f4031f129f126ad07acc5d4dbbe5376c51e1dd7ea4d184c1a