use crate::error::{PluginManagerError, PluginManagerResult};
use crate::manager::types::{PluginInfo, PluginMap};
use crate::manager::validation::sanitize_plugin_name;
use tracing::{debug, error, info, trace};
pub async fn get_all_plugins(
plugins: PluginMap,
) -> PluginManagerResult<Vec<PluginInfo>> {
trace!("查询所有插件信息");
let plugin_infos: Vec<PluginInfo> = {
let plugins = plugins.read().await;
let count = plugins.len();
debug!("当前有 {} 个插件", count);
plugins
.values()
.map(|instance| PluginInfo {
metadata: instance.metadata.clone(),
status: instance.status.clone(),
fingerprint: instance.fingerprint.clone(),
child_plugins: instance.child_plugins.clone(),
})
.collect()
};
info!("查询到 {} 个插件", plugin_infos.len());
trace!("插件信息查询完成");
Ok(plugin_infos)
}
pub async fn get_plugin(
plugins: PluginMap,
plugin_id: &str,
) -> PluginManagerResult<PluginInfo> {
trace!("查询单个插件信息: {}", plugin_id);
let sanitized_plugin_id = sanitize_plugin_name(plugin_id)?;
debug!("插件ID清理: {} -> {}", plugin_id, sanitized_plugin_id);
let plugin_info = {
let plugins = plugins.read().await;
let plugin_instance = plugins.get(&sanitized_plugin_id)
.ok_or_else(|| {
error!("插件不存在: {}", plugin_id);
PluginManagerError::not_found(plugin_id)
})?;
debug!("找到插件: {} (状态: {:?})",
plugin_instance.metadata.name, plugin_instance.status);
PluginInfo {
metadata: plugin_instance.metadata.clone(),
status: plugin_instance.status.clone(),
fingerprint: plugin_instance.fingerprint.clone(),
child_plugins: plugin_instance.child_plugins.clone(),
}
};
trace!("插件信息查询完成");
Ok(plugin_info)
}