From ac74da4a27e090a6077b7f2487e792737aa5eda4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fe=CC=81lix=20Saparelli?= <felix@passcod.name>
Date: Wed, 1 Jun 2022 00:47:32 +1200
Subject: [PATCH 1/5] Clippy suggestions

---
 src/drivers.rs                |  4 ++--
 src/fetchers.rs               |  6 ++++--
 src/fetchers/gh_crate_meta.rs |  2 +-
 src/helpers.rs                |  4 ++--
 src/lib.rs                    | 20 +++++---------------
 src/main.rs                   |  6 +++---
 6 files changed, 17 insertions(+), 25 deletions(-)

diff --git a/src/drivers.rs b/src/drivers.rs
index 7b39bd10..1ca2ed3f 100644
--- a/src/drivers.rs
+++ b/src/drivers.rs
@@ -22,7 +22,7 @@ fn find_version<'a, V: Iterator<Item = &'a String>>(
     let filtered: BTreeSet<_> = version_iter
         .filter_map(|v| {
             // Remove leading `v` for git tags
-            let ver_str = match v.strip_prefix("s") {
+            let ver_str = match v.strip_prefix('s') {
                 Some(v) => v,
                 None => v,
             };
@@ -47,7 +47,7 @@ fn find_version<'a, V: Iterator<Item = &'a String>>(
         .iter()
         .max()
         .cloned()
-        .ok_or_else(|| BinstallError::VersionMismatch { req: version_req })
+        .ok_or(BinstallError::VersionMismatch { req: version_req })
 }
 
 /// Fetch a crate by name and version from crates.io
diff --git a/src/fetchers.rs b/src/fetchers.rs
index 44fdf57e..b7b25795 100644
--- a/src/fetchers.rs
+++ b/src/fetchers.rs
@@ -54,14 +54,16 @@ impl MultiFetcher {
 
     pub async fn first_available(&self) -> Option<&dyn Fetcher> {
         for fetcher in &self.fetchers {
-            if fetcher.check().await.unwrap_or_else(|err| {
+            let available = fetcher.check().await.unwrap_or_else(|err| {
                 debug!(
                     "Error while checking fetcher {}: {}",
                     fetcher.source_name(),
                     err
                 );
                 false
-            }) {
+            });
+
+            if available {
                 return Some(&**fetcher);
             }
         }
diff --git a/src/fetchers/gh_crate_meta.rs b/src/fetchers/gh_crate_meta.rs
index c8b4e60d..e9a7634a 100644
--- a/src/fetchers/gh_crate_meta.rs
+++ b/src/fetchers/gh_crate_meta.rs
@@ -16,7 +16,7 @@ impl GhCrateMeta {
     fn url(&self) -> Result<Url, BinstallError> {
         let ctx = Context::from_data(&self.data);
         debug!("Using context: {:?}", ctx);
-        Ok(ctx.render_url(&self.data.meta.pkg_url)?)
+        ctx.render_url(&self.data.meta.pkg_url)
     }
 }
 
diff --git a/src/helpers.rs b/src/helpers.rs
index c1ffcec0..6f160391 100644
--- a/src/helpers.rs
+++ b/src/helpers.rs
@@ -194,7 +194,7 @@ pub fn get_install_path<P: AsRef<Path>>(install_path: Option<P>) -> Option<PathB
     // Local executable dir if no cargo is found
     if let Some(d) = dirs::executable_dir() {
         debug!("Fallback to {}", d.display());
-        return Some(d.into());
+        return Some(d);
     }
 
     None
@@ -226,7 +226,7 @@ pub trait Template: Serialize {
         let mut tt = TinyTemplate::new();
 
         // Add template to instance
-        tt.add_template("path", &template)?;
+        tt.add_template("path", template)?;
 
         // Render output
         Ok(tt.render("path", self)?)
diff --git a/src/lib.rs b/src/lib.rs
index 1fa840b1..2a823625 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -16,14 +16,14 @@ pub mod bins;
 pub mod fetchers;
 
 /// Compiled target triple, used as default for binary fetching
-pub const TARGET: &'static str = env!("TARGET");
+pub const TARGET: &str = env!("TARGET");
 
 /// Default package path template (may be overridden in package Cargo.toml)
-pub const DEFAULT_PKG_URL: &'static str =
+pub const DEFAULT_PKG_URL: &str =
     "{ repo }/releases/download/v{ version }/{ name }-{ target }-v{ version }.{ archive-format }";
 
 /// Default binary name template (may be overridden in package Cargo.toml)
-pub const DEFAULT_BIN_DIR: &'static str = "{ name }-{ target }-v{ version }/{ bin }{ binary-ext }";
+pub const DEFAULT_BIN_DIR: &str = "{ name }-{ target }-v{ version }/{ bin }{ binary-ext }";
 
 /// Binary format enumeration
 #[derive(
@@ -113,7 +113,7 @@ impl PkgMeta {
 /// Target specific overrides for binary installation
 ///
 /// Exposed via `[package.metadata.TARGET]` in `Cargo.toml`
-#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
 #[serde(rename_all = "kebab-case", default)]
 pub struct PkgOverride {
     /// URL template override for package downloads
@@ -126,16 +126,6 @@ pub struct PkgOverride {
     pub bin_dir: Option<String>,
 }
 
-impl Default for PkgOverride {
-    fn default() -> Self {
-        Self {
-            pkg_url: None,
-            pkg_fmt: None,
-            bin_dir: None,
-        }
-    }
-}
-
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
 #[serde(rename_all = "kebab-case")]
 pub struct BinMeta {
@@ -164,7 +154,7 @@ mod test {
 
         let manifest = load_manifest_path(&manifest_dir).expect("Error parsing metadata");
         let package = manifest.package.unwrap();
-        let meta = package.metadata.map(|m| m.binstall).flatten().unwrap();
+        let meta = package.metadata.and_then(|m| m.binstall).unwrap();
 
         assert_eq!(&package.name, "cargo-binstall");
 
diff --git a/src/main.rs b/src/main.rs
index 000ae381..a9479a2d 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -191,9 +191,8 @@ async fn entry() -> Result<()> {
         package
             .metadata
             .as_ref()
-            .map(|m| m.binstall.clone())
-            .flatten()
-            .unwrap_or(PkgMeta::default()),
+            .and_then(|m| m.binstall.clone())
+            .unwrap_or_default(),
         manifest.bin,
     );
 
@@ -254,6 +253,7 @@ async fn entry() -> Result<()> {
     }
 }
 
+#[allow(clippy::too_many_arguments)]
 async fn install_from_package(
     binaries: Vec<Product>,
     fetcher: &dyn Fetcher,

From f2905dd46e68f41675f3d7fe777d4b02588eab14 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?F=C3=A9lix=20Saparelli?= <felix@passcod.name>
Date: Wed, 1 Jun 2022 00:59:00 +1200
Subject: [PATCH 2/5] Update src/helpers.rs

Co-authored-by: Jiahao XU <Jiahao_XU@outlook.com>
---
 src/helpers.rs | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/src/helpers.rs b/src/helpers.rs
index 6f160391..a9795ffe 100644
--- a/src/helpers.rs
+++ b/src/helpers.rs
@@ -192,7 +192,13 @@ pub fn get_install_path<P: AsRef<Path>>(install_path: Option<P>) -> Option<PathB
     }
 
     // Local executable dir if no cargo is found
-    if let Some(d) = dirs::executable_dir() {
+    let dir = dirs::executable_dir();
+    
+    if let Some(d) = &dir {
+        debug!("Fallback to {}", d.display());
+    }
+
+    dir
         debug!("Fallback to {}", d.display());
         return Some(d);
     }

From 7ce1ac4ee6ed5d0cf62371d3bef118e536eb13de Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fe=CC=81lix=20Saparelli?= <felix@passcod.name>
Date: Wed, 1 Jun 2022 01:00:33 +1200
Subject: [PATCH 3/5] Fix syntax

---
 src/helpers.rs | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/src/helpers.rs b/src/helpers.rs
index a9795ffe..e0d85b99 100644
--- a/src/helpers.rs
+++ b/src/helpers.rs
@@ -193,17 +193,12 @@ pub fn get_install_path<P: AsRef<Path>>(install_path: Option<P>) -> Option<PathB
 
     // Local executable dir if no cargo is found
     let dir = dirs::executable_dir();
-    
+
     if let Some(d) = &dir {
         debug!("Fallback to {}", d.display());
     }
 
     dir
-        debug!("Fallback to {}", d.display());
-        return Some(d);
-    }
-
-    None
 }
 
 pub fn confirm() -> Result<(), BinstallError> {

From 23f05f39855430b7c775d116cbd472f25d332760 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fe=CC=81lix=20Saparelli?= <felix@passcod.name>
Date: Wed, 1 Jun 2022 01:03:52 +1200
Subject: [PATCH 4/5] Clippy in tests

---
 src/fetchers/gh_crate_meta.rs | 45 ++++++++++++++++++++++++-----------
 1 file changed, 31 insertions(+), 14 deletions(-)

diff --git a/src/fetchers/gh_crate_meta.rs b/src/fetchers/gh_crate_meta.rs
index e9a7634a..fdf655e7 100644
--- a/src/fetchers/gh_crate_meta.rs
+++ b/src/fetchers/gh_crate_meta.rs
@@ -157,8 +157,11 @@ mod test {
 
     #[test]
     fn no_repo_but_full_url() {
-        let mut meta = PkgMeta::default();
-        meta.pkg_url = format!("https://example.com{}", meta.pkg_url);
+        let meta = PkgMeta {
+            pkg_url: format!("https://example.com{}", PkgMeta::default().pkg_url),
+            ..Default::default()
+        };
+
         let data = Data {
             name: "cargo-binstall".to_string(),
             target: "x86_64-unknown-linux-gnu".to_string(),
@@ -176,8 +179,13 @@ mod test {
 
     #[test]
     fn different_url() {
-        let mut meta = PkgMeta::default();
-        meta.pkg_url = "{ repo }/releases/download/v{ version }/sx128x-util-{ target }-v{ version }.{ archive-format }".to_string();
+        let meta = PkgMeta {
+            pkg_url:
+            "{ repo }/releases/download/v{ version }/sx128x-util-{ target }-v{ version }.{ archive-format }"
+                .into(),
+            ..Default::default()
+        };
+
         let data = Data {
             name: "radio-sx128x".to_string(),
             target: "x86_64-unknown-linux-gnu".to_string(),
@@ -195,8 +203,11 @@ mod test {
 
     #[test]
     fn deprecated_format() {
-        let mut meta = PkgMeta::default();
-        meta.pkg_url = "{ repo }/releases/download/v{ version }/sx128x-util-{ target }-v{ version }.{ format }".to_string();
+        let meta = PkgMeta {
+            pkg_url: "{ repo }/releases/download/v{ version }/sx128x-util-{ target }-v{ version }.{ format }".into(),
+            ..Default::default()
+        };
+
         let data = Data {
             name: "radio-sx128x".to_string(),
             target: "x86_64-unknown-linux-gnu".to_string(),
@@ -214,11 +225,14 @@ mod test {
 
     #[test]
     fn different_ext() {
-        let mut meta = PkgMeta::default();
-        meta.pkg_url =
-            "{ repo }/releases/download/v{ version }/{ name }-v{ version }-{ target }.tar.xz"
-                .to_string();
-        meta.pkg_fmt = PkgFmt::Txz;
+        let meta = PkgMeta {
+            pkg_url:
+                "{ repo }/releases/download/v{ version }/{ name }-v{ version }-{ target }.tar.xz"
+                    .into(),
+            pkg_fmt: PkgFmt::Txz,
+            ..Default::default()
+        };
+
         let data = Data {
             name: "cargo-watch".to_string(),
             target: "aarch64-apple-darwin".to_string(),
@@ -236,9 +250,12 @@ mod test {
 
     #[test]
     fn no_archive() {
-        let mut meta = PkgMeta::default();
-        meta.pkg_url = "{ repo }/releases/download/v{ version }/{ name }-v{ version }-{ target }{ binary-ext }".to_string();
-        meta.pkg_fmt = PkgFmt::Bin;
+        let meta = PkgMeta {
+            pkg_url: "{ repo }/releases/download/v{ version }/{ name }-v{ version }-{ target }{ binary-ext }".into(),
+            pkg_fmt: PkgFmt::Bin,
+            ..Default::default()
+        };
+
         let data = Data {
             name: "cargo-watch".to_string(),
             target: "aarch64-pc-windows-msvc".to_string(),

From e3754de7f72399dac0d187701ac0d2a42f850ccb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fe=CC=81lix=20Saparelli?= <felix@passcod.name>
Date: Wed, 1 Jun 2022 01:11:53 +1200
Subject: [PATCH 5/5] Formatting

---
 src/fetchers/gh_crate_meta.rs | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/fetchers/gh_crate_meta.rs b/src/fetchers/gh_crate_meta.rs
index fdf655e7..f048bb87 100644
--- a/src/fetchers/gh_crate_meta.rs
+++ b/src/fetchers/gh_crate_meta.rs
@@ -30,7 +30,9 @@ impl super::Fetcher for GhCrateMeta {
         let url = self.url()?;
 
         if url.scheme() != "https" {
-            warn!("URL is not HTTPS! This may become a hard error in the future, tell the upstream!");
+            warn!(
+                "URL is not HTTPS! This may become a hard error in the future, tell the upstream!"
+            );
         }
 
         info!("Checking for package at: '{url}'");