moduforge_core/
extension_manager.rs1use 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};
11pub 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}