use crate::config::PluginConfig;
use crate::error::{PluginManagerError, PluginManagerResult};
use crate::status::PluginStatus;
use super::types::PluginInstance;
use tokio::time::{timeout, Duration};
use tracing::{debug, error, info, trace, warn};
pub async fn stop_single_plugin(
plugin_id: String,
plugin_instance: &mut PluginInstance,
timeout_secs: u64,
) {
trace!("停止单个插件: {} (超时: {}s)", plugin_id, timeout_secs);
if plugin_instance.status == PluginStatus::Running {
let fingerprint = plugin_instance.fingerprint.clone();
let plugin_version = plugin_instance.metadata.version.clone();
debug!("插件信息 - ID: {}, 版本: {}, 指纹: {}",
plugin_id, plugin_version, fingerprint);
let span = tracing::info_span!(
"plugin_stop",
plugin_id = %plugin_id,
fingerprint = %fingerprint,
plugin_version = %plugin_version
);
let _guard = span.enter();
trace!("调用插件 stop 方法");
let stop_result = timeout(
Duration::from_secs(timeout_secs),
plugin_instance.plugin.stop()
).await;
match stop_result {
Ok(Ok(_)) => {
if plugin_instance.status.validate_transition(&PluginStatus::Stopped).is_ok() {
plugin_instance.status = PluginStatus::Stopped;
info!("插件停止成功: {}", plugin_id);
trace!("插件状态已更新为 Stopped");
} else {
plugin_instance.status = PluginStatus::Error("状态转换无效".to_string());
error!("插件 {} 状态转换无效", plugin_id);
}
}
Ok(Err(e)) => {
plugin_instance.status = PluginStatus::Error(e.to_string());
error!("插件停止失败 {}: {}", plugin_id, e);
}
Err(_) => {
plugin_instance.status = PluginStatus::Error("停止超时".to_string());
error!("插件停止超时: {} (超时时间: {}s)", plugin_id, timeout_secs);
}
}
} else {
debug!("插件 {} 未运行,跳过停止操作 (状态: {:?})", plugin_id, plugin_instance.status);
}
}
pub async fn initialize_single_plugin(
plugin_instance: &mut PluginInstance,
) -> Result<(), Box<dyn std::error::Error>> {
trace!("初始化单个插件: {}", plugin_instance.metadata.id);
let mut config = PluginConfig::default();
config.enabled = true;
debug!("创建默认配置,enabled = true");
trace!("调用插件 initialize 方法");
plugin_instance
.plugin
.initialize(config)
.await
.map_err(|e| {
error!("插件初始化失败: {} - {}", plugin_instance.metadata.id, e);
format!("插件初始化失败: {}", e)
})?;
debug!("插件初始化成功: {}", plugin_instance.metadata.id);
Ok(())
}