service_install/tui/
removal.rsuse dialoguer::Confirm;
use crate::install::{RemoveError, RemoveSteps};
use crate::Tense;
use dialoguer;
#[derive(Debug, thiserror::Error)]
pub enum Error {
#[error("The removal was canceled by the user")]
Canceled,
#[error("User aborted removal after one or more errors happened, errors: {0:?}")]
AbortedAfterError(Vec<RemoveError>),
#[error("Removal done however one or more errors happened, errors: {0:?}")]
CompletedWithErrors(Vec<RemoveError>),
#[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::Questioning)))
.interact()?
{
return Err(Error::Canceled);
}
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(())
}