From f5b987a00712211b7ce56300851182bda904e97b Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sat, 23 May 2026 17:33:56 +0900 Subject: refactor(resolver): change Rule to a closed enum Co-Authored-By: Claude Opus 4.7 --- .../src/dependency_resolver/rule_watch_node.rs | 26 +++++++++------------- 1 file changed, 11 insertions(+), 15 deletions(-) (limited to 'crates/shirabe/src/dependency_resolver/rule_watch_node.rs') diff --git a/crates/shirabe/src/dependency_resolver/rule_watch_node.rs b/crates/shirabe/src/dependency_resolver/rule_watch_node.rs index a643d3e..7292ae0 100644 --- a/crates/shirabe/src/dependency_resolver/rule_watch_node.rs +++ b/crates/shirabe/src/dependency_resolver/rule_watch_node.rs @@ -1,12 +1,15 @@ //! ref: composer/src/Composer/DependencyResolver/RuleWatchNode.php +use std::cell::RefCell; +use std::rc::Rc; + use crate::dependency_resolver::Decisions; -use crate::dependency_resolver::RuleLiterals; +use crate::dependency_resolver::Rule; pub struct RuleWatchNode { pub watch1: i64, pub watch2: i64, - pub(crate) rule: Box, + pub(crate) rule: Rc>, } impl std::fmt::Debug for RuleWatchNode { @@ -19,8 +22,8 @@ impl std::fmt::Debug for RuleWatchNode { } impl RuleWatchNode { - pub fn new(rule: Box) -> Self { - let literals = rule.get_literals(); + pub fn new(rule: Rc>) -> Self { + let literals = rule.borrow().get_literals(); let literal_count = literals.len(); let watch1 = if literal_count > 0 { literals[0] } else { 0 }; let watch2 = if literal_count > 1 { literals[1] } else { 0 }; @@ -33,14 +36,13 @@ impl RuleWatchNode { } pub fn watch2_on_highest(&mut self, decisions: &Decisions) { - let literals = self.rule.get_literals(); + let literals = self.rule.borrow().get_literals(); // if there are only 2 elements, both are being watched anyway - if literals.len() < 3 || self.rule.is_multi_conflict_rule() { + if literals.len() < 3 || self.rule.borrow().is_multi_conflict_rule() { return; } - let literals: Vec = literals.clone(); let mut watch_level: i64 = 0; for literal in &literals { @@ -53,14 +55,8 @@ impl RuleWatchNode { } } - pub fn get_rule(&self) -> &dyn RuleLiterals { - self.rule.as_ref() - } - - /// Owned clone for callers that need a `Box`. Default impl in - /// `RuleLiterals` returns `todo!()`; concrete rule impls override it. - pub fn get_rule_boxed(&self) -> Box { - self.rule.clone_rule_box() + pub fn get_rule(&self) -> Rc> { + self.rule.clone() } pub fn get_other_watch(&self, literal: i64) -> i64 { -- cgit v1.3.1