use std::sync::Arc;
use moduforge_model::schema::Schema;
use moduforge_state::plugin::Plugin;
use crate::{
helpers::get_schema_by_resolved_extensions::get_schema_by_resolved_extensions,
types::Extensions,
};
pub struct ExtensionManager {
plugins: Vec<Arc<Plugin>>,
schema: Arc<Schema>,
}
impl ExtensionManager {
pub fn new(extensions: &Vec<Extensions>) -> Self {
let schema = Arc::new(
get_schema_by_resolved_extensions(extensions).unwrap_or_else(|e| {
panic!("schema 构建失败: {}", e);
}),
);
let mut plugins = vec![];
for extension in extensions {
if let Extensions::E(extension) = extension {
for plugin in extension.get_plugins() {
plugins.push(plugin.clone());
}
}
}
ExtensionManager { schema, plugins }
}
pub fn get_schema(&self) -> Arc<Schema> {
self.schema.clone()
}
pub fn get_plugins(&self) -> &Vec<Arc<Plugin>> {
&self.plugins
}
}