aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/mozart-sat-resolver/src/rule_set_generator.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/mozart-sat-resolver/src/rule_set_generator.rs')
-rw-r--r--crates/mozart-sat-resolver/src/rule_set_generator.rs36
1 files changed, 19 insertions, 17 deletions
diff --git a/crates/mozart-sat-resolver/src/rule_set_generator.rs b/crates/mozart-sat-resolver/src/rule_set_generator.rs
index 11c04cc..2ab9f86 100644
--- a/crates/mozart-sat-resolver/src/rule_set_generator.rs
+++ b/crates/mozart-sat-resolver/src/rule_set_generator.rs
@@ -1,8 +1,10 @@
use crate::pool::{Literal, PackageId, Pool, PoolLink};
use crate::rule::{ReasonData, Rule, RuleReason, RuleType};
use crate::rule_set::RuleSet;
+use indexmap::IndexMap;
+use indexmap::IndexSet;
use mozart_semver::VersionConstraint;
-use std::collections::{HashMap, HashSet, VecDeque};
+use std::collections::VecDeque;
/// Generates SAT rules from the pool and request.
///
@@ -11,11 +13,11 @@ pub struct RuleSetGenerator<'a> {
pool: &'a mut Pool,
rules: RuleSet,
/// Packages already processed.
- added_map: HashSet<PackageId>,
+ added_map: IndexSet<PackageId>,
/// Package names → list of package IDs with that name (non-alias).
- added_packages_by_name: HashMap<String, Vec<PackageId>>,
+ added_packages_by_name: IndexMap<String, Vec<PackageId>>,
/// Specific platform packages to ignore (from `--ignore-platform-req=name`).
- ignore_platform_reqs: HashSet<String>,
+ ignore_platform_reqs: IndexSet<String>,
/// When true, every platform package is treated as ignored.
/// Mirrors `--ignore-platform-reqs` (no value).
ignore_all_platform_reqs: bool,
@@ -26,15 +28,15 @@ impl<'a> RuleSetGenerator<'a> {
RuleSetGenerator {
pool,
rules: RuleSet::new(),
- added_map: HashSet::new(),
- added_packages_by_name: HashMap::new(),
- ignore_platform_reqs: HashSet::new(),
+ added_map: IndexSet::new(),
+ added_packages_by_name: IndexMap::new(),
+ ignore_platform_reqs: IndexSet::new(),
ignore_all_platform_reqs: false,
}
}
/// Set platform requirements to ignore.
- pub fn set_ignore_platform_reqs(&mut self, names: HashSet<String>) {
+ pub fn set_ignore_platform_reqs(&mut self, names: IndexSet<String>) {
self.ignore_platform_reqs = names;
}
@@ -76,10 +78,10 @@ impl<'a> RuleSetGenerator<'a> {
/// unresolvable problem.
pub fn generate(
mut self,
- requires: &HashMap<String, Option<String>>,
+ requires: &IndexMap<String, Option<String>>,
fixed_packages: &[PackageId],
- root_provides: &HashMap<String, String>,
- root_replaces: &HashMap<String, String>,
+ root_provides: &IndexMap<String, String>,
+ root_replaces: &IndexMap<String, String>,
) -> (RuleSet, Vec<(String, Option<String>)>) {
let mut missing_root_requires: Vec<(String, Option<String>)> = Vec::new();
// Process fixed packages
@@ -351,7 +353,7 @@ impl<'a> RuleSetGenerator<'a> {
fn root_self_fulfills(
target: &str,
require_constraint: Option<&str>,
- root_links: &HashMap<String, String>,
+ root_links: &IndexMap<String, String>,
) -> bool {
let Some(link_constraint_str) = root_links.get(target) else {
return false;
@@ -394,11 +396,11 @@ mod tests {
vec![],
);
- let mut requires = HashMap::new();
+ let mut requires = IndexMap::new();
requires.insert("a/a".to_string(), None);
let generator = RuleSetGenerator::new(&mut pool);
- let (rules, _) = generator.generate(&requires, &[], &HashMap::new(), &HashMap::new());
+ let (rules, _) = generator.generate(&requires, &[], &IndexMap::new(), &IndexMap::new());
// Should have a request rule: (1 | 2)
let request_count = rules.iter_type(RuleType::Request).count();
@@ -434,11 +436,11 @@ mod tests {
vec![],
);
- let mut requires = HashMap::new();
+ let mut requires = IndexMap::new();
requires.insert("a/a".to_string(), None);
let generator = RuleSetGenerator::new(&mut pool);
- let (rules, _) = generator.generate(&requires, &[], &HashMap::new(), &HashMap::new());
+ let (rules, _) = generator.generate(&requires, &[], &IndexMap::new(), &IndexMap::new());
// Should have:
// 1. Request rule: (1) — root requires a/a
@@ -452,7 +454,7 @@ mod tests {
let generator = RuleSetGenerator::new(&mut pool);
let (rules, _) =
- generator.generate(&HashMap::new(), &[1], &HashMap::new(), &HashMap::new());
+ generator.generate(&IndexMap::new(), &[1], &IndexMap::new(), &IndexMap::new());
// Should have an assertion rule: (1)
let request_rules: Vec<_> = rules.iter_type(RuleType::Request).collect();