use crate::error::{PluginManagerError, PluginManagerResult};
use crate::status::ChildPluginInfo;
use super::types::PluginInstance;
use std::collections::HashMap;
use tracing::{debug, error, info, trace, warn};
pub fn check_plugin_dependencies(
plugins: &HashMap<String, PluginInstance>,
plugin_id: &str,
) -> PluginManagerResult<()> {
trace!("检查插件依赖关系: {}", plugin_id);
let dependent_plugins: Vec<String> = plugins
.iter()
.filter_map(|(id, instance)| {
if instance.metadata.dependencies.contains(&plugin_id.to_string()) {
trace!("发现依赖插件 {} 的插件: {}", plugin_id, id);
Some(id.clone())
} else {
None
}
})
.collect();
if !dependent_plugins.is_empty() {
let error_msg = format!(
"无法卸载插件 {},因为以下插件依赖它: {}",
plugin_id,
dependent_plugins.join(", ")
);
error!("{}", error_msg);
debug!("依赖插件列表: {:?}", dependent_plugins);
return Err(PluginManagerError::DependencyError(error_msg));
}
debug!("插件 {} 没有依赖关系,可以安全卸载", plugin_id);
Ok(())
}
pub async fn cleanup_single_temp_files(plugin_instance: &PluginInstance) {
let temp_dir = &plugin_instance.plugin_temp_dir;
trace!("开始清理插件临时文件: {} -> {}",
plugin_instance.metadata.id, temp_dir.display());
if let Err(e) = tokio::fs::remove_dir_all(temp_dir).await {
warn!("清理插件临时目录失败: {} - {}", temp_dir.display(), e);
} else {
info!(
plugin_id = %plugin_instance.metadata.id,
temp_path = %temp_dir.display(),
"已清理临时文件: {}",
temp_dir.display()
);
debug!("临时文件清理成功: {}", temp_dir.display());
}
}