[INFO] cloning repository https://github.com/seaoak/fubaco [INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/seaoak/fubaco" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fseaoak%2Ffubaco", kill_on_drop: false }` [INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fseaoak%2Ffubaco'... [INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }` [INFO] [stdout] 59e1538a7a7166fd1c38446dc6e9c5837d5f3b1f [INFO] linting seaoak/fubaco against nightly for clippy-nonminimal_bool-denied [INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fseaoak%2Ffubaco" "/workspace/builds/worker-1-tc1/source", kill_on_drop: false }` [INFO] [stderr] Cloning into '/workspace/builds/worker-1-tc1/source'... [INFO] [stderr] done. [INFO] started tweaking git repo https://github.com/seaoak/fubaco [INFO] finished tweaking git repo https://github.com/seaoak/fubaco [INFO] tweaked toml for git repo https://github.com/seaoak/fubaco written to /workspace/builds/worker-1-tc1/source/Cargo.toml [INFO] validating manifest of git repo https://github.com/seaoak/fubaco on toolchain nightly [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+nightly" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }` [INFO] crate git repo https://github.com/seaoak/fubaco 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 unicode-jp v0.4.0 [INFO] [stderr] Downloaded scraper v0.20.0 [INFO] [stderr] Downloaded yaml-rust v0.3.5 [INFO] [stderr] Downloaded miniz_oxide v0.8.7 [INFO] [stderr] Downloaded lingua-japanese-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-punjabi-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-chinese-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-korean-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-tswana-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-tamil-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-swahili-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-sotho-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-maori-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-hindi-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-gujarati-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-bengali-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-xhosa-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-marathi-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-tsonga-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-yoruba-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-shona-language-model v1.2.0 [INFO] [stderr] Downloaded mail-parser v0.9.4 [INFO] [stderr] Downloaded lingua-telugu-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-somali-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-zulu-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-tagalog-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-malay-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-welsh-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-ganda-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-basque-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-latin-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-vietnamese-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-irish-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-afrikaans-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-macedonian-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-bosnian-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-indonesian-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-mongolian-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-italian-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-armenian-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-portuguese-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-nynorsk-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-catalan-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-spanish-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-english-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-albanian-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-french-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-bokmal-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-esperanto-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-dutch-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-bulgarian-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-slovene-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-danish-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-russian-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-turkish-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-croatian-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-finnish-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-german-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-kazakh-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-estonian-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-romanian-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-swedish-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-azerbaijani-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-ukrainian-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-belarusian-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-persian-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-georgian-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-serbian-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-icelandic-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-polish-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-thai-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-urdu-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-lithuanian-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-latvian-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-slovak-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-hebrew-language-model v1.2.0 [INFO] [stderr] Downloaded lingua v1.7.1 [INFO] [stderr] Downloaded lingua-czech-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-greek-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-arabic-language-model v1.2.0 [INFO] [stderr] Downloaded lingua-hungarian-language-model v1.2.0 [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] 26d5fdb4ecaf4c6275286889891136044f9408e1a0837f692d2ca5ed55abfb84 [INFO] running `Command { std: "docker" "start" "-a" "26d5fdb4ecaf4c6275286889891136044f9408e1a0837f692d2ca5ed55abfb84", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "26d5fdb4ecaf4c6275286889891136044f9408e1a0837f692d2ca5ed55abfb84", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "26d5fdb4ecaf4c6275286889891136044f9408e1a0837f692d2ca5ed55abfb84", kill_on_drop: false }` [INFO] [stdout] 26d5fdb4ecaf4c6275286889891136044f9408e1a0837f692d2ca5ed55abfb84 [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] d420415055ab476cc0e00abe09914b67b1f5f171c6331b080e07e3506c345aad [INFO] running `Command { std: "docker" "start" "-a" "d420415055ab476cc0e00abe09914b67b1f5f171c6331b080e07e3506c345aad", kill_on_drop: false }` [INFO] [stderr] Compiling include_dir_macros v0.7.4 [INFO] [stderr] Checking smallvec v1.15.0 [INFO] [stderr] Compiling libc v0.2.171 [INFO] [stderr] Compiling zerocopy v0.8.24 [INFO] [stderr] Compiling cc v1.2.18 [INFO] [stderr] Checking getrandom v0.2.15 [INFO] [stderr] Compiling num-traits v0.2.19 [INFO] [stderr] Checking yoke v0.7.5 [INFO] [stderr] Checking zerovec v0.10.4 [INFO] [stderr] Checking parking_lot_core v0.9.10 [INFO] [stderr] Checking signal-hook-registry v1.4.2 [INFO] [stderr] Compiling serde_derive v1.0.219 [INFO] [stderr] Checking include_dir v0.7.4 [INFO] [stderr] Checking parking_lot v0.12.3 [INFO] [stderr] Checking spin v0.9.8 [INFO] [stderr] Checking tokio v1.44.2 [INFO] [stderr] Checking base64ct v1.7.3 [INFO] [stderr] Checking pem-rfc7468 v0.7.0 [INFO] [stderr] Checking lazy_static v1.5.0 [INFO] [stderr] Checking num-integer v0.1.46 [INFO] [stderr] Checking tracing v0.1.41 [INFO] [stderr] Checking digest v0.10.7 [INFO] [stderr] Checking tinystr v0.7.6 [INFO] [stderr] Checking rand_core v0.6.4 [INFO] [stderr] Checking icu_locid v1.5.0 [INFO] [stderr] Checking bitflags v2.9.0 [INFO] [stderr] Compiling winapi-build v0.1.1 [INFO] [stderr] Checking indexmap v2.9.0 [INFO] [stderr] Compiling kernel32-sys v0.2.2 [INFO] [stderr] Checking icu_collections v1.5.0 [INFO] [stderr] Checking der v0.7.9 [INFO] [stderr] Compiling ppv-lite86 v0.2.21 [INFO] [stderr] Compiling openssl-sys v0.9.107 [INFO] [stderr] Compiling ring v0.17.14 [INFO] [stderr] Checking icu_provider v1.5.0 [INFO] [stderr] Compiling rand_chacha v0.3.1 [INFO] [stderr] Checking num-iter v0.1.45 [INFO] [stderr] Compiling rustls v0.23.25 [INFO] [stderr] Compiling openssl v0.10.72 [INFO] [stderr] Checking icu_locid_transform v1.5.0 [INFO] [stderr] Compiling rand v0.8.5 [INFO] [stderr] Checking winapi v0.2.8 [INFO] [stderr] Compiling native-tls v0.2.14 [INFO] [stderr] Checking aho-corasick v1.1.3 [INFO] [stderr] Checking icu_properties v1.5.1 [INFO] [stderr] Checking spki v0.7.3 [INFO] [stderr] Compiling phf_generator v0.11.3 [INFO] [stderr] Compiling phf_generator v0.10.0 [INFO] [stderr] Compiling phf_codegen v0.10.0 [INFO] [stderr] Compiling phf_macros v0.11.3 [INFO] [stderr] Compiling string_cache_codegen v0.5.4 [INFO] [stderr] Compiling phf_codegen v0.11.3 [INFO] [stderr] Checking pkcs8 v0.10.2 [INFO] [stderr] Compiling markup5ever v0.12.1 [INFO] [stderr] Checking num-bigint v0.4.6 [INFO] [stderr] Checking phf v0.11.3 [INFO] [stderr] Checking regex-automata v0.4.9 [INFO] [stderr] Compiling selectors v0.25.0 [INFO] [stderr] Checking serde v1.0.219 [INFO] [stderr] Checking tokio-util v0.7.14 [INFO] [stderr] Compiling curve25519-dalek v4.1.3 [INFO] [stderr] Checking icu_normalizer v1.5.0 [INFO] [stderr] Checking h2 v0.4.8 [INFO] [stderr] Checking num-rational v0.4.2 [INFO] [stderr] Checking thread-id v2.0.0 [INFO] [stderr] Checking signature v2.2.0 [INFO] [stderr] Checking num-complex v0.4.6 [INFO] [stderr] Checking idna_adapter v1.2.0 [INFO] [stderr] Checking memchr v0.1.11 [INFO] [stderr] Compiling html5ever v0.27.0 [INFO] [stderr] Compiling cssparser-macros v0.6.1 [INFO] [stderr] Compiling num-bigint-dig v0.8.4 [INFO] [stderr] Compiling time-macros v0.2.22 [INFO] [stderr] Checking num v0.4.3 [INFO] [stderr] Checking ahash v0.8.11 [INFO] [stderr] Checking tokio-native-tls v0.3.1 [INFO] [stderr] Checking cssparser v0.31.2 [INFO] [stderr] Checking rustls-webpki v0.103.1 [INFO] [stderr] Checking regex v1.11.1 [INFO] [stderr] Checking aho-corasick v0.5.3 [INFO] [stderr] Checking idna v1.0.3 [INFO] [stderr] Checking thread_local v0.2.7 [INFO] [stderr] Checking brotli-decompressor v4.0.2 [INFO] [stderr] Checking castaway v0.2.3 [INFO] [stderr] Checking textwrap v0.11.0 [INFO] [stderr] Checking servo_arc v0.3.0 [INFO] [stderr] Checking atty v0.2.14 [INFO] [stderr] Compiling curve25519-dalek-derive v0.1.1 [INFO] [stderr] Compiling derive_more v0.99.19 [INFO] [stderr] Checking regex-syntax v0.3.9 [INFO] [stderr] Checking utf8-ranges v0.1.3 [INFO] [stderr] Checking yaml-rust v0.3.5 [INFO] [stderr] Checking ansi_term v0.12.1 [INFO] [stderr] Checking string_cache v0.8.9 [INFO] [stderr] Checking serde_json v1.0.140 [INFO] [stderr] Checking regex v0.1.80 [INFO] [stderr] Checking clap v2.34.0 [INFO] [stderr] Checking brotli v7.0.0 [INFO] [stderr] Checking hyper v1.6.0 [INFO] [stderr] Checking serde_urlencoded v0.7.1 [INFO] [stderr] Checking time v0.3.41 [INFO] [stderr] Compiling strum_macros v0.27.1 [INFO] [stderr] Checking dashmap v6.1.0 [INFO] [stderr] Checking hyper-util v0.1.11 [INFO] [stderr] Checking compact_str v0.9.0 [INFO] [stderr] Checking tower v0.5.2 [INFO] [stderr] Checking url v2.5.4 [INFO] [stderr] Checking tokio-rustls v0.26.2 [INFO] [stderr] Checking fraction v0.15.3 [INFO] [stderr] Checking hyper-tls v0.6.0 [INFO] [stderr] Checking hyper-rustls v0.27.5 [INFO] [stderr] Checking ed25519 v2.2.3 [INFO] [stderr] Checking sha2 v0.10.8 [INFO] [stderr] Checking pkcs1 v0.7.5 [INFO] [stderr] Checking sharded-slab v0.1.7 [INFO] [stderr] Checking lingua-french-language-model v1.2.0 [INFO] [stderr] Checking lingua-tamil-language-model v1.2.0 [INFO] [stderr] Checking lingua-marathi-language-model v1.2.0 [INFO] [stderr] Checking lingua-german-language-model v1.2.0 [INFO] [stderr] Checking lingua-malay-language-model v1.2.0 [INFO] [stderr] Checking lingua-tagalog-language-model v1.2.0 [INFO] [stderr] Checking lingua-punjabi-language-model v1.2.0 [INFO] [stderr] Checking lingua-ganda-language-model v1.2.0 [INFO] [stderr] Checking lingua-zulu-language-model v1.2.0 [INFO] [stderr] Checking lingua-tswana-language-model v1.2.0 [INFO] [stderr] Checking lingua-welsh-language-model v1.2.0 [INFO] [stderr] Checking lingua-bulgarian-language-model v1.2.0 [INFO] [stderr] Checking lingua-ukrainian-language-model v1.2.0 [INFO] [stderr] Checking lingua-telugu-language-model v1.2.0 [INFO] [stderr] Checking lingua-portuguese-language-model v1.2.0 [INFO] [stderr] Checking lingua-czech-language-model v1.2.0 [INFO] [stderr] Checking lingua-italian-language-model v1.2.0 [INFO] [stderr] Checking lingua-slovak-language-model v1.2.0 [INFO] [stderr] Checking lingua-latin-language-model v1.2.0 [INFO] [stderr] Checking lingua-bokmal-language-model v1.2.0 [INFO] [stderr] Checking lingua-catalan-language-model v1.2.0 [INFO] [stderr] Checking lingua-georgian-language-model v1.2.0 [INFO] [stderr] Checking lingua-russian-language-model v1.2.0 [INFO] [stderr] Checking lingua-serbian-language-model v1.2.0 [INFO] [stderr] Checking lingua-bosnian-language-model v1.2.0 [INFO] [stderr] Checking lingua-somali-language-model v1.2.0 [INFO] [stderr] Checking lingua-indonesian-language-model v1.2.0 [INFO] [stderr] Checking lingua-mongolian-language-model v1.2.0 [INFO] [stderr] Checking lingua-spanish-language-model v1.2.0 [INFO] [stderr] Checking lingua-hungarian-language-model v1.2.0 [INFO] [stderr] Checking lingua-nynorsk-language-model v1.2.0 [INFO] [stderr] Checking lingua-romanian-language-model v1.2.0 [INFO] [stderr] Checking lingua-urdu-language-model v1.2.0 [INFO] [stderr] Checking lingua-arabic-language-model v1.2.0 [INFO] [stderr] Checking lingua-polish-language-model v1.2.0 [INFO] [stderr] Checking lingua-danish-language-model v1.2.0 [INFO] [stderr] Checking lingua-icelandic-language-model v1.2.0 [INFO] [stderr] Checking lingua-kazakh-language-model v1.2.0 [INFO] [stderr] Checking lingua-hebrew-language-model v1.2.0 [INFO] [stderr] Checking lingua-slovene-language-model v1.2.0 [INFO] [stderr] Checking lingua-thai-language-model v1.2.0 [INFO] [stderr] Checking lingua-xhosa-language-model v1.2.0 [INFO] [stderr] Checking lingua-irish-language-model v1.2.0 [INFO] [stderr] Checking lingua-swahili-language-model v1.2.0 [INFO] [stderr] Checking lingua-afrikaans-language-model v1.2.0 [INFO] [stderr] Checking lingua-hindi-language-model v1.2.0 [INFO] [stderr] Checking lingua-chinese-language-model v1.2.0 [INFO] [stderr] Checking lingua-sotho-language-model v1.2.0 [INFO] [stderr] Checking lingua-greek-language-model v1.2.0 [INFO] [stderr] Checking lingua-croatian-language-model v1.2.0 [INFO] [stderr] Checking lingua-persian-language-model v1.2.0 [INFO] [stderr] Checking lingua-tsonga-language-model v1.2.0 [INFO] [stderr] Checking lingua-finnish-language-model v1.2.0 [INFO] [stderr] Checking lingua-belarusian-language-model v1.2.0 [INFO] [stderr] Checking lingua-esperanto-language-model v1.2.0 [INFO] [stderr] Checking lingua-dutch-language-model v1.2.0 [INFO] [stderr] Checking lingua-english-language-model v1.2.0 [INFO] [stderr] Checking lingua-bengali-language-model v1.2.0 [INFO] [stderr] Checking lingua-lithuanian-language-model v1.2.0 [INFO] [stderr] Checking lingua-armenian-language-model v1.2.0 [INFO] [stderr] Checking lingua-estonian-language-model v1.2.0 [INFO] [stderr] Checking lingua-basque-language-model v1.2.0 [INFO] [stderr] Checking lingua-korean-language-model v1.2.0 [INFO] [stderr] Checking lingua-yoruba-language-model v1.2.0 [INFO] [stderr] Checking lingua-albanian-language-model v1.2.0 [INFO] [stderr] Checking lingua-vietnamese-language-model v1.2.0 [INFO] [stderr] Checking lingua-japanese-language-model v1.2.0 [INFO] [stderr] Checking lingua-turkish-language-model v1.2.0 [INFO] [stderr] Checking lingua-macedonian-language-model v1.2.0 [INFO] [stderr] Checking lingua-swedish-language-model v1.2.0 [INFO] [stderr] Checking lingua-maori-language-model v1.2.0 [INFO] [stderr] Checking lingua-latvian-language-model v1.2.0 [INFO] [stderr] Checking lingua-shona-language-model v1.2.0 [INFO] [stderr] Checking lingua-gujarati-language-model v1.2.0 [INFO] [stderr] Checking lingua-azerbaijani-language-model v1.2.0 [INFO] [stderr] Checking strum v0.27.1 [INFO] [stderr] Checking maplit v1.0.2 [INFO] [stderr] Checking ego-tree v0.6.3 [INFO] [stderr] Checking reqwest v0.12.15 [INFO] [stderr] Checking chrono v0.4.41 [INFO] [stderr] Checking tracing-subscriber v0.3.19 [INFO] [stderr] Checking ed25519-dalek v2.1.1 [INFO] [stderr] Checking rsa v0.9.8 [INFO] [stderr] Checking unicode-jp v0.4.0 [INFO] [stderr] Checking lingua v1.7.1 [INFO] [stderr] Checking mail-parser v0.9.4 [INFO] [stderr] Checking rustls-native-certs v0.7.3 [INFO] [stderr] Checking scraper v0.20.0 [INFO] [stderr] Checking sha1 v0.10.6 [INFO] [stderr] Checking fubaco v0.1.0 (/opt/rustwide/workdir) [INFO] [stdout] warning: this import is redundant [INFO] [stdout] --> src/main.rs:12:1 [INFO] [stdout] | [INFO] [stdout] 12 | use rustls; [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/main.rs:13:1 [INFO] [stdout] | [INFO] [stdout] 13 | use tokio; [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] [INFO] [stdout] [INFO] [stdout] warning: this import is redundant [INFO] [stdout] --> src/main.rs:14:1 [INFO] [stdout] | [INFO] [stdout] 14 | use webpki_roots; [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] [INFO] [stdout] [INFO] [stdout] warning: this import is redundant [INFO] [stdout] --> src/my_disconnect.rs:4:1 [INFO] [stdout] | [INFO] [stdout] 4 | use native_tls; [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] [INFO] [stdout] [INFO] [stdout] warning: this import is redundant [INFO] [stdout] --> src/my_disconnect.rs:5:1 [INFO] [stdout] | [INFO] [stdout] 5 | use rustls; [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] [INFO] [stdout] [INFO] [stdout] warning: this import is redundant [INFO] [stdout] --> src/main.rs:12:1 [INFO] [stdout] | [INFO] [stdout] 12 | use rustls; [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/main.rs:13:1 [INFO] [stdout] | [INFO] [stdout] 13 | use tokio; [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] [INFO] [stdout] [INFO] [stdout] warning: this import is redundant [INFO] [stdout] --> src/main.rs:14:1 [INFO] [stdout] | [INFO] [stdout] 14 | use webpki_roots; [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] [INFO] [stdout] [INFO] [stdout] warning: this import is redundant [INFO] [stdout] --> src/my_dns_resolver.rs:10:1 [INFO] [stdout] | [INFO] [stdout] 10 | use reqwest; [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] [INFO] [stdout] [INFO] [stdout] warning: this import is redundant [INFO] [stdout] --> src/my_dns_resolver.rs:11:1 [INFO] [stdout] | [INFO] [stdout] 11 | use serde_json; [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] [INFO] [stdout] [INFO] [stdout] warning: this import is redundant [INFO] [stdout] --> src/my_disconnect.rs:4:1 [INFO] [stdout] | [INFO] [stdout] 4 | use native_tls; [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] [INFO] [stdout] [INFO] [stdout] warning: this import is redundant [INFO] [stdout] --> src/my_disconnect.rs:5:1 [INFO] [stdout] | [INFO] [stdout] 5 | use rustls; [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] [INFO] [stdout] [INFO] [stdout] warning: this import is redundant [INFO] [stdout] --> src/my_dns_resolver.rs:10:1 [INFO] [stdout] | [INFO] [stdout] 10 | use reqwest; [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] [INFO] [stdout] [INFO] [stdout] warning: this import is redundant [INFO] [stdout] --> src/my_dns_resolver.rs:11:1 [INFO] [stdout] | [INFO] [stdout] 11 | use serde_json; [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] [INFO] [stdout] [INFO] [stdout] warning: the `x @ _` pattern can be written as just `x` [INFO] [stdout] --> src/my_message_parser.rs:58:13 [INFO] [stdout] | [INFO] [stdout] 58 | x @ _ => { [INFO] [stdout] | ^^^^^ help: try: `x` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern [INFO] [stdout] = note: `#[warn(clippy::redundant_pattern)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this import is redundant [INFO] [stdout] --> src/my_plugin_yondakiji.rs:10:1 [INFO] [stdout] | [INFO] [stdout] 10 | use serde_json; [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] [INFO] [stdout] [INFO] [stdout] warning: this import is redundant [INFO] [stdout] --> src/my_plugin_yondatweet.rs:9:1 [INFO] [stdout] | [INFO] [stdout] 9 | use scraper; [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] [INFO] [stdout] [INFO] [stdout] warning: this import is redundant [INFO] [stdout] --> src/my_plugin_yondatweet.rs:11:1 [INFO] [stdout] | [INFO] [stdout] 11 | use serde_json; [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] [INFO] [stdout] [INFO] [stdout] warning: the `x @ _` pattern can be written as just `x` [INFO] [stdout] --> src/my_message_parser.rs:58:13 [INFO] [stdout] | [INFO] [stdout] 58 | x @ _ => { [INFO] [stdout] | ^^^^^ help: try: `x` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern [INFO] [stdout] = note: `#[warn(clippy::redundant_pattern)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this import is redundant [INFO] [stdout] --> src/my_plugin_yondakiji.rs:10:1 [INFO] [stdout] | [INFO] [stdout] 10 | use serde_json; [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] [INFO] [stdout] [INFO] [stdout] warning: this import is redundant [INFO] [stdout] --> src/my_plugin_yondatweet.rs:9:1 [INFO] [stdout] | [INFO] [stdout] 9 | use scraper; [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] [INFO] [stdout] [INFO] [stdout] warning: this import is redundant [INFO] [stdout] --> src/my_plugin_yondatweet.rs:11:1 [INFO] [stdout] | [INFO] [stdout] 11 | use serde_json; [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] [INFO] [stdout] [INFO] [stdout] warning: this import is redundant [INFO] [stdout] --> src/my_spam_checker.rs:6:1 [INFO] [stdout] | [INFO] [stdout] 6 | use scraper; [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] [INFO] [stdout] [INFO] [stdout] warning: this import is redundant [INFO] [stdout] --> src/my_spam_checker.rs:6:1 [INFO] [stdout] | [INFO] [stdout] 6 | use scraper; [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] [INFO] [stdout] [INFO] [stdout] warning: this import is redundant [INFO] [stdout] --> src/my_timestamp.rs:1:1 [INFO] [stdout] | [INFO] [stdout] 1 | use chrono; [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] [INFO] [stdout] [INFO] [stdout] warning: this import is redundant [INFO] [stdout] --> src/my_timestamp.rs:1:1 [INFO] [stdout] | [INFO] [stdout] 1 | use chrono; [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] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/my_crypto.rs:117:19 [INFO] [stdout] | [INFO] [stdout] 117 | Ok(()) => return Ok(true), [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] 117 - Ok(()) => return Ok(true), [INFO] [stdout] 117 + Ok(()) => Ok(true), [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/my_crypto.rs:120:13 [INFO] [stdout] | [INFO] [stdout] 120 | return Ok(false); [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 120 - return Ok(false); [INFO] [stdout] 120 + Ok(false) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `NONE` contains a capitalized acronym [INFO] [stdout] --> src/my_dkim_verifier.rs:20:5 [INFO] [stdout] | [INFO] [stdout] 20 | NONE, [INFO] [stdout] | ^^^^ help: consider making the acronym lowercase, except the initial letter: `None` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] = note: `#[warn(clippy::upper_case_acronyms)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `NEUTRAL` contains a capitalized acronym [INFO] [stdout] --> src/my_dkim_verifier.rs:21:5 [INFO] [stdout] | [INFO] [stdout] 21 | NEUTRAL, [INFO] [stdout] | ^^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Neutral` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `PASS` contains a capitalized acronym [INFO] [stdout] --> src/my_dkim_verifier.rs:22:5 [INFO] [stdout] | [INFO] [stdout] 22 | PASS, [INFO] [stdout] | ^^^^ help: consider making the acronym lowercase, except the initial letter: `Pass` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `FAIL` contains a capitalized acronym [INFO] [stdout] --> src/my_dkim_verifier.rs:23:5 [INFO] [stdout] | [INFO] [stdout] 23 | FAIL, [INFO] [stdout] | ^^^^ help: consider making the acronym lowercase, except the initial letter: `Fail` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `PERMERROR` contains a capitalized acronym [INFO] [stdout] --> src/my_dkim_verifier.rs:24:5 [INFO] [stdout] | [INFO] [stdout] 24 | PERMERROR, [INFO] [stdout] | ^^^^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Permerror` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `TEMPERROR` contains a capitalized acronym [INFO] [stdout] --> src/my_dkim_verifier.rs:25:5 [INFO] [stdout] | [INFO] [stdout] 25 | TEMPERROR, [INFO] [stdout] | ^^^^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Temperror` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_dkim_verifier.rs:104:42 [INFO] [stdout] | [INFO] [stdout] 104 | let fields = s.split(";").filter(|s| s.len() > 0); [INFO] [stdout] | ^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!s.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] = note: `#[warn(clippy::len_zero)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_dkim_verifier.rs:122:8 [INFO] [stdout] | [INFO] [stdout] 122 | if lack_of_mandatory_field_names.len() > 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!lack_of_mandatory_field_names.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_dkim_verifier.rs:172:8 [INFO] [stdout] | [INFO] [stdout] 172 | if text.len() > 0 && !text.ends_with("\r\n") { [INFO] [stdout] | ^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!text.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_dkim_verifier.rs:183:21 [INFO] [stdout] | [INFO] [stdout] 183 | if is_simple && text.len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `text.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/my_dkim_verifier.rs:210:68 [INFO] [stdout] | [INFO] [stdout] 210 | let text = REGEX_CONTINUATION_LINE_PATTERN.replace_all(&text, "$1"); [INFO] [stdout] | ^^^^^ help: change this to: `text` [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: unneeded `return` statement [INFO] [stdout] --> src/my_crypto.rs:117:19 [INFO] [stdout] | [INFO] [stdout] 117 | Ok(()) => return Ok(true), [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] 117 - Ok(()) => return Ok(true), [INFO] [stdout] 117 + Ok(()) => Ok(true), [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/my_crypto.rs:120:13 [INFO] [stdout] | [INFO] [stdout] 120 | return Ok(false); [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 120 - return Ok(false); [INFO] [stdout] 120 + Ok(false) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `NONE` contains a capitalized acronym [INFO] [stdout] --> src/my_dkim_verifier.rs:20:5 [INFO] [stdout] | [INFO] [stdout] 20 | NONE, [INFO] [stdout] | ^^^^ help: consider making the acronym lowercase, except the initial letter: `None` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] = note: `#[warn(clippy::upper_case_acronyms)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `NEUTRAL` contains a capitalized acronym [INFO] [stdout] --> src/my_dkim_verifier.rs:21:5 [INFO] [stdout] | [INFO] [stdout] 21 | NEUTRAL, [INFO] [stdout] | ^^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Neutral` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `PASS` contains a capitalized acronym [INFO] [stdout] --> src/my_dkim_verifier.rs:22:5 [INFO] [stdout] | [INFO] [stdout] 22 | PASS, [INFO] [stdout] | ^^^^ help: consider making the acronym lowercase, except the initial letter: `Pass` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `FAIL` contains a capitalized acronym [INFO] [stdout] --> src/my_dkim_verifier.rs:23:5 [INFO] [stdout] | [INFO] [stdout] 23 | FAIL, [INFO] [stdout] | ^^^^ help: consider making the acronym lowercase, except the initial letter: `Fail` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `PERMERROR` contains a capitalized acronym [INFO] [stdout] --> src/my_dkim_verifier.rs:24:5 [INFO] [stdout] | [INFO] [stdout] 24 | PERMERROR, [INFO] [stdout] | ^^^^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Permerror` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `TEMPERROR` contains a capitalized acronym [INFO] [stdout] --> src/my_dkim_verifier.rs:25:5 [INFO] [stdout] | [INFO] [stdout] 25 | TEMPERROR, [INFO] [stdout] | ^^^^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Temperror` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this call to `from_str_radix` can be replaced with a call to `str::parse` [INFO] [stdout] --> src/my_dkim_verifier.rs:301:31 [INFO] [stdout] | [INFO] [stdout] 301 | let timestamp = match u64::from_str_radix(&dkim_signature_fields["t"], 10) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `dkim_signature_fields["t"].parse::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_str_radix_10 [INFO] [stdout] = note: `#[warn(clippy::from_str_radix_10)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this call to `from_str_radix` can be replaced with a call to `str::parse` [INFO] [stdout] --> src/my_dkim_verifier.rs:316:27 [INFO] [stdout] | [INFO] [stdout] 316 | let limit = match u64::from_str_radix(&dkim_signature_fields["x"], 10) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `dkim_signature_fields["x"].parse::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_str_radix_10 [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_dkim_verifier.rs:104:42 [INFO] [stdout] | [INFO] [stdout] 104 | let fields = s.split(";").filter(|s| s.len() > 0); [INFO] [stdout] | ^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!s.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] = note: `#[warn(clippy::len_zero)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_dkim_verifier.rs:122:8 [INFO] [stdout] | [INFO] [stdout] 122 | if lack_of_mandatory_field_names.len() > 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!lack_of_mandatory_field_names.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this call to `from_str_radix` can be replaced with a call to `str::parse` [INFO] [stdout] --> src/my_dkim_verifier.rs:348:27 [INFO] [stdout] | [INFO] [stdout] 348 | let limit = match usize::from_str_radix(&dkim_signature_fields["l"], 10) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `dkim_signature_fields["l"].parse::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_str_radix_10 [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_dkim_verifier.rs:382:62 [INFO] [stdout] | [INFO] [stdout] 382 | let lines = header_text.split("\r\n").filter(|s| s.len() > 0); // CRLF is removed [INFO] [stdout] | ^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!s.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_dkim_verifier.rs:390:24 [INFO] [stdout] | [INFO] [stdout] 390 | if buf.len() > 0 { [INFO] [stdout] | ^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!buf.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_dkim_verifier.rs:172:8 [INFO] [stdout] | [INFO] [stdout] 172 | if text.len() > 0 && !text.ends_with("\r\n") { [INFO] [stdout] | ^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!text.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_dkim_verifier.rs:403:16 [INFO] [stdout] | [INFO] [stdout] 403 | if buf.len() > 0 { [INFO] [stdout] | ^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!buf.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_dkim_verifier.rs:183:21 [INFO] [stdout] | [INFO] [stdout] 183 | if is_simple && text.len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `text.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/my_dkim_verifier.rs:210:68 [INFO] [stdout] | [INFO] [stdout] 210 | let text = REGEX_CONTINUATION_LINE_PATTERN.replace_all(&text, "$1"); [INFO] [stdout] | ^^^^^ help: change this to: `text` [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: length comparison to zero [INFO] [stdout] --> src/my_dkim_verifier.rs:498:53 [INFO] [stdout] | [INFO] [stdout] 498 | let fields = text_raw.split(";").filter(|s| s.len() > 0).map(str::trim); [INFO] [stdout] | ^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!s.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: comparison to empty slice [INFO] [stdout] --> src/my_dkim_verifier.rs:503:16 [INFO] [stdout] | [INFO] [stdout] 503 | if tag == "" { [INFO] [stdout] | ^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `tag.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#comparison_to_empty [INFO] [stdout] = note: `#[warn(clippy::comparison_to_empty)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unnecessary use of `get(tag).is_none()` [INFO] [stdout] --> src/my_dkim_verifier.rs:507:37 [INFO] [stdout] | [INFO] [stdout] 507 | assert!(dkim_dns_fields.get(tag).is_none()); [INFO] [stdout] | ----------------^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | | [INFO] [stdout] | help: replace it with: `!dkim_dns_fields.contains_key(tag)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_get_then_check [INFO] [stdout] = note: `#[warn(clippy::unnecessary_get_then_check)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this call to `from_str_radix` can be replaced with a call to `str::parse` [INFO] [stdout] --> src/my_dkim_verifier.rs:301:31 [INFO] [stdout] | [INFO] [stdout] 301 | let timestamp = match u64::from_str_radix(&dkim_signature_fields["t"], 10) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `dkim_signature_fields["t"].parse::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_str_radix_10 [INFO] [stdout] = note: `#[warn(clippy::from_str_radix_10)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this call to `from_str_radix` can be replaced with a call to `str::parse` [INFO] [stdout] --> src/my_dkim_verifier.rs:316:27 [INFO] [stdout] | [INFO] [stdout] 316 | let limit = match u64::from_str_radix(&dkim_signature_fields["x"], 10) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `dkim_signature_fields["x"].parse::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_str_radix_10 [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_dkim_verifier.rs:545:16 [INFO] [stdout] | [INFO] [stdout] 545 | if v.len() > 0 { [INFO] [stdout] | ^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!v.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this call to `from_str_radix` can be replaced with a call to `str::parse` [INFO] [stdout] --> src/my_dkim_verifier.rs:348:27 [INFO] [stdout] | [INFO] [stdout] 348 | let limit = match usize::from_str_radix(&dkim_signature_fields["l"], 10) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `dkim_signature_fields["l"].parse::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_str_radix_10 [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_dkim_verifier.rs:382:62 [INFO] [stdout] | [INFO] [stdout] 382 | let lines = header_text.split("\r\n").filter(|s| s.len() > 0); // CRLF is removed [INFO] [stdout] | ^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!s.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_dkim_verifier.rs:390:24 [INFO] [stdout] | [INFO] [stdout] 390 | if buf.len() > 0 { [INFO] [stdout] | ^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!buf.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_dkim_verifier.rs:403:16 [INFO] [stdout] | [INFO] [stdout] 403 | if buf.len() > 0 { [INFO] [stdout] | ^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!buf.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_dns_resolver.rs:44:12 [INFO] [stdout] | [INFO] [stdout] 44 | if spf_records.len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `spf_records.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_dkim_verifier.rs:498:53 [INFO] [stdout] | [INFO] [stdout] 498 | let fields = text_raw.split(";").filter(|s| s.len() > 0).map(str::trim); [INFO] [stdout] | ^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!s.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: comparison to empty slice [INFO] [stdout] --> src/my_dkim_verifier.rs:503:16 [INFO] [stdout] | [INFO] [stdout] 503 | if tag == "" { [INFO] [stdout] | ^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `tag.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#comparison_to_empty [INFO] [stdout] = note: `#[warn(clippy::comparison_to_empty)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unnecessary use of `get(tag).is_none()` [INFO] [stdout] --> src/my_dkim_verifier.rs:507:37 [INFO] [stdout] | [INFO] [stdout] 507 | assert!(dkim_dns_fields.get(tag).is_none()); [INFO] [stdout] | ----------------^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | | [INFO] [stdout] | help: replace it with: `!dkim_dns_fields.contains_key(tag)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_get_then_check [INFO] [stdout] = note: `#[warn(clippy::unnecessary_get_then_check)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual implementation of `Option::map` [INFO] [stdout] --> src/my_dns_resolver.rs:113:13 [INFO] [stdout] | [INFO] [stdout] 113 | / if let Some(v) = guard.get(&url) { [INFO] [stdout] 114 | | Some(v.clone()) [INFO] [stdout] 115 | | } else { [INFO] [stdout] 116 | | None [INFO] [stdout] 117 | | } [INFO] [stdout] | |_____________^ help: try: `guard.get(&url).map(|v| v.clone())` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_map [INFO] [stdout] = note: `#[warn(clippy::manual_map)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_dns_resolver.rs:133:16 [INFO] [stdout] | [INFO] [stdout] 133 | if v.len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `v.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: usage of `contains_key` followed by `insert` on a `HashMap` [INFO] [stdout] --> src/my_dns_resolver.rs:140:21 [INFO] [stdout] | [INFO] [stdout] 140 | / if table.contains_key(&name) { [INFO] [stdout] 141 | | table.get_mut(&name).unwrap().push(data); [INFO] [stdout] 142 | | } else { [INFO] [stdout] 143 | | table.insert(name, vec![data]); [INFO] [stdout] 144 | | } [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: length comparison to zero [INFO] [stdout] --> src/my_dkim_verifier.rs:545:16 [INFO] [stdout] | [INFO] [stdout] 545 | if v.len() > 0 { [INFO] [stdout] | ^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!v.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: deref which would be done by auto-deref [INFO] [stdout] --> src/my_dns_resolver.rs:222:62 [INFO] [stdout] | [INFO] [stdout] 222 | static ref REGEX_FOR_PLACEHOLDER: Regex = Regex::new(&*PLACEHOLDER).unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^ help: try: `&PLACEHOLDER` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_auto_deref [INFO] [stdout] = note: `#[warn(clippy::explicit_auto_deref)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: deref which would be done by auto-deref [INFO] [stdout] --> src/my_dns_resolver.rs:225:44 [INFO] [stdout] | [INFO] [stdout] 225 | assert_eq!(*PLACEHOLDER, regex::escape(&*PLACEHOLDER)); [INFO] [stdout] | ^^^^^^^^^^^^^ help: try: `&PLACEHOLDER` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_auto_deref [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_dns_resolver.rs:240:17 [INFO] [stdout] | [INFO] [stdout] 240 | let ss = if table.len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `table.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: deref which would be done by auto-deref [INFO] [stdout] --> src/my_dns_resolver.rs:268:62 [INFO] [stdout] | [INFO] [stdout] 268 | static ref REGEX_FOR_PLACEHOLDER: Regex = Regex::new(&*PLACEHOLDER).unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^ help: try: `&PLACEHOLDER` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_auto_deref [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: deref which would be done by auto-deref [INFO] [stdout] --> src/my_dns_resolver.rs:270:44 [INFO] [stdout] | [INFO] [stdout] 270 | assert_eq!(*PLACEHOLDER, regex::escape(&*PLACEHOLDER)); [INFO] [stdout] | ^^^^^^^^^^^^^ help: try: `&PLACEHOLDER` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_auto_deref [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_dns_resolver.rs:44:12 [INFO] [stdout] | [INFO] [stdout] 44 | if spf_records.len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `spf_records.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `NONE` contains a capitalized acronym [INFO] [stdout] --> src/my_dmarc_verifier.rs:58:5 [INFO] [stdout] | [INFO] [stdout] 58 | NONE, [INFO] [stdout] | ^^^^ help: consider making the acronym lowercase, except the initial letter: `None` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `QUARANTINE` contains a capitalized acronym [INFO] [stdout] --> src/my_dmarc_verifier.rs:59:5 [INFO] [stdout] | [INFO] [stdout] 59 | QUARANTINE, [INFO] [stdout] | ^^^^^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Quarantine` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `REJECT` contains a capitalized acronym [INFO] [stdout] --> src/my_dmarc_verifier.rs:60:5 [INFO] [stdout] | [INFO] [stdout] 60 | REJECT, [INFO] [stdout] | ^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Reject` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `ENFORCED` contains a capitalized acronym [INFO] [stdout] --> src/my_dmarc_verifier.rs:61:5 [INFO] [stdout] | [INFO] [stdout] 61 | ENFORCED, // Fubaco original (when no DNS record is existed) [INFO] [stdout] | ^^^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Enforced` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `NONE` contains a capitalized acronym [INFO] [stdout] --> src/my_dmarc_verifier.rs:79:5 [INFO] [stdout] | [INFO] [stdout] 79 | NONE, [INFO] [stdout] | ^^^^ help: consider making the acronym lowercase, except the initial letter: `None` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `PASS` contains a capitalized acronym [INFO] [stdout] --> src/my_dmarc_verifier.rs:80:5 [INFO] [stdout] | [INFO] [stdout] 80 | PASS, [INFO] [stdout] | ^^^^ help: consider making the acronym lowercase, except the initial letter: `Pass` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `FAIL` contains a capitalized acronym [INFO] [stdout] --> src/my_dmarc_verifier.rs:81:5 [INFO] [stdout] | [INFO] [stdout] 81 | FAIL, [INFO] [stdout] | ^^^^ help: consider making the acronym lowercase, except the initial letter: `Fail` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `TEMPERROR` contains a capitalized acronym [INFO] [stdout] --> src/my_dmarc_verifier.rs:82:5 [INFO] [stdout] | [INFO] [stdout] 82 | TEMPERROR, [INFO] [stdout] | ^^^^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Temperror` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `PERMERROR` contains a capitalized acronym [INFO] [stdout] --> src/my_dmarc_verifier.rs:83:5 [INFO] [stdout] | [INFO] [stdout] 83 | PERMERROR, [INFO] [stdout] | ^^^^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Permerror` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this boolean expression can be simplified [INFO] [stdout] --> src/my_dmarc_verifier.rs:271:31 [INFO] [stdout] | [INFO] [stdout] 271 | let is_alignment_ok = false [INFO] [stdout] | _______________________________^ [INFO] [stdout] 272 | | || spf_target_list.iter().any(|prev_target| is_aligned(dns_fields.get("aspf"), prev_target, &target_domain)) [INFO] [stdout] 273 | | || dkim_target_list.iter().any(|prev_target| is_aligned(dns_fields.get("adkim"), prev_target, &target_domain)); [INFO] [stdout] | |__________________________________________________________________________________________________________________________^ help: try: `spf_target_list.iter().any(|prev_target| is_aligned(dns_fields.get("aspf"), prev_target, &target_domain)) || dkim_target_list.iter().any(|prev_target| is_aligned(dns_fields.get("adkim"), prev_target, &target_domain))` [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: this boolean expression can be simplified [INFO] [stdout] --> src/my_dmarc_verifier.rs:271:31 [INFO] [stdout] | [INFO] [stdout] 271 | let is_alignment_ok = false [INFO] [stdout] | _______________________________^ [INFO] [stdout] 272 | | || spf_target_list.iter().any(|prev_target| is_aligned(dns_fields.get("aspf"), prev_target, &target_domain)) [INFO] [stdout] | |________________________________________________________________________________________________________________________^ help: try: `spf_target_list.iter().any(|prev_target| is_aligned(dns_fields.get("aspf"), prev_target, &target_domain))` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#nonminimal_bool [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/my_dmarc_verifier.rs:275:13 [INFO] [stdout] | [INFO] [stdout] 275 | return DMARCResult::new(DMARCStatus::PASS, Some(policy)); [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] 275 ~ DMARCResult::new(DMARCStatus::PASS, Some(policy)) [INFO] [stdout] 276 | } else { [INFO] [stdout] 277 | return DMARCResult::new(DMARCStatus::FAIL, Some(policy)); [INFO] [stdout] 278 | } [INFO] [stdout] 279 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/my_dmarc_verifier.rs:277:13 [INFO] [stdout] | [INFO] [stdout] 277 | return DMARCResult::new(DMARCStatus::FAIL, Some(policy)); [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] 277 ~ DMARCResult::new(DMARCStatus::FAIL, Some(policy)) [INFO] [stdout] 278 | } [INFO] [stdout] 279 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&Vec` instead of `&[_]` involves a new object where a slice will do [INFO] [stdout] --> src/my_dmarc_verifier.rs:138:57 [INFO] [stdout] | [INFO] [stdout] 138 | pub fn dmarc_verify(message: &Message, spf_target_list: &Vec, dkim_target_list: &Vec, resolver: &MyDNSResolver) -> ... [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] 138 - pub fn dmarc_verify(message: &Message, spf_target_list: &Vec, dkim_target_list: &Vec, resolver: &MyDNSResolver) -> DMARCResult { [INFO] [stdout] 138 + pub fn dmarc_verify(message: &Message, spf_target_list: &[String], dkim_target_list: &Vec, resolver: &MyDNSResolver) -> DMARCResult { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&Vec` instead of `&[_]` involves a new object where a slice will do [INFO] [stdout] --> src/my_dmarc_verifier.rs:138:89 [INFO] [stdout] | [INFO] [stdout] 138 | pub fn dmarc_verify(message: &Message, spf_target_list: &Vec, dkim_target_list: &Vec, resolver: &MyDNSResolver) -> ... [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] 138 - pub fn dmarc_verify(message: &Message, spf_target_list: &Vec, dkim_target_list: &Vec, resolver: &MyDNSResolver) -> DMARCResult { [INFO] [stdout] 138 + pub fn dmarc_verify(message: &Message, spf_target_list: &Vec, dkim_target_list: &[String], resolver: &MyDNSResolver) -> DMARCResult { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual implementation of `Option::map` [INFO] [stdout] --> src/my_dns_resolver.rs:113:13 [INFO] [stdout] | [INFO] [stdout] 113 | / if let Some(v) = guard.get(&url) { [INFO] [stdout] 114 | | Some(v.clone()) [INFO] [stdout] 115 | | } else { [INFO] [stdout] 116 | | None [INFO] [stdout] 117 | | } [INFO] [stdout] | |_____________^ help: try: `guard.get(&url).map(|v| v.clone())` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_map [INFO] [stdout] = note: `#[warn(clippy::manual_map)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_dns_resolver.rs:133:16 [INFO] [stdout] | [INFO] [stdout] 133 | if v.len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `v.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: usage of `contains_key` followed by `insert` on a `HashMap` [INFO] [stdout] --> src/my_dns_resolver.rs:140:21 [INFO] [stdout] | [INFO] [stdout] 140 | / if table.contains_key(&name) { [INFO] [stdout] 141 | | table.get_mut(&name).unwrap().push(data); [INFO] [stdout] 142 | | } else { [INFO] [stdout] 143 | | table.insert(name, vec![data]); [INFO] [stdout] 144 | | } [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: this `if` statement can be collapsed [INFO] [stdout] --> src/my_dmarc_verifier.rs:173:17 [INFO] [stdout] | [INFO] [stdout] 173 | / if table.is_empty() { [INFO] [stdout] 174 | | if left != "v" { [INFO] [stdout] 175 | | info!("invalid DMARC record: the first tag must be \"v\", but: {}", left); [INFO] [stdout] 176 | | return DMARCResult::new(DMARCStatus::PERMERROR, None); [INFO] [stdout] 177 | | } [INFO] [stdout] 178 | | } [INFO] [stdout] | |_________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] = note: `#[warn(clippy::collapsible_if)]` on by default [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 173 ~ if table.is_empty() [INFO] [stdout] 174 ~ && left != "v" { [INFO] [stdout] 175 | info!("invalid DMARC record: the first tag must be \"v\", but: {}", left); [INFO] [stdout] 176 | return DMARCResult::new(DMARCStatus::PERMERROR, None); [INFO] [stdout] 177 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_dmarc_verifier.rs:199:28 [INFO] [stdout] | [INFO] [stdout] 199 | if s.len() > 0 { [INFO] [stdout] | ^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!s.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: deref which would be done by auto-deref [INFO] [stdout] --> src/my_dns_resolver.rs:222:62 [INFO] [stdout] | [INFO] [stdout] 222 | static ref REGEX_FOR_PLACEHOLDER: Regex = Regex::new(&*PLACEHOLDER).unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^ help: try: `&PLACEHOLDER` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_auto_deref [INFO] [stdout] = note: `#[warn(clippy::explicit_auto_deref)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: deref which would be done by auto-deref [INFO] [stdout] --> src/my_dns_resolver.rs:225:44 [INFO] [stdout] | [INFO] [stdout] 225 | assert_eq!(*PLACEHOLDER, regex::escape(&*PLACEHOLDER)); [INFO] [stdout] | ^^^^^^^^^^^^^ help: try: `&PLACEHOLDER` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_auto_deref [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_dns_resolver.rs:240:17 [INFO] [stdout] | [INFO] [stdout] 240 | let ss = if table.len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `table.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_fqdn.rs:26:12 [INFO] [stdout] | [INFO] [stdout] 26 | if line.len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `line.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_fqdn.rs:32:68 [INFO] [stdout] | [INFO] [stdout] 32 | let fields = line.split("\t").map(|s| s.trim()).filter(|s| s.len() > 0).map(|s| s.to_string()).collect::>(); [INFO] [stdout] | ^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!s.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_fqdn.rs:33:17 [INFO] [stdout] | [INFO] [stdout] 33 | assert!(fields.len() > 0); [INFO] [stdout] | ^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!fields.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: deref which would be done by auto-deref [INFO] [stdout] --> src/my_dns_resolver.rs:268:62 [INFO] [stdout] | [INFO] [stdout] 268 | static ref REGEX_FOR_PLACEHOLDER: Regex = Regex::new(&*PLACEHOLDER).unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^ help: try: `&PLACEHOLDER` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_auto_deref [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: deref which would be done by auto-deref [INFO] [stdout] --> src/my_dns_resolver.rs:270:44 [INFO] [stdout] | [INFO] [stdout] 270 | assert_eq!(*PLACEHOLDER, regex::escape(&*PLACEHOLDER)); [INFO] [stdout] | ^^^^^^^^^^^^^ help: try: `&PLACEHOLDER` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_auto_deref [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/my_fqdn.rs:68:31 [INFO] [stdout] | [INFO] [stdout] 68 | let it = it.flatten().map(|word| normalize_string(word)); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the function itself: `normalize_string` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] = note: `#[warn(clippy::redundant_closure)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/my_fqdn.rs:99:37 [INFO] [stdout] | [INFO] [stdout] 99 | if let Some(caps) = re.captures(&url) { [INFO] [stdout] | ^^^^ help: change this to: `url` [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: length comparison to zero [INFO] [stdout] --> src/my_fqdn.rs:154:16 [INFO] [stdout] | [INFO] [stdout] 154 | if domain_list.len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `domain_list.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `.into_iter()` call is equivalent to `.iter()` and will not consume the `Vec` [INFO] [stdout] --> src/my_fqdn.rs:187:51 [INFO] [stdout] | [INFO] [stdout] 187 | let it = it.flat_map(|(_re, domains)| domains.into_iter()); [INFO] [stdout] | ^^^^^^^^^ help: call directly: `iter` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#into_iter_on_ref [INFO] [stdout] = note: `#[warn(clippy::into_iter_on_ref)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_fqdn.rs:191:8 [INFO] [stdout] | [INFO] [stdout] 191 | if joined_string.len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `joined_string.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the following explicit lifetimes could be elided: 'b [INFO] [stdout] --> src/my_fubaco_header.rs:21:22 [INFO] [stdout] | [INFO] [stdout] 21 | fn intersect_vec<'a, 'b, S>(a: &'a [S], b: &'b [S]) -> Vec<&'a S> [INFO] [stdout] | ^^ ^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_lifetimes [INFO] [stdout] = note: `#[warn(clippy::needless_lifetimes)]` on by default [INFO] [stdout] help: elide the lifetimes [INFO] [stdout] | [INFO] [stdout] 21 - fn intersect_vec<'a, 'b, S>(a: &'a [S], b: &'b [S]) -> Vec<&'a S> [INFO] [stdout] 21 + fn intersect_vec<'a, S>(a: &'a [S], b: &[S]) -> Vec<&'a S> [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `NONE` contains a capitalized acronym [INFO] [stdout] --> src/my_dmarc_verifier.rs:58:5 [INFO] [stdout] | [INFO] [stdout] 58 | NONE, [INFO] [stdout] | ^^^^ help: consider making the acronym lowercase, except the initial letter: `None` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `QUARANTINE` contains a capitalized acronym [INFO] [stdout] --> src/my_dmarc_verifier.rs:59:5 [INFO] [stdout] | [INFO] [stdout] 59 | QUARANTINE, [INFO] [stdout] | ^^^^^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Quarantine` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `REJECT` contains a capitalized acronym [INFO] [stdout] --> src/my_dmarc_verifier.rs:60:5 [INFO] [stdout] | [INFO] [stdout] 60 | REJECT, [INFO] [stdout] | ^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Reject` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `ENFORCED` contains a capitalized acronym [INFO] [stdout] --> src/my_dmarc_verifier.rs:61:5 [INFO] [stdout] | [INFO] [stdout] 61 | ENFORCED, // Fubaco original (when no DNS record is existed) [INFO] [stdout] | ^^^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Enforced` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `NONE` contains a capitalized acronym [INFO] [stdout] --> src/my_dmarc_verifier.rs:79:5 [INFO] [stdout] | [INFO] [stdout] 79 | NONE, [INFO] [stdout] | ^^^^ help: consider making the acronym lowercase, except the initial letter: `None` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `PASS` contains a capitalized acronym [INFO] [stdout] --> src/my_dmarc_verifier.rs:80:5 [INFO] [stdout] | [INFO] [stdout] 80 | PASS, [INFO] [stdout] | ^^^^ help: consider making the acronym lowercase, except the initial letter: `Pass` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `FAIL` contains a capitalized acronym [INFO] [stdout] --> src/my_dmarc_verifier.rs:81:5 [INFO] [stdout] | [INFO] [stdout] 81 | FAIL, [INFO] [stdout] | ^^^^ help: consider making the acronym lowercase, except the initial letter: `Fail` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `TEMPERROR` contains a capitalized acronym [INFO] [stdout] --> src/my_dmarc_verifier.rs:82:5 [INFO] [stdout] | [INFO] [stdout] 82 | TEMPERROR, [INFO] [stdout] | ^^^^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Temperror` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `PERMERROR` contains a capitalized acronym [INFO] [stdout] --> src/my_dmarc_verifier.rs:83:5 [INFO] [stdout] | [INFO] [stdout] 83 | PERMERROR, [INFO] [stdout] | ^^^^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Permerror` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this boolean expression can be simplified [INFO] [stdout] --> src/my_dmarc_verifier.rs:271:31 [INFO] [stdout] | [INFO] [stdout] 271 | let is_alignment_ok = false [INFO] [stdout] | _______________________________^ [INFO] [stdout] 272 | | || spf_target_list.iter().any(|prev_target| is_aligned(dns_fields.get("aspf"), prev_target, &target_domain)) [INFO] [stdout] 273 | | || dkim_target_list.iter().any(|prev_target| is_aligned(dns_fields.get("adkim"), prev_target, &target_domain)); [INFO] [stdout] | |__________________________________________________________________________________________________________________________^ help: try: `spf_target_list.iter().any(|prev_target| is_aligned(dns_fields.get("aspf"), prev_target, &target_domain)) || dkim_target_list.iter().any(|prev_target| is_aligned(dns_fields.get("adkim"), prev_target, &target_domain))` [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: this boolean expression can be simplified [INFO] [stdout] --> src/my_dmarc_verifier.rs:271:31 [INFO] [stdout] | [INFO] [stdout] 271 | let is_alignment_ok = false [INFO] [stdout] | _______________________________^ [INFO] [stdout] 272 | | || spf_target_list.iter().any(|prev_target| is_aligned(dns_fields.get("aspf"), prev_target, &target_domain)) [INFO] [stdout] | |________________________________________________________________________________________________________________________^ help: try: `spf_target_list.iter().any(|prev_target| is_aligned(dns_fields.get("aspf"), prev_target, &target_domain))` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#nonminimal_bool [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/my_dmarc_verifier.rs:275:13 [INFO] [stdout] | [INFO] [stdout] 275 | return DMARCResult::new(DMARCStatus::PASS, Some(policy)); [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] 275 ~ DMARCResult::new(DMARCStatus::PASS, Some(policy)) [INFO] [stdout] 276 | } else { [INFO] [stdout] 277 | return DMARCResult::new(DMARCStatus::FAIL, Some(policy)); [INFO] [stdout] 278 | } [INFO] [stdout] 279 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/my_dmarc_verifier.rs:277:13 [INFO] [stdout] | [INFO] [stdout] 277 | return DMARCResult::new(DMARCStatus::FAIL, Some(policy)); [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] 277 ~ DMARCResult::new(DMARCStatus::FAIL, Some(policy)) [INFO] [stdout] 278 | } [INFO] [stdout] 279 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&Vec` instead of `&[_]` involves a new object where a slice will do [INFO] [stdout] --> src/my_dmarc_verifier.rs:138:57 [INFO] [stdout] | [INFO] [stdout] 138 | pub fn dmarc_verify(message: &Message, spf_target_list: &Vec, dkim_target_list: &Vec, resolver: &MyDNSResolver) -> ... [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] 138 - pub fn dmarc_verify(message: &Message, spf_target_list: &Vec, dkim_target_list: &Vec, resolver: &MyDNSResolver) -> DMARCResult { [INFO] [stdout] 138 + pub fn dmarc_verify(message: &Message, spf_target_list: &[String], dkim_target_list: &Vec, resolver: &MyDNSResolver) -> DMARCResult { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&Vec` instead of `&[_]` involves a new object where a slice will do [INFO] [stdout] --> src/my_dmarc_verifier.rs:138:89 [INFO] [stdout] | [INFO] [stdout] 138 | pub fn dmarc_verify(message: &Message, spf_target_list: &Vec, dkim_target_list: &Vec, resolver: &MyDNSResolver) -> ... [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] 138 - pub fn dmarc_verify(message: &Message, spf_target_list: &Vec, dkim_target_list: &Vec, resolver: &MyDNSResolver) -> DMARCResult { [INFO] [stdout] 138 + pub fn dmarc_verify(message: &Message, spf_target_list: &Vec, dkim_target_list: &[String], resolver: &MyDNSResolver) -> DMARCResult { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_fubaco_header.rs:87:16 [INFO] [stdout] | [INFO] [stdout] 87 | ... if my_spf_domain_list.len() > 0 && mx_spf_domain_list.len() > 0 && intersect_vec(&my_spf_domain_list, &mx_spf_domain_list).len... [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!my_spf_domain_list.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_fubaco_header.rs:87:48 [INFO] [stdout] | [INFO] [stdout] 87 | ...> 0 && mx_spf_domain_list.len() > 0 && intersect_vec(&my_spf_domain_list, &mx_spf_domain_list).len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!mx_spf_domain_list.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_fubaco_header.rs:87:80 [INFO] [stdout] | [INFO] [stdout] 87 | ...domain_list.len() > 0 && intersect_vec(&my_spf_domain_list, &mx_spf_domain_list).len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `intersect_vec(&my_spf_domain_list, &mx_spf_domain_list).is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_fubaco_header.rs:106:16 [INFO] [stdout] | [INFO] [stdout] 106 | ... if my_dkim_domain_list.len() > 0 && mx_dkim_domain_list.len() > 0 && intersect_vec(&my_dkim_domain_list, &mx_dkim_domain_list... [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!my_dkim_domain_list.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_fubaco_header.rs:106:49 [INFO] [stdout] | [INFO] [stdout] 106 | ...0 && mx_dkim_domain_list.len() > 0 && intersect_vec(&my_dkim_domain_list, &mx_dkim_domain_list).len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!mx_dkim_domain_list.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_fubaco_header.rs:106:82 [INFO] [stdout] | [INFO] [stdout] 106 | ...main_list.len() > 0 && intersect_vec(&my_dkim_domain_list, &mx_dkim_domain_list).len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `intersect_vec(&my_dkim_domain_list, &mx_dkim_domain_list).is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/my_dmarc_verifier.rs:173:17 [INFO] [stdout] | [INFO] [stdout] 173 | / if table.is_empty() { [INFO] [stdout] 174 | | if left != "v" { [INFO] [stdout] 175 | | info!("invalid DMARC record: the first tag must be \"v\", but: {}", left); [INFO] [stdout] 176 | | return DMARCResult::new(DMARCStatus::PERMERROR, None); [INFO] [stdout] 177 | | } [INFO] [stdout] 178 | | } [INFO] [stdout] | |_________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] = note: `#[warn(clippy::collapsible_if)]` on by default [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 173 ~ if table.is_empty() [INFO] [stdout] 174 ~ && left != "v" { [INFO] [stdout] 175 | info!("invalid DMARC record: the first tag must be \"v\", but: {}", left); [INFO] [stdout] 176 | return DMARCResult::new(DMARCStatus::PERMERROR, None); [INFO] [stdout] 177 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_dmarc_verifier.rs:199:28 [INFO] [stdout] | [INFO] [stdout] 199 | if s.len() > 0 { [INFO] [stdout] | ^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!s.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this block may be rewritten with the `?` operator [INFO] [stdout] --> src/my_message_parser.rs:23:9 [INFO] [stdout] | [INFO] [stdout] 23 | / if header.is_none() { [INFO] [stdout] 24 | | return None; // "rejected" when no FROM field is existed [INFO] [stdout] 25 | | } [INFO] [stdout] | |_________^ help: replace it with: `header?;` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#question_mark [INFO] [stdout] = note: `#[warn(clippy::question_mark)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded late initialization [INFO] [stdout] --> src/my_message_parser.rs:29:9 [INFO] [stdout] | [INFO] [stdout] 29 | let text; [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 `text` here and remove the assignments from the `match` arms [INFO] [stdout] | [INFO] [stdout] 29 ~ [INFO] [stdout] 30 ~ let text = match header.unwrap() { [INFO] [stdout] 31 | // the value of HeaderValue should be automatically decoded when it is such as UTF-8 or ISO-2022-JP [INFO] [stdout] ... [INFO] [stdout] 38 | } [INFO] [stdout] 39 ~ v[0].address().unwrap().to_string() [INFO] [stdout] 40 | }, [INFO] [stdout] ... [INFO] [stdout] 45 | assert_ne!(s.len(), 0); [INFO] [stdout] 46 ~ s.to_string() [INFO] [stdout] 47 | } [INFO] [stdout] ... [INFO] [stdout] 52 | assert_ne!(v[0].len(), 0); [INFO] [stdout] 53 ~ v[0].to_string() [INFO] [stdout] 54 | } [INFO] [stdout] ... [INFO] [stdout] 60 | }, [INFO] [stdout] 61 ~ }; [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this block may be rewritten with the `?` operator [INFO] [stdout] --> src/my_message_parser.rs:36:17 [INFO] [stdout] | [INFO] [stdout] 36 | / if v[0].address().is_none() { [INFO] [stdout] 37 | | return None; // "rejected" when FROM field contains no meaningful domains [INFO] [stdout] 38 | | } [INFO] [stdout] | |_________________^ help: replace it with: `v[0].address()?;` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#question_mark [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this block may be rewritten with the `?` operator [INFO] [stdout] --> src/my_message_parser.rs:86:9 [INFO] [stdout] | [INFO] [stdout] 86 | / if first_header.is_none() { [INFO] [stdout] 87 | | return None; [INFO] [stdout] 88 | | } [INFO] [stdout] | |_________^ help: replace it with: `first_header?;` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#question_mark [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> src/my_message_parser.rs:94:44 [INFO] [stdout] | [INFO] [stdout] 94 | let envelop_from = address.replace(&['<', '>'], "").to_lowercase().trim().to_string(); [INFO] [stdout] | ^^^^^^^^^^^ help: change this to: `['<', '>']` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrows_for_generic_args [INFO] [stdout] = note: `#[warn(clippy::needless_borrows_for_generic_args)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_message_parser.rs:96:12 [INFO] [stdout] | [INFO] [stdout] 96 | if envelop_from.len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `envelop_from.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_fqdn.rs:26:12 [INFO] [stdout] | [INFO] [stdout] 26 | if line.len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `line.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_fqdn.rs:32:68 [INFO] [stdout] | [INFO] [stdout] 32 | let fields = line.split("\t").map(|s| s.trim()).filter(|s| s.len() > 0).map(|s| s.to_string()).collect::>(); [INFO] [stdout] | ^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!s.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_fqdn.rs:33:17 [INFO] [stdout] | [INFO] [stdout] 33 | assert!(fields.len() > 0); [INFO] [stdout] | ^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!fields.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/my_fqdn.rs:68:31 [INFO] [stdout] | [INFO] [stdout] 68 | let it = it.flatten().map(|word| normalize_string(word)); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the function itself: `normalize_string` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [INFO] [stdout] = note: `#[warn(clippy::redundant_closure)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/my_fqdn.rs:99:37 [INFO] [stdout] | [INFO] [stdout] 99 | if let Some(caps) = re.captures(&url) { [INFO] [stdout] | ^^^^ help: change this to: `url` [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: this `match` expression can be replaced with `?` [INFO] [stdout] --> src/my_message_parser.rs:132:17 [INFO] [stdout] | [INFO] [stdout] 132 | / match received.from_ip() { [INFO] [stdout] 133 | | Some(v) => v, [INFO] [stdout] 134 | | None => return None, [INFO] [stdout] 135 | | } [INFO] [stdout] | |_________________^ help: try instead: `received.from_ip()?` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#question_mark [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/my_message_parser.rs:151:72 [INFO] [stdout] | [INFO] [stdout] 151 | let header_value = REGEX_CONTINUATION_LINE_PATTERN.replace_all(&header_value, " "); [INFO] [stdout] | ^^^^^^^^^^^^^ help: change this to: `header_value` [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: unnecessary use of `get("mx").is_none()` [INFO] [stdout] --> src/my_message_parser.rs:157:22 [INFO] [stdout] | [INFO] [stdout] 157 | if table.get("mx").is_none() { [INFO] [stdout] | ------^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | | [INFO] [stdout] | help: replace it with: `!table.contains_key("mx")` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_get_then_check [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual implementation of `Option::map` [INFO] [stdout] --> src/my_message_parser.rs:187:28 [INFO] [stdout] | [INFO] [stdout] 187 | } else if let Some(caps) = REGEX_DOMAIN_OF.captures(rest) { [INFO] [stdout] | ____________________________^ [INFO] [stdout] 188 | | Some(caps[2].to_string()) [INFO] [stdout] 189 | | } else { [INFO] [stdout] 190 | | None [INFO] [stdout] 191 | | } [INFO] [stdout] | |_____________________^ help: try: `{ REGEX_DOMAIN_OF.captures(rest).map(|caps| caps[2].to_string()) }` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_map [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_fqdn.rs:154:16 [INFO] [stdout] | [INFO] [stdout] 154 | if domain_list.len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `domain_list.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `.into_iter()` call is equivalent to `.iter()` and will not consume the `Vec` [INFO] [stdout] --> src/my_fqdn.rs:187:51 [INFO] [stdout] | [INFO] [stdout] 187 | let it = it.flat_map(|(_re, domains)| domains.into_iter()); [INFO] [stdout] | ^^^^^^^^^ help: call directly: `iter` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#into_iter_on_ref [INFO] [stdout] = note: `#[warn(clippy::into_iter_on_ref)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_fqdn.rs:191:8 [INFO] [stdout] | [INFO] [stdout] 191 | if joined_string.len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `joined_string.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual implementation of `Option::map` [INFO] [stdout] --> src/my_message_parser.rs:200:28 [INFO] [stdout] | [INFO] [stdout] 200 | } else if let Some(caps) = REGEX_HEADER_D.captures(rest) { [INFO] [stdout] | ____________________________^ [INFO] [stdout] 201 | | Some(caps[2].to_string()) [INFO] [stdout] 202 | | } else { [INFO] [stdout] 203 | | None [INFO] [stdout] 204 | | } [INFO] [stdout] | |_____________________^ help: try: `{ REGEX_HEADER_D.captures(rest).map(|caps| caps[2].to_string()) }` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_map [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual implementation of `Option::map` [INFO] [stdout] --> src/my_message_parser.rs:210:21 [INFO] [stdout] | [INFO] [stdout] 210 | / if let Some(caps) = REGEX_HEADER_FROM.captures(rest) { [INFO] [stdout] 211 | | Some(caps[2].to_string()) [INFO] [stdout] 212 | | } else { [INFO] [stdout] 213 | | None [INFO] [stdout] 214 | | } [INFO] [stdout] | |_____________________^ help: try: `REGEX_HEADER_FROM.captures(rest).map(|caps| caps[2].to_string())` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_map [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual implementation of `Option::map` [INFO] [stdout] --> src/my_message_parser.rs:220:21 [INFO] [stdout] | [INFO] [stdout] 220 | / if let Some(caps) = REGEX_HEADER_FROM.captures(rest) { [INFO] [stdout] 221 | | Some(caps[2].to_string()) [INFO] [stdout] 222 | | } else { [INFO] [stdout] 223 | | None [INFO] [stdout] 224 | | } [INFO] [stdout] | |_____________________^ help: try: `REGEX_HEADER_FROM.captures(rest).map(|caps| caps[2].to_string())` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_map [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the following explicit lifetimes could be elided: 'b [INFO] [stdout] --> src/my_fubaco_header.rs:21:22 [INFO] [stdout] | [INFO] [stdout] 21 | fn intersect_vec<'a, 'b, S>(a: &'a [S], b: &'b [S]) -> Vec<&'a S> [INFO] [stdout] | ^^ ^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_lifetimes [INFO] [stdout] = note: `#[warn(clippy::needless_lifetimes)]` on by default [INFO] [stdout] help: elide the lifetimes [INFO] [stdout] | [INFO] [stdout] 21 - fn intersect_vec<'a, 'b, S>(a: &'a [S], b: &'b [S]) -> Vec<&'a S> [INFO] [stdout] 21 + fn intersect_vec<'a, S>(a: &'a [S], b: &[S]) -> Vec<&'a S> [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_fubaco_header.rs:87:16 [INFO] [stdout] | [INFO] [stdout] 87 | ... if my_spf_domain_list.len() > 0 && mx_spf_domain_list.len() > 0 && intersect_vec(&my_spf_domain_list, &mx_spf_domain_list).len... [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!my_spf_domain_list.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_fubaco_header.rs:87:48 [INFO] [stdout] | [INFO] [stdout] 87 | ...> 0 && mx_spf_domain_list.len() > 0 && intersect_vec(&my_spf_domain_list, &mx_spf_domain_list).len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!mx_spf_domain_list.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_fubaco_header.rs:87:80 [INFO] [stdout] | [INFO] [stdout] 87 | ...domain_list.len() > 0 && intersect_vec(&my_spf_domain_list, &mx_spf_domain_list).len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `intersect_vec(&my_spf_domain_list, &mx_spf_domain_list).is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&Vec` instead of `&[_]` involves a new object where a slice will do [INFO] [stdout] --> src/my_plugin_yondakiji.rs:30:50 [INFO] [stdout] | [INFO] [stdout] 30 | pub fn from_message(message: &Message, tags: &Vec) -> 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] 30 ~ pub fn from_message(message: &Message, tags: &[String]) -> Result { [INFO] [stdout] 31 | let title = match message.subject() { [INFO] [stdout] ... [INFO] [stdout] 60 | let localtime_added = timestamp.to_str(); [INFO] [stdout] 61 ~ let tags = tags.to_owned(); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_plugin_yondakiji.rs:44:67 [INFO] [stdout] | [INFO] [stdout] 44 | let line = body_text.lines().map(|s| s.trim()).filter(|s| s.len() > 0).nth(0); [INFO] [stdout] | ^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!s.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_fubaco_header.rs:106:16 [INFO] [stdout] | [INFO] [stdout] 106 | ... if my_dkim_domain_list.len() > 0 && mx_dkim_domain_list.len() > 0 && intersect_vec(&my_dkim_domain_list, &mx_dkim_domain_list... [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!my_dkim_domain_list.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_fubaco_header.rs:106:49 [INFO] [stdout] | [INFO] [stdout] 106 | ...0 && mx_dkim_domain_list.len() > 0 && intersect_vec(&my_dkim_domain_list, &mx_dkim_domain_list).len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!mx_dkim_domain_list.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_fubaco_header.rs:106:82 [INFO] [stdout] | [INFO] [stdout] 106 | ...main_list.len() > 0 && intersect_vec(&my_dkim_domain_list, &mx_dkim_domain_list).len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `intersect_vec(&my_dkim_domain_list, &mx_dkim_domain_list).is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/my_plugin_yondakiji.rs:117:13 [INFO] [stdout] | [INFO] [stdout] 117 | return; [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] 116 - error!("ERROR: plugin_yondakiji: {:?}", e); [INFO] [stdout] 117 - return; [INFO] [stdout] 116 + error!("ERROR: plugin_yondakiji: {:?}", e); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this block may be rewritten with the `?` operator [INFO] [stdout] --> src/my_message_parser.rs:23:9 [INFO] [stdout] | [INFO] [stdout] 23 | / if header.is_none() { [INFO] [stdout] 24 | | return None; // "rejected" when no FROM field is existed [INFO] [stdout] 25 | | } [INFO] [stdout] | |_________^ help: replace it with: `header?;` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#question_mark [INFO] [stdout] = note: `#[warn(clippy::question_mark)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded late initialization [INFO] [stdout] --> src/my_message_parser.rs:29:9 [INFO] [stdout] | [INFO] [stdout] 29 | let text; [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 `text` here and remove the assignments from the `match` arms [INFO] [stdout] | [INFO] [stdout] 29 ~ [INFO] [stdout] 30 ~ let text = match header.unwrap() { [INFO] [stdout] 31 | // the value of HeaderValue should be automatically decoded when it is such as UTF-8 or ISO-2022-JP [INFO] [stdout] ... [INFO] [stdout] 38 | } [INFO] [stdout] 39 ~ v[0].address().unwrap().to_string() [INFO] [stdout] 40 | }, [INFO] [stdout] ... [INFO] [stdout] 45 | assert_ne!(s.len(), 0); [INFO] [stdout] 46 ~ s.to_string() [INFO] [stdout] 47 | } [INFO] [stdout] ... [INFO] [stdout] 52 | assert_ne!(v[0].len(), 0); [INFO] [stdout] 53 ~ v[0].to_string() [INFO] [stdout] 54 | } [INFO] [stdout] ... [INFO] [stdout] 60 | }, [INFO] [stdout] 61 ~ }; [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this block may be rewritten with the `?` operator [INFO] [stdout] --> src/my_message_parser.rs:36:17 [INFO] [stdout] | [INFO] [stdout] 36 | / if v[0].address().is_none() { [INFO] [stdout] 37 | | return None; // "rejected" when FROM field contains no meaningful domains [INFO] [stdout] 38 | | } [INFO] [stdout] | |_________________^ help: replace it with: `v[0].address()?;` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#question_mark [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this block may be rewritten with the `?` operator [INFO] [stdout] --> src/my_message_parser.rs:86:9 [INFO] [stdout] | [INFO] [stdout] 86 | / if first_header.is_none() { [INFO] [stdout] 87 | | return None; [INFO] [stdout] 88 | | } [INFO] [stdout] | |_________^ help: replace it with: `first_header?;` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#question_mark [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> src/my_message_parser.rs:94:44 [INFO] [stdout] | [INFO] [stdout] 94 | let envelop_from = address.replace(&['<', '>'], "").to_lowercase().trim().to_string(); [INFO] [stdout] | ^^^^^^^^^^^ help: change this to: `['<', '>']` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrows_for_generic_args [INFO] [stdout] = note: `#[warn(clippy::needless_borrows_for_generic_args)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_message_parser.rs:96:12 [INFO] [stdout] | [INFO] [stdout] 96 | if envelop_from.len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `envelop_from.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&Vec` instead of `&[_]` involves a new object where a slice will do [INFO] [stdout] --> src/my_plugin_yondatweet.rs:36:50 [INFO] [stdout] | [INFO] [stdout] 36 | pub fn from_message(message: &Message, tags: &Vec) -> 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] 36 ~ pub fn from_message(message: &Message, tags: &[String]) -> Result { [INFO] [stdout] 37 | let date_header = message.date().ok_or_else(|| anyhow!("no \"Date:\" header"))?; [INFO] [stdout] ... [INFO] [stdout] 108 | [INFO] [stdout] 109 ~ let tags = tags.to_owned(); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `match` expression can be replaced with `?` [INFO] [stdout] --> src/my_message_parser.rs:132:17 [INFO] [stdout] | [INFO] [stdout] 132 | / match received.from_ip() { [INFO] [stdout] 133 | | Some(v) => v, [INFO] [stdout] 134 | | None => return None, [INFO] [stdout] 135 | | } [INFO] [stdout] | |_________________^ help: try instead: `received.from_ip()?` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#question_mark [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/my_message_parser.rs:151:72 [INFO] [stdout] | [INFO] [stdout] 151 | let header_value = REGEX_CONTINUATION_LINE_PATTERN.replace_all(&header_value, " "); [INFO] [stdout] | ^^^^^^^^^^^^^ help: change this to: `header_value` [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: unnecessary use of `get("mx").is_none()` [INFO] [stdout] --> src/my_message_parser.rs:157:22 [INFO] [stdout] | [INFO] [stdout] 157 | if table.get("mx").is_none() { [INFO] [stdout] | ------^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | | [INFO] [stdout] | help: replace it with: `!table.contains_key("mx")` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_get_then_check [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/my_plugin_yondatweet.rs:170:13 [INFO] [stdout] | [INFO] [stdout] 170 | return; [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] 169 - error!("ERROR: plugin_yondatweet: {:?}", e); [INFO] [stdout] 170 - return; [INFO] [stdout] 169 + error!("ERROR: plugin_yondatweet: {:?}", e); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual implementation of `Option::map` [INFO] [stdout] --> src/my_message_parser.rs:187:28 [INFO] [stdout] | [INFO] [stdout] 187 | } else if let Some(caps) = REGEX_DOMAIN_OF.captures(rest) { [INFO] [stdout] | ____________________________^ [INFO] [stdout] 188 | | Some(caps[2].to_string()) [INFO] [stdout] 189 | | } else { [INFO] [stdout] 190 | | None [INFO] [stdout] 191 | | } [INFO] [stdout] | |_____________________^ help: try: `{ REGEX_DOMAIN_OF.captures(rest).map(|caps| caps[2].to_string()) }` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_map [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual implementation of `Option::map` [INFO] [stdout] --> src/my_message_parser.rs:200:28 [INFO] [stdout] | [INFO] [stdout] 200 | } else if let Some(caps) = REGEX_HEADER_D.captures(rest) { [INFO] [stdout] | ____________________________^ [INFO] [stdout] 201 | | Some(caps[2].to_string()) [INFO] [stdout] 202 | | } else { [INFO] [stdout] 203 | | None [INFO] [stdout] 204 | | } [INFO] [stdout] | |_____________________^ help: try: `{ REGEX_HEADER_D.captures(rest).map(|caps| caps[2].to_string()) }` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_map [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual implementation of `Option::map` [INFO] [stdout] --> src/my_message_parser.rs:210:21 [INFO] [stdout] | [INFO] [stdout] 210 | / if let Some(caps) = REGEX_HEADER_FROM.captures(rest) { [INFO] [stdout] 211 | | Some(caps[2].to_string()) [INFO] [stdout] 212 | | } else { [INFO] [stdout] 213 | | None [INFO] [stdout] 214 | | } [INFO] [stdout] | |_____________________^ help: try: `REGEX_HEADER_FROM.captures(rest).map(|caps| caps[2].to_string())` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_map [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual implementation of `Option::map` [INFO] [stdout] --> src/my_message_parser.rs:220:21 [INFO] [stdout] | [INFO] [stdout] 220 | / if let Some(caps) = REGEX_HEADER_FROM.captures(rest) { [INFO] [stdout] 221 | | Some(caps[2].to_string()) [INFO] [stdout] 222 | | } else { [INFO] [stdout] 223 | | None [INFO] [stdout] 224 | | } [INFO] [stdout] | |_____________________^ help: try: `REGEX_HEADER_FROM.captures(rest).map(|caps| caps[2].to_string())` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_map [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&Vec` instead of `&[_]` involves a new object where a slice will do [INFO] [stdout] --> src/my_plugin_yondakiji.rs:30:50 [INFO] [stdout] | [INFO] [stdout] 30 | pub fn from_message(message: &Message, tags: &Vec) -> 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] 30 ~ pub fn from_message(message: &Message, tags: &[String]) -> Result { [INFO] [stdout] 31 | let title = match message.subject() { [INFO] [stdout] ... [INFO] [stdout] 60 | let localtime_added = timestamp.to_str(); [INFO] [stdout] 61 ~ let tags = tags.to_owned(); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_plugin_yondakiji.rs:44:67 [INFO] [stdout] | [INFO] [stdout] 44 | let line = body_text.lines().map(|s| s.trim()).filter(|s| s.len() > 0).nth(0); [INFO] [stdout] | ^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!s.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/my_plugin_yondakiji.rs:117:13 [INFO] [stdout] | [INFO] [stdout] 117 | return; [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] 116 - error!("ERROR: plugin_yondakiji: {:?}", e); [INFO] [stdout] 117 - return; [INFO] [stdout] 116 + error!("ERROR: plugin_yondakiji: {:?}", e); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&Vec` instead of `&[_]` involves a new object where a slice will do [INFO] [stdout] --> src/my_plugin_yondatweet.rs:36:50 [INFO] [stdout] | [INFO] [stdout] 36 | pub fn from_message(message: &Message, tags: &Vec) -> 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] 36 ~ pub fn from_message(message: &Message, tags: &[String]) -> Result { [INFO] [stdout] 37 | let date_header = message.date().ok_or_else(|| anyhow!("no \"Date:\" header"))?; [INFO] [stdout] ... [INFO] [stdout] 108 | [INFO] [stdout] 109 ~ let tags = tags.to_owned(); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this call to `from_str_radix` can be replaced with a call to `str::parse` [INFO] [stdout] --> src/my_pop3_bridge.rs:98:45 [INFO] [stdout] | [INFO] [stdout] 98 | let message_number = if let Ok(n) = u32::from_str_radix(index, 10) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `index.parse::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_str_radix_10 [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this call to `from_str_radix` can be replaced with a call to `str::parse` [INFO] [stdout] --> src/my_pop3_bridge.rs:126:24 [INFO] [stdout] | [INFO] [stdout] 126 | if let Ok(i) = usize::from_str_radix(&s, 10) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `s.parse::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_str_radix_10 [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/my_pop3_bridge.rs:135:73 [INFO] [stdout] | [INFO] [stdout] 135 | let list: Vec<(MessageNumber, usize)> = list.into_iter().filter_map(|t| convert_an_entry(t)).collect(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the function itself: `convert_an_entry` [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: unneeded `return` statement [INFO] [stdout] --> src/my_plugin_yondatweet.rs:170:13 [INFO] [stdout] | [INFO] [stdout] 170 | return; [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] 169 - error!("ERROR: plugin_yondatweet: {:?}", e); [INFO] [stdout] 170 - return; [INFO] [stdout] 169 + error!("ERROR: plugin_yondatweet: {:?}", e); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: useless use of `format!` [INFO] [stdout] --> src/my_pop3_bridge.rs:157:28 [INFO] [stdout] | [INFO] [stdout] 157 | let command_line = format!("UIDL\r\n").into_bytes(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `"UIDL\r\n".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: useless use of `format!` [INFO] [stdout] --> src/my_pop3_bridge.rs:176:28 [INFO] [stdout] | [INFO] [stdout] 176 | let command_line = format!("LIST\r\n").into_bytes(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `"LIST\r\n".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: length comparison to zero [INFO] [stdout] --> src/my_pop3_bridge.rs:192:8 [INFO] [stdout] | [INFO] [stdout] 192 | if unique_id_to_message_info.len() == 0 { // at the first time only, all existed massages are treated as old messages which hav... [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `unique_id_to_message_info.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `.fold` can be written more succinctly using another method [INFO] [stdout] --> src/my_pop3_bridge.rs:206:79 [INFO] [stdout] | [INFO] [stdout] 206 | let total_nbytes_of_original_maildrop = message_number_to_nbytes.values().fold(0, |acc, nbytes| acc + nbytes); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `sum::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_fold [INFO] [stdout] = note: `#[warn(clippy::unnecessary_fold)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `.fold` can be written more succinctly using another method [INFO] [stdout] --> src/my_pop3_bridge.rs:220:10 [INFO] [stdout] | [INFO] [stdout] 220 | .fold(0, |acc, nbytes| acc + nbytes); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `sum::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_fold [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this call to `from_str_radix` can be replaced with a call to `str::parse` [INFO] [stdout] --> src/my_pop3_bridge.rs:98:45 [INFO] [stdout] | [INFO] [stdout] 98 | let message_number = if let Ok(n) = u32::from_str_radix(index, 10) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `index.parse::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_str_radix_10 [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this call to `from_str_radix` can be replaced with a call to `str::parse` [INFO] [stdout] --> src/my_pop3_bridge.rs:126:24 [INFO] [stdout] | [INFO] [stdout] 126 | if let Ok(i) = usize::from_str_radix(&s, 10) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `s.parse::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_str_radix_10 [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/my_pop3_bridge.rs:135:73 [INFO] [stdout] | [INFO] [stdout] 135 | let list: Vec<(MessageNumber, usize)> = list.into_iter().filter_map(|t| convert_an_entry(t)).collect(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the function itself: `convert_an_entry` [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: useless use of `format!` [INFO] [stdout] --> src/my_pop3_bridge.rs:157:28 [INFO] [stdout] | [INFO] [stdout] 157 | let command_line = format!("UIDL\r\n").into_bytes(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `"UIDL\r\n".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: useless use of `format!` [INFO] [stdout] --> src/my_pop3_bridge.rs:176:28 [INFO] [stdout] | [INFO] [stdout] 176 | let command_line = format!("LIST\r\n").into_bytes(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `"LIST\r\n".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: length comparison to zero [INFO] [stdout] --> src/my_pop3_bridge.rs:192:8 [INFO] [stdout] | [INFO] [stdout] 192 | if unique_id_to_message_info.len() == 0 { // at the first time only, all existed massages are treated as old messages which hav... [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `unique_id_to_message_info.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `.fold` can be written more succinctly using another method [INFO] [stdout] --> src/my_pop3_bridge.rs:206:79 [INFO] [stdout] | [INFO] [stdout] 206 | let total_nbytes_of_original_maildrop = message_number_to_nbytes.values().fold(0, |acc, nbytes| acc + nbytes); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `sum::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_fold [INFO] [stdout] = note: `#[warn(clippy::unnecessary_fold)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `.fold` can be written more succinctly using another method [INFO] [stdout] --> src/my_pop3_bridge.rs:220:10 [INFO] [stdout] | [INFO] [stdout] 220 | .fold(0, |acc, nbytes| acc + nbytes); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `sum::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_fold [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this call to `from_str_radix` can be replaced with a call to `str::parse` [INFO] [stdout] --> src/my_pop3_bridge.rs:266:56 [INFO] [stdout] | [INFO] [stdout] 266 | let arg_message_number = MessageNumber(u32::from_str_radix(&command_arg1.clone().unwrap(), 10).unwrap()); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `command_arg1.clone().unwrap().parse::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_str_radix_10 [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this call to `from_str_radix` can be replaced with a call to `str::parse` [INFO] [stdout] --> src/my_pop3_bridge.rs:266:56 [INFO] [stdout] | [INFO] [stdout] 266 | let arg_message_number = MessageNumber(u32::from_str_radix(&command_arg1.clone().unwrap(), 10).unwrap()); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `command_arg1.clone().unwrap().parse::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_str_radix_10 [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this call to `from_str_radix` can be replaced with a call to `str::parse` [INFO] [stdout] --> src/my_pop3_bridge.rs:276:52 [INFO] [stdout] | [INFO] [stdout] 276 | message_number = MessageNumber(u32::from_str_radix(caps.get(1).unwrap().as_str(), 10).unwrap()); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `caps.get(1).unwrap().as_str().parse::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_str_radix_10 [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this call to `from_str_radix` can be replaced with a call to `str::parse` [INFO] [stdout] --> src/my_pop3_bridge.rs:277:30 [INFO] [stdout] | [INFO] [stdout] 277 | nbytes = usize::from_str_radix(caps.get(2).unwrap().as_str(), 10).unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `caps.get(2).unwrap().as_str().parse::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_str_radix_10 [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this call to `from_str_radix` can be replaced with a call to `str::parse` [INFO] [stdout] --> src/my_pop3_bridge.rs:276:52 [INFO] [stdout] | [INFO] [stdout] 276 | message_number = MessageNumber(u32::from_str_radix(caps.get(1).unwrap().as_str(), 10).unwrap()); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `caps.get(1).unwrap().as_str().parse::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_str_radix_10 [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this call to `from_str_radix` can be replaced with a call to `str::parse` [INFO] [stdout] --> src/my_pop3_bridge.rs:277:30 [INFO] [stdout] | [INFO] [stdout] 277 | nbytes = usize::from_str_radix(caps.get(2).unwrap().as_str(), 10).unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `caps.get(2).unwrap().as_str().parse::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_str_radix_10 [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this call to `from_str_radix` can be replaced with a call to `str::parse` [INFO] [stdout] --> src/my_pop3_bridge.rs:313:34 [INFO] [stdout] | [INFO] [stdout] 313 | let nbytes = usize::from_str_radix(&caps[1], 10).unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `caps[1].parse::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_str_radix_10 [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this call to `from_str_radix` can be replaced with a call to `str::parse` [INFO] [stdout] --> src/my_pop3_bridge.rs:313:34 [INFO] [stdout] | [INFO] [stdout] 313 | let nbytes = usize::from_str_radix(&caps[1], 10).unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `caps[1].parse::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_str_radix_10 [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this call to `from_str_radix` can be replaced with a call to `str::parse` [INFO] [stdout] --> src/my_pop3_bridge.rs:331:56 [INFO] [stdout] | [INFO] [stdout] 331 | let arg_message_number = MessageNumber(u32::from_str_radix(&command_arg1.clone().unwrap(), 10).unwrap()); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `command_arg1.clone().unwrap().parse::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_str_radix_10 [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this call to `from_str_radix` can be replaced with a call to `str::parse` [INFO] [stdout] --> src/my_pop3_bridge.rs:331:56 [INFO] [stdout] | [INFO] [stdout] 331 | let arg_message_number = MessageNumber(u32::from_str_radix(&command_arg1.clone().unwrap(), 10).unwrap()); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `command_arg1.clone().unwrap().parse::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_str_radix_10 [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/my_pop3_bridge.rs:342:21 [INFO] [stdout] | [INFO] [stdout] 342 | / ... if command_name == "RETR" { [INFO] [stdout] 343 | | ... if body_u8.len() != message_number_to_nbytes[&arg_message_number] { [INFO] [stdout] 344 | | ... warn!("WARNING: message size is different from the response of LIST comand: {} vs {}", body_u8.len(), message_numbe... [INFO] [stdout] 345 | | ... } [INFO] [stdout] 346 | | ... } [INFO] [stdout] | |_______^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 342 ~ if command_name == "RETR" [INFO] [stdout] 343 ~ && body_u8.len() != message_number_to_nbytes[&arg_message_number] { [INFO] [stdout] 344 | warn!("WARNING: message size is different from the response of LIST comand: {} vs {}", body_u8.len(), message_number_to_nbytes[&arg_message_number]); [INFO] [stdout] 345 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` statement can be collapsed [INFO] [stdout] --> src/my_pop3_bridge.rs:342:21 [INFO] [stdout] | [INFO] [stdout] 342 | / ... if command_name == "RETR" { [INFO] [stdout] 343 | | ... if body_u8.len() != message_number_to_nbytes[&arg_message_number] { [INFO] [stdout] 344 | | ... warn!("WARNING: message size is different from the response of LIST comand: {} vs {}", body_u8.len(), message_numbe... [INFO] [stdout] 345 | | ... } [INFO] [stdout] 346 | | ... } [INFO] [stdout] | |_______^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 342 ~ if command_name == "RETR" [INFO] [stdout] 343 ~ && body_u8.len() != message_number_to_nbytes[&arg_message_number] { [INFO] [stdout] 344 | warn!("WARNING: message size is different from the response of LIST comand: {} vs {}", body_u8.len(), message_number_to_nbytes[&arg_message_number]); [INFO] [stdout] 345 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this call to `from_str_radix` can be replaced with a call to `str::parse` [INFO] [stdout] --> src/my_pop3_bridge.rs:368:34 [INFO] [stdout] | [INFO] [stdout] 368 | let nbytes = usize::from_str_radix(&caps[1], 10).unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `caps[1].parse::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_str_radix_10 [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this call to `from_str_radix` can be replaced with a call to `str::parse` [INFO] [stdout] --> src/my_pop3_bridge.rs:368:34 [INFO] [stdout] | [INFO] [stdout] 368 | let nbytes = usize::from_str_radix(&caps[1], 10).unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `caps[1].parse::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_str_radix_10 [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this call to `from_str_radix` can be replaced with a call to `str::parse` [INFO] [stdout] --> src/my_pop3_bridge.rs:389:39 [INFO] [stdout] | [INFO] [stdout] 389 | num_of_messages = usize::from_str_radix(&caps[1], 10).unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `caps[1].parse::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_str_radix_10 [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this call to `from_str_radix` can be replaced with a call to `str::parse` [INFO] [stdout] --> src/my_pop3_bridge.rs:389:39 [INFO] [stdout] | [INFO] [stdout] 389 | num_of_messages = usize::from_str_radix(&caps[1], 10).unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `caps[1].parse::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_str_radix_10 [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this call to `from_str_radix` can be replaced with a call to `str::parse` [INFO] [stdout] --> src/my_pop3_bridge.rs:390:30 [INFO] [stdout] | [INFO] [stdout] 390 | nbytes = usize::from_str_radix(&caps[2], 10).unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `caps[2].parse::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_str_radix_10 [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this call to `from_str_radix` can be replaced with a call to `str::parse` [INFO] [stdout] --> src/my_pop3_bridge.rs:390:30 [INFO] [stdout] | [INFO] [stdout] 390 | nbytes = usize::from_str_radix(&caps[2], 10).unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `caps[2].parse::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_str_radix_10 [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you are using an explicit closure for cloning elements [INFO] [stdout] --> src/my_pop3_bridge.rs:449:36 [INFO] [stdout] | [INFO] [stdout] 449 | let lack_keys: Vec = username_to_hostname.keys().filter(|u| !database.contains_key(u)).map(|u| u.clone()).collect(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider calling the dedicated `cloned` method: `username_to_hostname.keys().filter(|u| !database.contains_key(u)).cloned()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_clone [INFO] [stdout] = note: `#[warn(clippy::map_clone)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you are using an explicit closure for cloning elements [INFO] [stdout] --> src/my_pop3_bridge.rs:449:36 [INFO] [stdout] | [INFO] [stdout] 449 | let lack_keys: Vec = username_to_hostname.keys().filter(|u| !database.contains_key(u)).map(|u| u.clone()).collect(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider calling the dedicated `cloned` method: `username_to_hostname.keys().filter(|u| !database.contains_key(u)).cloned()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_clone [INFO] [stdout] = note: `#[warn(clippy::map_clone)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_spam_checker.rs:25:8 [INFO] [stdout] | [INFO] [stdout] 25 | if lacked_header_names.len() > 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!lacked_header_names.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_spam_checker.rs:25:8 [INFO] [stdout] | [INFO] [stdout] 25 | if lacked_header_names.len() > 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!lacked_header_names.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/my_spam_checker.rs:41:79 [INFO] [stdout] | [INFO] [stdout] 41 | if let Some(fqdn) = my_fqdn::extract_fqdn_in_mail_address_with_validation(&envelop_from) { [INFO] [stdout] | ^^^^^^^^^^^^^ help: change this to: `envelop_from` [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: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/my_spam_checker.rs:41:79 [INFO] [stdout] | [INFO] [stdout] 41 | if let Some(fqdn) = my_fqdn::extract_fqdn_in_mail_address_with_validation(&envelop_from) { [INFO] [stdout] | ^^^^^^^^^^^^^ help: change this to: `envelop_from` [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: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/my_spam_checker.rs:58:45 [INFO] [stdout] | [INFO] [stdout] 58 | if my_fqdn::is_prohibited_word_included(&text_raw) { [INFO] [stdout] | ^^^^^^^^^ help: change this to: `text_raw` [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: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/my_spam_checker.rs:58:45 [INFO] [stdout] | [INFO] [stdout] 58 | if my_fqdn::is_prohibited_word_included(&text_raw) { [INFO] [stdout] | ^^^^^^^^^ help: change this to: `text_raw` [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: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/my_spam_checker.rs:61:41 [INFO] [stdout] | [INFO] [stdout] 61 | if is_non_english_alphabet_included(&text_raw) { [INFO] [stdout] | ^^^^^^^^^ help: change this to: `text_raw` [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: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/my_spam_checker.rs:64:46 [INFO] [stdout] | [INFO] [stdout] 64 | if is_unicode_control_codepoint_included(&text_raw) { [INFO] [stdout] | ^^^^^^^^^ help: change this to: `text_raw` [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: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/my_spam_checker.rs:61:41 [INFO] [stdout] | [INFO] [stdout] 61 | if is_non_english_alphabet_included(&text_raw) { [INFO] [stdout] | ^^^^^^^^^ help: change this to: `text_raw` [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: this `.into_iter()` call is equivalent to `.iter()` and will not consume the `Vec` [INFO] [stdout] --> src/my_spam_checker.rs:77:20 [INFO] [stdout] | [INFO] [stdout] 77 | groups.into_iter().flat_map(|g| g.addresses.iter()).map(|addr| addr.to_owned()).collect() [INFO] [stdout] | ^^^^^^^^^ help: call directly: `iter` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#into_iter_on_ref [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/my_spam_checker.rs:64:46 [INFO] [stdout] | [INFO] [stdout] 64 | if is_unicode_control_codepoint_included(&text_raw) { [INFO] [stdout] | ^^^^^^^^^ help: change this to: `text_raw` [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: this `.into_iter()` call is equivalent to `.iter()` and will not consume the `Vec` [INFO] [stdout] --> src/my_spam_checker.rs:77:20 [INFO] [stdout] | [INFO] [stdout] 77 | groups.into_iter().flat_map(|g| g.addresses.iter()).map(|addr| addr.to_owned()).collect() [INFO] [stdout] | ^^^^^^^^^ help: call directly: `iter` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#into_iter_on_ref [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/my_spam_checker.rs:99:53 [INFO] [stdout] | [INFO] [stdout] 99 | if my_fqdn::is_prohibited_word_included(&text) { [INFO] [stdout] | ^^^^^ help: change this to: `text` [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: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/my_spam_checker.rs:102:49 [INFO] [stdout] | [INFO] [stdout] 102 | if is_non_english_alphabet_included(&text) { [INFO] [stdout] | ^^^^^ help: change this to: `text` [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: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/my_spam_checker.rs:99:53 [INFO] [stdout] | [INFO] [stdout] 99 | if my_fqdn::is_prohibited_word_included(&text) { [INFO] [stdout] | ^^^^^ help: change this to: `text` [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: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/my_spam_checker.rs:102:49 [INFO] [stdout] | [INFO] [stdout] 102 | if is_non_english_alphabet_included(&text) { [INFO] [stdout] | ^^^^^ help: change this to: `text` [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: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/my_spam_checker.rs:105:54 [INFO] [stdout] | [INFO] [stdout] 105 | if is_unicode_control_codepoint_included(&text) { [INFO] [stdout] | ^^^^^ help: change this to: `text` [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: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/my_spam_checker.rs:105:54 [INFO] [stdout] | [INFO] [stdout] 105 | if is_unicode_control_codepoint_included(&text) { [INFO] [stdout] | ^^^^^ help: change this to: `text` [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: you are using an explicit closure for cloning elements [INFO] [stdout] --> src/my_spam_checker.rs:141:22 [INFO] [stdout] | [INFO] [stdout] 141 | table.extend(table_for_current_item.iter().map(|s| s.clone())); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider calling the dedicated `cloned` method: `table_for_current_item.iter().cloned()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_clone [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you are using an explicit closure for cloning elements [INFO] [stdout] --> src/my_spam_checker.rs:141:22 [INFO] [stdout] | [INFO] [stdout] 141 | table.extend(table_for_current_item.iter().map(|s| s.clone())); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider calling the dedicated `cloned` method: `table_for_current_item.iter().cloned()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_clone [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/my_spam_checker.rs:183:80 [INFO] [stdout] | [INFO] [stdout] 183 | if let Some(false) = my_fqdn::is_valid_domain_by_guessing_from_text(&fqdn, &subject_raw) { [INFO] [stdout] | ^^^^^^^^^^^^ help: change this to: `subject_raw` [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: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/my_spam_checker.rs:183:80 [INFO] [stdout] | [INFO] [stdout] 183 | if let Some(false) = my_fqdn::is_valid_domain_by_guessing_from_text(&fqdn, &subject_raw) { [INFO] [stdout] | ^^^^^^^^^^^^ help: change this to: `subject_raw` [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: length comparison to zero [INFO] [stdout] --> src/my_spam_checker.rs:201:8 [INFO] [stdout] | [INFO] [stdout] 201 | if url.len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `url.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_spam_checker.rs:201:8 [INFO] [stdout] | [INFO] [stdout] 201 | if url.len() == 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `url.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/my_spam_checker.rs:238:82 [INFO] [stdout] | [INFO] [stdout] 238 | if let Some(host_in_text) = my_fqdn::extract_fqdn_in_url_with_validation(&text) { [INFO] [stdout] | ^^^^^ help: change this to: `text` [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: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/my_spam_checker.rs:238:82 [INFO] [stdout] | [INFO] [stdout] 238 | if let Some(host_in_text) = my_fqdn::extract_fqdn_in_url_with_validation(&text) { [INFO] [stdout] | ^^^^^ help: change this to: `text` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded late initialization [INFO] [stdout] --> src/my_spam_checker.rs:248:5 [INFO] [stdout] | [INFO] [stdout] 248 | let html; [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 `html` here and remove the assignments from the `match` arms [INFO] [stdout] | [INFO] [stdout] 248 ~ [INFO] [stdout] 249 ~ let html = match message.body_html(0) { [INFO] [stdout] 250 ~ Some(v) => v, [INFO] [stdout] 251 | None => return, [INFO] [stdout] 252 ~ }; [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded late initialization [INFO] [stdout] --> src/my_spam_checker.rs:248:5 [INFO] [stdout] | [INFO] [stdout] 248 | let html; [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 `html` here and remove the assignments from the `match` arms [INFO] [stdout] | [INFO] [stdout] 248 ~ [INFO] [stdout] 249 ~ let html = match message.body_html(0) { [INFO] [stdout] 250 ~ Some(v) => v, [INFO] [stdout] 251 | None => return, [INFO] [stdout] 252 ~ }; [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded late initialization [INFO] [stdout] --> src/my_spam_checker.rs:264:5 [INFO] [stdout] | [INFO] [stdout] 264 | let body_text; [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 `body_text` here and remove the assignments from the `match` arms [INFO] [stdout] | [INFO] [stdout] 264 ~ [INFO] [stdout] 265 ~ let body_text = match message.body_text(0) { [INFO] [stdout] 266 ~ Some(v) => v, [INFO] [stdout] 267 | None => return, [INFO] [stdout] 268 ~ }; [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded late initialization [INFO] [stdout] --> src/my_spam_checker.rs:264:5 [INFO] [stdout] | [INFO] [stdout] 264 | let body_text; [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 `body_text` here and remove the assignments from the `match` arms [INFO] [stdout] | [INFO] [stdout] 264 ~ [INFO] [stdout] 265 ~ let body_text = match message.body_text(0) { [INFO] [stdout] 266 ~ Some(v) => v, [INFO] [stdout] 267 | None => return, [INFO] [stdout] 268 ~ }; [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded late initialization [INFO] [stdout] --> src/my_spam_checker.rs:286:5 [INFO] [stdout] | [INFO] [stdout] 286 | let html; [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 `html` here and remove the assignments from the `match` arms [INFO] [stdout] | [INFO] [stdout] 286 ~ [INFO] [stdout] 287 ~ let html = match message.body_html(0) { [INFO] [stdout] 288 ~ Some(v) => v, [INFO] [stdout] 289 | None => return, [INFO] [stdout] 290 ~ }; [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded late initialization [INFO] [stdout] --> src/my_spam_checker.rs:286:5 [INFO] [stdout] | [INFO] [stdout] 286 | let html; [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 `html` here and remove the assignments from the `match` arms [INFO] [stdout] | [INFO] [stdout] 286 ~ [INFO] [stdout] 287 ~ let html = match message.body_html(0) { [INFO] [stdout] 288 ~ Some(v) => v, [INFO] [stdout] 289 | None => return, [INFO] [stdout] 290 ~ }; [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded late initialization [INFO] [stdout] --> src/my_spam_checker.rs:302:5 [INFO] [stdout] | [INFO] [stdout] 302 | let text; [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 `text` here and remove the assignments from the `match` arms [INFO] [stdout] | [INFO] [stdout] 302 ~ [INFO] [stdout] 303 ~ let text = match message.body_text(0) { [INFO] [stdout] 304 ~ Some(v) => v, [INFO] [stdout] 305 | None => return, [INFO] [stdout] 306 ~ }; [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded late initialization [INFO] [stdout] --> src/my_spam_checker.rs:302:5 [INFO] [stdout] | [INFO] [stdout] 302 | let text; [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 `text` here and remove the assignments from the `match` arms [INFO] [stdout] | [INFO] [stdout] 302 ~ [INFO] [stdout] 303 ~ let text = match message.body_text(0) { [INFO] [stdout] 304 ~ Some(v) => v, [INFO] [stdout] 305 | None => return, [INFO] [stdout] 306 ~ }; [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/my_spam_checker.rs:323:13 [INFO] [stdout] | [INFO] [stdout] 323 | / match header.name { [INFO] [stdout] 324 | | mail_parser::HeaderName::ContentType => { [INFO] [stdout] 325 | | match header.value() { [INFO] [stdout] 326 | | mail_parser::HeaderValue::ContentType(ctype) => { [INFO] [stdout] ... | [INFO] [stdout] 335 | | _ => (), // skip [INFO] [stdout] 336 | | } [INFO] [stdout] | |_____________^ [INFO] [stdout] | [INFO] [stdout] = note: you might want to preserve the comments from inside the `match` [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] 323 ~ if let mail_parser::HeaderName::ContentType = header.name { [INFO] [stdout] 324 + match header.value() { [INFO] [stdout] 325 + mail_parser::HeaderValue::ContentType(ctype) => { [INFO] [stdout] 326 + if ctype.ctype() == "message" && ctype.subtype() == Some("delivery-status") { [INFO] [stdout] 327 + is_target_part = true; [INFO] [stdout] 328 + break; [INFO] [stdout] 329 + } [INFO] [stdout] 330 + }, [INFO] [stdout] 331 + _ => (), // skip [INFO] [stdout] 332 + } [INFO] [stdout] 333 + } [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/my_spam_checker.rs:323:13 [INFO] [stdout] | [INFO] [stdout] 323 | / match header.name { [INFO] [stdout] 324 | | mail_parser::HeaderName::ContentType => { [INFO] [stdout] 325 | | match header.value() { [INFO] [stdout] 326 | | mail_parser::HeaderValue::ContentType(ctype) => { [INFO] [stdout] ... | [INFO] [stdout] 335 | | _ => (), // skip [INFO] [stdout] 336 | | } [INFO] [stdout] | |_____________^ [INFO] [stdout] | [INFO] [stdout] = note: you might want to preserve the comments from inside the `match` [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] 323 ~ if let mail_parser::HeaderName::ContentType = header.name { [INFO] [stdout] 324 + match header.value() { [INFO] [stdout] 325 + mail_parser::HeaderValue::ContentType(ctype) => { [INFO] [stdout] 326 + if ctype.ctype() == "message" && ctype.subtype() == Some("delivery-status") { [INFO] [stdout] 327 + is_target_part = true; [INFO] [stdout] 328 + break; [INFO] [stdout] 329 + } [INFO] [stdout] 330 + }, [INFO] [stdout] 331 + _ => (), // skip [INFO] [stdout] 332 + } [INFO] [stdout] 333 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` can be collapsed into the outer `match` [INFO] [stdout] --> src/my_spam_checker.rs:327:29 [INFO] [stdout] | [INFO] [stdout] 327 | / ... if ctype.ctype() == "message" && ctype.subtype() == Some("delivery-status") { [INFO] [stdout] 328 | | ... is_target_part = true; [INFO] [stdout] 329 | | ... break; [INFO] [stdout] 330 | | ... } [INFO] [stdout] | |_______________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_match [INFO] [stdout] = note: `#[warn(clippy::collapsible_match)]` on by default [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 326 ~ mail_parser::HeaderValue::ContentType(ctype) [INFO] [stdout] 327 ~ if ctype.ctype() == "message" && ctype.subtype() == Some("delivery-status") => { [INFO] [stdout] 328 | is_target_part = true; [INFO] [stdout] 329 | break; [INFO] [stdout] 330 ~ }, [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/my_spam_checker.rs:325:21 [INFO] [stdout] | [INFO] [stdout] 325 | / match header.value() { [INFO] [stdout] 326 | | mail_parser::HeaderValue::ContentType(ctype) => { [INFO] [stdout] 327 | | if ctype.ctype() == "message" && ctype.subtype() == Some("delivery-status") { [INFO] [stdout] 328 | | is_target_part = true; [INFO] [stdout] ... | [INFO] [stdout] 332 | | _ => (), // skip [INFO] [stdout] 333 | | } [INFO] [stdout] | |_____________________^ [INFO] [stdout] | [INFO] [stdout] = note: you might want to preserve the comments from inside the `match` [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] 325 ~ if let mail_parser::HeaderValue::ContentType(ctype) = header.value() { [INFO] [stdout] 326 + if ctype.ctype() == "message" && ctype.subtype() == Some("delivery-status") { [INFO] [stdout] 327 + is_target_part = true; [INFO] [stdout] 328 + break; [INFO] [stdout] 329 + } [INFO] [stdout] 330 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `NONE` contains a capitalized acronym [INFO] [stdout] --> src/my_spf_verifier.rs:16:5 [INFO] [stdout] | [INFO] [stdout] 16 | NONE, [INFO] [stdout] | ^^^^ help: consider making the acronym lowercase, except the initial letter: `None` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `NEUTRAL` contains a capitalized acronym [INFO] [stdout] --> src/my_spf_verifier.rs:17:5 [INFO] [stdout] | [INFO] [stdout] 17 | NEUTRAL, [INFO] [stdout] | ^^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Neutral` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `PASS` contains a capitalized acronym [INFO] [stdout] --> src/my_spf_verifier.rs:18:5 [INFO] [stdout] | [INFO] [stdout] 18 | PASS, [INFO] [stdout] | ^^^^ help: consider making the acronym lowercase, except the initial letter: `Pass` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `FAIL` contains a capitalized acronym [INFO] [stdout] --> src/my_spf_verifier.rs:19:5 [INFO] [stdout] | [INFO] [stdout] 19 | FAIL, [INFO] [stdout] | ^^^^ help: consider making the acronym lowercase, except the initial letter: `Fail` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `SOFTFAIL` contains a capitalized acronym [INFO] [stdout] --> src/my_spf_verifier.rs:20:5 [INFO] [stdout] | [INFO] [stdout] 20 | SOFTFAIL, [INFO] [stdout] | ^^^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Softfail` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `HARDFAIL` contains a capitalized acronym [INFO] [stdout] --> src/my_spf_verifier.rs:21:5 [INFO] [stdout] | [INFO] [stdout] 21 | HARDFAIL, [INFO] [stdout] | ^^^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Hardfail` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `PERMERROR` contains a capitalized acronym [INFO] [stdout] --> src/my_spf_verifier.rs:22:5 [INFO] [stdout] | [INFO] [stdout] 22 | PERMERROR, [INFO] [stdout] | ^^^^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Permerror` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `TEMPERROR` contains a capitalized acronym [INFO] [stdout] --> src/my_spf_verifier.rs:23:5 [INFO] [stdout] | [INFO] [stdout] 23 | TEMPERROR, [INFO] [stdout] | ^^^^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Temperror` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded late initialization [INFO] [stdout] --> src/my_spf_verifier.rs:93:5 [INFO] [stdout] | [INFO] [stdout] 93 | let spf_record; [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 `spf_record` here and remove the assignments from the `match` arms [INFO] [stdout] | [INFO] [stdout] 93 ~ [INFO] [stdout] 94 ~ let spf_record = match resolver.query_spf_record(domain) { [INFO] [stdout] 95 ~ Ok(Some(s)) => s, [INFO] [stdout] 96 | Ok(None) => return SPFResult::new(SPFStatus::NONE, vec![target_domain]), [INFO] [stdout] 97 | Err(_e) => return SPFResult::new(SPFStatus::TEMPERROR, vec![target_domain]), [INFO] [stdout] 98 ~ }; [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_spf_verifier.rs:174:16 [INFO] [stdout] | [INFO] [stdout] 174 | if hosts.len() > 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!hosts.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/my_spf_verifier.rs:191:65 [INFO] [stdout] | [INFO] [stdout] 191 | let list: Vec = s.chars().rev().map(|c| String::from(c)).collect(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ help: replace the closure with the associated function itself: `String::from` [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: explicit call to `.into_iter()` in function argument accepting `IntoIterator` [INFO] [stdout] --> src/my_spf_verifier.rs:199:39 [INFO] [stdout] | [INFO] [stdout] 199 | Ok(v) => hosts.extend(v.into_iter()), [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()` [INFO] [stdout] --> /rustc/3645249d79dfb136b5d8de3ce153d19d6698d92d/library/core/src/iter/traits/collect.rs:416:17 [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_conversion [INFO] [stdout] = note: `#[warn(clippy::useless_conversion)]` on by default [INFO] [stdout] help: consider removing the `.into_iter()` [INFO] [stdout] | [INFO] [stdout] 199 - Ok(v) => hosts.extend(v.into_iter()), [INFO] [stdout] 199 + Ok(v) => hosts.extend(v), [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: explicit call to `.into_iter()` in function argument accepting `IntoIterator` [INFO] [stdout] --> src/my_spf_verifier.rs:212:42 [INFO] [stdout] | [INFO] [stdout] 212 | Ok(v) => list.extend(v.into_iter()), [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()` [INFO] [stdout] --> /rustc/3645249d79dfb136b5d8de3ce153d19d6698d92d/library/core/src/iter/traits/collect.rs:416:17 [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_conversion [INFO] [stdout] help: consider removing the `.into_iter()` [INFO] [stdout] | [INFO] [stdout] 212 - Ok(v) => list.extend(v.into_iter()), [INFO] [stdout] 212 + Ok(v) => list.extend(v), [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `if` can be collapsed into the outer `match` [INFO] [stdout] --> src/my_spam_checker.rs:327:29 [INFO] [stdout] | [INFO] [stdout] 327 | / ... if ctype.ctype() == "message" && ctype.subtype() == Some("delivery-status") { [INFO] [stdout] 328 | | ... is_target_part = true; [INFO] [stdout] 329 | | ... break; [INFO] [stdout] 330 | | ... } [INFO] [stdout] | |_______________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_match [INFO] [stdout] = note: `#[warn(clippy::collapsible_match)]` on by default [INFO] [stdout] help: collapse nested if block [INFO] [stdout] | [INFO] [stdout] 326 ~ mail_parser::HeaderValue::ContentType(ctype) [INFO] [stdout] 327 ~ if ctype.ctype() == "message" && ctype.subtype() == Some("delivery-status") => { [INFO] [stdout] 328 | is_target_part = true; [INFO] [stdout] 329 | break; [INFO] [stdout] 330 ~ }, [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/my_spam_checker.rs:325:21 [INFO] [stdout] | [INFO] [stdout] 325 | / match header.value() { [INFO] [stdout] 326 | | mail_parser::HeaderValue::ContentType(ctype) => { [INFO] [stdout] 327 | | if ctype.ctype() == "message" && ctype.subtype() == Some("delivery-status") { [INFO] [stdout] 328 | | is_target_part = true; [INFO] [stdout] ... | [INFO] [stdout] 332 | | _ => (), // skip [INFO] [stdout] 333 | | } [INFO] [stdout] | |_____________________^ [INFO] [stdout] | [INFO] [stdout] = note: you might want to preserve the comments from inside the `match` [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] 325 ~ if let mail_parser::HeaderValue::ContentType(ctype) = header.value() { [INFO] [stdout] 326 + if ctype.ctype() == "message" && ctype.subtype() == Some("delivery-status") { [INFO] [stdout] 327 + is_target_part = true; [INFO] [stdout] 328 + break; [INFO] [stdout] 329 + } [INFO] [stdout] 330 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `NONE` contains a capitalized acronym [INFO] [stdout] --> src/my_spf_verifier.rs:16:5 [INFO] [stdout] | [INFO] [stdout] 16 | NONE, [INFO] [stdout] | ^^^^ help: consider making the acronym lowercase, except the initial letter: `None` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `NEUTRAL` contains a capitalized acronym [INFO] [stdout] --> src/my_spf_verifier.rs:17:5 [INFO] [stdout] | [INFO] [stdout] 17 | NEUTRAL, [INFO] [stdout] | ^^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Neutral` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `PASS` contains a capitalized acronym [INFO] [stdout] --> src/my_spf_verifier.rs:18:5 [INFO] [stdout] | [INFO] [stdout] 18 | PASS, [INFO] [stdout] | ^^^^ help: consider making the acronym lowercase, except the initial letter: `Pass` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `FAIL` contains a capitalized acronym [INFO] [stdout] --> src/my_spf_verifier.rs:19:5 [INFO] [stdout] | [INFO] [stdout] 19 | FAIL, [INFO] [stdout] | ^^^^ help: consider making the acronym lowercase, except the initial letter: `Fail` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `SOFTFAIL` contains a capitalized acronym [INFO] [stdout] --> src/my_spf_verifier.rs:20:5 [INFO] [stdout] | [INFO] [stdout] 20 | SOFTFAIL, [INFO] [stdout] | ^^^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Softfail` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `HARDFAIL` contains a capitalized acronym [INFO] [stdout] --> src/my_spf_verifier.rs:21:5 [INFO] [stdout] | [INFO] [stdout] 21 | HARDFAIL, [INFO] [stdout] | ^^^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Hardfail` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `PERMERROR` contains a capitalized acronym [INFO] [stdout] --> src/my_spf_verifier.rs:22:5 [INFO] [stdout] | [INFO] [stdout] 22 | PERMERROR, [INFO] [stdout] | ^^^^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Permerror` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `TEMPERROR` contains a capitalized acronym [INFO] [stdout] --> src/my_spf_verifier.rs:23:5 [INFO] [stdout] | [INFO] [stdout] 23 | TEMPERROR, [INFO] [stdout] | ^^^^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Temperror` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded late initialization [INFO] [stdout] --> src/my_spf_verifier.rs:93:5 [INFO] [stdout] | [INFO] [stdout] 93 | let spf_record; [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 `spf_record` here and remove the assignments from the `match` arms [INFO] [stdout] | [INFO] [stdout] 93 ~ [INFO] [stdout] 94 ~ let spf_record = match resolver.query_spf_record(domain) { [INFO] [stdout] 95 ~ Ok(Some(s)) => s, [INFO] [stdout] 96 | Ok(None) => return SPFResult::new(SPFStatus::NONE, vec![target_domain]), [INFO] [stdout] 97 | Err(_e) => return SPFResult::new(SPFStatus::TEMPERROR, vec![target_domain]), [INFO] [stdout] 98 ~ }; [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_spf_verifier.rs:174:16 [INFO] [stdout] | [INFO] [stdout] 174 | if hosts.len() > 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!hosts.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant closure [INFO] [stdout] --> src/my_spf_verifier.rs:191:65 [INFO] [stdout] | [INFO] [stdout] 191 | let list: Vec = s.chars().rev().map(|c| String::from(c)).collect(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^ help: replace the closure with the associated function itself: `String::from` [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: explicit call to `.into_iter()` in function argument accepting `IntoIterator` [INFO] [stdout] --> src/my_spf_verifier.rs:199:39 [INFO] [stdout] | [INFO] [stdout] 199 | Ok(v) => hosts.extend(v.into_iter()), [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()` [INFO] [stdout] --> /rustc/3645249d79dfb136b5d8de3ce153d19d6698d92d/library/core/src/iter/traits/collect.rs:416:17 [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_conversion [INFO] [stdout] = note: `#[warn(clippy::useless_conversion)]` on by default [INFO] [stdout] help: consider removing the `.into_iter()` [INFO] [stdout] | [INFO] [stdout] 199 - Ok(v) => hosts.extend(v.into_iter()), [INFO] [stdout] 199 + Ok(v) => hosts.extend(v), [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: explicit call to `.into_iter()` in function argument accepting `IntoIterator` [INFO] [stdout] --> src/my_spf_verifier.rs:212:42 [INFO] [stdout] | [INFO] [stdout] 212 | Ok(v) => list.extend(v.into_iter()), [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()` [INFO] [stdout] --> /rustc/3645249d79dfb136b5d8de3ce153d19d6698d92d/library/core/src/iter/traits/collect.rs:416:17 [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_conversion [INFO] [stdout] help: consider removing the `.into_iter()` [INFO] [stdout] | [INFO] [stdout] 212 - Ok(v) => list.extend(v.into_iter()), [INFO] [stdout] 212 + Ok(v) => list.extend(v), [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this call to `from_str_radix` can be replaced with a call to `str::parse` [INFO] [stdout] --> src/my_spf_verifier.rs:248:31 [INFO] [stdout] | [INFO] [stdout] 248 | bitmask_len = u32::from_str_radix(&arg3, 10).unwrap_or(0); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `arg3.parse::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_str_radix_10 [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this call to `from_str_radix` can be replaced with a call to `str::parse` [INFO] [stdout] --> src/my_spf_verifier.rs:248:31 [INFO] [stdout] | [INFO] [stdout] 248 | bitmask_len = u32::from_str_radix(&arg3, 10).unwrap_or(0); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `arg3.parse::()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_str_radix_10 [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: casting to the same type is unnecessary (`u128` -> `u128`) [INFO] [stdout] --> src/my_spf_verifier.rs:279:25 [INFO] [stdout] | [INFO] [stdout] 279 | let right = addr.to_bits() as u128; // may be cast [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ help: try: `addr.to_bits()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_cast [INFO] [stdout] = note: `#[warn(clippy::unnecessary_cast)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: casting to the same type is unnecessary (`u128` -> `u128`) [INFO] [stdout] --> src/my_spf_verifier.rs:279:25 [INFO] [stdout] | [INFO] [stdout] 279 | let right = addr.to_bits() as u128; // may be cast [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ help: try: `addr.to_bits()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_cast [INFO] [stdout] = note: `#[warn(clippy::unnecessary_cast)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded late initialization [INFO] [stdout] --> src/my_spf_verifier.rs:304:13 [INFO] [stdout] | [INFO] [stdout] 304 | let nested_spf; [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 `nested_spf` here and remove the assignments from the `match` arms [INFO] [stdout] | [INFO] [stdout] 304 ~ [INFO] [stdout] 305 ~ let nested_spf = match resolver.query_spf_record(&domain) { [INFO] [stdout] 306 ~ Ok(Some(s)) => s, [INFO] [stdout] 307 | Ok(None) => return SPFResult::new(SPFStatus::PERMERROR, vec![target_domain]), // invalid field (abort immediately) [INFO] [stdout] 308 | Err(_e) => return SPFResult::new(SPFStatus::TEMPERROR, vec![target_domain]), // internal error [INFO] [stdout] 309 ~ }; [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded late initialization [INFO] [stdout] --> src/my_spf_verifier.rs:304:13 [INFO] [stdout] | [INFO] [stdout] 304 | let nested_spf; [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 `nested_spf` here and remove the assignments from the `match` arms [INFO] [stdout] | [INFO] [stdout] 304 ~ [INFO] [stdout] 305 ~ let nested_spf = match resolver.query_spf_record(&domain) { [INFO] [stdout] 306 ~ Ok(Some(s)) => s, [INFO] [stdout] 307 | Ok(None) => return SPFResult::new(SPFStatus::PERMERROR, vec![target_domain]), // invalid field (abort immediately) [INFO] [stdout] 308 | Err(_e) => return SPFResult::new(SPFStatus::TEMPERROR, vec![target_domain]), // internal error [INFO] [stdout] 309 ~ }; [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: explicit call to `.into_iter()` in function argument accepting `IntoIterator` [INFO] [stdout] --> src/my_spf_verifier.rs:316:27 [INFO] [stdout] | [INFO] [stdout] 316 | fields.extend(nested_fields.into_iter()); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()` [INFO] [stdout] --> /rustc/3645249d79dfb136b5d8de3ce153d19d6698d92d/library/core/src/iter/traits/collect.rs:416:17 [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_conversion [INFO] [stdout] help: consider removing the `.into_iter()` [INFO] [stdout] | [INFO] [stdout] 316 - fields.extend(nested_fields.into_iter()); [INFO] [stdout] 316 + fields.extend(nested_fields); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you don't need to add `&` to both the expression and the patterns [INFO] [stdout] --> src/my_spf_verifier.rs:322:13 [INFO] [stdout] | [INFO] [stdout] 322 | / match &result.status { [INFO] [stdout] 323 | | &SPFStatus::PASS => return result, [INFO] [stdout] 324 | | &SPFStatus::PERMERROR => return result, [INFO] [stdout] 325 | | &SPFStatus::TEMPERROR => return result, [INFO] [stdout] ... | [INFO] [stdout] 330 | | &SPFStatus::HARDFAIL => (), // ignored [INFO] [stdout] 331 | | } [INFO] [stdout] | |_____________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stdout] = note: `#[warn(clippy::match_ref_pats)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 322 ~ match result.status { [INFO] [stdout] 323 ~ SPFStatus::PASS => return result, [INFO] [stdout] 324 ~ SPFStatus::PERMERROR => return result, [INFO] [stdout] 325 ~ SPFStatus::TEMPERROR => return result, [INFO] [stdout] 326 ~ SPFStatus::NONE => (), // ignored [INFO] [stdout] 327 ~ SPFStatus::NEUTRAL => (), // ignored [INFO] [stdout] 328 ~ SPFStatus::FAIL => (), // ignored [INFO] [stdout] 329 ~ SPFStatus::SOFTFAIL => (), // ignored [INFO] [stdout] 330 ~ SPFStatus::HARDFAIL => (), // ignored [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: explicit call to `.into_iter()` in function argument accepting `IntoIterator` [INFO] [stdout] --> src/my_spf_verifier.rs:316:27 [INFO] [stdout] | [INFO] [stdout] 316 | fields.extend(nested_fields.into_iter()); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()` [INFO] [stdout] --> /rustc/3645249d79dfb136b5d8de3ce153d19d6698d92d/library/core/src/iter/traits/collect.rs:416:17 [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_conversion [INFO] [stdout] help: consider removing the `.into_iter()` [INFO] [stdout] | [INFO] [stdout] 316 - fields.extend(nested_fields.into_iter()); [INFO] [stdout] 316 + fields.extend(nested_fields); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you don't need to add `&` to both the expression and the patterns [INFO] [stdout] --> src/my_spf_verifier.rs:322:13 [INFO] [stdout] | [INFO] [stdout] 322 | / match &result.status { [INFO] [stdout] 323 | | &SPFStatus::PASS => return result, [INFO] [stdout] 324 | | &SPFStatus::PERMERROR => return result, [INFO] [stdout] 325 | | &SPFStatus::TEMPERROR => return result, [INFO] [stdout] ... | [INFO] [stdout] 330 | | &SPFStatus::HARDFAIL => (), // ignored [INFO] [stdout] 331 | | } [INFO] [stdout] | |_____________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stdout] = note: `#[warn(clippy::match_ref_pats)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 322 ~ match result.status { [INFO] [stdout] 323 ~ SPFStatus::PASS => return result, [INFO] [stdout] 324 ~ SPFStatus::PERMERROR => return result, [INFO] [stdout] 325 ~ SPFStatus::TEMPERROR => return result, [INFO] [stdout] 326 ~ SPFStatus::NONE => (), // ignored [INFO] [stdout] 327 ~ SPFStatus::NEUTRAL => (), // ignored [INFO] [stdout] 328 ~ SPFStatus::FAIL => (), // ignored [INFO] [stdout] 329 ~ SPFStatus::SOFTFAIL => (), // ignored [INFO] [stdout] 330 ~ SPFStatus::HARDFAIL => (), // ignored [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: returning the result of a `let` binding from a block [INFO] [stdout] --> src/my_str.rs:22:5 [INFO] [stdout] | [INFO] [stdout] 21 | let s = s.to_uppercase(); [INFO] [stdout] | ------------------------- unnecessary `let` binding [INFO] [stdout] 22 | s [INFO] [stdout] | ^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return [INFO] [stdout] = note: `#[warn(clippy::let_and_return)]` on by default [INFO] [stdout] help: return the expression directly [INFO] [stdout] | [INFO] [stdout] 21 ~ [INFO] [stdout] 22 ~ s.to_uppercase() [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: returning the result of a `let` binding from a block [INFO] [stdout] --> src/my_str.rs:22:5 [INFO] [stdout] | [INFO] [stdout] 21 | let s = s.to_uppercase(); [INFO] [stdout] | ------------------------- unnecessary `let` binding [INFO] [stdout] 22 | s [INFO] [stdout] | ^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return [INFO] [stdout] = note: `#[warn(clippy::let_and_return)]` on by default [INFO] [stdout] help: return the expression directly [INFO] [stdout] | [INFO] [stdout] 21 ~ [INFO] [stdout] 22 ~ s.to_uppercase() [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_str.rs:67:13 [INFO] [stdout] | [INFO] [stdout] 67 | assert!(s.len() > 0); [INFO] [stdout] | ^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!s.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `.nth(0)` on a `std::iter::Iterator`, when `.next()` is equivalent [INFO] [stdout] --> src/my_str.rs:69:22 [INFO] [stdout] | [INFO] [stdout] 69 | let first_char = s.chars().nth(0).unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^ help: try calling `.next()` instead of `.nth(0)`: `s.chars().next()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#iter_nth_zero [INFO] [stdout] = note: `#[warn(clippy::iter_nth_zero)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> src/my_str.rs:84:42 [INFO] [stdout] | [INFO] [stdout] 84 | let it = it.map(|c| normalize_string(&c.to_string())); [INFO] [stdout] | ^^^^^^^^^^^^^^ help: change this to: `c.to_string()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrows_for_generic_args [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_str.rs:85:28 [INFO] [stdout] | [INFO] [stdout] 85 | let it = it.map(|s| if s.len() > 0 { s } else { " ".to_string() }); // replace empty element with a whitespace [INFO] [stdout] | ^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!s.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_str.rs:67:13 [INFO] [stdout] | [INFO] [stdout] 67 | assert!(s.len() > 0); [INFO] [stdout] | ^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!s.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `.nth(0)` on a `std::iter::Iterator`, when `.next()` is equivalent [INFO] [stdout] --> src/my_str.rs:192:98 [INFO] [stdout] | [INFO] [stdout] 192 | info!("suspicious-control-codepoint-in-from: {} (codepoint=U+{:x})", &caps[1], u32::from(caps[1].chars().nth(0).unwrap())); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ help: try calling `.next()` instead of `.nth(0)`: `caps[1].chars().next()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#iter_nth_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `.nth(0)` on a `std::iter::Iterator`, when `.next()` is equivalent [INFO] [stdout] --> src/my_str.rs:69:22 [INFO] [stdout] | [INFO] [stdout] 69 | let first_char = s.chars().nth(0).unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^ help: try calling `.next()` instead of `.nth(0)`: `s.chars().next()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#iter_nth_zero [INFO] [stdout] = note: `#[warn(clippy::iter_nth_zero)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> src/my_str.rs:84:42 [INFO] [stdout] | [INFO] [stdout] 84 | let it = it.map(|c| normalize_string(&c.to_string())); [INFO] [stdout] | ^^^^^^^^^^^^^^ help: change this to: `c.to_string()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrows_for_generic_args [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_str.rs:85:28 [INFO] [stdout] | [INFO] [stdout] 85 | let it = it.map(|s| if s.len() > 0 { s } else { " ".to_string() }); // replace empty element with a whitespace [INFO] [stdout] | ^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!s.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_str.rs:210:29 [INFO] [stdout] | [INFO] [stdout] 210 | lines.take_while(|line| line.len() > 0).for_each(|line| { [INFO] [stdout] | ^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!line.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_str.rs:211:12 [INFO] [stdout] | [INFO] [stdout] 211 | if headers.len() == 0 || !line.starts_with([' ', '\t']) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `headers.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `.nth(0)` on a `std::iter::Iterator`, when `.next()` is equivalent [INFO] [stdout] --> src/my_str.rs:217:5 [INFO] [stdout] | [INFO] [stdout] 217 | headers.iter().filter(|line| line.to_ascii_lowercase().starts_with(&name.to_ascii_lowercase())).nth(0).map(|s| s[name.len()..].... [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try calling `.next()` instead of `.nth(0)`: `headers.iter().filter(|line| line.to_ascii_lowercase().starts_with(&name.to_ascii_lowercase())).next()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#iter_nth_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/my_str.rs:237:61 [INFO] [stdout] | [INFO] [stdout] 237 | let last_part = match regexp_for_last_part.captures(&body_part) { [INFO] [stdout] | ^^^^^^^^^^ help: change this to: `body_part` [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 `.nth(0)` on a `std::iter::Iterator`, when `.next()` is equivalent [INFO] [stdout] --> src/my_str.rs:192:98 [INFO] [stdout] | [INFO] [stdout] 192 | info!("suspicious-control-codepoint-in-from: {} (codepoint=U+{:x})", &caps[1], u32::from(caps[1].chars().nth(0).unwrap())); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ help: try calling `.next()` instead of `.nth(0)`: `caps[1].chars().next()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#iter_nth_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: needless call to `as_bytes` [INFO] [stdout] --> src/my_str.rs:248:108 [INFO] [stdout] | [INFO] [stdout] 248 | parts.iter().enumerate().for_each(|(index, s)| debug!("MIME multipart: part[{}]: {} bytes", index, s.as_bytes().len())); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ help: `len()` can be called directly on strings: `s.len()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_as_bytes [INFO] [stdout] = note: `#[warn(clippy::needless_as_bytes)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_str.rs:210:29 [INFO] [stdout] | [INFO] [stdout] 210 | lines.take_while(|line| line.len() > 0).for_each(|line| { [INFO] [stdout] | ^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!line.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_str.rs:211:12 [INFO] [stdout] | [INFO] [stdout] 211 | if headers.len() == 0 || !line.starts_with([' ', '\t']) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `headers.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `.nth(0)` on a `std::iter::Iterator`, when `.next()` is equivalent [INFO] [stdout] --> src/my_str.rs:217:5 [INFO] [stdout] | [INFO] [stdout] 217 | headers.iter().filter(|line| line.to_ascii_lowercase().starts_with(&name.to_ascii_lowercase())).nth(0).map(|s| s[name.len()..].... [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try calling `.next()` instead of `.nth(0)`: `headers.iter().filter(|line| line.to_ascii_lowercase().starts_with(&name.to_ascii_lowercase())).next()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#iter_nth_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/my_str.rs:237:61 [INFO] [stdout] | [INFO] [stdout] 237 | let last_part = match regexp_for_last_part.captures(&body_part) { [INFO] [stdout] | ^^^^^^^^^^ help: change this to: `body_part` [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: length comparison to zero [INFO] [stdout] --> src/my_text_line_stream.rs:99:17 [INFO] [stdout] | [INFO] [stdout] 99 | assert!(pattern.len() > 0); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!pattern.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: needless call to `as_bytes` [INFO] [stdout] --> src/my_str.rs:248:108 [INFO] [stdout] | [INFO] [stdout] 248 | parts.iter().enumerate().for_each(|(index, s)| debug!("MIME multipart: part[{}]: {} bytes", index, s.as_bytes().len())); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ help: `len()` can be called directly on strings: `s.len()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_as_bytes [INFO] [stdout] = note: `#[warn(clippy::needless_as_bytes)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `GREETING` contains a capitalized acronym [INFO] [stdout] --> src/pop3_upstream.rs:25:5 [INFO] [stdout] | [INFO] [stdout] 25 | GREETING, [INFO] [stdout] | ^^^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Greeting` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `TRANSACTION` contains a capitalized acronym [INFO] [stdout] --> src/pop3_upstream.rs:28:5 [INFO] [stdout] | [INFO] [stdout] 28 | TRANSACTION, [INFO] [stdout] | ^^^^^^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Transaction` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `UPDATE` contains a capitalized acronym [INFO] [stdout] --> src/pop3_upstream.rs:29:5 [INFO] [stdout] | [INFO] [stdout] 29 | UPDATE, [INFO] [stdout] | ^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Update` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/my_text_line_stream.rs:99:17 [INFO] [stdout] | [INFO] [stdout] 99 | assert!(pattern.len() > 0); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!pattern.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/pop3_upstream.rs:224:13 [INFO] [stdout] | [INFO] [stdout] 224 | return Ok(POP3Response::Err(first_line)); [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] 224 - return Ok(POP3Response::Err(first_line)); [INFO] [stdout] 224 + Ok(POP3Response::Err(first_line)) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/pop3_upstream.rs:231:17 [INFO] [stdout] | [INFO] [stdout] 231 | return Ok(POP3Response::OkMultiLine(first_line, body)); [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] 231 - return Ok(POP3Response::OkMultiLine(first_line, body)); [INFO] [stdout] 231 + Ok(POP3Response::OkMultiLine(first_line, body)) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/pop3_upstream.rs:236:17 [INFO] [stdout] | [INFO] [stdout] 236 | return Ok(POP3Response::OkSingleLine(first_line)); [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] 236 - return Ok(POP3Response::OkSingleLine(first_line)); [INFO] [stdout] 236 + Ok(POP3Response::OkSingleLine(first_line)) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/pop3_upstream.rs:239:13 [INFO] [stdout] | [INFO] [stdout] 239 | return Err(anyhow!("detect invalid response (neither +OK nor -ERR): {}", String::from_utf8_lossy(&buf))); [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] 239 - return Err(anyhow!("detect invalid response (neither +OK nor -ERR): {}", String::from_utf8_lossy(&buf))); [INFO] [stdout] 239 + Err(anyhow!("detect invalid response (neither +OK nor -ERR): {}", String::from_utf8_lossy(&buf))) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this assertion is always `false` [INFO] [stdout] --> src/pop3_upstream.rs:193:17 [INFO] [stdout] | [INFO] [stdout] 193 | assert!(false); [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: replace this with `panic!()` or `unreachable!()` [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#assertions_on_constants [INFO] [stdout] = note: `#[warn(clippy::assertions_on_constants)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/pop3_upstream.rs:203:12 [INFO] [stdout] | [INFO] [stdout] 203 | if command.command_text.len() == 0 { // Greeting [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `command.command_text.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `GREETING` contains a capitalized acronym [INFO] [stdout] --> src/pop3_upstream.rs:25:5 [INFO] [stdout] | [INFO] [stdout] 25 | GREETING, [INFO] [stdout] | ^^^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Greeting` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `TRANSACTION` contains a capitalized acronym [INFO] [stdout] --> src/pop3_upstream.rs:28:5 [INFO] [stdout] | [INFO] [stdout] 28 | TRANSACTION, [INFO] [stdout] | ^^^^^^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Transaction` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: name `UPDATE` contains a capitalized acronym [INFO] [stdout] --> src/pop3_upstream.rs:29:5 [INFO] [stdout] | [INFO] [stdout] 29 | UPDATE, [INFO] [stdout] | ^^^^^^ help: consider making the acronym lowercase, except the initial letter: `Update` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/pop3_upstream.rs:224:13 [INFO] [stdout] | [INFO] [stdout] 224 | return Ok(POP3Response::Err(first_line)); [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] 224 - return Ok(POP3Response::Err(first_line)); [INFO] [stdout] 224 + Ok(POP3Response::Err(first_line)) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/pop3_upstream.rs:231:17 [INFO] [stdout] | [INFO] [stdout] 231 | return Ok(POP3Response::OkMultiLine(first_line, body)); [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] 231 - return Ok(POP3Response::OkMultiLine(first_line, body)); [INFO] [stdout] 231 + Ok(POP3Response::OkMultiLine(first_line, body)) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/pop3_upstream.rs:236:17 [INFO] [stdout] | [INFO] [stdout] 236 | return Ok(POP3Response::OkSingleLine(first_line)); [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] 236 - return Ok(POP3Response::OkSingleLine(first_line)); [INFO] [stdout] 236 + Ok(POP3Response::OkSingleLine(first_line)) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/pop3_upstream.rs:239:13 [INFO] [stdout] | [INFO] [stdout] 239 | return Err(anyhow!("detect invalid response (neither +OK nor -ERR): {}", String::from_utf8_lossy(&buf))); [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] 239 - return Err(anyhow!("detect invalid response (neither +OK nor -ERR): {}", String::from_utf8_lossy(&buf))); [INFO] [stdout] 239 + Err(anyhow!("detect invalid response (neither +OK nor -ERR): {}", String::from_utf8_lossy(&buf))) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this assertion is always `false` [INFO] [stdout] --> src/pop3_upstream.rs:193:17 [INFO] [stdout] | [INFO] [stdout] 193 | assert!(false); [INFO] [stdout] | ^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: replace this with `panic!()` or `unreachable!()` [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#assertions_on_constants [INFO] [stdout] = note: `#[warn(clippy::assertions_on_constants)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/pop3_upstream.rs:203:12 [INFO] [stdout] | [INFO] [stdout] 203 | if command.command_text.len() == 0 { // Greeting [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `command.command_text.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: explicit call to `.into_iter()` in function argument accepting `IntoIterator` [INFO] [stdout] --> src/main.rs:346:74 [INFO] [stdout] | [INFO] [stdout] 346 | let mail_list: Vec<(usize, String)> = mail_size_list.into_iter().zip(mail_uid_list.into_iter()).collect(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()` [INFO] [stdout] --> /rustc/3645249d79dfb136b5d8de3ce153d19d6698d92d/library/core/src/iter/traits/iterator.rs:629:11 [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_conversion [INFO] [stdout] help: consider removing the `.into_iter()` [INFO] [stdout] | [INFO] [stdout] 346 - let mail_list: Vec<(usize, String)> = mail_size_list.into_iter().zip(mail_uid_list.into_iter()).collect(); [INFO] [stdout] 346 + let mail_list: Vec<(usize, String)> = mail_size_list.into_iter().zip(mail_uid_list).collect(); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: explicit call to `.into_iter()` in function argument accepting `IntoIterator` [INFO] [stdout] --> src/main.rs:346:74 [INFO] [stdout] | [INFO] [stdout] 346 | let mail_list: Vec<(usize, String)> = mail_size_list.into_iter().zip(mail_uid_list.into_iter()).collect(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()` [INFO] [stdout] --> /rustc/3645249d79dfb136b5d8de3ce153d19d6698d92d/library/core/src/iter/traits/iterator.rs:629:11 [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_conversion [INFO] [stdout] help: consider removing the `.into_iter()` [INFO] [stdout] | [INFO] [stdout] 346 - let mail_list: Vec<(usize, String)> = mail_size_list.into_iter().zip(mail_uid_list.into_iter()).collect(); [INFO] [stdout] 346 + let mail_list: Vec<(usize, String)> = mail_size_list.into_iter().zip(mail_uid_list).collect(); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: useless use of `vec!` [INFO] [stdout] --> src/my_fubaco_header.rs:155:24 [INFO] [stdout] | [INFO] [stdout] 155 | let auth_results = vec![ [INFO] [stdout] | ________________________^ [INFO] [stdout] 156 | | format!("spf={}", spf_result.as_status()), [INFO] [stdout] 157 | | format!("dkim={}", dkim_result.as_status()), [INFO] [stdout] 158 | | format!("dmarc={}", dmarc_result.as_status()), [INFO] [stdout] 159 | | ]; [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_vec [INFO] [stdout] = note: `#[warn(clippy::useless_vec)]` on by default [INFO] [stdout] help: you can use an array directly [INFO] [stdout] | [INFO] [stdout] 155 ~ let auth_results = [format!("spf={}", spf_result.as_status()), [INFO] [stdout] 156 + format!("dkim={}", dkim_result.as_status()), [INFO] [stdout] 157 ~ format!("dmarc={}", dmarc_result.as_status())]; [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: useless use of `vec!` [INFO] [stdout] --> src/my_fubaco_header.rs:155:24 [INFO] [stdout] | [INFO] [stdout] 155 | let auth_results = vec![ [INFO] [stdout] | ________________________^ [INFO] [stdout] 156 | | format!("spf={}", spf_result.as_status()), [INFO] [stdout] 157 | | format!("dkim={}", dkim_result.as_status()), [INFO] [stdout] 158 | | format!("dmarc={}", dmarc_result.as_status()), [INFO] [stdout] 159 | | ]; [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_vec [INFO] [stdout] = note: `#[warn(clippy::useless_vec)]` on by default [INFO] [stdout] help: you can use an array directly [INFO] [stdout] | [INFO] [stdout] 155 ~ let auth_results = [format!("spf={}", spf_result.as_status()), [INFO] [stdout] 156 + format!("dkim={}", dkim_result.as_status()), [INFO] [stdout] 157 ~ format!("dmarc={}", dmarc_result.as_status())]; [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 36s [INFO] [stderr] warning: the following packages contain code that will be rejected by a future version of Rust: num-bigint-dig v0.8.4 [INFO] [stderr] note: to see what the problems were, use the option `--future-incompat-report`, or run `cargo report future-incompatibilities --id 7` [INFO] running `Command { std: "docker" "inspect" "d420415055ab476cc0e00abe09914b67b1f5f171c6331b080e07e3506c345aad", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "d420415055ab476cc0e00abe09914b67b1f5f171c6331b080e07e3506c345aad", kill_on_drop: false }` [INFO] [stdout] d420415055ab476cc0e00abe09914b67b1f5f171c6331b080e07e3506c345aad