From 603955b84833ea20236f57c38755e68468da2002 Mon Sep 17 00:00:00 2001
From: Jiahao XU <Jiahao_XU@outlook.com>
Date: Tue, 7 Jun 2022 15:11:04 +1000
Subject: [PATCH 1/3] Support for checking multi-targets

Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>
---
 src/main.rs | 24 +++++++++++++++---------
 1 file changed, 15 insertions(+), 9 deletions(-)

diff --git a/src/main.rs b/src/main.rs
index a9479a2d..8cdf4e72 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -217,18 +217,24 @@ async fn entry() -> Result<()> {
         .join(format!("pkg-{}.{}", opts.name, meta.pkg_fmt));
     debug!("Using temporary download path: {}", pkg_path.display());
 
-    let fetcher_data = Data {
-        name: package.name.clone(),
-        target: opts.target.clone(),
-        version: package.version.clone(),
-        repo: package.repository.clone(),
-        meta: meta.clone(),
-    };
+    let fetcher_data: Vec<_> = detect_targets()
+        .await
+        .into_iter()
+        .map(|target| Data {
+            name: package.name.clone(),
+            target: target.into(),
+            version: package.version.clone(),
+            repo: package.repository.clone(),
+            meta: meta.clone(),
+        })
+        .collect();
 
     // Try github releases, then quickinstall
     let mut fetchers = MultiFetcher::default();
-    fetchers.add(GhCrateMeta::new(&fetcher_data).await);
-    fetchers.add(QuickInstall::new(&fetcher_data).await);
+    for data in &fetcher_data {
+        fetchers.add(GhCrateMeta::new(data).await);
+        fetchers.add(QuickInstall::new(data).await);
+    }
 
     match fetchers.first_available().await {
         Some(fetcher) => {

From 3f2e03893a5159057764087ad15881113c98b519 Mon Sep 17 00:00:00 2001
From: Jiahao XU <Jiahao_XU@outlook.com>
Date: Tue, 7 Jun 2022 16:35:47 +1000
Subject: [PATCH 2/3] Add `Fetcher::target` to trait `Fetcher`

Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>
---
 src/fetchers.rs               | 3 +++
 src/fetchers/gh_crate_meta.rs | 4 ++++
 src/fetchers/quickinstall.rs  | 8 +++++++-
 3 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/src/fetchers.rs b/src/fetchers.rs
index b7b25795..9b6df316 100644
--- a/src/fetchers.rs
+++ b/src/fetchers.rs
@@ -30,6 +30,9 @@ pub trait Fetcher {
 
     /// Should return true if the remote is from a third-party source
     fn is_third_party(&self) -> bool;
+
+    /// Return the target for this fetcher
+    fn target(&self) -> &str;
 }
 
 /// Data required to fetch a package
diff --git a/src/fetchers/gh_crate_meta.rs b/src/fetchers/gh_crate_meta.rs
index f048bb87..1c096189 100644
--- a/src/fetchers/gh_crate_meta.rs
+++ b/src/fetchers/gh_crate_meta.rs
@@ -66,6 +66,10 @@ impl super::Fetcher for GhCrateMeta {
     fn is_third_party(&self) -> bool {
         false
     }
+
+    fn target(&self) -> &str {
+        &self.data.target
+    }
 }
 
 /// Template for constructing download paths
diff --git a/src/fetchers/quickinstall.rs b/src/fetchers/quickinstall.rs
index 61871e5c..1d500647 100644
--- a/src/fetchers/quickinstall.rs
+++ b/src/fetchers/quickinstall.rs
@@ -13,6 +13,7 @@ const USER_AGENT: &str = concat!(env!("CARGO_PKG_NAME"), "/", env!("CARGO_PKG_VE
 
 pub struct QuickInstall {
     package: String,
+    target: String,
 }
 
 #[async_trait::async_trait]
@@ -20,9 +21,10 @@ impl super::Fetcher for QuickInstall {
     async fn new(data: &Data) -> Box<Self> {
         let crate_name = &data.name;
         let version = &data.version;
-        let target = &data.target;
+        let target = data.target.clone();
         Box::new(Self {
             package: format!("{crate_name}-{version}-{target}"),
+            target,
         })
     }
 
@@ -50,6 +52,10 @@ impl super::Fetcher for QuickInstall {
     fn is_third_party(&self) -> bool {
         true
     }
+
+    fn target(&self) -> &str {
+        &self.target
+    }
 }
 
 impl QuickInstall {

From ad3e707aa36f4d8f9e05af199f299d400ebd5242 Mon Sep 17 00:00:00 2001
From: Jiahao XU <Jiahao_XU@outlook.com>
Date: Tue, 7 Jun 2022 16:37:04 +1000
Subject: [PATCH 3/3] Fix `install_from_package`: Rm use of `opts.target`

Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>
---
 src/main.rs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/main.rs b/src/main.rs
index 8cdf4e72..e282004a 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -341,7 +341,7 @@ async fn install_from_package(
     // based on those found via Cargo.toml
     let bin_data = bins::Data {
         name: package.name.clone(),
-        target: opts.target.clone(),
+        target: fetcher.target().to_string(),
         version: package.version.clone(),
         repo: package.repository.clone(),
         meta,