diff --git a/src/review/datastructures.rs b/src/review/datastructures.rs new file mode 100644 index 0000000..2532e12 --- /dev/null +++ b/src/review/datastructures.rs @@ -0,0 +1,40 @@ +use std::rc::Rc; + +use crate::backend::Backend; +use crate::{Group, Package}; + +#[derive(Debug, PartialEq)] +pub(super) enum ReviewAction { + AsDependency(Package), + Delete(Package), + AssignGroup(Package, Rc), +} + +#[derive(Debug)] +pub(super) enum ReviewIntention { + AsDependency, + AssignGroup, + Delete, + Info, + Invalid, + Skip, + Quit, +} + +#[derive(Debug)] +pub(super) struct ReviewsPerBackend(pub Vec<(Box, Vec)>); + +impl ReviewsPerBackend { + pub(super) fn new() -> Self { + Self(vec![]) + } + + pub(super) fn nothing_to_do(&self) -> bool { + self.0.iter().all(|(_, vec)| vec.is_empty()) + } +} + +pub(super) enum ContinueWithReview { + Yes, + No, +} diff --git a/src/review.rs b/src/review/mod.rs similarity index 66% rename from src/review.rs rename to src/review/mod.rs index 80870df..638fc4b 100644 --- a/src/review.rs +++ b/src/review/mod.rs @@ -1,42 +1,17 @@ +mod datastructures; +mod strategy; + use std::io::{stdin, stdout, Write}; use std::rc::Rc; use anyhow::Result; use crate::backend::{Backend, ToDoPerBackend}; -use crate::grouping::{Group, Package}; use crate::ui::{get_user_confirmation, read_single_char_from_terminal}; +use crate::{Group, Package}; -#[derive(Debug)] -struct ReviewsPerBackend(Vec<(Box, Vec)>); - -#[derive(Debug)] -enum ReviewIntention { - AsDependency, - AssignGroup, - Delete, - Info, - Invalid, - Skip, - Quit, -} - -#[derive(Debug, PartialEq)] -enum ReviewAction { - AsDependency(Package), - Delete(Package), - AssignGroup(Package, Rc), -} - -impl ReviewsPerBackend { - fn new() -> Self { - Self(vec![]) - } - - pub(crate) fn nothing_to_do(&self) -> bool { - self.0.iter().all(|(_, vec)| vec.is_empty()) - } -} +use self::datastructures::{ContinueWithReview, ReviewAction, ReviewIntention, ReviewsPerBackend}; +use self::strategy::Strategy; pub(crate) fn review( todo_per_backend: ToDoPerBackend, @@ -119,11 +94,6 @@ fn get_action_for_package( Ok(ContinueWithReview::Yes) } -enum ContinueWithReview { - Yes, - No, -} - fn ask_user_action_for_package() -> Result { print!("assign to (g)roup, (d)elete, (s)kip, (i)nfo, (a)s dependency, (q)uit? "); stdout().lock().flush()?; @@ -162,80 +132,6 @@ fn ask_group(groups: &[Rc]) -> Result>> { Ok(None) } } - -#[derive(Debug)] -struct Strategy { - backend: Box, - delete: Vec, - as_dependency: Vec, - assign_group: Vec<(Package, Rc)>, -} - -impl Strategy { - fn new( - backend: Box, - delete: Vec, - as_dependency: Vec, - assign_group: Vec<(Package, Rc)>, - ) -> Self { - Self { - backend, - delete, - as_dependency, - assign_group, - } - } - - fn execute(self) -> Result<()> { - if !self.delete.is_empty() { - self.backend.remove_packages(&self.delete)?; - } - - if !self.as_dependency.is_empty() { - self.backend.make_dependency(&self.as_dependency)?; - } - - if !self.assign_group.is_empty() { - self.backend.assign_group(self.assign_group); - } - - Ok(()) - } - - fn show(&self) { - if self.nothing_to_do() { - return; - } - - println!("[{}]", self.backend.get_section()); - - if !self.delete.is_empty() { - println!("delete:"); - for p in &self.delete { - println!(" {p}"); - } - } - - if !self.as_dependency.is_empty() { - println!("as depdendency:"); - for p in &self.as_dependency { - println!(" {p}"); - } - } - - if !self.assign_group.is_empty() { - println!("assign groups:"); - for (p, g) in &self.assign_group { - println!(" {p} -> {}", g.name); - } - } - } - - fn nothing_to_do(&self) -> bool { - 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![]; diff --git a/src/review/strategy.rs b/src/review/strategy.rs new file mode 100644 index 0000000..a1ba88d --- /dev/null +++ b/src/review/strategy.rs @@ -0,0 +1,79 @@ +use std::rc::Rc; + +use anyhow::Result; + +use crate::backend::Backend; +use crate::{Group, Package}; + +#[derive(Debug)] +pub(super) struct Strategy { + backend: Box, + delete: Vec, + as_dependency: Vec, + assign_group: Vec<(Package, Rc)>, +} + +impl Strategy { + pub(super) fn new( + backend: Box, + delete: Vec, + as_dependency: Vec, + assign_group: Vec<(Package, Rc)>, + ) -> Self { + Self { + backend, + delete, + as_dependency, + assign_group, + } + } + + pub(super) fn execute(self) -> Result<()> { + if !self.delete.is_empty() { + self.backend.remove_packages(&self.delete)?; + } + + if !self.as_dependency.is_empty() { + self.backend.make_dependency(&self.as_dependency)?; + } + + if !self.assign_group.is_empty() { + self.backend.assign_group(self.assign_group); + } + + Ok(()) + } + + pub(super) fn show(&self) { + if self.nothing_to_do() { + return; + } + + println!("[{}]", self.backend.get_section()); + + if !self.delete.is_empty() { + println!("delete:"); + for p in &self.delete { + println!(" {p}"); + } + } + + if !self.as_dependency.is_empty() { + println!("as depdendency:"); + for p in &self.as_dependency { + println!(" {p}"); + } + } + + if !self.assign_group.is_empty() { + println!("assign groups:"); + for (p, g) in &self.assign_group { + println!(" {p} -> {}", g.name); + } + } + } + + pub(super) fn nothing_to_do(&self) -> bool { + self.delete.is_empty() && self.as_dependency.is_empty() && self.assign_group.is_empty() + } +}