From 64d44337b01db66053fda064ba84a67a4e5c54bd Mon Sep 17 00:00:00 2001 From: steven-omaha <35634100+steven-omaha@users.noreply.github.com> Date: Wed, 1 Feb 2023 16:37:00 +0100 Subject: [PATCH] finish review --- src/backend/backend_trait.rs | 82 ++++++++++-------------------------- src/grouping/group.rs | 57 +++++++++++++++++++++++-- 2 files changed, 77 insertions(+), 62 deletions(-) diff --git a/src/backend/backend_trait.rs b/src/backend/backend_trait.rs index 094d33f..12feef5 100644 --- a/src/backend/backend_trait.rs +++ b/src/backend/backend_trait.rs @@ -1,7 +1,5 @@ use std::collections::HashMap; use std::fmt::Debug; -use std::fs::{read_to_string, File}; -use std::io::Write; use std::process::Command; use std::rc::Rc; use std::{collections::HashSet, process::ExitStatus}; @@ -32,66 +30,12 @@ pub(crate) trait Backend: Debug { /// Get all packages that were installed in the system explicitly. fn get_explicitly_installed_packages(&self) -> Result>; - // TODO continue here fn assign_group(&self, to_assign: Vec<(Package, Rc)>) { - todo!(); - let mut group_package_map = HashMap::new(); - - for (p, group) in to_assign { - if !group_package_map.contains_key(&group) { - group_package_map.insert(group.clone(), vec![]); - } - - let inner = group_package_map.get_mut(&group).unwrap(); - inner.push(p); - } - - for vecs in group_package_map.values_mut() { - vecs.sort(); - } + let group_package_map = get_group_packages_map(to_assign); + let section_header = format!("[{}]", self.get_section()); for (group, packages) in group_package_map { - let group_file_content = read_to_string(&group.path).unwrap(); - let old_length = dbg!(group_file_content.len()); - let mut must_write_section_header = false; - - let mut lines = group_file_content.lines(); - - lines.find(|line| line.contains(&format!("[{}]", self.get_section()))); - lines.next().unwrap(); - - // let start_of_section = if let Some(start_of_section) = group_file_content.find() { - // start_of_section - // } else { - // must_write_section_header = true; - // old_length - // }; - - // dbg!(&start_of_section); - - // let mut new_file_content = group_file_content - // .get(..start_of_section) - // .unwrap() - // .to_owned(); - - // dbg!(&new_file_content); - - // todo!(); - - // if dbg!(must_write_section_header) { - // new_file_content.push_str(&format!("\n[{}]", self.get_section())); - // } - // for package in packages { - // new_file_content.push_str(&format!("\n{package}")); - // } - // new_file_content.push('\n'); - - // if old_length > start_of_section { - // new_file_content.push_str(group_file_content.get(old_length..).unwrap()); - // } - - // let mut file = File::create(&group.path).unwrap(); - // write!(file, "{new_file_content}").unwrap(); + group.save_packages(§ion_header, packages); } } @@ -170,3 +114,23 @@ pub(crate) trait Backend: Debug { Ok(diff) } } + +fn get_group_packages_map( + to_assign: Vec<(Package, Rc)>, +) -> HashMap, Vec> { + let mut group_package_map = HashMap::new(); + + for (p, group) in to_assign { + if !group_package_map.contains_key(&group) { + group_package_map.insert(group.clone(), vec![]); + } + + let inner = group_package_map.get_mut(&group).unwrap(); + inner.push(p); + } + + for vecs in group_package_map.values_mut() { + vecs.sort(); + } + group_package_map +} diff --git a/src/grouping/group.rs b/src/grouping/group.rs index 757793c..89193af 100644 --- a/src/grouping/group.rs +++ b/src/grouping/group.rs @@ -1,12 +1,13 @@ -use std::fmt::Write; -use std::fs::read_to_string; +use std::fmt::Write as FmtWrite; +use std::fs::{read_to_string, File}; use std::hash::Hash; +use std::io::Write as IoWrite; use std::path::{Path, PathBuf}; use std::{collections::HashSet, fmt::Display}; use anyhow::{Context, Result}; -use super::Section; +use super::{Package, Section}; use crate::Config; @@ -110,6 +111,19 @@ impl Group { path, }) } + + pub(crate) fn save_packages(&self, section_header: &str, packages: Vec) { + let mut content = read_to_string(&self.path).unwrap(); + + if content.contains(section_header) { + write_packages_to_existing_section(&mut content, section_header, &packages); + } else { + add_new_section_with_packages(&mut content, section_header, &packages); + } + + let mut file = File::create(&self.path).unwrap(); + write!(file, "{content}").unwrap(); + } } impl Display for Group { @@ -128,3 +142,40 @@ impl Display for Group { Ok(()) } } + +fn write_packages_to_existing_section( + group_file_content: &mut String, + section_header: &str, + packages: &[Package], +) { + let idx_of_first_package_line_in_section = + find_first_package_line_in_section(group_file_content, section_header); + + let after = group_file_content.split_off(idx_of_first_package_line_in_section); + + for p in packages { + group_file_content.push_str(&format!("{p}\n")); + } + + group_file_content.push_str(&after); +} + +fn find_first_package_line_in_section(group_file_content: &str, section_header: &str) -> usize { + let section_start = group_file_content.find(section_header).unwrap(); + let distance_to_next_newline = group_file_content[section_start..].find('\n').unwrap(); + + section_start + distance_to_next_newline + 1 // + 1 to be after the newline +} + +fn add_new_section_with_packages( + group_file_content: &mut String, + section_header: &str, + packages: &[Package], +) { + group_file_content.push('\n'); + group_file_content.push_str(section_header); + group_file_content.push('\n'); + for p in packages { + group_file_content.push_str(&format!("{p}\n")); + } +}