use crate::{App, CoreError, InstalledVersion};
impl App {
pub fn install_plugin_version(
&self,
plugin_name: &str,
version: Option<&str>,
progress: Option<&crate::ProgressFn<'_>>,
) -> Result<InstalledVersion, CoreError> {
let entry = self.resolve_registry_entry(plugin_name)?;
let plugin = self.load_plugin(&entry)?;
let available_versions = self.cached_available_versions(plugin_name, &[])?;
let selected_version = version
.map(str::to_string)
.or_else(|| {
available_versions
.first()
.map(|candidate| candidate.version.clone())
})
.ok_or_else(|| {
CoreError::Unsupported(format!(
"plugin {plugin_name} does not expose installable versions"
))
})?;
let plan = plugin.install_plan(&selected_version)?;
let runtime = self.installer.install(&plan, progress)?;
if let Err(error) = plugin.post_install(&runtime) {
let _ = std::fs::remove_dir_all(&runtime.root_dir);
return Err(error.into());
}
Ok(InstalledVersion {
plugin: plugin_name.to_string(),
version: runtime.version,
install_dir: runtime.root_dir,
})
}
pub fn project_tool_version(&self, plugin_name: &str) -> Result<Option<String>, CoreError> {
Ok(self
.resolve_project_tool_version_internal(plugin_name)?
.map(|resolved| resolved.version))
}
pub fn configured_tools_for_install(&self) -> Result<Vec<(String, String)>, CoreError> {
Ok(self
.collect_current_tools()?
.into_iter()
.map(|tool| (tool.plugin, tool.version))
.collect())
}
}