aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/mozart-registry/src/version_selector.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/mozart-registry/src/version_selector.rs')
-rw-r--r--crates/mozart-registry/src/version_selector.rs48
1 files changed, 48 insertions, 0 deletions
diff --git a/crates/mozart-registry/src/version_selector.rs b/crates/mozart-registry/src/version_selector.rs
new file mode 100644
index 0000000..7aa409e
--- /dev/null
+++ b/crates/mozart-registry/src/version_selector.rs
@@ -0,0 +1,48 @@
+use crate::cache::Cache;
+use crate::packagist::{self, PackagistVersion};
+use crate::version;
+use mozart_core::package::Stability;
+
+/// Mirrors `Composer\Package\Version\VersionSelector`.
+pub struct VersionSelector {
+ preferred_stability: Stability,
+ repo_cache: Cache,
+}
+
+impl VersionSelector {
+ pub fn new(preferred_stability: Stability, repo_cache: Cache) -> Self {
+ Self {
+ preferred_stability,
+ repo_cache,
+ }
+ }
+
+ /// Fetch versions from Packagist and pick the best candidate.
+ /// Mirrors `VersionSelector::findBestCandidate()`.
+ pub async fn find_best_candidate(
+ &self,
+ package_name: &str,
+ ) -> anyhow::Result<Option<PackagistVersion>> {
+ let versions = packagist::fetch_package_versions(package_name, &self.repo_cache).await?;
+ Ok(version::find_best_candidate(&versions, self.preferred_stability).cloned())
+ }
+
+ /// Generate a recommended constraint string from a concrete version.
+ /// Mirrors `VersionSelector::findRecommendedRequireVersion()`.
+ pub fn find_recommended_require_version_string(
+ &self,
+ pkg: &PackagistVersion,
+ fixed: bool,
+ ) -> String {
+ if fixed {
+ pkg.version.clone()
+ } else {
+ let stability = version::stability_of(&pkg.version_normalized);
+ version::find_recommended_require_version(
+ &pkg.version,
+ &pkg.version_normalized,
+ stability,
+ )
+ }
+ }
+}