diff --git a/src/fetchers.rs b/src/fetchers.rs index b532d1e3..24fbf502 100644 --- a/src/fetchers.rs +++ b/src/fetchers.rs @@ -32,6 +32,9 @@ pub trait Fetcher: Send + Sync { /// 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 0fe37c7d..e38d7ae1 100644 --- a/src/fetchers/gh_crate_meta.rs +++ b/src/fetchers/gh_crate_meta.rs @@ -67,6 +67,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 844ae85e..e433194c 100644 --- a/src/fetchers/quickinstall.rs +++ b/src/fetchers/quickinstall.rs @@ -14,6 +14,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] @@ -21,9 +22,10 @@ impl super::Fetcher for QuickInstall { async fn new(data: &Data) -> Arc { let crate_name = &data.name; let version = &data.version; - let target = &data.target; + let target = data.target.clone(); Arc::new(Self { package: format!("{crate_name}-{version}-{target}"), + target, }) } @@ -51,6 +53,10 @@ impl super::Fetcher for QuickInstall { fn is_third_party(&self) -> bool { true } + + fn target(&self) -> &str { + &self.target + } } impl QuickInstall { diff --git a/src/main.rs b/src/main.rs index e8ca8554..3d04fd3d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -225,18 +225,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) => { @@ -343,7 +349,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,