mf_state/plugin/
manager.rs1use std::collections::{HashMap, HashSet};
2use std::sync::Arc;
3use tokio::sync::RwLock;
4use anyhow::Result;
5
6use super::dependency::DependencyManager;
7use super::plugin::Plugin;
8
9#[derive(Debug, Clone)]
11pub struct PluginManager {
12 pub plugins: Arc<RwLock<HashMap<String, Arc<Plugin>>>>,
13 pub dependency_manager: Arc<RwLock<DependencyManager>>,
14 pub plugin_order: Arc<RwLock<Vec<String>>>,
15 pub initialized: Arc<RwLock<bool>>,
17}
18
19impl PluginManager {
20 pub fn new() -> Self {
21 Self {
22 plugins: Arc::new(RwLock::new(HashMap::new())),
23 dependency_manager: Arc::new(RwLock::new(DependencyManager::new())),
24 plugin_order: Arc::new(RwLock::new(Vec::new())),
25 initialized: Arc::new(RwLock::new(false)),
26 }
27 }
28
29 pub async fn register_plugin(
31 &self,
32 plugin: Arc<Plugin>,
33 ) -> Result<()> {
34 let plugin_name = plugin.spec.tr.metadata().name.clone();
35
36 {
38 let plugins = self.plugins.read().await;
39 if plugins.contains_key(&plugin_name) {
40 return Err(anyhow::anyhow!("插件 '{}' 已存在", plugin_name));
41 }
42 }
43 {
45 let mut plugins = self.plugins.write().await;
46 plugins.insert(plugin_name.clone(), plugin.clone());
47 }
48
49 self.update_dependency_graph(&plugin).await?;
51
52 tracing::info!("插件 '{}' 注册成功", plugin_name);
53 Ok(())
54 }
55 pub async fn finalize_registration(&self) -> Result<()> {
57 self.check_circular_dependencies().await?;
59
60 self.check_missing_dependencies().await?;
62
63 self.check_plugin_conflicts().await?;
65
66 self.update_plugin_order().await?;
68
69 {
71 let mut initialized = self.initialized.write().await;
72 *initialized = true;
73 }
74
75 tracing::info!("插件注册完成,共注册 {} 个插件", {
76 let plugins = self.plugins.read().await;
77 plugins.len()
78 });
79
80 Ok(())
81 }
82 async fn check_circular_dependencies(&self) -> Result<()> {
84 let dependency_manager = self.dependency_manager.read().await;
85 if dependency_manager.has_circular_dependencies() {
86 let report = dependency_manager.get_circular_dependency_report();
87 return Err(anyhow::anyhow!(
88 "检测到循环依赖: {:?}",
89 report.to_string()
90 ));
91 }
92 Ok(())
93 }
94 async fn check_missing_dependencies(&self) -> Result<()> {
96 let dependency_manager = self.dependency_manager.read().await;
97 let report = dependency_manager.check_missing_dependencies();
98 if report.has_missing_dependencies {
99 return Err(anyhow::anyhow!(
100 "检测到缺失依赖: {:?}",
101 report.to_string()
102 ));
103 }
104 Ok(())
105 }
106 async fn check_plugin_conflicts(&self) -> Result<()> {
108 let plugins = self.plugins.read().await;
109 let available_plugins: HashSet<String> =
110 plugins.keys().cloned().collect();
111
112 for (name, plugin) in plugins.iter() {
113 let metadata = plugin.spec.tr.metadata();
114
115 for conflict in &metadata.conflicts {
116 if available_plugins.contains(conflict) {
117 return Err(anyhow::anyhow!(
118 "插件 '{}' 与插件 '{}' 冲突",
119 name,
120 conflict
121 ));
122 }
123 }
124 }
125
126 Ok(())
127 }
128
129 async fn update_dependency_graph(
131 &self,
132 plugin: &Arc<Plugin>,
133 ) -> Result<()> {
134 let mut dependency_manager = self.dependency_manager.write().await;
135
136 let metadata = plugin.spec.tr.metadata();
137
138 dependency_manager.add_plugin(&metadata.name);
140
141 for dep in &metadata.dependencies {
143 dependency_manager.add_dependency(&metadata.name, dep)?;
144 }
145
146 Ok(())
147 }
148 async fn update_plugin_order(&self) -> Result<()> {
150 let dependency_manager = self.dependency_manager.read().await;
151 let order = dependency_manager.get_topological_order()?;
152
153 let mut plugin_order = self.plugin_order.write().await;
154 *plugin_order = order;
155
156 Ok(())
157 }
158 pub async fn get_sorted_plugins(&self) -> Vec<Arc<Plugin>> {
161 let plugin_order = self.plugin_order.read().await;
162 let plugins = self.plugins.read().await;
163 let mut sorted_plugins = Vec::new();
164 for plugin_name in plugin_order.iter() {
165 if let Some(plugin) = plugins.get(plugin_name) {
166 sorted_plugins.push(plugin.clone());
167 }
168 }
169 sorted_plugins
170 }
171
172 pub async fn is_initialized(&self) -> bool {
174 let initialized = self.initialized.read().await;
175 *initialized
176 }
177}