Skip to main content

mf_persistence/
step_factory.rs

1use std::{collections::HashMap, sync::Arc};
2
3use mf_transform::{
4    attr_step::AttrStep,
5    mark_step::AddMarkStep,
6    node_step::{AddNodeStep, MoveNodeStep, RemoveNodeStep},
7    step::Step,
8};
9use std::fmt::Debug;
10
11pub trait StepFactory: Send + Sync + Debug {
12    fn create_from_bytes(
13        &self,
14        bytes: &[u8],
15    ) -> Arc<dyn Step>;
16}
17
18#[derive(Debug)]
19pub struct StepFactoryRegistry {
20    factories: HashMap<String, Arc<dyn StepFactory>>,
21}
22
23impl Default for StepFactoryRegistry {
24    fn default() -> Self {
25        Self::new()
26    }
27}
28
29impl StepFactoryRegistry {
30    pub fn new() -> Self {
31        let mut registry = StepFactoryRegistry { factories: HashMap::new() };
32        // 属性更新
33        registry.register("attr_step", Arc::new(AttrStepFactory));
34        // 添加标记
35        registry.register("add_mark_step", Arc::new(AddMarkStepFactory));
36        // 添加节点
37        registry.register("add_node_step", Arc::new(AddNodeStepFactory));
38        // 删除节点
39        registry.register("remove_node_step", Arc::new(RemoveNodeStepFactory));
40        // 移动节点
41        registry.register("move_node_step", Arc::new(MoveNodeStepFactory));
42        registry
43    }
44
45    pub fn register(
46        &mut self,
47        type_id: &str,
48        factory: Arc<dyn StepFactory>,
49    ) {
50        self.factories.insert(type_id.to_string(), factory);
51    }
52
53    pub fn create(
54        &self,
55        type_id: &str,
56        bytes: &[u8],
57    ) -> Arc<dyn Step> {
58        self.factories
59            .get(type_id)
60            .expect("Unknown step type")
61            .create_from_bytes(bytes)
62    }
63}
64
65#[derive(Debug)]
66pub struct AttrStepFactory;
67impl StepFactory for AttrStepFactory {
68    fn create_from_bytes(
69        &self,
70        bytes: &[u8],
71    ) -> Arc<dyn Step> {
72        let step: AttrStep = serde_json::from_slice(bytes).unwrap();
73        Arc::new(step)
74    }
75}
76
77#[derive(Debug)]
78pub struct AddMarkStepFactory;
79impl StepFactory for AddMarkStepFactory {
80    fn create_from_bytes(
81        &self,
82        bytes: &[u8],
83    ) -> Arc<dyn Step> {
84        let step: AddMarkStep = serde_json::from_slice(bytes).unwrap();
85        Arc::new(step)
86    }
87}
88
89#[derive(Debug)]
90pub struct AddNodeStepFactory;
91impl StepFactory for AddNodeStepFactory {
92    fn create_from_bytes(
93        &self,
94        bytes: &[u8],
95    ) -> Arc<dyn Step> {
96        let step: AddNodeStep = serde_json::from_slice(bytes).unwrap();
97        Arc::new(step)
98    }
99}
100
101#[derive(Debug)]
102pub struct RemoveNodeStepFactory;
103impl StepFactory for RemoveNodeStepFactory {
104    fn create_from_bytes(
105        &self,
106        bytes: &[u8],
107    ) -> Arc<dyn Step> {
108        let step: RemoveNodeStep = serde_json::from_slice(bytes).unwrap();
109        Arc::new(step)
110    }
111}
112
113#[derive(Debug)]
114pub struct MoveNodeStepFactory;
115impl StepFactory for MoveNodeStepFactory {
116    fn create_from_bytes(
117        &self,
118        bytes: &[u8],
119    ) -> Arc<dyn Step> {
120        let step: MoveNodeStep = serde_json::from_slice(bytes).unwrap();
121        Arc::new(step)
122    }
123}