use std::io;
use piglog::prelude::*;
pub fn tidy_up() -> Result<(), io::Error> {
let deleted = clean_dups(false)?;
let aligned = align(false)?;
piglog::success!("Deleted {deleted} duplicate generations!");
piglog::success!("Aligned {aligned} generations!");
return Ok(());
}
pub fn clean_dups(verbose: bool) -> Result<usize, io::Error> {
let mut deleted: usize = 0;
let mut gen_nums = super::list_gen_nums()?;
gen_nums.sort();
let mut comparison: Option<super::Generation> = None;
let mut comp_num: Option<usize> = None;
for i in gen_nums {
let generation = super::get_gen_from_usize(i)?;
if let Some(ref s) = comparison {
if generation == *s {
let current = super::is_current(i)?;
let built = super::is_built(i)?;
if verbose {
piglog::info!("Deleting generation: {i}");
}
if current {
match super::set_current(comp_num.unwrap(), verbose) {
Ok(_) => (),
Err(e) => {
piglog::fatal!("Failed to set 'current' generation!");
return Err(e);
},
};
}
if built {
match super::set_built(comp_num.unwrap(), verbose) {
Ok(_) => (),
Err(e) => {
piglog::fatal!("Failed to set 'built' generation!");
return Err(e);
},
};
}
match super::delete(i, verbose) {
Ok(_) => (),
Err(e) => {
piglog::fatal!("Failed to delete generation: {i}");
return Err(e);
},
};
deleted += 1;
}
else {
comparison = Some(generation);
comp_num = Some(i);
}
}
else {
comparison = Some(generation);
comp_num = Some(i);
}
}
return Ok(deleted);
}
pub fn align(verbose: bool) -> Result<usize, io::Error> {
let mut moved: usize = 0;
let mut gen_nums = super::list_gen_nums()?;
gen_nums.sort();
let mut comparison: usize = 0;
for i in gen_nums {
let new_number = comparison + 1;
if i > new_number {
if verbose {
piglog::info!("Moving: {i} -> {new_number}");
}
match super::move_gen(i, new_number, verbose) {
Ok(_) => (),
Err(e) => {
piglog::fatal!("Failed to move generation {i} to {new_number}!");
return Err(e);
},
};
moved += 1;
}
comparison += 1;
}
return Ok(moved);
}