diff --git a/crates/pacdef_core/src/review/datastructures.rs b/crates/pacdef_core/src/review/datastructures.rs index ed2d69d..ade96b9 100644 --- a/crates/pacdef_core/src/review/datastructures.rs +++ b/crates/pacdef_core/src/review/datastructures.rs @@ -3,6 +3,8 @@ use std::rc::Rc; use crate::backend::Backend; use crate::{Group, Package}; +use super::strategy::Strategy; + #[derive(Debug, PartialEq)] pub(super) enum ReviewAction { AsDependency(Package), @@ -38,6 +40,39 @@ impl ReviewsPerBackend { pub(super) fn push(&mut self, value: (Box, Vec)) { self.items.push(value); } + + /// Convert the reviews per backend to a vector of [`Strategy`], where one `Strategy` contains + /// all actions that must be executed for a [`Backend`]. + /// + /// If there are no actions for a `Backend`, then that `Backend` is removed from the return + /// value. + pub(super) fn into_strategies(self) -> Vec { + let mut result = vec![]; + + for (backend, actions) in self { + let mut to_delete = vec![]; + let mut assign_group = vec![]; + let mut as_dependency = vec![]; + + extract_actions( + actions, + &mut to_delete, + &mut assign_group, + &mut as_dependency, + ); + + result.push(Strategy::new( + backend, + to_delete, + as_dependency, + assign_group, + )); + } + + result.retain(|s| !s.nothing_to_do()); + + result + } } impl IntoIterator for ReviewsPerBackend { @@ -54,3 +89,18 @@ pub(super) enum ContinueWithReview { Yes, No, } + +fn extract_actions( + actions: Vec, + to_delete: &mut Vec, + assign_group: &mut Vec<(Package, Rc)>, + as_dependency: &mut Vec, +) { + for action in actions { + match action { + ReviewAction::Delete(package) => to_delete.push(package), + ReviewAction::AssignGroup(package, group) => assign_group.push((package, group)), + ReviewAction::AsDependency(package) => as_dependency.push(package), + } + } +} diff --git a/crates/pacdef_core/src/review/mod.rs b/crates/pacdef_core/src/review/mod.rs index 328d5f9..c15c05f 100644 --- a/crates/pacdef_core/src/review/mod.rs +++ b/crates/pacdef_core/src/review/mod.rs @@ -44,8 +44,7 @@ pub fn review( return Ok(()); } - let mut strategies: Vec = reviews.into(); - strategies.retain(|s| !s.nothing_to_do()); + let strategies: Vec = reviews.into_strategies(); println!(); let mut iter = strategies.iter().peekable(); diff --git a/crates/pacdef_core/src/review/strategy.rs b/crates/pacdef_core/src/review/strategy.rs index 12b0e42..57de1ec 100644 --- a/crates/pacdef_core/src/review/strategy.rs +++ b/crates/pacdef_core/src/review/strategy.rs @@ -5,8 +5,6 @@ use anyhow::Result; use crate::backend::Backend; use crate::{Group, Package}; -use super::datastructures::{ReviewAction, ReviewsPerBackend}; - #[derive(Debug)] pub(super) struct Strategy { backend: Box, @@ -79,46 +77,3 @@ impl Strategy { self.delete.is_empty() && self.as_dependency.is_empty() && self.assign_group.is_empty() } } - -impl From for Vec { - fn from(reviews: ReviewsPerBackend) -> Self { - let mut result = vec![]; - - for (backend, actions) in reviews { - let mut to_delete = vec![]; - let mut assign_group = vec![]; - let mut as_dependency = vec![]; - - extract_actions( - actions, - &mut to_delete, - &mut assign_group, - &mut as_dependency, - ); - - result.push(Strategy::new( - backend, - to_delete, - as_dependency, - assign_group, - )); - } - - result - } -} - -fn extract_actions( - actions: Vec, - to_delete: &mut Vec, - assign_group: &mut Vec<(Package, Rc)>, - as_dependency: &mut Vec, -) { - for action in actions { - match action { - ReviewAction::Delete(package) => to_delete.push(package), - ReviewAction::AssignGroup(package, group) => assign_group.push((package, group)), - ReviewAction::AsDependency(package) => as_dependency.push(package), - } - } -}