aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/dependency_resolver/default_policy.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe/src/dependency_resolver/default_policy.rs')
-rw-r--r--crates/shirabe/src/dependency_resolver/default_policy.rs48
1 files changed, 22 insertions, 26 deletions
diff --git a/crates/shirabe/src/dependency_resolver/default_policy.rs b/crates/shirabe/src/dependency_resolver/default_policy.rs
index cc33b81..0c6b2fc 100644
--- a/crates/shirabe/src/dependency_resolver/default_policy.rs
+++ b/crates/shirabe/src/dependency_resolver/default_policy.rs
@@ -1,6 +1,5 @@
//! ref: composer/src/Composer/DependencyResolver/DefaultPolicy.php
-use std::any::Any;
use std::cell::RefCell;
use indexmap::IndexMap;
@@ -10,9 +9,8 @@ use shirabe_semver::constraint::SimpleConstraint;
use crate::dependency_resolver::PolicyInterface;
use crate::dependency_resolver::Pool;
-use crate::package::AliasPackage;
-use crate::package::PackageInterface;
-use crate::package::{BasePackage, STABILITIES};
+use crate::package::BasePackageHandle;
+use crate::package::STABILITIES;
use crate::util::Platform;
#[derive(Debug)]
@@ -46,14 +44,14 @@ impl DefaultPolicy {
pub fn compare_by_priority(
&self,
pool: &Pool,
- a: &dyn BasePackage,
- b: &dyn BasePackage,
+ a: &BasePackageHandle,
+ b: &BasePackageHandle,
required_package: Option<String>,
ignore_replace: bool,
) -> i64 {
- if PackageInterface::get_name(a) == PackageInterface::get_name(b) {
- let a_aliased = a.as_any().downcast_ref::<AliasPackage>().is_some();
- let b_aliased = b.as_any().downcast_ref::<AliasPackage>().is_some();
+ if a.get_name() == b.get_name() {
+ let a_aliased = a.as_alias().is_some();
+ let b_aliased = b.as_alias().is_some();
if a_aliased && !b_aliased {
return -1;
}
@@ -73,10 +71,8 @@ impl DefaultPolicy {
if let Some(ref required_package) = required_package {
if let Some(pos) = required_package.find('/') {
let required_vendor = &required_package[..pos];
- let a_is_same_vendor =
- PackageInterface::get_name(a).starts_with(required_vendor);
- let b_is_same_vendor =
- PackageInterface::get_name(b).starts_with(required_vendor);
+ let a_is_same_vendor = a.get_name().starts_with(required_vendor);
+ let b_is_same_vendor = b.get_name().starts_with(required_vendor);
if b_is_same_vendor != a_is_same_vendor {
return if a_is_same_vendor { -1 } else { 1 };
}
@@ -112,7 +108,7 @@ impl DefaultPolicy {
.iter()
.copied()
.filter(|&literal| {
- pool.literal_to_package(literal).get_version() == preferred_version
+ pool.literal_to_package(literal).get_version() == *preferred_version
})
.collect();
if !best_literals.is_empty() {
@@ -129,10 +125,10 @@ impl DefaultPolicy {
continue;
}
let package = pool.literal_to_package(literal);
- if self.version_compare(package, best_package, operator) {
+ if self.version_compare(&package, &best_package, operator) {
best_package = package;
best_literals = vec![literal];
- } else if self.version_compare(package, best_package, "==") {
+ } else if self.version_compare(&package, &best_package, "==") {
best_literals.push(literal);
}
}
@@ -144,7 +140,7 @@ impl DefaultPolicy {
for &literal in &literals {
let package = pool.literal_to_package(literal);
- if let Some(alias_pkg) = package.as_any().downcast_ref::<AliasPackage>() {
+ if let Some(alias_pkg) = package.as_alias() {
if alias_pkg.is_root_package_alias() {
has_local_alias = true;
break;
@@ -159,7 +155,7 @@ impl DefaultPolicy {
let mut selected = vec![];
for &literal in &literals {
let package = pool.literal_to_package(literal);
- if let Some(alias_pkg) = package.as_any().downcast_ref::<AliasPackage>() {
+ if let Some(alias_pkg) = package.as_alias() {
if alias_pkg.is_root_package_alias() {
selected.push(literal);
}
@@ -168,9 +164,9 @@ impl DefaultPolicy {
selected
}
- pub(crate) fn replaces(&self, source: &dyn BasePackage, target: &dyn BasePackage) -> bool {
+ pub(crate) fn replaces(&self, source: &BasePackageHandle, target: &BasePackageHandle) -> bool {
for link in source.get_replaces().values() {
- if link.get_target() == target.get_name() {
+ if link.get_target() == target.get_name().as_str() {
return true;
}
}
@@ -181,8 +177,8 @@ impl DefaultPolicy {
impl PolicyInterface for DefaultPolicy {
fn version_compare(
&self,
- a: &dyn PackageInterface,
- b: &dyn PackageInterface,
+ a: &BasePackageHandle,
+ b: &BasePackageHandle,
operator: &str,
) -> bool {
if self.prefer_stable {
@@ -267,8 +263,8 @@ impl PolicyInterface for DefaultPolicy {
}
let result = self.compare_by_priority(
pool,
- pool.literal_to_package(a),
- pool.literal_to_package(b),
+ &pool.literal_to_package(a),
+ &pool.literal_to_package(b),
required_package.clone(),
true,
);
@@ -300,8 +296,8 @@ impl PolicyInterface for DefaultPolicy {
}
let result = self.compare_by_priority(
pool,
- pool.literal_to_package(a),
- pool.literal_to_package(b),
+ &pool.literal_to_package(a),
+ &pool.literal_to_package(b),
required_package.clone(),
false,
);