refactor ReviewsPerBackend::into_strategies()

This commit is contained in:
steven-omaha
2023-02-15 11:44:07 +01:00
parent fef245522c
commit 230e631fe8
3 changed files with 51 additions and 47 deletions
@@ -3,6 +3,8 @@ use std::rc::Rc;
use crate::backend::Backend; use crate::backend::Backend;
use crate::{Group, Package}; use crate::{Group, Package};
use super::strategy::Strategy;
#[derive(Debug, PartialEq)] #[derive(Debug, PartialEq)]
pub(super) enum ReviewAction { pub(super) enum ReviewAction {
AsDependency(Package), AsDependency(Package),
@@ -38,6 +40,39 @@ impl ReviewsPerBackend {
pub(super) fn push(&mut self, value: (Box<dyn Backend>, Vec<ReviewAction>)) { pub(super) fn push(&mut self, value: (Box<dyn Backend>, Vec<ReviewAction>)) {
self.items.push(value); 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<Strategy> {
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 { impl IntoIterator for ReviewsPerBackend {
@@ -54,3 +89,18 @@ pub(super) enum ContinueWithReview {
Yes, Yes,
No, No,
} }
fn extract_actions(
actions: Vec<ReviewAction>,
to_delete: &mut Vec<Package>,
assign_group: &mut Vec<(Package, Rc<Group>)>,
as_dependency: &mut Vec<Package>,
) {
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),
}
}
}
+1 -2
View File
@@ -44,8 +44,7 @@ pub fn review(
return Ok(()); return Ok(());
} }
let mut strategies: Vec<Strategy> = reviews.into(); let strategies: Vec<Strategy> = reviews.into_strategies();
strategies.retain(|s| !s.nothing_to_do());
println!(); println!();
let mut iter = strategies.iter().peekable(); let mut iter = strategies.iter().peekable();
-45
View File
@@ -5,8 +5,6 @@ use anyhow::Result;
use crate::backend::Backend; use crate::backend::Backend;
use crate::{Group, Package}; use crate::{Group, Package};
use super::datastructures::{ReviewAction, ReviewsPerBackend};
#[derive(Debug)] #[derive(Debug)]
pub(super) struct Strategy { pub(super) struct Strategy {
backend: Box<dyn Backend>, backend: Box<dyn Backend>,
@@ -79,46 +77,3 @@ impl Strategy {
self.delete.is_empty() && self.as_dependency.is_empty() && self.assign_group.is_empty() self.delete.is_empty() && self.as_dependency.is_empty() && self.assign_group.is_empty()
} }
} }
impl From<ReviewsPerBackend> for Vec<Strategy> {
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<ReviewAction>,
to_delete: &mut Vec<Package>,
assign_group: &mut Vec<(Package, Rc<Group>)>,
as_dependency: &mut Vec<Package>,
) {
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),
}
}
}