use eyre::Result;
use crate::backend::unalias_backend;
use crate::toolset::install_state;
use crate::ui::multi_progress_report::MultiProgressReport;
use crate::ui::style;
use crate::{backend, plugins};
#[derive(Debug, usage_rs::Args)]
#[usage(verbatim_doc_comment, visible_aliases = ["remove", "rm"], example(r###"mise plugins uninstall my-tool"###))]
pub(super) struct PluginsUninstall {
#[usage(verbatim_doc_comment)]
plugin: Vec<String>,
#[usage(long, short, verbatim_doc_comment, conflicts = "plugin")]
all: bool,
#[usage(long, short, verbatim_doc_comment)]
purge: bool,
}
impl PluginsUninstall {
pub(super) async fn run(self) -> Result<()> {
let mpr = MultiProgressReport::get();
let plugins = match self.all {
true => install_state::list_plugins().keys().cloned().collect(),
false => self.plugin.clone(),
};
for plugin_name in plugins {
let plugin_name = unalias_backend(&plugin_name);
self.uninstall_one(plugin_name, &mpr).await?;
}
Ok(())
}
async fn uninstall_one(&self, plugin_name: &str, mpr: &MultiProgressReport) -> Result<()> {
if let Ok(plugin) = plugins::get(plugin_name) {
if plugin.is_installed() {
let prefix = format!("plugin:{}", style::eblue(&plugin.name()));
let pr = mpr.add(&prefix);
plugin.uninstall(pr.as_ref()).await?;
if self.purge {
let backend = backend::get(&plugin_name.into()).unwrap();
backend.purge(pr.as_ref())?;
}
pr.finish_with_message("uninstalled".into());
} else {
warn!("{} is not installed", style::eblue(plugin_name));
}
} else {
warn!("{} is not installed", style::eblue(plugin_name));
}
Ok(())
}
}