aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/dependency_resolver/rule.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe/src/dependency_resolver/rule.rs')
-rw-r--r--crates/shirabe/src/dependency_resolver/rule.rs105
1 files changed, 48 insertions, 57 deletions
diff --git a/crates/shirabe/src/dependency_resolver/rule.rs b/crates/shirabe/src/dependency_resolver/rule.rs
index fbc8521..afb0318 100644
--- a/crates/shirabe/src/dependency_resolver/rule.rs
+++ b/crates/shirabe/src/dependency_resolver/rule.rs
@@ -22,6 +22,7 @@ use crate::dependency_resolver::Rule2Literals;
use crate::dependency_resolver::RuleSet;
use crate::package::AliasPackage;
use crate::package::BasePackage;
+use crate::package::BasePackageHandle;
use crate::package::Link;
use crate::package::PackageInterface;
use crate::package::version::VersionParser;
@@ -31,7 +32,7 @@ use crate::repository::RepositorySet;
#[derive(Debug)]
pub enum ReasonData {
Link(Link),
- BasePackage(Box<dyn BasePackage>),
+ BasePackage(BasePackageHandle),
String(String),
Int(i64),
RootRequire {
@@ -39,7 +40,7 @@ pub enum ReasonData {
constraint: AnyConstraint,
},
Fixed {
- package: Box<dyn BasePackage>,
+ package: BasePackageHandle,
},
/// Phase B placeholder for an arbitrary PHP-side value not yet mapped to a real variant.
Mixed(PhpMixed),
@@ -231,9 +232,9 @@ impl Rule {
// TODO(phase-b): Request::get_locked_repository() signature
let locked_repo: Option<()> = todo!("request.get_locked_repository()");
if let Some(_locked_repo) = locked_repo {
- let packages: Vec<Box<dyn BasePackage>> = todo!("locked_repo.get_packages()");
+ let packages: Vec<BasePackageHandle> = todo!("locked_repo.get_packages()");
for package in packages {
- let p: &dyn BasePackage = todo!("package as BasePackage reference");
+ let p: &BasePackageHandle = &package;
if p.get_name() == link.get_target() {
if pool.is_unacceptable_fixed_or_locked_package(p) {
return true;
@@ -272,10 +273,10 @@ impl Rule {
// TODO(phase-b): Request::get_locked_repository() signature
let locked_repo: Option<()> = todo!("request.get_locked_repository()");
if let Some(_locked_repo) = locked_repo {
- let packages: Vec<Box<dyn BasePackage>> = todo!("locked_repo.get_packages()");
+ let packages: Vec<BasePackageHandle> = todo!("locked_repo.get_packages()");
for package in packages {
- let p: &dyn BasePackage = todo!("package as BasePackage reference");
- if p.get_name() == package_name {
+ let p: &BasePackageHandle = &package;
+ if p.get_name() == *package_name {
if pool.is_unacceptable_fixed_or_locked_package(p) {
return true;
}
@@ -300,17 +301,15 @@ impl Rule {
}
/// @internal
- pub fn get_source_package(&self, pool: &Pool) -> Result<Box<dyn BasePackage>> {
+ pub fn get_source_package(&self, pool: &Pool) -> Result<BasePackageHandle> {
let literals = self.get_literals();
match self.get_reason() {
r if r == RULE_PACKAGE_CONFLICT => {
- let mut package1 = self.deduplicate_default_branch_alias(
- pool.literal_to_package(literals[0]).clone_box(),
- );
- let mut package2 = self.deduplicate_default_branch_alias(
- pool.literal_to_package(literals[1]).clone_box(),
- );
+ let mut package1 =
+ self.deduplicate_default_branch_alias(pool.literal_to_package(literals[0]));
+ let mut package2 =
+ self.deduplicate_default_branch_alias(pool.literal_to_package(literals[1]));
let reason_data = self.get_reason_data();
// swap literals if they are not in the right order with package2 being the conflicter
@@ -325,9 +324,8 @@ impl Rule {
r if r == RULE_PACKAGE_REQUIRES => {
let source_literal = literals[0];
- let source_package = self.deduplicate_default_branch_alias(
- pool.literal_to_package(source_literal).clone_box(),
- );
+ let source_package =
+ self.deduplicate_default_branch_alias(pool.literal_to_package(source_literal));
Ok(source_package)
}
@@ -348,7 +346,7 @@ impl Rule {
request: &Request,
pool: &mut Pool,
is_verbose: bool,
- installed_map: &IndexMap<String, Box<dyn BasePackage>>,
+ installed_map: &IndexMap<String, BasePackageHandle>,
_learned_pool: &Vec<Vec<Rc<RefCell<Rule>>>>,
) -> String {
let mut literals = self.get_literals();
@@ -373,10 +371,10 @@ impl Rule {
);
}
- let packages_non_alias: Vec<Box<dyn BasePackage>> = packages
+ let packages_non_alias: Vec<BasePackageHandle> = packages
.iter()
- .filter(|p| p.as_any().downcast_ref::<AliasPackage>().is_none())
- .map(|p| p.clone_box())
+ .filter(|p| p.as_alias().is_none())
+ .map(|p| p.clone())
.collect();
if packages_non_alias.len() == 1 {
let package = &packages_non_alias[0];
@@ -396,7 +394,7 @@ impl Rule {
constraint.get_pretty_string(),
self.format_packages_unique_from_packages(
pool,
- packages,
+ packages.iter().map(|p| p.clone()).collect(),
is_verbose,
Some(constraint),
false
@@ -406,7 +404,7 @@ impl Rule {
r if r == RULE_FIXED => {
let package_in = match self.get_reason_data() {
- ReasonData::Fixed { package } => package.clone_box(),
+ ReasonData::Fixed { package } => package.clone(),
_ => return String::new(),
};
let package = self.deduplicate_default_branch_alias(package_in);
@@ -427,12 +425,10 @@ impl Rule {
}
r if r == RULE_PACKAGE_CONFLICT => {
- let mut package1 = self.deduplicate_default_branch_alias(
- pool.literal_to_package(literals[0]).clone_box(),
- );
- let mut package2 = self.deduplicate_default_branch_alias(
- pool.literal_to_package(literals[1]).clone_box(),
- );
+ let mut package1 =
+ self.deduplicate_default_branch_alias(pool.literal_to_package(literals[0]));
+ let mut package2 =
+ self.deduplicate_default_branch_alias(pool.literal_to_package(literals[1]));
let mut conflict_target = package1.get_pretty_string();
let reason_data = self.get_reason_data();
@@ -495,21 +491,21 @@ impl Rule {
r if r == RULE_PACKAGE_REQUIRES => {
assert!(literals.len() > 0);
let source_literal = array_shift(&mut literals).unwrap();
- let source_package = self.deduplicate_default_branch_alias(
- pool.literal_to_package(source_literal).clone_box(),
- );
+ let source_package =
+ self.deduplicate_default_branch_alias(pool.literal_to_package(source_literal));
let reason_data = self.get_reason_data();
let link = match reason_data {
ReasonData::Link(l) => l,
_ => return String::new(),
};
- let mut requires: Vec<Box<dyn BasePackage>> = vec![];
+ let mut requires: Vec<BasePackageHandle> = vec![];
for literal in &literals {
- requires.push(pool.literal_to_package(*literal).clone_box());
+ requires.push(pool.literal_to_package(*literal));
}
- let text = link.get_pretty_string(&*source_package);
+ let text =
+ link.get_pretty_string(source_package.as_rc().borrow().as_package_interface());
if requires.len() > 0 {
format!(
"{} -> satisfiable by {}.",
@@ -573,13 +569,13 @@ impl Rule {
reason_str
};
- let mut installed_packages: Vec<Box<dyn BasePackage>> = vec![];
- let mut removable_packages: Vec<Box<dyn BasePackage>> = vec![];
+ let mut installed_packages: Vec<BasePackageHandle> = vec![];
+ let mut removable_packages: Vec<BasePackageHandle> = vec![];
for literal in &literals {
if installed_map.contains_key(&abs(*literal).to_string()) {
- installed_packages.push(pool.literal_to_package(*literal).clone_box());
+ installed_packages.push(pool.literal_to_package(*literal));
} else {
- removable_packages.push(pool.literal_to_package(*literal).clone_box());
+ removable_packages.push(pool.literal_to_package(*literal));
}
}
@@ -628,7 +624,7 @@ impl Rule {
let rule_text = if literals.len() == 1 {
pool.literal_to_pretty_string(literals[0], &installed_map)
} else {
- let mut groups: IndexMap<String, Vec<Box<dyn BasePackage>>> = IndexMap::new();
+ let mut groups: IndexMap<String, Vec<BasePackageHandle>> = IndexMap::new();
for literal in &literals {
let package = pool.literal_to_package(*literal);
let group = if installed_map.contains_key(&package.id().to_string()) {
@@ -644,7 +640,7 @@ impl Rule {
groups
.entry(group.to_string())
.or_insert_with(Vec::new)
- .push(self.deduplicate_default_branch_alias(package.clone_box()));
+ .push(self.deduplicate_default_branch_alias(package.clone()));
}
let mut rule_texts: Vec<String> = vec![];
for (group, packages) in &groups {
@@ -654,7 +650,7 @@ impl Rule {
if packages.len() > 1 { " one of" } else { "" },
self.format_packages_unique_from_packages(
pool,
- packages.iter().map(|p| p.clone_box()).collect(),
+ packages.iter().map(|p| p.clone()).collect(),
is_verbose,
None,
false,
@@ -674,9 +670,8 @@ impl Rule {
if alias_package.get_version() == VersionParser::DEFAULT_BRANCH_ALIAS {
return String::new();
}
- let package = self.deduplicate_default_branch_alias(
- pool.literal_to_package(literals[1]).clone_box(),
- );
+ let package =
+ self.deduplicate_default_branch_alias(pool.literal_to_package(literals[1]));
format!(
"{} is an alias of {} and thus requires it to be installed too.",
@@ -692,9 +687,8 @@ impl Rule {
if alias_package.get_version() == VersionParser::DEFAULT_BRANCH_ALIAS {
return String::new();
}
- let package = self.deduplicate_default_branch_alias(
- pool.literal_to_package(literals[0]).clone_box(),
- );
+ let package =
+ self.deduplicate_default_branch_alias(pool.literal_to_package(literals[0]));
format!(
"{} is an alias of {} and must be installed with it.",
@@ -720,7 +714,7 @@ impl Rule {
fn format_packages_unique_from_packages(
&self,
pool: &Pool,
- packages: Vec<Box<dyn BasePackage>>,
+ packages: Vec<BasePackageHandle>,
is_verbose: bool,
constraint: Option<&AnyConstraint>,
use_removed_version_group: bool,
@@ -743,9 +737,9 @@ impl Rule {
constraint: Option<&AnyConstraint>,
use_removed_version_group: bool,
) -> String {
- let mut packages: Vec<Box<dyn BasePackage>> = vec![];
+ let mut packages: Vec<BasePackageHandle> = vec![];
for literal in literals {
- packages.push(pool.literal_to_package(*literal).clone_box());
+ packages.push(pool.literal_to_package(*literal));
}
Problem::get_package_list(
&packages,
@@ -756,13 +750,10 @@ impl Rule {
)
}
- fn deduplicate_default_branch_alias(
- &self,
- package: Box<dyn BasePackage>,
- ) -> Box<dyn BasePackage> {
- if let Some(alias_pkg) = package.as_any().downcast_ref::<AliasPackage>() {
+ fn deduplicate_default_branch_alias(&self, package: BasePackageHandle) -> BasePackageHandle {
+ if let Some(alias_pkg) = package.as_alias() {
if alias_pkg.get_pretty_version() == VersionParser::DEFAULT_BRANCH_ALIAS {
- return alias_pkg.get_alias_of().clone_box();
+ return alias_pkg.get_alias_of().into();
}
}