mf_core/
extension.rs

1use std::sync::Arc;
2
3use mf_state::{ops::GlobalResourceManager, plugin::Plugin};
4
5use crate::{types::GlobalAttributeItem, ForgeResult};
6use crate::node::Node;
7
8pub type OpFnItem =
9    Arc<dyn Fn(&GlobalResourceManager) -> ForgeResult<()> + Send + Sync>;
10pub type OpFn = Vec<OpFnItem>;
11pub type NodeTransformFn =
12    Arc<dyn Fn(&mut Node) -> ForgeResult<()> + Send + Sync>;
13///扩展实现
14/// 组装全局属性和插件
15#[derive(Clone, Default)]
16pub struct Extension {
17    global_attributes: Vec<GlobalAttributeItem>,
18    plugins: Vec<Arc<Plugin>>,
19    op_fn: Option<OpFn>,
20    node_transform: Option<NodeTransformFn>,
21}
22
23impl Extension {
24    pub fn new() -> Self {
25        Extension {
26            global_attributes: vec![],
27            plugins: vec![],
28            op_fn: Some(vec![]),
29            node_transform: None,
30        }
31    }
32    pub fn add_node_transform(
33        &mut self,
34        node_fn: NodeTransformFn,
35    ) -> &mut Self {
36        self.node_transform = Some(node_fn);
37        self
38    }
39    pub fn get_node_transform(&self) -> Option<NodeTransformFn> {
40        self.node_transform.clone()
41    }
42    pub fn add_op_fn(
43        &mut self,
44        op_fn: OpFnItem,
45    ) -> &mut Self {
46        self.op_fn.get_or_insert(vec![]).push(op_fn);
47        self
48    }
49    pub fn get_op_fns(&self) -> OpFn {
50        self.op_fn.clone().unwrap_or_default()
51    }
52    pub fn add_global_attribute(
53        &mut self,
54        item: GlobalAttributeItem,
55    ) -> &mut Self {
56        self.global_attributes.push(item);
57        self
58    }
59    pub fn get_global_attributes(&self) -> &Vec<GlobalAttributeItem> {
60        &self.global_attributes
61    }
62    pub fn add_plugin(
63        &mut self,
64        plugin: Arc<Plugin>,
65    ) -> &mut Self {
66        self.plugins.push(plugin);
67        self
68    }
69    pub fn get_plugins(&self) -> &Vec<Arc<Plugin>> {
70        &self.plugins
71    }
72}