use dialoguer::Confirm;
use crate::install::RemoveSteps;
use crate::Tense;
use dialoguer;
#[derive(Debug, thiserror::Error)]
pub enum Error {
#[error("The removal was canceld by the user")]
Canceld,
#[error("User aborted removal after one or more errors happened, errors: {0:?}")]
AbortedAfterError(Vec<Box<dyn std::error::Error>>),
#[error("Removal done however one or more errors happened, errors: {0:?}")]
CompletedWithErrors(Vec<Box<dyn std::error::Error>>),
#[error("Could not get input from the user: {0}")]
UserInputFailed(#[from] dialoguer::Error),
}
pub fn start(steps: RemoveSteps) -> Result<(), Error> {
let mut errors = Vec::new();
for mut step in steps {
if !Confirm::new()
.with_prompt(format!("{}?", step.describe(Tense::Present)))
.interact()?
{
return Err(Error::Canceld);
}
if let Err(e) = step.perform() {
errors.push(e);
if !Confirm::new()
.with_prompt("Error happened during removal, do you want to try and continue?")
.interact()?
{
return Err(Error::AbortedAfterError(errors));
}
}
}
if !errors.is_empty() {
return Err(Error::CompletedWithErrors(errors));
}
Ok(())
}