mod archive;
mod binstall;
mod github;
mod gitlab;
mod quickinstall;
pub(super) use archive::{ArchiveFormat, extract_binary};
pub(super) use binstall::BinstallProvider;
pub(super) use github::GithubProvider;
pub(super) use gitlab::GitlabProvider;
pub(super) use quickinstall::QuickinstallProvider;
use crate::{Result, bin_resolver::ResolvedBinary, downloader::DownloadedCrate};
pub(super) trait Provider {
fn try_resolve(&self, krate: &DownloadedCrate, platform: &str) -> Result<Option<ResolvedBinary>>;
}
pub(super) struct CandidateFilename {
pub filename: String,
pub format: ArchiveFormat,
}
pub(super) fn generate_candidate_filenames(
name: &str,
version: &str,
platform: &str,
) -> Vec<CandidateFilename> {
let formats = ArchiveFormat::all_formats();
let mut candidates = Vec::new();
for &(format, suffix) in formats {
push_candidate_patterns(&mut candidates, name, version, platform, format, suffix);
}
if platform.contains("windows") {
let exe_name = format!("{}.exe", name);
for &(format, suffix) in formats {
push_candidate_patterns(&mut candidates, &exe_name, version, platform, format, suffix);
}
}
candidates
}
fn push_candidate_patterns(
candidates: &mut Vec<CandidateFilename>,
name: &str,
version: &str,
platform: &str,
format: ArchiveFormat,
suffix: &str,
) {
candidates.push(CandidateFilename {
filename: format!("{}-{}-v{}{}", name, platform, version, suffix),
format,
});
candidates.push(CandidateFilename {
filename: format!("{}-{}-{}{}", name, platform, version, suffix),
format,
});
candidates.push(CandidateFilename {
filename: format!("{}-v{}-{}{}", name, version, platform, suffix),
format,
});
candidates.push(CandidateFilename {
filename: format!("{}-{}-{}{}", name, version, platform, suffix),
format,
});
candidates.push(CandidateFilename {
filename: format!("{}_{}_v{}{}", name, platform, version, suffix),
format,
});
candidates.push(CandidateFilename {
filename: format!("{}_{}_{}{}", name, platform, version, suffix),
format,
});
candidates.push(CandidateFilename {
filename: format!("{}_v{}_{}{}", name, version, platform, suffix),
format,
});
candidates.push(CandidateFilename {
filename: format!("{}_{}_{}{}", name, version, platform, suffix),
format,
});
candidates.push(CandidateFilename {
filename: format!("{}-{}{}", name, platform, suffix),
format,
});
candidates.push(CandidateFilename {
filename: format!("{}_{}{}", name, platform, suffix),
format,
});
}