use super::{Result, Settled, purge};
use crate::context::Context;
use crate::state::Account;
use crate::{home, state};
pub struct Removed {
pub parks: usize,
pub pending: usize,
pub left: usize,
pub home_removed: bool,
}
pub fn uninstall(settled: Settled) -> Result<Removed> {
let Settled {
_exclusive,
mut state,
ctx,
} = settled;
let held = state.accounts.iter().filter_map(|a| a.parked.as_ref());
let left = held
.clone()
.filter(|park| state.is_foreign(&park.service))
.count();
let parks = held.count() - left;
for key in state.accounts.iter().map(Account::key).collect::<Vec<_>>() {
state.remove(&key);
}
state.active.clear();
state::save(&ctx, &state)?;
let pending = purge(&ctx, &mut state);
if pending == 0 {
crate::pending::clear(&ctx);
}
let home_removed = pending == 0 && remove_home(&ctx);
Ok(Removed {
parks: parks.saturating_sub(pending),
pending,
left,
home_removed,
})
}
fn remove_home(ctx: &Context) -> bool {
std::fs::remove_dir_all(home::dir(ctx)).is_ok()
}