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#[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}