even more review stuff
This commit is contained in:
+63
-8
@@ -1,4 +1,4 @@
|
|||||||
use std::collections::HashSet;
|
use std::collections::{HashMap, HashSet};
|
||||||
use std::io::{self, stdin, stdout, Read, Write};
|
use std::io::{self, stdin, stdout, Read, Write};
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
|
||||||
@@ -9,6 +9,45 @@ use crate::backend::{Backend, Backends, ToDoPerBackend};
|
|||||||
use crate::grouping::{Group, Package, Section};
|
use crate::grouping::{Group, Package, Section};
|
||||||
use crate::ui::get_user_confirmation;
|
use crate::ui::get_user_confirmation;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct BackendVectorMap<I>(Vec<(Rc<Box<dyn Backend>>, Vec<I>)>);
|
||||||
|
|
||||||
|
impl<I> BackendVectorMap<I> {
|
||||||
|
fn new() -> Self {
|
||||||
|
Self(vec![])
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get(&self, backend: &Rc<Box<dyn Backend>>) -> Option<&[I]> {
|
||||||
|
for (b, value) in &self.0 {
|
||||||
|
if b.get_section() == backend.get_section() {
|
||||||
|
return Some(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_mut(&mut self, backend: &Rc<Box<dyn Backend>>) -> Option<&mut [I]> {
|
||||||
|
for (b, value) in &mut self.0 {
|
||||||
|
if b.get_section() == backend.get_section() {
|
||||||
|
return Some(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn push(&mut self, val: I) {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_empty(&self) -> bool {
|
||||||
|
self.0.iter().all(|(_, packages)| packages.is_empty())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn iter(&self) -> impl Iterator<Item = &I> {
|
||||||
|
self.0.iter().flat_map(|(_, items)| items)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum ReviewAction {
|
enum ReviewAction {
|
||||||
AsDependency,
|
AsDependency,
|
||||||
@@ -22,35 +61,41 @@ enum ReviewAction {
|
|||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct Reviews<'a> {
|
struct Reviews<'a> {
|
||||||
pub as_dependency: Vec<(Rc<Box<dyn Backend>>, Package)>,
|
pub as_dependency: BackendVectorMap<Package>,
|
||||||
pub assign: Vec<(Rc<Box<dyn Backend>>, Package, &'a Group)>,
|
pub assign: BackendVectorMap<(Package, &'a Group)>,
|
||||||
pub delete: Vec<(Rc<Box<dyn Backend>>, Package)>,
|
pub delete: BackendVectorMap<Package>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Reviews<'a> {
|
impl<'a> Reviews<'a> {
|
||||||
fn new() -> Self {
|
fn new() -> Self {
|
||||||
Self {
|
Self {
|
||||||
as_dependency: vec![],
|
as_dependency: BackendVectorMap::new(),
|
||||||
assign: vec![],
|
assign: BackendVectorMap::new(),
|
||||||
delete: vec![],
|
delete: BackendVectorMap::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// order will be: per backend, first assign, then delete, then as dependency
|
||||||
fn run_strategy(self) -> Result<()> {
|
fn run_strategy(self) -> Result<()> {
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn print_strategy(&self) {
|
fn print_strategy(&self) {
|
||||||
println!("delete:");
|
println!("delete:");
|
||||||
for (backend, package) in &self.delete {
|
if !self.delete.is_empty() {
|
||||||
|
for (backend, package) in self.delete.iter() {
|
||||||
println!("{} {}", backend.get_section(), package.name);
|
println!("{} {}", backend.get_section(), package.name);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !self.assign.is_empty() {
|
||||||
println!("assign:");
|
println!("assign:");
|
||||||
for (backend, package, group) in &self.assign {
|
for (backend, package, group) in &self.assign {
|
||||||
println!("{} {} {}", backend.get_section(), package.name, group.name);
|
println!("{} {} {}", backend.get_section(), package.name, group.name);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !self.as_dependency.is_empty() {
|
||||||
println!("as dependency:");
|
println!("as dependency:");
|
||||||
for (backend, package) in &self.as_dependency {
|
for (backend, package) in &self.as_dependency {
|
||||||
println!("{} {}", backend.get_section(), package.name);
|
println!("{} {}", backend.get_section(), package.name);
|
||||||
@@ -58,6 +103,11 @@ impl<'a> Reviews<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn nothing_to_do(&self) -> bool {
|
||||||
|
self.as_dependency.is_empty() && self.assign.is_empty() && self.delete.is_empty()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) fn review(todo_per_backend: ToDoPerBackend, groups: HashSet<Group>) -> Result<()> {
|
pub(crate) fn review(todo_per_backend: ToDoPerBackend, groups: HashSet<Group>) -> Result<()> {
|
||||||
dbg!(&todo_per_backend);
|
dbg!(&todo_per_backend);
|
||||||
|
|
||||||
@@ -78,6 +128,10 @@ pub(crate) fn review(todo_per_backend: ToDoPerBackend, groups: HashSet<Group>) -
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if reviews.nothing_to_do() {
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
reviews.print_strategy();
|
reviews.print_strategy();
|
||||||
|
|
||||||
if !get_user_confirmation() {
|
if !get_user_confirmation() {
|
||||||
@@ -96,6 +150,7 @@ fn get_action_for_package<'a>(
|
|||||||
loop {
|
loop {
|
||||||
match ask_user_action_for_package()? {
|
match ask_user_action_for_package()? {
|
||||||
ReviewAction::AsDependency => {
|
ReviewAction::AsDependency => {
|
||||||
|
// reviews.as_dependency.insert(_);
|
||||||
reviews.as_dependency.push((backend.clone(), package));
|
reviews.as_dependency.push((backend.clone(), package));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user