moduforge_core/
extension_manager.rs

1use std::sync::Arc;
2use std::time::Instant;
3
4use moduforge_model::schema::Schema;
5use moduforge_state::{ops::GlobalResourceManager, plugin::Plugin};
6
7use crate::{
8    helpers::get_schema_by_resolved_extensions::get_schema_by_resolved_extensions,
9    metrics, types::Extensions, ForgeResult,
10};
11/// 扩展管理器
12pub struct ExtensionManager {
13    plugins: Vec<Arc<Plugin>>,
14    schema: Arc<Schema>,
15    op_fns: Vec<
16        Arc<dyn Fn(&GlobalResourceManager) -> ForgeResult<()> + Send + Sync>,
17    >,
18}
19impl ExtensionManager {
20    pub fn new(extensions: &Vec<Extensions>) -> ForgeResult<Self> {
21        let start_time = Instant::now();
22        let schema = Arc::new(get_schema_by_resolved_extensions(extensions)?);
23        let mut plugins = vec![];
24        let mut op_fns = vec![];
25        let mut extension_count = 0;
26        let mut plugin_count = 0;
27        for extension in extensions {
28            if let Extensions::E(extension) = extension {
29                extension_count += 1;
30                for plugin in extension.get_plugins() {
31                    plugin_count += 1;
32                    plugins.push(plugin.clone());
33                }
34                for op_fn in extension.get_op_fns() {
35                    op_fns.push(op_fn.clone());
36                }
37            }
38        }
39
40        metrics::extensions_loaded(extension_count);
41        metrics::plugins_loaded(plugin_count);
42        metrics::extension_manager_creation_duration(start_time.elapsed());
43
44        Ok(ExtensionManager { schema, plugins, op_fns })
45    }
46    pub fn get_op_fns(
47        &self
48    ) -> &Vec<
49        Arc<dyn Fn(&GlobalResourceManager) -> ForgeResult<()> + Send + Sync>,
50    > {
51        &self.op_fns
52    }
53
54    pub fn get_schema(&self) -> Arc<Schema> {
55        self.schema.clone()
56    }
57    pub fn get_plugins(&self) -> &Vec<Arc<Plugin>> {
58        &self.plugins
59    }
60}